Переглянути джерело

Merge remote-tracking branch 'origin/master' into master

yangyj 2 роки тому
батько
коміт
1286253c7d

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java

@@ -94,4 +94,8 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     User getUserInfo(@Param("userId") Long userId);
 
     List<ProjectCostBudget> getAllMaintainPlan();
+
+    List<ProjectCostBudget> getAllMaintainPlan2(@Param("projectId")Long projectId);
+
+    List<ProjectCostBudget> getAllMaintainPlan3(@Param("projectId")Long projectId,@Param("costType")Integer costType);
 }

+ 10 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -279,6 +279,16 @@
         from c_project_cost_budget
         WHERE plan_task_type > 0 and (SELECT dict_value from c_dict_info cdi WHERE id = plan_task_type) = 2
     </select>
+    <select id="getAllMaintainPlan2" resultType="org.springblade.control.entity.ProjectCostBudget">
+        SELECT *
+        from c_project_cost_budget
+        WHERE project_id = #{projectId} and plan_task_type > 0 and (SELECT dict_value from c_dict_info cdi WHERE id = plan_task_type) = 2
+    </select>
+    <select id="getAllMaintainPlan3" resultType="org.springblade.control.entity.ProjectCostBudget">
+        SELECT *
+        from c_project_cost_budget
+        WHERE project_id = #{projectId} and cost_type = #{costType} and plan_task_type > 0 and (SELECT dict_value from c_dict_info cdi WHERE id = plan_task_type) = 2
+    </select>
 
 
 </mapper>

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -66,7 +66,7 @@
             cpi.name as 'projectName',
             cci.contract_money  as 'contractMoney',
                 (select cbs.project_cost_total from c_project_cost_budget_stats cbs WHERE cpi.id = cbs.project_id  and cbs.is_deleted = 0) as 'budgetCost',
-                (select SUM(pcb.actual_total_money)  from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = cpi.id and pcb.task_approve = 1)as "practicalPayCost",
+                (select SUM(pcb.actual_total_money)  from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = cpi.id and pcb.task_approve = 1)as 'practicalPayCost',
                 (select SUM(cri.practical_returned_money)  from c_contract_returned_info cri WHERE cpi.id = cri.project_id and cri.is_deleted = 0) as 'ReturnedMoney',
                 (cci.contract_money - IFNULL((select SUM(cri.practical_returned_money) from c_contract_returned_info cri WHERE cri.contract_id = cci.id and cri.is_deleted = 0),0)) as 'unreturnedMoney'
         from c_control_project_info cpi left join c_control_contract_info cci on cpi.id = cci.project_id and cci.is_deleted = 0

+ 14 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -16,6 +16,7 @@ import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Param
@@ -90,7 +91,7 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     //获取所有项目截至当年的维护支出
     BigDecimal getAllMaintainCost(int year);
 
-    //获取所有项目的维护支出
+    //获取所有项目的截至目前的维护支出
     BigDecimal getAllMaintainCost2();
 
     //获取所有项目截至当年的维护支出,分月返回
@@ -98,4 +99,16 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     //获取所有项目截至当年的维护支出,按年返回
     Map<Long,BigDecimal> getAllMaintainCost4(int year);
+
+    //获取所有项目截至目前的的维护支出,按项目返回
+    Map<Long,BigDecimal> getAllMaintainCost5();
+
+    //根据项目id获取项目截至目前的维护支出,按费用分类返回
+    Map<Integer,BigDecimal> getAllMaintainCost6(Long projectId);
+
+    //根据项目id获取项目截至目前-某个费用分类的的维护支出,按项目环节返回
+    Map<Long,BigDecimal> getAllMaintainCost7(Long projectId,Integer costType);
+
+    //获取项目的维护预算
+    Set<Long> getAllMaintainBudgetId(Long projectId);
 }

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

@@ -1296,6 +1296,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 }else {
                     //不是今年
                     if (startTime.getYear() > year){
+                        continue;
+                    }else if (startTime.getYear() < year) {
                         startMonth = 1;
                     }else {
                         //如果合同开始月比1月要大,则用开始日期
@@ -1491,6 +1493,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 }else {
                     //不是今年
                     if (startTime.getYear() > year){
+                        continue;
+                    }else if (startTime.getYear() < year) {
                         startMonth = 1;
                     }else {
                         //如果合同开始月比1月要大,则用开始日期
@@ -1615,6 +1619,8 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 }else {
                     //不是今年
                     if (startTime.getYear() > year){
+                        map.put(info.getId(),new BigDecimal(0));
+                    }else if (startTime.getYear() < year) {
                         startMonth = 1;
                     }else {
                         //如果合同开始月比1月要大,则用开始日期
@@ -1646,6 +1652,247 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         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;
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 76 - 3
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -29,6 +29,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -161,7 +162,11 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
      */
     @Override
     public AllProjectStatsVO allProjectStats() {
-        return baseMapper.allProjectStats();
+        AllProjectStatsVO vo = baseMapper.allProjectStats();
+        //获取截至目前所有维护支出
+        BigDecimal cost2 = budgetService.getAllMaintainCost2();
+        vo.setAllPracticalDisburse(vo.getAllPracticalDisburse().add(cost2));
+        return vo;
     }
 
     /**
@@ -169,7 +174,24 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
      */
     @Override
     public List<AllProjectStatsVO> ProjectListStats() {
-        return baseMapper.ProjectListStats();
+        List<AllProjectStatsVO> vos = baseMapper.ProjectListStats();
+        Map<Long, BigDecimal> map = budgetService.getAllMaintainCost5();
+        Boolean isMaintain = true;
+        if (map == null || map.size() <= 0){
+            isMaintain = false;
+        }
+        for (AllProjectStatsVO vo : vos) {
+            if (isMaintain) {
+                BigDecimal decimal = map.get(vo.getProjectId());
+                if (decimal != null) {
+                    if (vo.getPracticalPayCost() == null){
+                        vo.setPracticalPayCost(new BigDecimal(0));
+                    }
+                    vo.setPracticalPayCost(vo.getPracticalPayCost().add(decimal));
+                }
+            }
+        }
+        return vos;
     }
 
     /**
@@ -182,6 +204,16 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         List<DictInfo> costTypeDict = baseMapper.getCostTypeDict();
         //获取项目所有预算
         List<ProjectCostBudget> budgets = budgetService.getAllBudgetByProjectId(id);
+        //获取项目所有的维护预算
+        Set<Long> set = budgetService.getAllMaintainBudgetId(id);
+        //从预算中排除维护预算
+        budgets = budgets.stream().filter(l->!set.contains(l.getId())).collect(Collectors.toList());
+        //获取项目所有维护预算
+        Map<Integer, BigDecimal> map = budgetService.getAllMaintainCost6(id);
+        Boolean isMaintain = true;
+        if (map == null || map.size() <= 0){
+            isMaintain = false;
+        }
         //获取项目所有实际费用
         List<ProjectCostBudget> practicalList = budgetService.getAllPracticalBudgetByProjectId(id);
         if (budgets != null && budgets.size() > 0){
@@ -199,6 +231,13 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                         bigDecimal = bigDecimal.add(budget.getBudgetCountMoney());
                     }
                 }
+                //加上每个部门的维护预算
+                if (isMaintain){
+                    BigDecimal decimal = map.get(i);
+                    if (decimal != null){
+                        bigDecimal = bigDecimal.add(decimal);
+                    }
+                }
                 vo.setBudgetCost(bigDecimal);
                 //设置费用分类实际费用,目前只设置人工
                 BigDecimal practicalCost = new BigDecimal(0);
@@ -209,12 +248,46 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                         }
                     }
                 }
+                //加上每个部门的维护支出
+                if (isMaintain){
+                    BigDecimal decimal = map.get(i);
+                    if (decimal != null){
+                        practicalCost = practicalCost.add(decimal);
+                    }
+                }
                 vo.setPracticalCost(practicalCost);
                 list.add(vo);
             }
             return list;
+        }else {
+            if (isMaintain){
+                for (int i = 1; i <= 6; i++) {
+                    AllProjectStatsVO vo = new AllProjectStatsVO();
+                    vo.setProjectId(id);
+                    vo.setCostType(i);
+                    vo.setCostTypeValue(costTypeDict.get(i-1).getDictName());
+                    BigDecimal bigDecimal = new BigDecimal(0);
+                    BigDecimal practicalCost = new BigDecimal(0);
+                    if (practicalList != null && practicalList.size() > 0){
+                        for (ProjectCostBudget budget : practicalList) {
+                            if (budget.getCostType() == i){
+                                practicalCost = practicalCost.add(budget.getActualTotalMoney());
+                            }
+                        }
+                    }
+                    BigDecimal decimal = map.get(i);
+                    if (decimal != null){
+                        bigDecimal = bigDecimal.add(decimal);
+                        practicalCost = practicalCost.add(decimal);
+                    }
+                    vo.setBudgetCost(bigDecimal);
+                    vo.setPracticalCost(practicalCost);
+                    list.add(vo);
+                }
+                return list;
+            }
+            return null;
         }
-        return null;
     }
 
     /**

+ 17 - 6
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java

@@ -121,6 +121,11 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
     public List<ProjectProcessVO> processService(Long projectId, Integer costType) {
         //获取当前项目所有项目环节
         List<ProjectProcessVO> list = processMapper.getProjectProcess(projectId);
+        Map<Long, BigDecimal> maintainMap = budgetService.getAllMaintainCost7(projectId, costType);
+        Boolean isMaintain = true;
+        if (maintainMap == null || maintainMap.size() <= 0){
+            isMaintain = false;
+        }
         //获取项目具体部门所有已闭环的任务
         List<ProjectCostBudget> budgets = budgetService.getProjectAllFinishedTask(projectId,costType);
         if (budgets != null || budgets.size() > 0){
@@ -131,17 +136,23 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
                     .collect(Collectors.groupingBy(ProjectCostBudget::getProjectProcess));
             //包含此环节就统计,不包含就跳出
             for (ProjectProcessVO vo : list) {
-                if (set.contains(vo.getId())){
+                if (set.contains(vo.getId()) || (isMaintain && maintainMap.get(vo.getId()) != null)){
                     //设置参与
                     vo.setIsParticipate(1);
                     //时间成本统计总天数,人员投入统计总人数,成本支出统计当前环节总支出
-                    List<ProjectCostBudget> budgetList = map.get(vo.getId());
                     BigDecimal costDisburse = new BigDecimal(0);
                     BigDecimal timeCost = new BigDecimal(0);
-                    int staffTotal = budgetList.size();
-                    for (ProjectCostBudget budget : budgetList) {
-                        costDisburse = costDisburse.add(budget.getActualTotalMoney());
-                        timeCost = timeCost.add(budget.getPracticalTaskDays());
+                    int staffTotal = 0;
+                    if (set.contains(vo.getId())) {
+                        List<ProjectCostBudget> budgetList = map.get(vo.getId());
+                        staffTotal = budgetList.size();
+                        for (ProjectCostBudget budget : budgetList) {
+                            costDisburse = costDisburse.add(budget.getActualTotalMoney());
+                            timeCost = timeCost.add(budget.getPracticalTaskDays());
+                        }
+                    }
+                    if (isMaintain && maintainMap.get(vo.getId()) != null){
+                        costDisburse = costDisburse.add(maintainMap.get(vo.getId()));
                     }
                     //设置费用明细
                     List<ProjectProcessVO.costDetail> details = new ArrayList<>();

+ 7 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -36,7 +36,6 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
-import java.lang.reflect.Field;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -282,7 +281,9 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
      * @return
      */
     private List<WbsTreePrivateVO> buildWbsTreeByStreamChildNodeTreeProject(List<WbsTreePrivateVO> nodes, WbsTreePrivate parentNodeRoot) {
-        List<WbsTreePrivateVO> list = nodes.stream().filter(f -> f.getId().equals(parentNodeRoot.getId())).collect(Collectors.toList());
+        List<WbsTreePrivateVO> list = nodes.stream().filter(f -> f.getId().equals(parentNodeRoot.getId()))
+                .sorted(Comparator.comparing(WbsTreePrivateVO::getSort, Comparator.nullsLast(Integer::compare)))
+                .collect(Collectors.toList());
         Map<Long, List<WbsTreePrivateVO>> map = nodes.stream().collect(Collectors.groupingBy(WbsTreePrivateVO::getParentId));
         this.recursionFnTreeChildNodeProject(list, map);
         return list;
@@ -291,21 +292,12 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     private void recursionFnTreeChildNodeProject(List<WbsTreePrivateVO> list, Map<Long, List<WbsTreePrivateVO>> map) {
         for (WbsTreePrivateVO wbsTreePrivateVO : list) {
             List<WbsTreePrivateVO> childrenList = map.get(wbsTreePrivateVO.getId());
-            wbsTreePrivateVO.setChildren(childrenList);
             if (childrenList != null && childrenList.size() > 0) {
+                List<WbsTreePrivateVO> sortChildrenList = childrenList.stream()
+                        .sorted(Comparator.comparing(WbsTreePrivateVO::getSort, Comparator.nullsLast(Integer::compare))).collect(Collectors.toList());
                 wbsTreePrivateVO.setHasChildren(true);
-                recursionFnTreeProject(childrenList, map);
-            }
-        }
-    }
-
-    private void recursionFnTreeProject(List<WbsTreePrivateVO> list, Map<Long, List<WbsTreePrivateVO>> map) {
-        for (WbsTreePrivateVO wbsTreePrivateVO : list) {
-            List<WbsTreePrivateVO> childrenList = map.get(wbsTreePrivateVO.getId());
-            wbsTreePrivateVO.setChildren(childrenList);
-            if (childrenList != null && childrenList.size() > 0) {
-                wbsTreePrivateVO.setHasChildren(true);
-                recursionFnTreeProject(childrenList, map);
+                wbsTreePrivateVO.setChildren(sortChildrenList);
+                recursionFnTreeChildNodeProject(sortChildrenList, map);
             }
         }
     }

+ 10 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -753,7 +753,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                             List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
                             if (wbsTreeContractList.size() > 0) {
                                 String join = StringUtils.join(names, ",");
-                                throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
+                                return R.fail(400, StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
                             }
                         }
 
@@ -787,7 +787,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     if (saveIds.size() >= 1000) {
                         String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
                         if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-                            throw new ServiceException("请勿重复提交,请60秒后再尝试");
+                            return R.fail(400, "请勿重复提交,请60秒后再尝试");
                         }
                     }
 
@@ -824,27 +824,18 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     } else if (pawDTO.getReferenceType().equals("private")) {
                         List<WbsTreePrivate> addListData = new ArrayList<>();
 
-                        //获取当前树下所有节点、表信息(type=10独立表)
+                        /*//获取当前树下所有节点、表信息(type=10独立表)
+                        List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId()).and(obj -> obj.eq(WbsTreePrivate::getType, 1).or().eq(WbsTreePrivate::getType, 2)));
+                        List<WbsTreePrivate> wbsTreePrivatesTableDLOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getParentId, -10).isNull(WbsTreePrivate::getWbsId));
+                        wbsTreePrivatesNodeAndTab.addAll(wbsTreePrivatesTableDLOld);*/
+
                         List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                                 .eq(WbsTreePrivate::getStatus, 1)
                                 .eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId())
-                                .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
-                                .and(obj -> obj.eq(WbsTreePrivate::getType, 1).or().eq(WbsTreePrivate::getType, 2))
-                        );
-                        List<WbsTreePrivate> wbsTreePrivatesTableDLOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                .eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId())
-                                .eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getStatus, 1)
-                                .eq(WbsTreePrivate::getParentId, -10).isNull(WbsTreePrivate::getWbsId));
-
-                        wbsTreePrivatesNodeAndTab.addAll(wbsTreePrivatesTableDLOld);
+                                .apply("((wbs_id = '" + pawDTO.getWbsId() + "' AND (type = 1 OR type = 2)) OR (wbs_id IS NULL AND type = 10 AND parent_id = -10))"));
 
                         //获取当前项目下的所有独立表
-                        List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                .select(WbsTreePrivate::getId)
-                                .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                                .eq(WbsTreePrivate::getType, 10)
-                                .eq(WbsTreePrivate::getParentId, -10)
-                                .eq(WbsTreePrivate::getStatus, 1));
+                        List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().select(WbsTreePrivate::getId).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getParentId, -10).eq(WbsTreePrivate::getStatus, 1));
 
                         for (WbsTreePrivate wbsTreePrivate : wbsTreePrivatesNodeAndTab) {
                             if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
@@ -917,7 +908,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         }
 
                         //异步修改htmlUrl
-                        //wbsTreePrivateService.batchResetHtmlUrl(insertData2);
+                        wbsTreePrivateService.batchResetHtmlUrl(insertData2);
 
                         //修改状态
                         if (pawDTO.getWbsType() == 1) {