|
@@ -1296,6 +1296,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
}else {
|
|
}else {
|
|
//不是今年
|
|
//不是今年
|
|
if (startTime.getYear() > year){
|
|
if (startTime.getYear() > year){
|
|
|
|
+ continue;
|
|
|
|
+ }else if (startTime.getYear() < year) {
|
|
startMonth = 1;
|
|
startMonth = 1;
|
|
}else {
|
|
}else {
|
|
//如果合同开始月比1月要大,则用开始日期
|
|
//如果合同开始月比1月要大,则用开始日期
|
|
@@ -1491,6 +1493,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
}else {
|
|
}else {
|
|
//不是今年
|
|
//不是今年
|
|
if (startTime.getYear() > year){
|
|
if (startTime.getYear() > year){
|
|
|
|
+ continue;
|
|
|
|
+ }else if (startTime.getYear() < year) {
|
|
startMonth = 1;
|
|
startMonth = 1;
|
|
}else {
|
|
}else {
|
|
//如果合同开始月比1月要大,则用开始日期
|
|
//如果合同开始月比1月要大,则用开始日期
|
|
@@ -1615,6 +1619,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
}else {
|
|
}else {
|
|
//不是今年
|
|
//不是今年
|
|
if (startTime.getYear() > year){
|
|
if (startTime.getYear() > year){
|
|
|
|
+ map.put(info.getId(),new BigDecimal(0));
|
|
|
|
+ }else if (startTime.getYear() < year) {
|
|
startMonth = 1;
|
|
startMonth = 1;
|
|
}else {
|
|
}else {
|
|
//如果合同开始月比1月要大,则用开始日期
|
|
//如果合同开始月比1月要大,则用开始日期
|
|
@@ -1646,6 +1652,247 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 获取所有项目到目前的的维护支出,按项目返回
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Map<Long,BigDecimal> getAllMaintainCost5() {
|
|
|
|
+ //获取所有已分配任务人的维护支出,如果没有返回0
|
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan();
|
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
|
+ bab.add(plan.getId());
|
|
|
|
+ } else {
|
|
|
|
+ bab.add(plan.getParentId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //查询出所有维护计划,根据项目id分组
|
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
|
+ Map<Long, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
|
|
|
|
+ .collect(Collectors.groupingBy(ProjectCostBudget::getProjectId));
|
|
|
|
+ //查询出所有项目
|
|
|
|
+ List<ControlProjectInfo> projectInfos = infoMapper.selectList(
|
|
|
|
+ new LambdaQueryWrapper<ControlProjectInfo>().in(ControlProjectInfo::getId, budgetMap.keySet()));
|
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
|
+ List<ControlContractInfo> contractList = contractService.list(
|
|
|
|
+ new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId,budgetMap.keySet()));
|
|
|
|
+ if (contractList == null || contractList.size() <= 0){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ //把合同根据项目分组
|
|
|
|
+ Map<Long, List<ControlContractInfo>> contractMap = contractList.parallelStream()
|
|
|
|
+ .collect(Collectors.groupingBy(ControlContractInfo::getProjectId));
|
|
|
|
+ //返回值
|
|
|
|
+ Map<Long,BigDecimal> map = new HashMap<>();
|
|
|
|
+ //循环项目,
|
|
|
|
+ for (ControlProjectInfo info : projectInfos) {
|
|
|
|
+ List<ControlContractInfo> infos = contractMap.get(info.getId());
|
|
|
|
+ if (infos == null || infos.size() == 0){
|
|
|
|
+ map.put(info.getId(),new BigDecimal(0));
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
|
+ ControlContractInfo contract = contractMap.get(info.getId()).get(0);
|
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
|
+ List<ProjectCostBudget> list = budgetMap.get(info.getId());
|
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
|
+ for (ProjectCostBudget l : list) {
|
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
|
+ }
|
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ //获得每个月的维护费
|
|
|
|
+ BigDecimal scale = big.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
|
+ map.put(info.getId(),new BigDecimal(0));
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ //如果合同结束时间比当前大,就用当前时间
|
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
|
+ endTime = LocalDate.now();
|
|
|
|
+ }
|
|
|
|
+ int year = LocalDate.now().getYear() - startTime.getYear();
|
|
|
|
+ int month = year * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
|
+ BigDecimal multiply = scale.multiply(new BigDecimal(month));
|
|
|
|
+ map.put(info.getId(),multiply);
|
|
|
|
+ }
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * //根据项目id获取项目截至目前的的维护支出,按费用分类返回
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Map<Integer,BigDecimal> getAllMaintainCost6(Long projectId) {
|
|
|
|
+ //获取当前项目所有已分配任务人的维护支出,如果没有返回0
|
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan2(projectId);
|
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
|
+ bab.add(plan.getId());
|
|
|
|
+ } else {
|
|
|
|
+ bab.add(plan.getParentId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //查询出所有维护计划
|
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
|
+ ControlContractInfo contract = contractService.getOne(
|
|
|
|
+ new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, projectId));
|
|
|
|
+ if (contract == null){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ //把合同根据项目分组
|
|
|
|
+ //返回值
|
|
|
|
+ Map<Integer,BigDecimal> map = new HashMap<>();
|
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
|
+ for (ProjectCostBudget l : budgets) {
|
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
|
+ if (map.get(l.getCostType()) == null){
|
|
|
|
+ map.put(l.getCostType(),l.getBudgetStaffCost());
|
|
|
|
+ }else {
|
|
|
|
+ map.put(l.getCostType(),map.get(l.getCostType()).add(l.getBudgetStaffCost()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //如果合同结束时间比当前大,就用当前时间
|
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
|
+ endTime = LocalDate.now();
|
|
|
|
+ }
|
|
|
|
+ int year = LocalDate.now().getYear() - startTime.getYear();
|
|
|
|
+ int month = year * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
|
+ //目前是每个部门总金额,先计算每个月的总费用,再乘以month个月
|
|
|
|
+ for (Integer integer : map.keySet()) {
|
|
|
|
+ BigDecimal count = map.get(integer);
|
|
|
|
+ //获得每个月的维护费
|
|
|
|
+ BigDecimal scale = count.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
|
+ map.put(integer,scale.multiply(new BigDecimal(month)));
|
|
|
|
+ }
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * //根据项目id获取项目截至目前-某个费用分类的的维护支出,按项目环节返回
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Map<Long,BigDecimal> getAllMaintainCost7(Long projectId,Integer costType) {
|
|
|
|
+ //获取当前项目-指定费用分类的-维护支出,如果没有返回null
|
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan3(projectId,costType);
|
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
|
+ bab.add(plan.getId());
|
|
|
|
+ } else {
|
|
|
|
+ bab.add(plan.getParentId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ //查询出所有维护计划
|
|
|
|
+ List<ProjectCostBudget> budgets = this.listByIds(bab);
|
|
|
|
+ //通过项目id查询出所有的合同,如果项目没有合同则提示,项目没有合同,无法计算维护支出
|
|
|
|
+ ControlContractInfo contract = contractService.getOne(
|
|
|
|
+ new LambdaQueryWrapper<ControlContractInfo>().in(ControlContractInfo::getProjectId, projectId));
|
|
|
|
+ if (contract == null){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ //把合同根据项目分组
|
|
|
|
+ //返回值
|
|
|
|
+ Map<Long,BigDecimal> map = new HashMap<>();
|
|
|
|
+ //获取合同时间,获取多少个月
|
|
|
|
+ LocalDate startTime = contract.getStartTime();
|
|
|
|
+ LocalDate endTime = contract.getEndTime();
|
|
|
|
+ // 当前日期和合同开始时间比较,相差多少月 月 * 每个月维护费 = 当前项目截至当前的所有维护费
|
|
|
|
+ if (LocalDate.now().compareTo(startTime) < 0){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ int years = endTime.getYear() - startTime.getYear();
|
|
|
|
+ int months = years * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
|
+ //每个项目的维护总和 / 多少个月 = 该项目每个月的维护费
|
|
|
|
+ BigDecimal big = new BigDecimal(0);
|
|
|
|
+ for (ProjectCostBudget l : budgets) {
|
|
|
|
+ big = big.add(l.getBudgetStaffCost());
|
|
|
|
+ if (map.get(l.getProjectProcess()) == null){
|
|
|
|
+ map.put(l.getProjectProcess(),l.getBudgetStaffCost());
|
|
|
|
+ }else {
|
|
|
|
+ map.put(l.getProjectProcess(),map.get(l.getProjectProcess()).add(l.getBudgetStaffCost()));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (big.compareTo(new BigDecimal(0)) == 0){
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ //如果合同结束时间比当前大,就用当前时间
|
|
|
|
+ if (endTime.compareTo(LocalDate.now()) > 0){
|
|
|
|
+ endTime = LocalDate.now();
|
|
|
|
+ }
|
|
|
|
+ int year = LocalDate.now().getYear() - startTime.getYear();
|
|
|
|
+ int month = year * 12 + (endTime.getMonthValue() - startTime.getMonthValue()) + 1;
|
|
|
|
+ //目前是每个部门总金额,先计算每个月的总费用,再乘以month个月
|
|
|
|
+ for (Long process: map.keySet()) {
|
|
|
|
+ BigDecimal count = map.get(process);
|
|
|
|
+ //获得每个月的维护费
|
|
|
|
+ BigDecimal scale = count.divide(new BigDecimal(months),2,RoundingMode.HALF_UP).setScale(2, RoundingMode.HALF_UP);
|
|
|
|
+ map.put(process,scale.multiply(new BigDecimal(month)));
|
|
|
|
+ }
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * //获取项目的维护预算
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Set<Long> getAllMaintainBudgetId(Long projectId) {
|
|
|
|
+ //获取当前项目所有已分配任务人的维护支出,如果没有返回0
|
|
|
|
+ List<ProjectCostBudget> plans = baseMapper.getAllMaintainPlan2(projectId);
|
|
|
|
+ if (plans != null && plans.size() > 0) {
|
|
|
|
+ //分离出主计划和子计划,建立主计划的id,set集合
|
|
|
|
+ Set<Long> bab = new HashSet<>();
|
|
|
|
+ for (ProjectCostBudget plan : plans) {
|
|
|
|
+ if (plan.getParentId() == 0) {
|
|
|
|
+ bab.add(plan.getId());
|
|
|
|
+ } else {
|
|
|
|
+ bab.add(plan.getParentId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return bab;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 统计一行的几个总金额
|
|
* 统计一行的几个总金额
|
|
*/
|
|
*/
|