Prechádzať zdrojové kódy

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

yangyj 2 rokov pred
rodič
commit
552b8d824d
28 zmenil súbory, kde vykonal 610 pridanie a 329 odobranie
  1. 4 6
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java
  2. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskProcessInfo.java
  3. 18 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/DepartmentPlanLogVO.java
  4. 2 2
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ExMaByContractReturnedInfoVO.java
  5. 2 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO.java
  6. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessDetailBasicsVO.java
  7. 0 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java
  8. 32 34
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  9. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentPlanLogController.java
  10. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java
  11. 3 5
      blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetStatsController.java
  12. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  13. 5 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  14. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetStatsMapper.xml
  15. 4 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentPlanLogService.java
  16. 5 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  17. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetStatsService.java
  18. 24 5
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java
  19. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentMonthPlanServiceImpl.java
  20. 55 8
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java
  21. 23 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  22. 23 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  23. 23 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java
  24. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  25. 289 188
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  26. 19 10
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java
  27. 30 25
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  28. 36 23
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

+ 4 - 6
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/DepartmentPlanLog.java

@@ -100,20 +100,18 @@ public class DepartmentPlanLog extends BaseEntity {
 
 
     @ApiModelProperty(value = "项目原计划起止工时")
-    private BigDecimal planDays;
+    private Integer planDays;
 
     @ApiModelProperty(value = "上一次计划截至暂停阶段,起止工时(天)")
-    private BigDecimal realWorkDays;
+    private Integer realWorkDays;
 
     @ApiModelProperty(value = "计划执行顺序")
     private Integer sort;
 
     @ApiModelProperty(value = "中途暂停之后开启计划起止工时(天)")
-    private BigDecimal openPlanStartEndDays;
+    private Integer openPlanStartEndDays;
 
     @ApiModelProperty(value = "上一次计划工时(天)")
-    private BigDecimal lastOpenPlanStartEndDays;
+    private Integer lastOpenPlanStartEndDays;
 
-    @ApiModelProperty(value = "0不显示提示,1显示提示")
-    private Integer isShowTips;
 }

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/TaskProcessInfo.java

@@ -20,7 +20,7 @@ public class TaskProcessInfo extends BaseEntity {
     private String taskName;
 
     @ApiModelProperty(value = "上报日期")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date reportDate;
 
     @ApiModelProperty(value = "审核日期")

+ 18 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/DepartmentPlanLogVO.java

@@ -0,0 +1,18 @@
+package org.springblade.control.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.control.entity.DepartmentPlanLog;
+
+/**
+ * @Param
+ * @Author wangwl
+ * @Date 2023/7/12 18:25
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DepartmentPlanLogVO extends DepartmentPlanLog {
+    @ApiModelProperty(value = "超时提示")
+    private Integer isShowTips;
+}

+ 2 - 2
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ExMaByContractReturnedInfoVO.java

@@ -18,14 +18,14 @@ public class ExMaByContractReturnedInfoVO implements Serializable {
     @ApiModelProperty(value = "回款条件")
     private String returnedCondition;
 
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @ApiModelProperty(value = "应回款时间")
     private LocalDate shouldReturnedTime;
 
     @ApiModelProperty(value = "应回款金额")
     private BigDecimal shouldReturnedMoney;
 
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd", timezone = "GMT+8")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
     @ApiModelProperty(value = "实际回款时间")
     private LocalDate practicalReturnedTime;
 

+ 2 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectCostBudgetVO.java

@@ -50,6 +50,7 @@ public class ProjectCostBudgetVO extends ProjectCostBudget {
     @ApiModelProperty(value = "计划建设单位")
     private Map<Integer,List<ProjectCostBudgetVO2>> constructUnit;
 
-
+    @ApiModelProperty(value = "任务类型值")
+    private String planTaskTypeValue;
 
 }

+ 2 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/TaskProcessDetailBasicsVO.java

@@ -1,5 +1,6 @@
 package org.springblade.control.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -25,6 +26,7 @@ public class TaskProcessDetailBasicsVO implements Serializable {
     private String reportUser;
 
     @ApiModelProperty(value = "审批任务上报时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date reportDate;
 
     @ApiModelProperty(value = "支付状态 1=已支付 0=待支付")

+ 0 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsTreeContractClient.java

@@ -179,7 +179,6 @@ public interface WbsTreeContractClient {
     @GetMapping(API_PREFIX + "/getNextPkeyIdByNodeType")
     Long getNextPkeyIdByNodeType(@RequestParam Long pkeyId, @RequestParam Integer nodeType);
 
-
     //获取 节点下表单
     @GetMapping(API_PREFIX + "/searchNodeAllTableInfo")
     List<AppWbsTreeContractVO> searchNodeAllTableInfo(@RequestParam String primaryKeyId, @RequestParam String type, @RequestParam String contractId, @RequestParam String projectId);

+ 32 - 34
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -2654,7 +2654,7 @@ public class InformationWriteQueryController extends BladeController {
         List<WbsTreePrivate> query = new ArrayList<>();
         List<String> pKeyIds = selectList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).collect(Collectors.toList());
         //所有相关节点集合
-        List<WbsTreeContract> selectedNodeList = new ArrayList<>();
+        List<WbsTreePrivate> selectedNodeList = new ArrayList<>();
 
         //检查新增类型
         if ("1".equals(vo.getSaveType())) {
@@ -2667,9 +2667,9 @@ public class InformationWriteQueryController extends BladeController {
                     return R.data(null);
                 }
                 //检查当前操作的节点是否是填报节点,如果是则需要查询相关联表格
-                List<WbsTreeContract> submitNodeList = selectedNodeList.stream().filter(treeContract1 -> Arrays.asList("1,2,3,4".split(",")).contains(treeContract1.getMajorDataType().toString())).distinct().collect(Collectors.toList());
+                List<WbsTreePrivate> submitNodeList = selectedNodeList.stream().filter(treeContract1 -> Arrays.asList("1,2,3,4".split(",")).contains(treeContract1.getMajorDataType().toString())).distinct().collect(Collectors.toList());
 
-                List<WbsTreeContract> childList = new ArrayList<>();
+                List<WbsTreePrivate> childList = new ArrayList<>();
                 if (submitNodeList.size() > 0) {
                     //只取原始表
                     this.foreachQueryChild(submitNodeList, childList);
@@ -2679,11 +2679,11 @@ public class InformationWriteQueryController extends BladeController {
 
                 if (childList.size() > 0) {
                     //处理重复的数据
-                    Iterator<WbsTreeContract> iterator = childList.iterator();
+                    Iterator<WbsTreePrivate> iterator = childList.iterator();
                     while (iterator.hasNext()) {
-                        WbsTreeContract next = iterator.next();
-                        for (WbsTreeContract wbsTreeContract : selectedNodeList) {
-                            if (wbsTreeContract.getPKeyId().equals(next.getPKeyId())) {
+                        WbsTreePrivate next = iterator.next();
+                        for (WbsTreePrivate wbsTreePrivate : selectedNodeList) {
+                            if (wbsTreePrivate.getPKeyId().equals(next.getPKeyId())) {
                                 //删掉重复数据
                                 iterator.remove();
                                 break;
@@ -2709,9 +2709,9 @@ public class InformationWriteQueryController extends BladeController {
                     return R.data(null);
                 }
                 //检查当前操作的节点是否是填报节点,如果是则需要查询相关联表格
-                List<WbsTreeContract> submitNodeList = selectedNodeList.stream().filter(treePrivate -> Arrays.asList("1,2,3,4".split(",")).contains(treePrivate.getMajorDataType().toString())).distinct().collect(Collectors.toList());
+                List<WbsTreePrivate> submitNodeList = selectedNodeList.stream().filter(treePrivate -> Arrays.asList("1,2,3,4".split(",")).contains(treePrivate.getMajorDataType().toString())).distinct().collect(Collectors.toList());
 
-                List<WbsTreeContract> childList = new ArrayList<>();
+                List<WbsTreePrivate> childList = new ArrayList<>();
                 if (submitNodeList.size() > 0) {
                     //只取原始表
                     this.foreachQueryChild(submitNodeList, childList);
@@ -2736,20 +2736,24 @@ public class InformationWriteQueryController extends BladeController {
                                 .orElse("")));
 
         //原始表ids,电签位置信息使用
-        List<Long> oldTabIds = selectedNodeList.stream().filter(f -> new Integer(2).equals(f.getType())).map(WbsTreeContract::getId).collect(Collectors.toList());
+        List<Long> oldTabIds = selectedNodeList.stream().filter(f -> new Integer(2).equals(f.getType())).map(WbsTreePrivate::getId).collect(Collectors.toList());
 
         //构造参数
         if (selectedNodeList.size() > 0) {
             //重塑关键信息
             Map<Long, Long> OldIdToNewIdMap = new HashMap<>();
-            Map<String, WbsTreeContract> nodeMap = new HashMap<>();
+            Map<String, WbsTreePrivate> nodeMap = new HashMap<>();
+            Map<String, WbsTreeContract> nodeMapContract = new HashMap<>();
             selectedNodeList.forEach(half -> {
                 OldIdToNewIdMap.put(half.getId(), SnowFlakeUtil.getId());
                 nodeMap.put(half.getId().toString(), half);
+
+                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(half, WbsTreeContract.class);
+                nodeMapContract.put(half.getId().toString(), wbsTreeContract);
             });
 
             //处理数据
-            for (WbsTreeContract half : selectedNodeList) {
+            for (WbsTreePrivate half : selectedNodeList) {
                 //处理合同段数据
                 WbsTreeContract newData = new WbsTreeContract();
                 BeanUtils.copyProperties(half, newData);
@@ -2766,8 +2770,8 @@ public class InformationWriteQueryController extends BladeController {
                     //当前节点及其子节点操作
                     if (OldIdToNewIdMap.containsKey(half.getParentId())) {
                         //跨节点
-                        WbsTreeContract wbsTreeContract = nodeMap.get(half.getParentId() + "");
-                        if (treeContract.getNodeType().equals(wbsTreeContract.getNodeType()) && treeContract.getNodeName().equals(wbsTreeContract.getNodeName())) {
+                        WbsTreePrivate wbsTreePrivate = nodeMap.get(half.getParentId() + "");
+                        if (treeContract.getNodeType().equals(wbsTreePrivate.getNodeType()) && treeContract.getNodeName().equals(wbsTreePrivate.getNodeName())) {
                             newData.setParentId(treeContract.getId());
                             var = false;
                         }
@@ -2842,7 +2846,8 @@ public class InformationWriteQueryController extends BladeController {
 
                 if (new Integer("6").equals(newData.getNodeType())) {
                     //生成施工日志
-                    this.createLedger(newData, saveLedger, null, nodeMap);
+
+                    this.createLedger(newData, saveLedger, null, nodeMapContract);
                 }
             }
         }
@@ -2883,28 +2888,25 @@ public class InformationWriteQueryController extends BladeController {
         }
     }
 
-    private List<WbsTreeContract> unifiedCode(List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract, String saveType, List<WbsTreePrivate> queryResultP) {
+    private List<WbsTreePrivate> unifiedCode(List<AddContractTreeNodeVO.Node> allSelectedNodeList, WbsTreeContract treeContract, String saveType, List<WbsTreePrivate> queryResultP) {
         //获取项目节点树的主键
         List<Long> halfSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
 
         //获取项目对应的合同段的树原始节点的信息
         List<WbsTreePrivate> query = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id in(" + StringUtils.join(halfSelectedList, ",") + ")", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-        List<Long> projectNodeIds = query.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
-        if (projectNodeIds.size() > 0) {
+        if (query.size() > 0) {
             //返回结果集,匹配节点名称使用
             queryResultP.addAll(query);
 
-            //查询数据
-            List<WbsTreeContract> selectedNodeList = jdbcTemplate.query("select * from m_wbs_tree_contract where contract_id = " + treeContract.getContractId() + " and status = 1 and is_deleted = 0 and id in(" + StringUtils.join(projectNodeIds, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
-
             //剔除与当前操作节点相同的ID,(如果saveType=1,表示当前及子级节点,那么就要剔除自己本身,否则视为仅当前节点操作,会存在自己本身)
             if ("1".equals(saveType)) {
-                selectedNodeList.removeIf(wbsTreePrivate -> {
+                query.removeIf(wbsTreePrivate -> {
                     Long id = wbsTreePrivate.getId();
                     return treeContract.getId() != null && treeContract.getId().equals(id);
                 });
             }
-            return selectedNodeList;
+
+            return query;
         }
 
         return null;
@@ -3015,29 +3017,25 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 处理半选集合
      */
-    private void disposeHalfSelectList(@RequestBody WbsTreeContract treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreeContract> selectedNodeList, List<WbsTreePrivate> queryResultP) {
+    private void disposeHalfSelectList(@RequestBody WbsTreeContract treeContract, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList, List<WbsTreePrivate> queryResultP) {
         if (allSelectedNodeList != null && allSelectedNodeList.size() > 0) {
             //获取主键
             List<Long> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).map(Long::parseLong).distinct().collect(Collectors.toList());
 
             //获取项目对应的合同段的树原始节点的信息
             List<WbsTreePrivate> query = jdbcTemplate.query("select * from m_wbs_tree_private where p_key_id in(" + StringUtils.join(allSelectedList, ",") + ")", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-            List<Long> projectNodeIds = query.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
-            if (projectNodeIds.size() > 0) {
+            if (query.size() > 0) {
                 //返回结果集,匹配节点名称使用
                 queryResultP.addAll(query);
 
-                //查询数据
-                List<WbsTreeContract> allSelectedNodeLists = jdbcTemplate.query("select * from m_wbs_tree_contract where contract_id = " + treeContract.getContractId() + " and status = 1 and is_deleted = 0 and id in(" + StringUtils.join(projectNodeIds, ",") + ")", new BeanPropertyRowMapper<>(WbsTreeContract.class));
-
                 //剔除与当前操作节点相同的ID
-                allSelectedNodeLists.removeIf(wbsTreePrivate -> {
+                query.removeIf(wbsTreePrivate -> {
                     Long id = wbsTreePrivate.getId();
                     return treeContract.getId() != null && treeContract.getId().equals(id);
                 });
 
                 //设置到集合中
-                selectedNodeList.addAll(allSelectedNodeLists);
+                selectedNodeList.addAll(query);
             }
         }
     }
@@ -3048,10 +3046,10 @@ public class InformationWriteQueryController extends BladeController {
      * @param parentList 父节点集合
      * @param childList  保存集合
      */
-    private void foreachQueryChild(List<WbsTreeContract> parentList, List<WbsTreeContract> childList) {
+    private void foreachQueryChild(List<WbsTreePrivate> parentList, List<WbsTreePrivate> childList) {
         parentList.forEach(parent -> {
-            //只获取原始表,不获取复制的表(业务说是从项目wbs处取表,目前直接从当前合同段取原始表,也是一样的
-            List<WbsTreeContract> childS = jdbcTemplate.query("select * from m_wbs_tree_contract where parent_id = " + parent.getId() + " and contract_id = " + parent.getContractId() + " and is_deleted = 0 and is_cope_tab is null", new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            //只获取原始表,不获取复制的表(业务说是从项目wbs处取表)
+            List<WbsTreePrivate> childS = jdbcTemplate.query("select * from m_wbs_tree_private where parent_id = " + parent.getId() + " and project_id = " + parent.getProjectId() + " and wbs_id = " + parent.getWbsId() + " and is_deleted = 0 and status = 1", new BeanPropertyRowMapper<>(WbsTreePrivate.class));
             if (childS.size() > 0) {
                 //添加入结果集
                 childList.addAll(childS);

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/DepartmentPlanLogController.java

@@ -11,6 +11,7 @@ import org.springblade.control.dto.AnnualBudgetDTO;
 import org.springblade.control.entity.DepartmentPlanLog;
 import org.springblade.control.service.IAnnualBudgetService;
 import org.springblade.control.service.IDepartmentPlanLogService;
+import org.springblade.control.vo.DepartmentPlanLogVO;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
@@ -95,7 +96,7 @@ public class DepartmentPlanLogController {
     @PostMapping("/updateOpenTime")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "修改开启计划时间")
-    public R<DepartmentPlanLog> updateOpenTime(@RequestBody DepartmentPlanLog log) {
+    public R<DepartmentPlanLogVO> updateOpenTime(@RequestBody DepartmentPlanLog log) {
         return R.data(logService.updateOpenTime(log));
     }
 

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetController.java

@@ -213,7 +213,7 @@ public class ProjectCostBudgetController {
      * 编辑子计划
      */
     @PostMapping("/updateChildrenPlan")
-    @ApiOperationSupport(order = 15)
+    @ApiOperationSupport(order = 16)
     @ApiOperation(value = "编辑项目计划预算-编辑子计划",notes = "传入主计划,和子计划")
     public R<ProjectCostBudgetVO2> updateChildrenPlan(@RequestBody ProjectCostBudgetVO2 vo2){
         return R.data(budgetService.updateChildrenPlan(vo2));

+ 3 - 5
blade-service/blade-control/src/main/java/org/springblade/control/controller/ProjectCostBudgetStatsController.java

@@ -58,7 +58,7 @@ public class ProjectCostBudgetStatsController {
             @ApiImplicitParam(name = "id", value = "成本预算统计id", required = true),
     })
     public R<ProjectCostBudgetStatsVO> getBudgetStatsById(Long id) {
-        return R.data(budgetStatsService.getBudgetStatsById(id));
+        return R.data(budgetStatsService.getBudgetStatsById(id, null, 2));
     }
 
     /**
@@ -84,8 +84,8 @@ public class ProjectCostBudgetStatsController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "queryValue", value = "搜索值", required = false),
     })
-    public R<List<ProjectCostBudgetStatsVO>> page(String queryValue, Query query){
-        return R.data(budgetStatsService.page(queryValue,query));
+    public R<List<ProjectCostBudgetStatsVO>> page(String queryValue, Query query) {
+        return R.data(budgetStatsService.page(queryValue, query));
     }
 
     /**
@@ -144,6 +144,4 @@ public class ProjectCostBudgetStatsController {
     }
 
 
-
-
 }

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

@@ -90,4 +90,6 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     List<ContractReturnedInfo> getAllReturnedInfo(@Param("projectId") Long id);
 
     DictInfo getTaskType(@Param("id") Long planTaskType);
+
+    User getUserInfo(@Param("userId") Long userId);
 }

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

@@ -89,7 +89,8 @@
                (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0) as budgetTypeValue,
                (select di.dict_name from c_dict_info di where di.type = 1 and di.dict_value = pcb.task_detail and di.parent_id =
                    (select di.id from c_dict_info di where di.type = 1 and di.dict_value = pcb.budget_type and di.parent_id = 0)) as taskDetailValue,
-               (select cpp.name from c_project_process cpp WHERE cpp.id = pcb.project_process) as projectProcessValue
+               (select cpp.name from c_project_process cpp WHERE cpp.id = pcb.project_process) as projectProcessValue,
+               (select di.dict_name from c_dict_info di where di.type = 2 and di.id = pcb.plan_task_type) as planTaskTypeValue
         from c_project_cost_budget pcb
         WHERE pcb.cost_type = #{type}
           and (pcb.plan_start_time BETWEEN #{startDate} AND #{endDate}
@@ -270,6 +271,9 @@
         select * from c_dict_info
         where `type` = 2 and  id = #{id}
     </select>
+    <select id="getUserInfo" resultType="org.springblade.system.user.entity.User">
+        select * from blade_user where id = #{userId}
+    </select>
 
 
 </mapper>

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

@@ -16,7 +16,7 @@
     <select id="page" resultType="org.springblade.control.vo.ProjectCostBudgetStatsVO">
         SELECT cbs.*,cpi.name as projectName,
 --                CASE cbs.status WHEN '0' THEN '未上报' WHEN '1' THEN '已上报' WHEN '2' THEN '已审批' ELSE '已驳回' END as statusValue
-        IF ((select COUNT(1)  from c_project_cost_budget pcb WHERE pcb.project_id = cbs.project_id and pcb.approve = 0)=0,0,1) as 'approveStatus'
+        IF ((select COUNT(1)  from c_project_cost_budget pcb WHERE pcb.project_id = cbs.project_id and pcb.approve = 0 and pcb.parent_id = 0)=0,0,1) as 'approveStatus'
         from c_project_cost_budget_stats cbs left join bladex.c_control_project_info cpi on cbs.project_id = cpi.id
         where cbs.is_deleted = 0
         <if test="queryValue != null and queryValue != ''">

+ 4 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/IDepartmentPlanLogService.java

@@ -3,6 +3,7 @@ package org.springblade.control.service;
 import org.springblade.control.entity.DepartmentMonthPlan;
 import org.springblade.control.entity.DepartmentPlanLog;
 import org.springblade.control.entity.DictInfo;
+import org.springblade.control.vo.DepartmentPlanLogVO;
 import org.springblade.control.vo.ProjectCostBudgetVO;
 import org.springblade.core.mp.base.BaseService;
 
@@ -26,5 +27,7 @@ public interface IDepartmentPlanLogService extends BaseService<DepartmentPlanLog
 
     void savePlanInOpen(DepartmentPlanLog log);
 
-    DepartmentPlanLog updateOpenTime(DepartmentPlanLog log);
+    DepartmentPlanLogVO updateOpenTime(DepartmentPlanLog log);
+
+    DepartmentPlanLog getNewestTaskLog(Long planId);
 }

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

@@ -30,6 +30,8 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
 
     List<ProjectCostBudget> budgetListByProjectId(Long projectId);
 
+    List<ProjectCostBudget> budgetListByProjectId2(List<Long> ids);
+
     void deleteByProjectId(Long projectId);
     //分页获取列表
     List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query);
@@ -81,4 +83,7 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     ProjectCostBudgetVO2 updateMainPlan(ProjectCostBudgetVO2 vo2);
 
     ProjectCostBudgetVO2 updateChildrenPlan(ProjectCostBudgetVO2 vo2);
+
+    //任务审批完成闭环时,计算当前任务的实际用时和人工成本,传入任务id和任务实际完成时间
+    void taskFinishedStats(Long PlanId,LocalDate practicalFinishTime);
 }

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

@@ -20,7 +20,7 @@ public interface IProjectCostBudgetStatsService extends BaseService<ProjectCostB
 
     void AddOrUpdate(ProjectCostBudgetStatsDTO dto);
 
-    ProjectCostBudgetStatsVO getBudgetStatsById(Long id);
+    ProjectCostBudgetStatsVO getBudgetStatsById(Long id, List<Long> ids, Integer type);
 
     void deleteByProjectId(Long id);
 

+ 24 - 5
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java

@@ -88,8 +88,8 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
         queryWrapper.eq(AttendanceTripInfo::getIsTemp, 0); //暂存
         List<AttendanceTripInfo> list = baseMapper.selectList(queryWrapper);
         Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
-        List<String> dataIds = list.stream().map(AttendanceTripInfo::getId).map(String::valueOf).collect(Collectors.toList());
 
+        List<String> dataIds = list.stream().map(AttendanceTripInfo::getId).map(String::valueOf).collect(Collectors.toList());
         List<EMDraftGroupVO> resultList = new LinkedList<>();
         if (dataIds.size() > 0) {
             List<ExDraftRecord> query = jdbcTemplate.query("select * from c_ex_draft_record where data_type = 9 and data_id in(" + StringUtils.join(dataIds, ",") + ")", new BeanPropertyRowMapper<>(ExDraftRecord.class));
@@ -97,15 +97,34 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
             for (Map.Entry<Long, List<ExDraftRecord>> listEntry : groupMaps.entrySet()) {
                 Long groupId = listEntry.getKey();
                 List<Long> ids = listEntry.getValue().stream().map(ExDraftRecord::getDataId).collect(Collectors.toList());
-                AttendanceTripInfo obj = baseMapper.selectById(ids.get(0));
+                AttendanceTripInfo obj = list.stream().filter(f -> f.getId().equals(ids.get(0))).findAny().orElse(null);
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
                     userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
+                    vo.setGroupId(groupId);
+                    vo.setEMDraftIds(StringUtils.join(ids, ","));
+                    resultList.add(vo);
+                }
+            }
+
+            //除去分组的,剩下的都是单独的草稿
+            List<String> dataIdsGroup = query.stream().map(ExDraftRecord::getDataId).map(String::valueOf).collect(Collectors.toList());
+            List<String> dataIdsOne = dataIds.stream()
+                    .filter(f -> !dataIdsGroup.contains(f))
+                    .collect(Collectors.toList());
+            if (dataIdsOne.size() > 0) {
+                List<AttendanceTripInfo> attendanceTripInfosOne = list.stream().filter(f -> dataIdsOne.contains(f.getId() + "")).collect(Collectors.toList());
+                for (AttendanceTripInfo obj : attendanceTripInfosOne) {
+                    EMDraftGroupVO vo = new EMDraftGroupVO();
+                    if (obj != null) {
+                        userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
+                        vo.setUpdateTime(obj.getUpdateTime());
+                        vo.setGroupId(obj.getId());
+                        vo.setEMDraftIds(obj.getId() + "");
+                        resultList.add(vo);
+                    }
                 }
-                vo.setGroupId(groupId);
-                vo.setEMDraftIds(StringUtils.join(ids, ","));
-                resultList.add(vo);
             }
         }
         return resultList.stream()

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

@@ -140,7 +140,7 @@ public class DepartmentMonthPlanServiceImpl extends BaseServiceImpl<DepartmentMo
                     planLog.setPlanStartTime(budget.getPlanStartTime());
                     planLog.setPlanEndTime(budget.getPlanEndTime());
                     planLog.setRealPlanStartTime(LocalDate.now());
-                    planLog.setPlanDays(budget.getPlanDays());
+                    planLog.setPlanDays(budget.getPlanDays().intValue());
                     planLog.setSort(1);
                     logService.save(planLog);
                     //修改计划状态为进行中

+ 55 - 8
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/DepartmentPlanLogImpl.java

@@ -6,8 +6,10 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.control.entity.DepartmentPlanLog;
 import org.springblade.control.mapper.DepartmentPlanLogMapper;
 import org.springblade.control.service.*;;
+import org.springblade.control.vo.DepartmentPlanLogVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
@@ -49,15 +51,30 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
         //计算暂停日期和,中途开启计划的开始日期,之前的工作天数,如果是第一次暂停,则中途开启为null,则计算计划实际开始日期
         int days;
         if (log.getOpenPlanStartTime() != null){
-            days = CommonUtil.getWorkDays(log.getOpenPlanStartTime(),log.getPauseTime());
+            //如果在开启当天暂停,则工时为0
+            if (log.getOpenPlanStartTime().compareTo(log.getPauseTime()) == 0){
+                days = 0;
+            }else {
+                days = CommonUtil.getWorkDays(log.getOpenPlanStartTime(), log.getPauseTime());
+                if (days != 0){
+                    days -= 1;
+                }
+            }
         }else {
-            days = CommonUtil.getWorkDays(log.getRealPlanStartTime(),log.getPauseTime());
+            if (log.getRealPlanStartTime().compareTo(log.getPauseTime()) == 0){
+                days = 0;
+            }else {
+                days = CommonUtil.getWorkDays(log.getRealPlanStartTime(), log.getPauseTime());
+                if (days != 0){
+                    days -= 1;
+                }
+            }
         }
         //更新计划实际工作日期,如果是第一次暂停则默认为0+
         if (log.getRealWorkDays() == null){
-            log.setRealWorkDays(new BigDecimal("0"));
+            log.setRealWorkDays(0);
         }
-        log.setRealWorkDays(log.getRealWorkDays().add(new BigDecimal(days)));
+        log.setRealWorkDays(log.getRealWorkDays() + days);
         return log;
     }
 
@@ -70,6 +87,15 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
         if (log.getPauseTime() == null){
             throw new ServiceException("请输入暂停时间");
         }
+//        if (log.getOpenPlanStartTime() == null){
+//            if (log.getPauseTime().compareTo(log.getRealPlanStartTime()) == 0){
+//                throw new ServiceException("不能在计划开启当天暂停");
+//            }
+//        }else {
+//            if (log.getPauseTime().compareTo(log.getOpenPlanStartTime()) == 0){
+//                throw new ServiceException("不能在计划开启当天暂停");
+//            }
+//        }
         log.setId(null);
         log.setSort(log.getSort()+1);
         log.setStatus(0);
@@ -102,7 +128,7 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
         //设置中途暂停结束时间,则为暂停时间
         log.setPausePlanEndTime(LocalDate.now());
         //计算剩余工作量
-        BigDecimal days = log.getPlanDays().subtract(log.getRealWorkDays());
+        int days = log.getPlanDays() - log.getRealWorkDays();
         //如果剩余天数大于0,才设置默认值
 //        if (days.intValue() > 0) {
 //            //设置默认,开启计划开启时间为今天
@@ -140,10 +166,31 @@ public class DepartmentPlanLogImpl extends BaseServiceImpl<DepartmentPlanLogMapp
      * @return
      */
     @Override
-    public DepartmentPlanLog updateOpenTime(DepartmentPlanLog log) {
+    public DepartmentPlanLogVO updateOpenTime(DepartmentPlanLog log) {
+        DepartmentPlanLogVO vo = new DepartmentPlanLogVO();
+        //先判断日期是否超过35天
+        if (log.getOpenPlanStartTime().until(log.getOpenPlanEndTime(), ChronoUnit.DAYS) > 35) {
+            throw new ServiceException("请不要制定超过一个月的临时计划");
+        }
         //计算中途开启的工作日
         int planDays = CommonUtil.getWorkDays(log.getOpenPlanStartTime(), log.getOpenPlanEndTime());
-        log.setOpenPlanStartEndDays(new BigDecimal(planDays));
-        return log;
+        log.setOpenPlanStartEndDays(planDays);
+        BeanUtils.copyProperties(log,vo);
+        if ((planDays + vo.getRealWorkDays()) > vo.getPlanDays()) {
+            vo.setIsShowTips(1);
+        }else {
+            vo.setIsShowTips(0);
+        }
+        return vo;
+    }
+
+    /**
+     * 根据计划id获取计划的最新一条日志
+     * @param planId
+     * @return
+     */
+    @Override
+    public DepartmentPlanLog getNewestTaskLog(Long planId) {
+        return baseMapper.getNewestPlanLog(planId);
     }
 }

+ 23 - 4
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -99,15 +99,34 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
             for (Map.Entry<Long, List<ExDraftRecord>> listEntry : groupMaps.entrySet()) {
                 Long groupId = listEntry.getKey();
                 List<Long> ids = listEntry.getValue().stream().map(ExDraftRecord::getDataId).collect(Collectors.toList());
-                EMFinancialReimbursementInfo obj = baseMapper.selectById(ids.get(0));
+                EMFinancialReimbursementInfo obj = list.stream().filter(f -> f.getId().equals(ids.get(0))).findAny().orElse(null);
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
                     userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的财务报销" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
+                    vo.setGroupId(groupId);
+                    vo.setEMDraftIds(StringUtils.join(ids, ","));
+                    resultList.add(vo);
+                }
+            }
+
+            //除去分组的,剩下的都是单独的草稿
+            List<String> dataIdsGroup = query.stream().map(ExDraftRecord::getDataId).map(String::valueOf).collect(Collectors.toList());
+            List<String> dataIdsOne = dataIds.stream()
+                    .filter(f -> !dataIdsGroup.contains(f))
+                    .collect(Collectors.toList());
+            if (dataIdsOne.size() > 0) {
+                List<EMFinancialReimbursementInfo> emFinancialReimbursementInfosOne = list.stream().filter(f -> dataIdsOne.contains(f.getId() + "")).collect(Collectors.toList());
+                for (EMFinancialReimbursementInfo obj : emFinancialReimbursementInfosOne) {
+                    EMDraftGroupVO vo = new EMDraftGroupVO();
+                    if (obj != null) {
+                        userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
+                        vo.setUpdateTime(obj.getUpdateTime());
+                        vo.setGroupId(obj.getId());
+                        vo.setEMDraftIds(obj.getId() + "");
+                        resultList.add(vo);
+                    }
                 }
-                vo.setGroupId(groupId);
-                vo.setEMDraftIds(StringUtils.join(ids, ","));
-                resultList.add(vo);
             }
         }
         return resultList.stream()

+ 23 - 4
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -86,15 +86,34 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
             for (Map.Entry<Long, List<ExDraftRecord>> listEntry : groupMaps.entrySet()) {
                 Long groupId = listEntry.getKey();
                 List<Long> ids = listEntry.getValue().stream().map(ExDraftRecord::getDataId).collect(Collectors.toList());
-                EMPurchaseInfo obj = baseMapper.selectById(ids.get(0));
+                EMPurchaseInfo obj = list.stream().filter(f -> f.getId().equals(ids.get(0))).findAny().orElse(null);
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
                     userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的采购申请" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
+                    vo.setGroupId(groupId);
+                    vo.setEMDraftIds(StringUtils.join(ids, ","));
+                    resultList.add(vo);
+                }
+            }
+
+            //除去分组的,剩下的都是单独的草稿
+            List<String> dataIdsGroup = query.stream().map(ExDraftRecord::getDataId).map(String::valueOf).collect(Collectors.toList());
+            List<String> dataIdsOne = dataIds.stream()
+                    .filter(f -> !dataIdsGroup.contains(f))
+                    .collect(Collectors.toList());
+            if (dataIdsOne.size() > 0) {
+                List<EMPurchaseInfo> emPurchaseInfosOne = list.stream().filter(f -> dataIdsOne.contains(f.getId() + "")).collect(Collectors.toList());
+                for (EMPurchaseInfo obj : emPurchaseInfosOne) {
+                    EMDraftGroupVO vo = new EMDraftGroupVO();
+                    if (obj != null) {
+                        userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
+                        vo.setUpdateTime(obj.getUpdateTime());
+                        vo.setGroupId(obj.getId());
+                        vo.setEMDraftIds(obj.getId() + "");
+                        resultList.add(vo);
+                    }
                 }
-                vo.setGroupId(groupId);
-                vo.setEMDraftIds(StringUtils.join(ids, ","));
-                resultList.add(vo);
             }
         }
         return resultList.stream()

+ 23 - 4
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

@@ -98,15 +98,34 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
             for (Map.Entry<Long, List<ExDraftRecord>> listEntry : groupMaps.entrySet()) {
                 Long groupId = listEntry.getKey();
                 List<Long> ids = listEntry.getValue().stream().map(ExDraftRecord::getDataId).collect(Collectors.toList());
-                EMUseCarInfo obj = baseMapper.selectById(ids.get(0));
+                EMUseCarInfo obj = list.stream().filter(f -> f.getId().equals(ids.get(0))).findAny().orElse(null);
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
                     userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的用车申请" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
+                    vo.setGroupId(groupId);
+                    vo.setEMDraftIds(StringUtils.join(ids, ","));
+                    resultList.add(vo);
+                }
+            }
+
+            //除去分组的,剩下的都是单独的草稿
+            List<String> dataIdsGroup = query.stream().map(ExDraftRecord::getDataId).map(String::valueOf).collect(Collectors.toList());
+            List<String> dataIdsOne = dataIds.stream()
+                    .filter(f -> !dataIdsGroup.contains(f))
+                    .collect(Collectors.toList());
+            if (dataIdsOne.size() > 0) {
+                List<EMUseCarInfo> emUseCarInfosOne = list.stream().filter(f -> dataIdsOne.contains(f.getId() + "")).collect(Collectors.toList());
+                for (EMUseCarInfo obj : emUseCarInfosOne) {
+                    EMDraftGroupVO vo = new EMDraftGroupVO();
+                    if (obj != null) {
+                        userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
+                        vo.setUpdateTime(obj.getUpdateTime());
+                        vo.setGroupId(obj.getId());
+                        vo.setEMDraftIds(obj.getId() + "");
+                        resultList.add(vo);
+                    }
                 }
-                vo.setGroupId(groupId);
-                vo.setEMDraftIds(StringUtils.join(ids, ","));
-                resultList.add(vo);
             }
         }
         return resultList.stream()

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -407,7 +407,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
         }
 
         //获取部门负责人信息
-        User departmentHead = taskProcessService.getDepartmentHead(task.getDeptId());
+        //User departmentHead = taskProcessService.getDepartmentHead(task.getDeptId());
+        User departmentHead = taskProcessService.getDepartmentHead(Long.parseLong(SecureUtil.getDeptId()));  //当前用户的部门
         if (departmentHead != null) {
             //修改计划任务的状态为已完成
             ProjectCostBudget obj = projectCostBudgetServiceImpl.getById(taskId);

+ 289 - 188
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -12,8 +12,10 @@ import org.springblade.control.dto.ControlProjectInfoDTO;
 import org.springblade.control.dto.ProjectCostBudgetDTO;
 import org.springblade.control.dto.ProjectCostBudgetStatsDTO;
 import org.springblade.control.entity.*;
+import org.springblade.control.mapper.DepartmentPlanLogMapper;
 import org.springblade.control.mapper.ProjectCostBudgetMapper;
 import org.springblade.control.mapper.ProjectInfoMapper;
+import org.springblade.control.service.IDepartmentPlanLogService;
 import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.service.IProjectInfoService;
 import org.springblade.control.service.IProjectProcessService;
@@ -43,13 +45,15 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBudgetMapper, ProjectCostBudget> implements IProjectCostBudgetService {
 
-//    private final IProjectInfoService projectInfoService;
+    private final DepartmentPlanLogMapper logMapper;
 
     private final ProjectInfoMapper infoMapper;
 
     private final ProjectCostBudgetMapper budgetMapper;
+
     /**
      * 批量新增或修改预算
+     *
      * @param dto
      */
     @Override
@@ -57,48 +61,48 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     public ProjectCostBudgetStats batchAddOrUpdate(ProjectCostBudgetStatsDTO dto) {
         List<ProjectCostBudget> allBudget = new ArrayList<>();
         //施工单位
-        if (dto.getBuildUnit() != null && dto.getBuildUnit().size() > 0){
-            dto.getBuildUnit().stream().forEach(l->{
-                if (l.getDeptId() == null){
+        if (dto.getBuildUnit() != null && dto.getBuildUnit().size() > 0) {
+            dto.getBuildUnit().stream().forEach(l -> {
+                if (l.getDeptId() == null) {
                     throw new ServiceException("请选择费用分摊部门");
                 }
-                if (l.getCostType() == null){
+                if (l.getCostType() == null) {
                     throw new ServiceException("请选择费用分类");
                 }
-                if (l.getProjectProcess() == null){
+                if (l.getProjectProcess() == null) {
                     throw new ServiceException("请选择项目环节");
                 }
-                if (l.getBudgetDays() == null){
+                if (l.getBudgetDays() == null) {
                     throw new ServiceException("请填写预计工作量");
                 }
-                if (l.getPostType() == null){
+                if (l.getPostType() == null) {
                     throw new ServiceException("请选择岗位类型");
                 }
-                if (l.getStaffCount() == null){
+                if (l.getStaffCount() == null) {
                     throw new ServiceException("请填写投入人员数量");
                 }
-                if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
+                if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)) {
                     return;
                 }
-              l.setProjectId(dto.getProjectId());
-              l.setUnitType(1);
-              countMoney(l);
+                l.setProjectId(dto.getProjectId());
+                l.setUnitType(1);
+                countMoney(l);
             });
             allBudget.addAll(dto.getBuildUnit());
         }
         //监理单位
-        if (dto.getSupervisorUnit() != null && dto.getSupervisorUnit().size() > 0){
-            dto.getSupervisorUnit().stream().forEach(l->{
-                if (l.getDeptId() == null){
+        if (dto.getSupervisorUnit() != null && dto.getSupervisorUnit().size() > 0) {
+            dto.getSupervisorUnit().stream().forEach(l -> {
+                if (l.getDeptId() == null) {
                     throw new ServiceException("请选择费用分摊部门");
                 }
-                if (l.getCostType() == null){
+                if (l.getCostType() == null) {
                     throw new ServiceException("请选择费用分类");
                 }
-                if (l.getProjectProcess() == null){
+                if (l.getProjectProcess() == null) {
                     throw new ServiceException("请选择项目环节");
                 }
-                if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
+                if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)) {
                     return;
                 }
                 l.setProjectId(dto.getProjectId());
@@ -108,18 +112,18 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             allBudget.addAll(dto.getSupervisorUnit());
         }
         //建设单位
-        if (dto.getConstructUnit() != null && dto.getConstructUnit().size() > 0){
-            dto.getConstructUnit().stream().forEach(l->{
-                if (l.getDeptId() == null){
+        if (dto.getConstructUnit() != null && dto.getConstructUnit().size() > 0) {
+            dto.getConstructUnit().stream().forEach(l -> {
+                if (l.getDeptId() == null) {
                     throw new ServiceException("请选择费用分摊部门");
                 }
-                if (l.getCostType() == null){
+                if (l.getCostType() == null) {
                     throw new ServiceException("请选择费用分类");
                 }
-                if (l.getProjectProcess() == null){
+                if (l.getProjectProcess() == null) {
                     throw new ServiceException("请选择项目环节");
                 }
-                if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)){
+                if (l.getApprove() != null && (l.getApprove() == 1 || l.getApprove() == 2)) {
                     return;
                 }
                 l.setProjectId(dto.getProjectId());
@@ -137,6 +141,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 项目预算列表,默认所有
+     *
      * @param costBudget
      * @return
      */
@@ -147,18 +152,33 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 查询项目下所有预算明细
+     *
      * @param projectId
      * @return
      */
     @Override
     public List<ProjectCostBudget> budgetListByProjectId(Long projectId) {
-        return this.list(new LambdaQueryWrapper<ProjectCostBudget>().eq(ProjectCostBudget::getProjectId,projectId).eq(ProjectCostBudget::getParentId,0));
+        return this.list(new LambdaQueryWrapper<ProjectCostBudget>().eq(ProjectCostBudget::getProjectId, projectId).eq(ProjectCostBudget::getParentId, 0));
 
     }
 
+    /**
+     * 查询项目下所有预算明细
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> budgetListByProjectId2(List<Long> ids) {
+        return this.list(new LambdaQueryWrapper<ProjectCostBudget>()
+                .in(ProjectCostBudget::getId, ids)
+                .eq(ProjectCostBudget::getParentId, 0));
+    }
+
 
     /**
      * 根据项目id删除项目
+     *
      * @param projectId
      */
     @Override
@@ -169,11 +189,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     @Override
     public List<ControlProjectInfoVO> page(ControlProjectInfoDTO dto, Query query) {
         IPage page = new Page(query.getCurrent(), query.getSize());
-        return baseMapper.page(page,dto);
+        return baseMapper.page(page, dto);
     }
 
     /**
      * 获取项目计划
+     *
      * @param id
      * @return
      */
@@ -187,51 +208,51 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         //获取所有岗位信息
         List<DictInfo> allPostType = baseMapper.getAllPostType();
         Map<Long, List<DictInfo>> postMap = new HashMap<>();
-        if (allPostType != null && allPostType.size() >0){
+        if (allPostType != null && allPostType.size() > 0) {
             postMap = allPostType.parallelStream()
                     .collect(Collectors.groupingBy(DictInfo::getId));
-        }else {
+        } else {
             throw new ServiceException("参数配置暂无岗位信息");
         }
         //获取所有任务信息
         List<DictInfo> allTaskInfo = baseMapper.getAllTaskInfo();
         Map<Long, List<DictInfo>> taskMap = new HashMap<>();
-        if (allPostType != null && allPostType.size() >0){
+        if (allPostType != null && allPostType.size() > 0) {
             taskMap = allTaskInfo.parallelStream()
                     .collect(Collectors.groupingBy(DictInfo::getId));
-        }else {
+        } else {
             throw new ServiceException("参数配置暂无任务信息");
         }
         //获取项目下所有计划关联回款信息
         List<PlanRelationReturned> allRelationInfo = baseMapper.getAllRelationInfo(id);
         Map<Long, List<PlanRelationReturned>> relationMap = null;
-        if (allRelationInfo != null && allRelationInfo.size() > 0){
+        if (allRelationInfo != null && allRelationInfo.size() > 0) {
             relationMap = allRelationInfo.parallelStream()
                     .collect(Collectors.groupingBy(PlanRelationReturned::getPlanId));
         }
         //获取项目下所有回款信息
         List<ContractReturnedInfo> allReturnedInfo = baseMapper.getAllReturnedInfo(id);
         Map<Long, List<ContractReturnedInfo>> returnedMap = null;
-        if (allReturnedInfo != null && allReturnedInfo.size() > 0){
+        if (allReturnedInfo != null && allReturnedInfo.size() > 0) {
             returnedMap = allReturnedInfo.parallelStream()
                     .collect(Collectors.groupingBy(ContractReturnedInfo::getId));
         }
         //获取项目下所有已审批的计划
         List<ProjectCostBudgetVO2> list = baseMapper.getApprovePlan(id);
         for (ProjectCostBudgetVO2 l : list) {
-            if (l.getPlanTaskType() != null || l.getPlanDays() != null || l.getPlanStartTime() != null || l.getPlanEndTime() != null){
+            if (l.getPlanTaskType() != null || l.getPlanDays() != null || l.getPlanStartTime() != null || l.getPlanEndTime() != null) {
                 l.setIsShowChildren(0);
-            }else {
+            } else {
                 l.setIsShowChildren(1);
             }
-            if (relationMap != null){
+            if (relationMap != null) {
                 List<PlanRelationReturned> returnedList = relationMap.get(l.getId());
-                if (returnedList != null && returnedList.size() > 0){
+                if (returnedList != null && returnedList.size() > 0) {
                     StringBuilder str = new StringBuilder();
                     int j = 1;
                     for (PlanRelationReturned returned : returnedList) {
                         ContractReturnedInfo info = returnedMap.get(returned.getReturnedId()).get(0);
-                        str.append(j+"."+info.getReturnedCondition()+"。");
+                        str.append(j + "." + info.getReturnedCondition() + "、");
                     }
                     l.setReturnedValue(str.toString());
                 }
@@ -240,7 +261,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         //获取项目下所有的子计划
         List<ProjectCostBudgetVO2> childrenList = baseMapper.getAllChildrenPlan(id);
         //有子计划就插入父计划,没有子计划直接跳过
-        if (childrenList != null && childrenList.size() >0) {
+        if (childrenList != null && childrenList.size() > 0) {
             //把子计划按parentId分组
             Map<Long, List<ProjectCostBudgetVO2>> listMap = childrenList.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getParentId));
@@ -248,7 +269,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             //循环所有父计划
             for (ProjectCostBudgetVO2 vo2 : list) {
                 if (vo2.getTaskApprove() == 1) {
-                        vo2.setTaskFinishedStatus(2);
+                    vo2.setTaskFinishedStatus(2);
                 }
                 //如果子计划,把子计划插入计划里
                 if (key.contains(vo2.getId())) {
@@ -264,12 +285,12 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     Boolean isFinished = true;
                     int j = 1;
                     for (ProjectCostBudgetVO2 budgetVO2 : vo2List) {
-                        if (budgetVO2.getTaskApprove() != 1){
+                        if (budgetVO2.getTaskApprove() != 1) {
                             isFinished = false;
                         }
-                        if (budgetVO2.getStatus() == 1){
+                        if (budgetVO2.getStatus() == 1) {
                             budgetVO2.setIsShowDelete(1);
-                        }else {
+                        } else {
                             budgetVO2.setIsShowDelete(0);
                         }
                         //计算总天数
@@ -277,20 +298,20 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             workDays = workDays.add(budgetVO2.getPlanDays());
                         }
                         //计算最大日期和最小日期
-                        if (budgetVO2.getPlanStartTime().isBefore(startDate)){
+                        if (budgetVO2.getPlanStartTime().isBefore(startDate)) {
                             startDate = budgetVO2.getPlanStartTime();
                         }
-                        if (budgetVO2.getPlanEndTime().isAfter(endDate)){
+                        if (budgetVO2.getPlanEndTime().isAfter(endDate)) {
                             endDate = budgetVO2.getPlanEndTime();
                         }
                         //拼接子计划的任务描述
-                        descStr.append(j + "."+budgetVO2.getPlanTaskDesc()+"。");
+                        descStr.append(j + "." + budgetVO2.getPlanTaskDesc() + "、");
                         //拼接子计划的完成指标
-                        targetStr.append(j+"."+budgetVO2.getPlanTarget()+"。");
+                        targetStr.append(j + "." + budgetVO2.getPlanTarget() + "、");
                         j++;
                     }
                     //所有子计划完成,设置父计划为绿色
-                    if (isFinished){
+                    if (isFinished) {
                         vo2.setTaskFinishedStatus(2);
                     }
 
@@ -306,10 +327,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     vo2.setPlanStartTime(startDate);
                     vo2.setPlanEndTime(endDate);
                     //根据任务类型设置父计划的工作天数,固定任务1,临时任务2
-                    if (taskMap.get(vo2.getPlanTaskType()).get(0).getDictValue().intValue() == 1){
+                    if (taskMap.get(vo2.getPlanTaskType()).get(0).getDictValue().intValue() == 2) {
                         vo2.setPlanDays(new BigDecimal(endDate.compareTo(startDate) + 1));
-                    }else {
-                        if (startDate.until(endDate,ChronoUnit.DAYS) > 35){
+                    } else {
+                        if (startDate.until(endDate, ChronoUnit.DAYS) > 35) {
                             throw new ServiceException("请不要制定超过一个月的临时计划");
 //                            //工作天数,工具只能获取50天之内的
 //                            int i = 0;
@@ -318,58 +339,58 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 //                                startDate = startDate.plusDays(36L);
 //                            }
 //                            vo2.setPlanDays(new BigDecimal(i));
-                        }else {
+                        } else {
                             vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(startDate, endDate)));
                         }
                     }
                     //如果计划已经完成,则不计算超预算
-                    if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
-                        if (workDays.intValue() > vo2.getBudgetDays().intValue()) {
+                    if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null) {
+                        if (workDays.intValue() > vo2.getBudgetDays().multiply(vo2.getStaffCount()).intValue()) {
                             vo2.setTaskFinishedStatus(1);
-                            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(workDays.intValue() - vo2.getBudgetDays().intValue())+"天)");
+                            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (workDays.intValue() - vo2.getBudgetDays().intValue()) + "天)");
                         }
                     }
                     vo2.setChildrenList(listMap.get(vo2.getId()));
-                }else {
+                } else {
                     //如果计划的status为2,3,4,或者计划有子计划,则不能编辑
-                    if (vo2.getStatus() == 1){
+                    if (vo2.getStatus() == 1) {
                         vo2.setIsShowEdit(1);
-                    }else {
+                    } else {
                         vo2.setIsShowEdit(0);
                     }
                     //没有子计划,则计算父计划成本是否超过测算,如果计划没有完成,有选择日期,有员工支出,则判断
-                    if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null){
+                    if (vo2.getTaskFinishedStatus() == null && vo2.getPlanDays() != null && vo2.getBudgetDays() != null) {
                         if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()) {
                             vo2.setTaskFinishedStatus(1);
-                            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
+                            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue()) + "天)");
                         }
                     }
                 }
             }
-        }else {
+        } else {
             //没有子计划也要为父计划设置颜色,是否显示编辑,是否显示分解子计划
             for (ProjectCostBudgetVO2 vo2 : list) {
                 //设置颜色,已完成绿色,并且不能编辑,不能分解子计划
-                if (vo2.getTaskApprove() == 1){
+                if (vo2.getTaskApprove() == 1) {
                     vo2.setTaskFinishedStatus(2);
                     vo2.setIsShowChildren(0);
                     vo2.setIsShowEdit(0);
-                }else {
+                } else {
                     //如果计划正在进行就不能编辑
-                    if (vo2.getStatus() == 1){
+                    if (vo2.getStatus() == 1) {
                         vo2.setIsShowEdit(1);
-                    }else {
+                    } else {
                         vo2.setIsShowEdit(0);
                     }
                     //如果已经填写了任务类型和选择了任务时间,就不显示子计划
-                    if (vo2.getPostType() != null && vo2.getPlanDays() != null){
+                    if (vo2.getPostType() != null && vo2.getPlanDays() != null) {
                         vo2.setIsShowChildren(0);
                         //计算是否超过预算
-                        if ((vo2.getPlanDays().multiply(new BigDecimal(postMap.get(vo2.getPostType()).get(0).getDictValue()))).compareTo(vo2.getBudgetStaffCost()) == 1){
+                        if ((vo2.getPlanDays().multiply(new BigDecimal(postMap.get(vo2.getPostType()).get(0).getDictValue()))).compareTo(vo2.getBudgetStaffCost()) == 1) {
                             vo2.setTaskFinishedStatus(1);
-                            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+"天)");
+                            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue()) + "天)");
                         }
-                    }else {
+                    } else {
                         vo2.setIsShowChildren(1);
                     }
 
@@ -381,17 +402,17 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         Map<Integer, List<ProjectCostBudgetVO2>> map = list.parallelStream()
                 .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getUnitType));
         //在相同单位下,根据部门分类,1施工,2监理,3建设
-        if (map.get(1) != null && map.get(1).size() > 0){
+        if (map.get(1) != null && map.get(1).size() > 0) {
             Map<Integer, List<ProjectCostBudgetVO2>> build = map.get(1).parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getCostType));
             vo.setBuildUnit(build);
         }
-        if (map.get(2) != null && map.get(2).size() > 0){
+        if (map.get(2) != null && map.get(2).size() > 0) {
             Map<Integer, List<ProjectCostBudgetVO2>> supervisor = map.get(2).parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getCostType));
             vo.setSupervisorUnit(supervisor);
         }
-        if (map.get(3) != null && map.get(3).size() > 0){
+        if (map.get(3) != null && map.get(3).size() > 0) {
             Map<Integer, List<ProjectCostBudgetVO2>> construct = map.get(3).parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudgetVO2::getCostType));
             vo.setConstructUnit(construct);
@@ -426,7 +447,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         //把所有子计划分离出来,并且设置父类id
         for (ProjectCostBudgetVO2 vo2 : list) {
             List<ProjectCostBudgetVO2> vo2ChildrenList = vo2.getChildrenList();
-            if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
+            if (vo2ChildrenList != null && vo2ChildrenList.size() > 0) {
                 for (ProjectCostBudget budget : vo2ChildrenList) {
                     budget.setProjectId(vo.getProjectId());
                     budget.setParentId(vo2.getId());
@@ -438,7 +459,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                     budget.setTaskDetail(vo2.getTaskDetail());
                 }
                 childrenList.addAll(vo2ChildrenList);
-            }else {
+            } else {
                 //无子计划
                 ProjectCostBudget budget = new ProjectCostBudget();
                 BeanUtils.copyProperties(vo2, budget);
@@ -455,6 +476,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 根据部门类型和日期查询计划
+     *
      * @param type
      * @param date
      * @return
@@ -467,28 +489,37 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         int month = Integer.parseInt(split[1]);
         LocalDate startDate;
         LocalDate endDate;
-        startDate =  LocalDate.of(year,month,1);
-        if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)){
-            endDate =  LocalDate.of(year,month,31);
-        }else {
+        startDate = LocalDate.of(year, month, 1);
+        if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)) {
+            endDate = LocalDate.of(year, month, 31);
+        } else {
             if (month != 2) {
                 endDate = LocalDate.of(year, month, 30);
-            }else {
-                if (year % 4 == 0){
+            } else {
+                if (year % 4 == 0) {
                     endDate = LocalDate.of(year, month, 29);
-                }else {
+                } else {
                     endDate = LocalDate.of(year, month, 28);
                 }
             }
         }
         List<ProjectCostBudgetVO> departmentPlan = baseMapper.getDepartmentPlan(type, startDate, endDate);
-        if (departmentPlan != null && departmentPlan.size() > 0){
+        List<DictInfo> allTaskInfo = budgetMapper.getAllTaskInfo();
+        Map<Long, List<DictInfo>> taskMap = new HashMap<>();
+        if (allTaskInfo != null && allTaskInfo.size() > 0) {
+            taskMap = allTaskInfo.parallelStream()
+                    .collect(Collectors.groupingBy(DictInfo::getId));
+        } else {
+            throw new ServiceException("请选择任务类型");
+        }
+        if (departmentPlan != null && departmentPlan.size() > 0) {
             for (ProjectCostBudgetVO vo : departmentPlan) {
-                if (vo.getStatus() == 1 || vo.getStatus() == 4){
+                //如果计划未开始,或者已完成,或者是固定计划,则不显示开启暂停
+                if (vo.getStatus() == 1 || vo.getStatus() == 4 || taskMap.get(vo.getPlanTaskType()).get(0).getDictValue() == 2) {
                     vo.setStartOrStop(0);
-                }else if (vo.getStatus() == 2){
+                } else if (vo.getStatus() == 2) {
                     vo.setStartOrStop(1);
-                }else {
+                } else {
                     vo.setStartOrStop(2);
                 }
             }
@@ -498,23 +529,24 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 根据id修改状态
+     *
      * @param id
      * @param status
      */
     @Override
     public void updateStatus(Long id, int status) {
-        baseMapper.updateStatus(id,status);
+        baseMapper.updateStatus(id, status);
     }
 
     /**
      * 根据起止日期获取工作日
      */
     @Override
-    public Integer getWorkDays(LocalDate startDate, LocalDate endDate,Long planTaskType) {
+    public Integer getWorkDays(LocalDate startDate, LocalDate endDate, Long planTaskType) {
         DictInfo info = baseMapper.getTaskType(planTaskType);
-        if (info.getDictValue().intValue() == 1){
-            return new BigDecimal(startDate.until(endDate,ChronoUnit.DAYS)).intValue() + 1 ;
-        }else {
+        if (info.getDictValue().intValue() == 2) {
+            return new BigDecimal(startDate.until(endDate, ChronoUnit.DAYS)).intValue() + 1;
+        } else {
             return CommonUtil.getWorkDays(startDate, endDate);
         }
     }
@@ -542,16 +574,16 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         int month = Integer.parseInt(split[1]);
         LocalDate startDate;
         LocalDate endDate;
-        startDate =  LocalDate.of(year,month,1);
-        if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)){
-            endDate =  LocalDate.of(year,month,31);
-        }else {
+        startDate = LocalDate.of(year, month, 1);
+        if (Arrays.asList("1,3,5,7,8,10,12".split(",")).contains(month)) {
+            endDate = LocalDate.of(year, month, 31);
+        } else {
             if (month != 2) {
                 endDate = LocalDate.of(year, month, 30);
-            }else {
-                if (year % 4 == 0){
+            } else {
+                if (year % 4 == 0) {
                     endDate = LocalDate.of(year, month, 29);
-                }else {
+                } else {
                     endDate = LocalDate.of(year, month, 28);
                 }
             }
@@ -594,11 +626,11 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 for (ProjectCostBudget budget : list) {
                     //先生成总计划数组
                     if ((budget.getPlanStartTime().getMonthValue() == i && budget.getPlanStartTime().getYear() == year)
-                            || (budget.getPlanEndTime().getMonthValue() == i && budget.getPlanEndTime().getYear() == year)){
+                            || (budget.getPlanEndTime().getMonthValue() == i && budget.getPlanEndTime().getYear() == year)) {
                         total1++;
-                        if (budget.getStatus().equals(4)){
+                        if (budget.getStatus().equals(4)) {
                             total2++;
-                        }else {
+                        } else {
                             total3++;
                         }
                     }
@@ -620,7 +652,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             mapList.add(vo2);
             mapList.add(vo3);
             return mapList;
-        }else {
+        } else {
             return null;
         }
     }
@@ -634,14 +666,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         LocalDate startDate;
         LocalDate endDate;
         //判断是否选择部门,如果选择了部门再判断是否选择了具体的人,如果没有选择具体的人则查询整个部门
-        if (StringUtils.isBlank(start) || StringUtils.isBlank(end)){
-            startDate = LocalDate.of(LocalDate.now().getYear(),1,1);
-            endDate = LocalDate.of(LocalDate.now().getYear(),12,31);
-        }else {
+        if (StringUtils.isBlank(start) || StringUtils.isBlank(end)) {
+            startDate = LocalDate.of(LocalDate.now().getYear(), 1, 1);
+            endDate = LocalDate.of(LocalDate.now().getYear(), 12, 31);
+        } else {
             String[] s1 = start.split("-");
-            startDate = LocalDate.of(Integer.parseInt(s1[0]),Integer.parseInt(s1[1]),1);
+            startDate = LocalDate.of(Integer.parseInt(s1[0]), Integer.parseInt(s1[1]), 1);
             String[] s2 = end.split("-");
-            endDate = LocalDate.of(Integer.parseInt(s2[0]),Integer.parseInt(s2[1]),1);
+            endDate = LocalDate.of(Integer.parseInt(s2[0]), Integer.parseInt(s2[1]), 1);
             endDate = endDate.with(TemporalAdjusters.lastDayOfMonth());
         }
         //获取时间段中的计划,默认是今年
@@ -692,25 +724,25 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                             || (plan.getPlanEndTime().getYear() == startDate.getYear() && plan.getPlanEndTime().getMonthValue() == startDate.getMonthValue())) {
                         //计划统计图
                         total++;
-                        if (plan.getTaskApprove() == 1){
+                        if (plan.getTaskApprove() == 1) {
                             finish++;
-                        }else {
+                        } else {
                             unfinish++;
                         }
 
                         //风险计划统计图
-                        if (plan.getStatus() == 4){
-                            if (plan.getPlanEndTime().isBefore(plan.getPracticalFinishTime())){
+                        if (plan.getStatus() == 4) {
+                            if (plan.getPlanEndTime().isBefore(plan.getPracticalFinishTime())) {
                                 //风险计划
                                 risk++;
-                            }else {
+                            } else {
                                 normal++;
                             }
-                        }else {
-                            if (plan.getPlanEndTime().isBefore(LocalDate.now())){
+                        } else {
+                            if (plan.getPlanEndTime().isBefore(LocalDate.now())) {
                                 //风险计划
                                 risk++;
-                            }else {
+                            } else {
                                 normal++;
                             }
                         }
@@ -723,7 +755,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                 l1.add(total);
                 l2.add(finish);
                 l3.add(unfinish);
-                dateList.add(startDate.getYear()+"年"+startDate.getMonthValue()+"月");
+                dateList.add(startDate.getYear() + "年" + startDate.getMonthValue() + "月");
                 startDate = startDate.plusMonths(1);
             }
             //统计图集合
@@ -757,16 +789,18 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 获取当前项目所有预算已闭环的任务
+     *
      * @param projectId
      * @return
      */
     @Override
-    public List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType) {
-        return baseMapper.getProjectAllFinishedTask(projectId,costType);
+    public List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId, Integer costType) {
+        return baseMapper.getProjectAllFinishedTask(projectId, costType);
     }
 
     /**
      * 获取项目的所有实际费用
+     *
      * @param projectId
      * @return
      */
@@ -777,13 +811,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 获取一年的人工支出
+     *
      * @param year
      * @return
      */
     @Override
     public BigDecimal getYearStaffDisburse(int year) {
         BigDecimal yearStaffDisburse = baseMapper.getYearStaffDisburse(year);
-        if (yearStaffDisburse == null){
+        if (yearStaffDisburse == null) {
             return new BigDecimal(0);
         }
         return yearStaffDisburse;
@@ -791,6 +826,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 按年查询所有支出
+     *
      * @param y
      * @return
      */
@@ -801,6 +837,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 按月查询所有计划支出
+     *
      * @param date
      * @return
      */
@@ -812,17 +849,19 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 
     /**
      * 获取风险计划,如果参数为空获取所有
+     *
      * @param projectId
      * @param costType
      * @return
      */
     @Override
-    public List<ProjectCostBudget> getRiskPlan(Long projectId,Integer costType) {
-        return baseMapper.getRiskPlan(projectId,costType);
+    public List<ProjectCostBudget> getRiskPlan(Long projectId, Integer costType) {
+        return baseMapper.getRiskPlan(projectId, costType);
     }
 
     /**
      * 根据月获取计划闭环后实际金额
+     *
      * @param date
      * @return
      */
@@ -838,31 +877,31 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     public PlanFinishedRatioVO planFinishedRatio(Long deptId, Long userId, String start, String end) {
         String tenantId = SecureUtil.getTenantId();
         List<User> Employees = new ArrayList<>();
-        if (deptId == null){
+        if (deptId == null) {
             //查询所有员工
-            Employees = baseMapper.getAllEmployees(tenantId,null,null);
-        }else if (userId == null){
+            Employees = baseMapper.getAllEmployees(tenantId, null, null);
+        } else if (userId == null) {
             //查询整个部门的员工
-            Employees = baseMapper.getAllEmployees(tenantId,deptId,null);
-        }else {
+            Employees = baseMapper.getAllEmployees(tenantId, deptId, null);
+        } else {
             //查询指定员工
-            Employees = baseMapper.getAllEmployees(tenantId,deptId,userId);
+            Employees = baseMapper.getAllEmployees(tenantId, deptId, userId);
         }
-        if (Employees != null && Employees.size() > 0 ){
+        if (Employees != null && Employees.size() > 0) {
             PlanFinishedRatioVO vo = new PlanFinishedRatioVO();
             List<String> names = new ArrayList<>();
             List<Integer> ratios = new ArrayList<>();
             LocalDate startDate;
             LocalDate endDate;
             //判断是否选择部门,如果选择了部门再判断是否选择了具体的人,如果没有选择具体的人则查询整个部门
-            if (StringUtils.isBlank(start) || StringUtils.isBlank(end)){
-                startDate = LocalDate.of(LocalDate.now().getYear(),1,1);
-                endDate = LocalDate.of(LocalDate.now().getYear(),12,31);
-            }else {
+            if (StringUtils.isBlank(start) || StringUtils.isBlank(end)) {
+                startDate = LocalDate.of(LocalDate.now().getYear(), 1, 1);
+                endDate = LocalDate.of(LocalDate.now().getYear(), 12, 31);
+            } else {
                 String[] s1 = start.split("-");
-                startDate = LocalDate.of(Integer.parseInt(s1[0]),Integer.parseInt(s1[1]),1);
+                startDate = LocalDate.of(Integer.parseInt(s1[0]), Integer.parseInt(s1[1]), 1);
                 String[] s2 = end.split("-");
-                endDate = LocalDate.of(Integer.parseInt(s2[0]),Integer.parseInt(s2[1]),1);
+                endDate = LocalDate.of(Integer.parseInt(s2[0]), Integer.parseInt(s2[1]), 1);
                 endDate = endDate.with(TemporalAdjusters.lastDayOfMonth());
             }
             //获取员工id集合
@@ -894,7 +933,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
                         } else {
                             ratios.add(0);
                         }
-                    }else {
+                    } else {
                         ratios.add(0);
                     }
                 }
@@ -945,20 +984,20 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     public ProjectCostBudgetVO2 updateMainPlan(ProjectCostBudgetVO2 vo2) {
         //先判断如果数据都没填写,则设置可以分解子计划
         if (vo2.getPlanTaskType() == null && StringUtils.isBlank(vo2.getPlanTaskDesc()) && StringUtils.isBlank(vo2.getPlanTarget())
-                && vo2.getPlanStartTime() == null && vo2.getPlanEndTime() == null){
+                && vo2.getPlanStartTime() == null && vo2.getPlanEndTime() == null) {
             vo2.setPlanTaskTypeValue(null);
             vo2.setPlanDays(null);
             vo2.setIsShowChildren(1);
             return vo2;
         }
         //如果填写了数据,则检查数据是否填写完成
-        if (vo2.getPlanTaskType() == null){
+        if (vo2.getPlanTaskType() == null) {
             throw new ServiceException("请选择任务类型");
-        }else if (StringUtils.isBlank(vo2.getPlanTaskDesc())){
+        } else if (StringUtils.isBlank(vo2.getPlanTaskDesc())) {
             throw new ServiceException("请填写任务描述");
-        }else if (StringUtils.isBlank(vo2.getPlanTarget())){
+        } else if (StringUtils.isBlank(vo2.getPlanTarget())) {
             throw new ServiceException("请填写完成指标");
-        }else if (vo2.getPlanStartTime() == null || vo2.getPlanEndTime() == null){
+        } else if (vo2.getPlanStartTime() == null || vo2.getPlanEndTime() == null) {
             throw new ServiceException("请选择计划起止日期");
         }
         //如果数据都填写完成,则根据任务类型,设置工作日,并且设置子计划不可分解
@@ -967,10 +1006,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         vo2.setPlanTaskTypeValue(taskType.getDictName());
         int type = taskType.getDictValue().intValue();
         //根据任务类型设置父计划的工作天数,固定任务1,临时任务2
-        if (type == 1){
-            vo2.setPlanDays(new BigDecimal(vo2.getPlanStartTime().until(vo2.getPlanEndTime(),ChronoUnit.DAYS) + 1));
-        }else {
-            if (vo2.getPlanStartTime().until(vo2.getPlanEndTime(),ChronoUnit.DAYS) > 35){
+        if (type == 2) {
+            vo2.setPlanDays(new BigDecimal(vo2.getPlanStartTime().until(vo2.getPlanEndTime(), ChronoUnit.DAYS) + 1));
+        } else {
+            if (vo2.getPlanStartTime().until(vo2.getPlanEndTime(), ChronoUnit.DAYS) > 35) {
                 throw new ServiceException("请不要制定超过一个月的临时计划");
 //                //工作天数,工具只能获取50天之内的
 //                LocalDate startDate = vo2.getPlanStartTime();
@@ -981,14 +1020,14 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 //                    startDate = startDate.plusDays(36L);
 //                }
 //                vo2.setPlanDays(new BigDecimal(i));
-            }else {
+            } else {
                 vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(vo2.getPlanStartTime(), vo2.getPlanEndTime())));
             }
         }
-        if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()){
-            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长("+(vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue())+")天");
+        if (vo2.getPlanDays().intValue() > vo2.getBudgetDays().intValue()) {
+            vo2.setOutMoneyTips("成本增加!该项计划完成时间超过当初测算时间工作时长(" + (vo2.getPlanDays().intValue() - vo2.getBudgetDays().intValue()) + ")天");
             vo2.setTaskFinishedStatus(1);
-        }else {
+        } else {
             vo2.setTaskFinishedStatus(0);
         }
         vo2.setIsShowChildren(0);
@@ -1002,13 +1041,13 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
     public ProjectCostBudgetVO2 updateChildrenPlan(ProjectCostBudgetVO2 vo2) {
         //如果子计划为空,则清空父计划,然后修改可以编辑父计划
         List<ProjectCostBudgetVO2> list = vo2.getChildrenList();
-        if (list != null && list.size() > 0){
+        if (list != null && list.size() > 0) {
             //获取子计划任务类型,用于判断子计划类型是否一致
             ProjectCostBudgetVO2 budgetVO2 = list.get(0);
             Long taskType;
-            if (budgetVO2.getPlanTaskType() == null){
+            if (budgetVO2.getPlanTaskType() == null) {
                 throw new ServiceException("请选择任务类型");
-            }else {
+            } else {
                 taskType = budgetVO2.getPlanTaskType();
             }
             DictInfo task = baseMapper.getTaskType(taskType);
@@ -1022,52 +1061,52 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             Boolean isFinished = true;
             for (ProjectCostBudgetVO2 l : list) {
                 //校验数据
-                if (l.getPlanTaskType() == null){
+                if (l.getPlanTaskType() == null) {
                     throw new ServiceException("请选择任务类型");
-                }else if (StringUtils.isBlank(l.getPlanTaskDesc())){
+                } else if (StringUtils.isBlank(l.getPlanTaskDesc())) {
                     throw new ServiceException("请填写任务描述");
-                }else if (StringUtils.isBlank(l.getPlanTarget())){
+                } else if (StringUtils.isBlank(l.getPlanTarget())) {
                     throw new ServiceException("请填写完成指标");
-                }else if (l.getPlanStartTime() == null || l.getPlanEndTime() == null){
+                } else if (l.getPlanStartTime() == null || l.getPlanEndTime() == null) {
                     throw new ServiceException("请选择计划起止日期");
                 }
                 //校验类型
-                if (!taskType.equals(l.getPlanTaskType())){
+                if (!taskType.equals(l.getPlanTaskType())) {
                     throw new ServiceException("子计划任务类型不一致");
                 }
-                if (budgetVO2.getTaskApprove() == null || budgetVO2.getTaskApprove() != 1){
+                if (budgetVO2.getTaskApprove() == null || budgetVO2.getTaskApprove() != 1) {
                     isFinished = false;
                 }
                 //计算总天数
                 if (l.getPlanDays() != null) {
                     workDays = workDays.add(l.getPlanDays());
-                }else {
-                    if (task.getDictValue().intValue() == 1) {
-                        l.setPlanDays(new BigDecimal(l.getPlanStartTime().until(l.getPlanEndTime(),ChronoUnit.DAYS) + 1));
+                } else {
+                    if (task.getDictValue().intValue() == 2) {
+                        l.setPlanDays(new BigDecimal(l.getPlanStartTime().until(l.getPlanEndTime(), ChronoUnit.DAYS) + 1));
                     } else {
                         if (l.getPlanStartTime().until(l.getPlanEndTime(), ChronoUnit.DAYS) > 35) {
                             throw new ServiceException("请不要制定超过一个月的临时计划");
-                        }else {
+                        } else {
                             l.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(budgetVO2.getPlanStartTime(), budgetVO2.getPlanEndTime())));
                         }
                     }
                 }
                 //计算最大日期和最小日期
-                if (l.getPlanStartTime().isBefore(startDate)){
+                if (l.getPlanStartTime().isBefore(startDate)) {
                     startDate = l.getPlanStartTime();
                 }
-                if (l.getPlanEndTime().isAfter(endDate)){
+                if (l.getPlanEndTime().isAfter(endDate)) {
                     endDate = l.getPlanEndTime();
                 }
                 //拼接子计划的任务描述
-                descStr.append(j + "."+l.getPlanTaskDesc()+"。");
+                descStr.append(j + "." + l.getPlanTaskDesc() + "、");
                 //拼接子计划的完成指标
-                targetStr.append(j+"."+l.getPlanTarget()+"。");
+                targetStr.append(j + "." + l.getPlanTarget() + "、");
                 j++;
             }
 
             //所有子计划完成,设置父计划为绿色
-            if (isFinished){
+            if (isFinished) {
                 vo2.setTaskFinishedStatus(2);
             }
             //计算是否超过预算
@@ -1092,10 +1131,10 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             vo2.setPlanStartTime(startDate);
             vo2.setPlanEndTime(endDate);
             //根据任务类型设置父计划的工作天数,固定任务1,临时任务2
-            if (task.getDictValue().intValue() == 1){
-                vo2.setPlanDays(new BigDecimal(startDate.until(endDate,ChronoUnit.DAYS)+ 1));
-            }else {
-                if (startDate.until(endDate,ChronoUnit.DAYS) > 35){
+            if (task.getDictValue().intValue() == 2) {
+                vo2.setPlanDays(new BigDecimal(startDate.until(endDate, ChronoUnit.DAYS) + 1));
+            } else {
+                if (startDate.until(endDate, ChronoUnit.DAYS) > 35) {
                     throw new ServiceException("请不要制定超过一个月的临时计划");
 //                    //工作天数,工具只能获取50天之内的
 //                    int i = 0;
@@ -1104,55 +1143,117 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
 //                        startDate = startDate.plusDays(36L);
 //                    }
 //                    vo2.setPlanDays(new BigDecimal(i));
-                }else {
+                } else {
                     vo2.setPlanDays(new BigDecimal(CommonUtil.getWorkDays(startDate, endDate)));
                 }
             }
             vo2.setIsShowEdit(0);
 
-        }else {
+        } else {
             vo2.setPlanTaskTypeValue(null);
-             vo2.setPlanTaskType(null);
-             vo2.setPlanTaskDesc(null);
-             vo2.setPlanTarget(null);
-             vo2.setPlanStartTime(null);
-             vo2.setPlanEndTime(null);
-             vo2.setPlanDays(null);
-             vo2.setIsShowEdit(1);
-             return vo2;
+            vo2.setPlanTaskType(null);
+            vo2.setPlanTaskDesc(null);
+            vo2.setPlanTarget(null);
+            vo2.setPlanStartTime(null);
+            vo2.setPlanEndTime(null);
+            vo2.setPlanDays(null);
+            vo2.setIsShowEdit(1);
+            return vo2;
         }
         return vo2;
     }
 
+    /**
+     * 任务完成之后统计工作时间和人工成本
+     *
+     * @param PlanId              计划id
+     * @param practicalFinishTime 实际完成时间
+     */
+    @Override
+    public void taskFinishedStats(Long PlanId, LocalDate practicalFinishTime) {
+        //先获取当前计划
+        ProjectCostBudget budget = this.getById(PlanId);
+        budget.setStatus(4);
+        budget.setTaskApprove(1);
+        budget.setPracticalFinishTime(practicalFinishTime);
+        DictInfo dictInfo = baseMapper.getTaskType(budget.getPlanTaskType());
+        int taskType = dictInfo.getDictValue().intValue();
+        //计划为临时计划,则不计算金额直接闭环
+        if (taskType == 2) {
+            this.updateById(budget);
+        } else {
+            //获取任务人工资
+            User userInfo = baseMapper.getUserInfo(budget.getTaskUser());
+            if (userInfo.getOneMoney() == null) {
+                throw new ServiceException("没有为任务人设置工资");
+            }
+            Double money = userInfo.getOneMoney();
+            //为固定计划,则获取最后一条任务日志
+            DepartmentPlanLog planLog = logMapper.getNewestPlanLog(PlanId);
+            Integer realWorkDays = 0;
+            //日志类型为暂停,和status=3则 直接用实际工作时间
+            if (planLog.getStatus() == 0) {
+                //实际工作时间
+                realWorkDays = planLog.getRealWorkDays();
+            } else {
+                //日志类型为开启,和status=2则 计算计划结束时间到中途开启时间 + 实际工作时间
+                if (planLog.getOpenPlanStartTime() == null) {
+                    //中途没暂停,开启过任务
+                    if (planLog.getRealPlanStartTime().until(practicalFinishTime, ChronoUnit.DAYS) > 35) {
+                        throw new ServiceException("固定计划完成周期超过一个月,请联系管理员");
+                    } else {
+                        realWorkDays = CommonUtil.getWorkDays(planLog.getRealPlanStartTime(), practicalFinishTime);
+                    }
+                } else {
+                    //中途暂停,开启过任务
+                    //获取上次暂停时实际工作日
+                    Integer days = planLog.getRealWorkDays();
+                    //计算这次开启后到任务完成之间的工作日
+                    if (planLog.getOpenPlanStartTime().until(practicalFinishTime, ChronoUnit.DAYS) > 35) {
+                        throw new ServiceException("固定计划完成周期超过一个月,请联系管理员");
+                    } else {
+                        int day = CommonUtil.getWorkDays(planLog.getOpenPlanStartTime(), practicalFinishTime);
+                        realWorkDays = days + day;
+                    }
+                }
+                //设置status=4,taskAPP=1,实际工资,实际工资天数,实际完成时间,如果计划处于暂停中,那么实际完成时间就是暂停时间
+            }
+            budget.setPracticalTaskDays(new BigDecimal(realWorkDays));
+            //实际人工支出
+            budget.setActualTotalMoney(new BigDecimal(realWorkDays).multiply(new BigDecimal(money)));
+            this.updateById(budget);
+        }
+    }
+
     /**
      * 统计一行的几个总金额
      */
-    public void countMoney(ProjectCostBudget budget){
+    public void countMoney(ProjectCostBudget budget) {
         BigDecimal postMoney;
-        if (budget.getPostType() != null && budget.getPostType() > 0){
+        if (budget.getPostType() != null && budget.getPostType() > 0) {
             Double money = baseMapper.getPostMoney(budget.getPostType());
-            postMoney = new BigDecimal(money+"");
-        }else {
+            postMoney = new BigDecimal(money + "");
+        } else {
             postMoney = new BigDecimal("0");
         }
         //人工成本 = 人员数量 * 单价 * 天数
         if (budget.getStaffCount() != null && budget.getBudgetDays() != null) {
             budget.setBudgetStaffCost(budget.getStaffCount().multiply(postMoney).multiply(budget.getBudgetDays()));
-        }else {
+        } else {
             budget.setBudgetStaffCost(new BigDecimal("0"));
         }
         //外包金额 = 外包单价 * 外包数量
         if (budget.getOutsourcePeopleCount() != null && budget.getOutsourceUnitPrice() != null) {
             budget.setOutsourceCountMoney(budget.getOutsourceUnitPrice().multiply(budget.getOutsourcePeopleCount()));
-        }else {
+        } else {
             budget.setOutsourceCountMoney(new BigDecimal("0"));
         }
         //判断差旅费
-        if (budget.getBudgetTravelExpense() == null){
+        if (budget.getBudgetTravelExpense() == null) {
             budget.setBudgetTravelExpense(new BigDecimal("0"));
         }
         //判断其他预算金额
-        if (budget.getOtherBudgetMoney() == null){
+        if (budget.getOtherBudgetMoney() == null) {
             budget.setOtherBudgetMoney(new BigDecimal("0"));
         }
         //总预算 = 人工成本 + 外包金额 + 差旅费 + 其他费用

+ 19 - 10
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetStatsServiceImpl.java

@@ -44,6 +44,7 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
 
     /**
      * 新增项目成本预算
+     *
      * @param dto
      */
     @Override
@@ -51,7 +52,7 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
     public void AddOrUpdate(ProjectCostBudgetStatsDTO dto) {
         //先新增或保存项目成本明细,返回统计后的数据
         ProjectCostBudgetStats budgetStats = budgetService.batchAddOrUpdate(dto);
-        if (dto.getId() != null){
+        if (dto.getId() != null) {
             budgetStats.setId(dto.getId());
         }
         budgetStats.setProjectId(dto.getProjectId());
@@ -61,16 +62,22 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
 
     /**
      * 根据id查询项目成本和具体明细
+     *
      * @param id
      * @return
      */
     @Override
-    public ProjectCostBudgetStatsVO getBudgetStatsById(Long id) {
+    public ProjectCostBudgetStatsVO getBudgetStatsById(Long id, List<Long> ids, Integer type) {
         //查询项目成本统计
         ProjectCostBudgetStatsVO vo = baseMapper.getBudgetStatsById(id);
-
-        //查询具体明细并分组存入
-        List<ProjectCostBudget> list = budgetService.budgetListByProjectId(vo.getProjectId());
+        List<ProjectCostBudget> list;
+        if (type == 1) {
+            //审批任务详情,根据每条任务单独查询
+            list = budgetService.budgetListByProjectId2(ids);
+        } else {
+            //查询具体明细并分组存入
+            list = budgetService.budgetListByProjectId(vo.getProjectId());
+        }
         if (list != null && list.size() > 0) {
             Map<Integer, List<ProjectCostBudget>> map = list.parallelStream().collect(Collectors.groupingBy(ProjectCostBudget::getUnitType));
             vo.setBuildUnit(map.get(1));
@@ -82,13 +89,14 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
 
     /**
      * 根据id删除项目统计和详情
+     *
      * @param id
      */
     @Override
     @Transactional
     public void deleteByProjectId(Long id) {
         ProjectCostBudgetStats stats = this.getById(id);
-        if (stats.getApprove() == 1){
+        if (stats.getApprove() == 1) {
             throw new ServiceException("已经审批通过,不能删除");
         }
         //先删除成本详情
@@ -99,6 +107,7 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
 
     /**
      * 分页获取列表
+     *
      * @param queryValue
      * @param query
      * @return
@@ -106,7 +115,7 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
     @Override
     public List<ProjectCostBudgetStatsVO> page(String queryValue, Query query) {
         IPage page = new Page(query.getCurrent(), query.getSize());
-        return baseMapper.page(page,queryValue);
+        return baseMapper.page(page, queryValue);
     }
 
     /**
@@ -117,10 +126,10 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
         ProjectCostBudgetStatsVO vo = new ProjectCostBudgetStatsVO();
         ControlProjectInfo projectInfo = projectInfoService.getById(costBudget.getProjectId());
         vo.setProjectName(projectInfo.getName());
-        if (costBudget.getCostType() != null && costBudget.getCostType() == -1){
+        if (costBudget.getCostType() != null && costBudget.getCostType() == -1) {
             costBudget.setCostType(null);
         }
-        if (costBudget.getUnitType() != null && costBudget.getUnitType() == -1){
+        if (costBudget.getUnitType() != null && costBudget.getUnitType() == -1) {
             costBudget.setUnitType(null);
         }
         List<ProjectCostBudgetVO> list = budgetService.budgetList(costBudget);
@@ -142,7 +151,7 @@ public class ProjectCostBudgetStatsServiceImpl extends BaseServiceImpl<ProjectCo
     public List<ControlProjectInfo> getProjectList(Integer type) {
         if (type.equals(1)) {
             return baseMapper.getProjectList();
-        }else {
+        } else {
             return baseMapper.getProjectList2();
         }
     }

+ 30 - 25
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -80,7 +80,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 queryWrapper.lambda().eq(TaskProcessInfo::getStatus, 1);
                 break;
             case "2":  //已审核、已驳回为已办任务
-                if (dto.getSelectStatus().equals("0") || dto.getSelectStatus().equals("1")) {
+                if (ObjectUtil.isNotEmpty(dto.getSelectStatus()) && (dto.getSelectStatus().equals("0") || dto.getSelectStatus().equals("1"))) {
                     var = false;
                     break;
                 }
@@ -91,11 +91,15 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 }
                 break;
             case "3":  //我发起的任务
-                queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
+                if (ObjectUtil.isNotEmpty(dto.getSelectStatus())) {
+                    queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
+                }
                 queryWrapper.lambda().eq(TaskProcessInfo::getReportUserId, SecureUtil.getUserId());
                 break;
             case "4":  //抄送给我的
-                queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
+                if (ObjectUtil.isNotEmpty(dto.getSelectStatus())) {
+                    queryWrapper.lambda().eq(TaskProcessInfo::getStatus, dto.getSelectStatus());
+                }
                 queryWrapper.lambda().like(TaskProcessInfo::getCcUserIds, SecureUtil.getUserId());
                 break;
         }
@@ -382,13 +386,13 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                                 break;
 
                             case 10: //成本测算
-                                List<ProjectCostBudget> query = jdbcTemplate.query("select project_id from c_project_cost_budget where id in(" + record.getExpenseInfoId() + ")", new BeanPropertyRowMapper<>(ProjectCostBudget.class));
+                                List<ProjectCostBudget> query = jdbcTemplate.query("select id,project_id from c_project_cost_budget where id in(" + record.getExpenseInfoId() + ")", new BeanPropertyRowMapper<>(ProjectCostBudget.class));
                                 if (query.size() > 0) {
                                     Long projectId = query.stream().map(ProjectCostBudget::getProjectId).collect(Collectors.toList()).stream().findAny().orElse(null);
                                     if (projectId != null) {
                                         ProjectCostBudgetStats stats = jdbcTemplate.query("select id from c_project_cost_budget_stats where project_id = " + projectId, new BeanPropertyRowMapper<>(ProjectCostBudgetStats.class)).stream().findAny().orElse(null);
                                         if (stats != null) {
-                                            data = projectCostBudgetStatsService.getBudgetStatsById(stats.getId());
+                                            data = projectCostBudgetStatsService.getBudgetStatsById(stats.getId(), query.stream().map(ProjectCostBudget::getId).collect(Collectors.toList()), 1);
                                         }
                                     }
                                 }
@@ -756,7 +760,8 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
             for (String taskId : taskIds) {
                 ProjectCostBudget planTaskInfo = projectCostBudgetService.getById(taskId);
                 if (planTaskInfo != null) {
-                    User departmentHead = this.getDepartmentHead(planTaskInfo.getDeptId());
+                    //User departmentHead = this.getDepartmentHead(planTaskInfo.getDeptId());
+                    User departmentHead = this.getDepartmentHead(Long.parseLong(SecureUtil.getDeptId())); //当前用户的部门
                     if (ObjectUtil.isEmpty(departmentHead)) {
                         throw new ServiceException("获取部门负责人失败,请联系管理员");
                     }
@@ -911,7 +916,8 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         if (projectCostBudgetStats != null) {
             List<ProjectCostBudget> projectCostBudgetList = projectCostBudgetService.getBaseMapper().selectList(Wrappers.<ProjectCostBudget>lambdaQuery()
                     .eq(ProjectCostBudget::getProjectId, projectCostBudgetStats.getProjectId())
-                    .eq(ProjectCostBudget::getApprove, 0));//未上报
+                    .eq(ProjectCostBudget::getApprove, 0)
+                    .eq(ProjectCostBudget::getParentId, 0));//未上报
             if (projectCostBudgetList.size() > 0) {
                 //审批人(总经理)
                 List<String> auditUserIds = new LinkedList<>();
@@ -1029,6 +1035,10 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                     //已完成 = approve = 1
                     jdbcTemplate.execute("update c_project_cost_budget set approve = 1 where id in(" + dataId + ")");
 
+                    ProjectCostBudget projectCostBudget = jdbcTemplate.query("select * from c_project_cost_budget where id = " + dataId, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
+                    if (projectCostBudget != null && ObjectUtil.isNotEmpty(projectCostBudget.getProjectId())) {
+                        jdbcTemplate.execute("update c_project_cost_budget_stats set approve = 1 where project_id = " + projectCostBudget.getProjectId());
+                    }
                 } else if (taskStatus == 3) {
                     //已驳回 = approve = 0
                     jdbcTemplate.execute("update c_project_cost_budget set approve = 0 where id in(" + dataId + ")");
@@ -1051,11 +1061,12 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                 //计划任务 task_approve = 1,status = 4 表示已完成,且通过审批
                 ProjectCostBudget projectCostBudget = jdbcTemplate.query("select * from c_project_cost_budget where id = " + dataId, new BeanPropertyRowMapper<>(ProjectCostBudget.class)).stream().findAny().orElse(null);
                 if (projectCostBudget != null && projectCostBudget.getStatus().equals(4) && projectCostBudget.getTaskApprove().equals(1)) {
-
                     //获取任务完成时间
                     TaskPlanUpdateStatusInfo taskPlanUpdateStatusInfo = jdbcTemplate.query("select completion_time from c_task_plan_update_status_info where update_type = 1 and approve_task_id = " + approveTaskId + " and plan_task_id = " + dataId, new BeanPropertyRowMapper<>(TaskPlanUpdateStatusInfo.class)).stream().findAny().orElse(null);
                     if (taskPlanUpdateStatusInfo != null) {
-                        //修改任务实际完成时间、金额 TODO
+                        //修改任务实际完成时间、金额
+                        LocalDate localDate = taskPlanUpdateStatusInfo.getCompletionTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                        projectCostBudgetService.taskFinishedStats(projectCostBudget.getId(), localDate);
                     }
                 }
 
@@ -1142,22 +1153,19 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         //构造审批人auditUserIds
         List<String> auditUserIds = new LinkedList<>();
 
-        //判断当前用户是否是部门负责人,如果是,那么不自己审批(跳过)
-        User user = iUserClient.userInfoById(SecureUtil.getUserId()).getData();
-        if (user != null && ObjectUtil.isEmpty(user.getIsLeader())) {
-            //负责人getIsLeader字段=null,证明不是负责人,那么获取当前部门负责人
-            User departmentHead = this.getDepartmentHead(Long.parseLong(SecureUtil.getUser().getDeptId()));
-            if (departmentHead != null) {
-                auditUserIds.add(departmentHead.getId() + "");
-            }
+        //获取当前部门负责人
+        User departmentHead = this.getDepartmentHead(Long.parseLong(SecureUtil.getDeptId())); //当前用户的部门
+        if (departmentHead == null) {
+            throw new ServiceException("获取当前用户部门负责人失败,请联系管理员");
         }
+        auditUserIds.add(departmentHead.getId() + "");
 
         //获取审批人、抄送人信息
         Map<String, List<User>> approveUserMaps = this.getApproveUserMaps(type, money);
 
         //审批人
         List<User> spUserList = approveUserMaps.getOrDefault("SP", null);
-        if (spUserList == null || spUserList.size() == 0) {
+        if (spUserList == null) {
             throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
         }
         auditUserIds.addAll(spUserList.stream().map(User::getId).map(String::valueOf).collect(Collectors.toList()));
@@ -1165,10 +1173,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         List<String> nonEmptyAuditUserIds = new LinkedList<>();
         for (String userId : auditUserIds) {
             //如果审批人中存在自己本身,那么移除,自己不审批自己的任务
-            if (StringUtils.isNotEmpty(userId) && !userId.equals(String.valueOf(SecureUtil.getUserId()))) {
-                nonEmptyAuditUserIds.add(userId);
-            } else if (auditUserIds.size() == 1 && StringUtils.isNotEmpty(userId) && userId.equals(String.valueOf(SecureUtil.getUserId()))) {
-                //如果只有本身,就是自己给自己提交的任务,只有一个审批人,那么就要添加
+            if (!userId.equals(String.valueOf(SecureUtil.getUserId()))) {
                 nonEmptyAuditUserIds.add(userId);
             }
         }
@@ -1225,7 +1230,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
      */
     public User getDepartmentHead(Long deptId) {
         if (ObjectUtil.isNotEmpty(deptId)) {
-            List<User> leaderUser = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_id like '%" + deptId + "%' and is_leader like '%" + deptId + "%'", new BeanPropertyRowMapper<>(User.class));
+            List<User> leaderUser = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and dept_id = " + deptId + " and is_leader like '%" + deptId + "%'", new BeanPropertyRowMapper<>(User.class));
             if (leaderUser.size() == 1) {
                 return leaderUser.get(0);
             }
@@ -1332,7 +1337,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         if (spPostIds.size() > 0) {
             List<User> spUserListAll = new LinkedList<>();
             for (String spPostId : spPostIds) {
-                List<User> spUserList = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and role_id like '%" + spPostId + "%' and post_id like '%" + spPostId + "%'", new BeanPropertyRowMapper<>(User.class));
+                List<User> spUserList = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and role_id = " + spPostId + " and post_id = " + spPostId, new BeanPropertyRowMapper<>(User.class));
                 spUserListAll.addAll(spUserList);
             }
             if (spUserListAll.size() > 0) {
@@ -1342,7 +1347,7 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
         if (zcPostIds.size() > 0) {
             List<User> zcUserListAll = new LinkedList<>();
             for (String zcPostId : zcPostIds) {
-                List<User> zcUserList = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and role_id like '%" + zcPostId + "%' and post_id like '%" + zcPostId + "%'", new BeanPropertyRowMapper<>(User.class));
+                List<User> zcUserList = jdbcTemplate.query("select * from blade_user where tenant_id = " + SecureUtil.getUser().getTenantId() + " and role_id = " + zcPostId + " and post_id = " + zcPostId, new BeanPropertyRowMapper<>(User.class));
                 zcUserListAll.addAll(zcUserList);
             }
             if (zcUserListAll.size() > 0) {

+ 36 - 23
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -19,6 +19,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.*;
@@ -191,27 +192,40 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     @Override
     public List<WbsTreePrivateVO> addNodeTree(String pKeyId) {
         WbsTreeContract parentNodeRoot = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pKeyId).eq(WbsTreeContract::getStatus, 1));
-        if (parentNodeRoot != null) {
-            //oldId不等于空,说明是复制节点,通过oldId,去获取原始树节点
-            if (parentNodeRoot.getOldId() != null) {
+        if (ObjectUtil.isNotEmpty(parentNodeRoot)) {
+            String oldId = "";
+            //oldId不等于空,说明是复制节点,通过oldId,获取原始节点
+            if (ObjectUtil.isNotEmpty(parentNodeRoot.getOldId())) {
+                oldId = parentNodeRoot.getOldId();
                 parentNodeRoot = this.recursionFindResourceRootNode(parentNodeRoot);
             }
-            List<WbsTreeContract> allNodes = this.getChildNodes(parentNodeRoot);
-            if (allNodes == null) {
+
+            //获取对应的项目树的节点
+            WbsTreePrivate wbsTreePrivateRoot = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId, parentNodeRoot.getId())
+                    .eq(WbsTreePrivate::getProjectId, parentNodeRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, parentNodeRoot.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
+
+            if (ObjectUtil.isEmpty(wbsTreePrivateRoot)) {
+                //如果为空表示,进入新增节点的位置是从新增的节点开始的,新增的节点id更改了,导致parentNodeRoot.getId()变了,获取不到对应的项目wbs树节点,那么直接用oldId获取
+                //当前新增节点oldId现在都是改成了项目的id,那么理论上都不会变,直接用oldId就能获取到数据源
+                //如果是复制节点,id也变了,oldId有没有改变暂不清楚(另一个接口),后面再排查
+                wbsTreePrivateRoot = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getId, oldId)
+                        .eq(WbsTreePrivate::getProjectId, parentNodeRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, parentNodeRoot.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
+                if (ObjectUtil.isEmpty(wbsTreePrivateRoot)) {
+                    throw new ServiceException("查询数据失败,请联系管理员");
+                }
+            }
+
+            //获取项目树所有子节点
+            List<WbsTreePrivate> allNodes = this.getChildNodes(wbsTreePrivateRoot);
+            if (ObjectUtil.isEmpty(allNodes)) {
                 //如果是最底层节点,那么直接返回null,最底层节点无法新增子节点
                 return null;
             }
-            allNodes.add(parentNodeRoot);
+            allNodes.add(wbsTreePrivateRoot);
 
-            //获取所有合同段树原始节点对应的项目树节点
-            List<Long> nodeIds = allNodes.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
-
-            //重新赋值
-            List<WbsTreePrivate> projectTreeNodes = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getId, nodeIds)
-                    .eq(WbsTreePrivate::getProjectId, parentNodeRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, parentNodeRoot.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
             //构造树
-            List<WbsTreePrivateVO> resultAllNodes = BeanUtil.copyProperties(projectTreeNodes, WbsTreePrivateVO.class);
-            WbsTreePrivateVO parentNodeRootProject = BeanUtil.copyProperties(parentNodeRoot, WbsTreePrivateVO.class);
+            List<WbsTreePrivateVO> resultAllNodes = BeanUtil.copyProperties(allNodes, WbsTreePrivateVO.class);
+            WbsTreePrivateVO parentNodeRootProject = BeanUtil.copyProperties(wbsTreePrivateRoot, WbsTreePrivateVO.class);
             return buildWbsTreeByStreamChildNodeTreeProject(resultAllNodes, parentNodeRootProject);
         }
         return null;
@@ -239,24 +253,23 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return obj;
     }
 
-    private List<WbsTreeContract> getChildNodes(WbsTreeContract obj) {
-        List<WbsTreeContract> wbsTreeContracts = Collections.singletonList(obj);
-        List<WbsTreeContract> result = new ArrayList<>();
-        this.recursionGetChildNodes(wbsTreeContracts, result, obj.getContractId());
+    private List<WbsTreePrivate> getChildNodes(WbsTreePrivate obj) {
+        List<WbsTreePrivate> wbsTreePrivates = Collections.singletonList(obj);
+        List<WbsTreePrivate> result = new ArrayList<>();
+        this.recursionGetChildNodes(wbsTreePrivates, result, obj.getProjectId(), obj.getWbsId());
         if (result.size() > 0) {
             return result;
         }
         return null;
     }
 
-    private void recursionGetChildNodes(List<WbsTreeContract> list, List<WbsTreeContract> result, String contractId) {
-        List<Long> ids = list.stream().map(WbsTreeContract::getId).collect(Collectors.toList());
+    private void recursionGetChildNodes(List<WbsTreePrivate> list, List<WbsTreePrivate> result, String projectId, String wbsId) {
+        List<Long> ids = list.stream().map(WbsTreePrivate::getId).collect(Collectors.toList());
         if (ids.size() > 0) {
-            //只查询原始节点
-            List<WbsTreeContract> query = jdbcTemplate.query("select * from m_wbs_tree_contract where type = 1 and old_id is null and parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and contract_id = " + contractId, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            List<WbsTreePrivate> query = jdbcTemplate.query("select * from m_wbs_tree_private where type = 1 and parent_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ") and status = 1 and is_deleted = 0 and project_id = " + projectId + " and wbs_id = " + wbsId, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
             if (query.size() > 0) {
                 result.addAll(query);
-                recursionGetChildNodes(query, result, contractId);
+                recursionGetChildNodes(query, result, projectId, wbsId);
             }
         }
     }