Pārlūkot izejas kodu

项目服务阶段进程增加维护支出

qianxb 2 gadi atpakaļ
vecāks
revīzija
8f00fa4466

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -109,6 +109,9 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //根据项目id获取项目截至目前-某个费用分类的的维护支出,按项目环节返回
     Map<Long,BigDecimal> getAllMaintainCost7(Long projectId,Integer costType);
 
+    //根据项目id获取项目截至目前-项目环节的维护支出,按项目环节返回
+    Map<Long,BigDecimal> getAllMaintainCost8(Long projectId);
+
     //获取项目的维护预算
     Set<Long> getAllMaintainBudgetId(Long projectId);
 }

+ 36 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AnnualBudgetServiceImpl.java

@@ -792,6 +792,13 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
         }else {
             isPlan = false;
         }
+        //项目每个进程的维护支出
+        Map<Long, BigDecimal> maintainMap = budgetService.getAllMaintainCost8(projectId);
+        Boolean isMaintain = true;
+        if (maintainMap == null || maintainMap.size() <= 0){
+            isMaintain = false;
+        }
+
         //项目每个进程的报销支出
         Map<Long, BigDecimal> reimburseMap = projectInfoService.getProjectReimburseByProcess(projectId);
         Boolean isReimburse = true;
@@ -837,8 +844,10 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 //未设置时间默认未开始
                 vo.setProcessProgressBar(0);
             }
-            //设置进程支出金额,目前只统计人工支出
+            //设置进程支出金额,统计人工支出,维护支出,报销支出
             if (!isPlan){
+                //没有完成的任务就不用设置人工支出
+                //报销支出
                 if (isReimburse){
                     if (reimburseMap.get(process.getId()) != null){
                         vo.setProcessCostCount(reimburseMap.get(process.getId()));
@@ -846,7 +855,17 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                 }else {
                     vo.setProcessCostCount(new BigDecimal(0));
                 }
+
+                //维护支出
+                if (isMaintain && maintainMap.get(process.getId()) != null){
+                    if (vo.getProcessCostCount() == null) {
+                        vo.setProcessCostCount(maintainMap.get(process.getId()));
+                    }else {
+                        vo.setProcessCostCount(vo.getProcessCostCount().add(maintainMap.get(process.getId())));
+                    }
+                }
             }else {
+                //有完成的任务,设置人工支出
                 List<ProjectCostBudget> budgets = collect.get(process.getId());
                 if (budgets != null && budgets.size() > 0){
                     //计算所有任务支出总和
@@ -854,13 +873,20 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     for (ProjectCostBudget budget : budgets) {
                         big = big.add(budget.getActualTotalMoney());
                     }
+                    //设置报销支出
                     if (isReimburse){
                         if (reimburseMap.get(process.getId()) != null){
                             big = big.add(reimburseMap.get(process.getId()));
                         }
                     }
+                    //设置维护支出
+                    if (isMaintain && maintainMap.get(process.getId()) != null){
+                           big = big.add(maintainMap.get(process.getId()));
+                    }
                     vo.setProcessCostCount(big);
                 }else {
+                    //没有人工支出
+                    //设置报销支出
                     if (isReimburse){
                         if (reimburseMap.get(process.getId()) != null){
                             vo.setProcessCostCount(reimburseMap.get(process.getId()));
@@ -868,6 +894,15 @@ public class AnnualBudgetServiceImpl extends BaseServiceImpl<AnnualBudgetMapper,
                     }else {
                         vo.setProcessCostCount(new BigDecimal(0));
                     }
+
+                    //维护支出
+                    if (isMaintain && maintainMap.get(process.getId()) != null){
+                        if (vo.getProcessCostCount() == null) {
+                            vo.setProcessCostCount(maintainMap.get(process.getId()));
+                        }else {
+                            vo.setProcessCostCount(vo.getProcessCostCount().add(maintainMap.get(process.getId())));
+                        }
+                    }
                 }
             }
             //设置进程支出金额百分比,统计实际支出和预算的百分比

+ 68 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -1923,6 +1923,74 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return null;
     }
 
+    /**
+     * //根据项目id获取项目截至目前-每个项目环节的维护支出,按项目环节返回
+     * @return
+     */
+    @Override
+    public Map<Long,BigDecimal> getAllMaintainCost8(Long projectId) {
+        //获取当前项目-指定费用分类的-维护支出,如果没有返回null
+        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<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