Преглед изворни кода

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
liuyc пре 3 година
родитељ
комит
4a33e7f322

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/OpinionUserClient.java

@@ -1,6 +1,7 @@
 package org.springblade.business.feign;
 package org.springblade.business.feign;
 
 
 import org.springblade.business.entity.AssessmentUser;
 import org.springblade.business.entity.AssessmentUser;
+import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.vo.AssessmentUserVOS;
 import org.springblade.business.vo.AssessmentUserVOS;
 import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.common.constant.BusinessConstant;
 import org.springblade.common.constant.BusinessConstant;
@@ -20,6 +21,9 @@ public interface OpinionUserClient {
      */
      */
     String API_PREFIX = "/api/business/opinionUser";
     String API_PREFIX = "/api/business/opinionUser";
 
 
+    @PostMapping(API_PREFIX + "/queryOpinionTypeAmount")
+    List<UserOpinion> queryOpinionTypeAmount();
+
     /**
     /**
      * 工单详情
      * 工单详情
      */
      */

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StartTaskVO.java

@@ -45,4 +45,7 @@ public class StartTaskVO {
     @ApiModelProperty("合同段ID")
     @ApiModelProperty("合同段ID")
     private String contractId;
     private String contractId;
 
 
+    @ApiModelProperty("施工、监理分类(填报页上报必传)")
+    private Integer classify;
+
 }
 }

+ 61 - 9
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ManagerHomePageVO.java

@@ -2,32 +2,88 @@ package org.springblade.manager.vo;
 
 
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
+import org.springblade.manager.entity.ProjectInfo;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
 @Data
 @Data
 public class ManagerHomePageVO {
 public class ManagerHomePageVO {
 
 
+    @ApiModelProperty("项目列表")
+    private List<ProjectInfo> projectInfos;
+
+    @ApiModelProperty("维护类型汇总")
+    private List<UserOpinion> userOpinionList = new ArrayList<>();
+
     @ApiModelProperty("项目人员总数")
     @ApiModelProperty("项目人员总数")
     private Integer projectUserAmount;
     private Integer projectUserAmount;
 
 
     @ApiModelProperty("每个项目人员数量")
     @ApiModelProperty("每个项目人员数量")
     private List<ProjectUserAmountVO> projectUserAmountVOList;
     private List<ProjectUserAmountVO> projectUserAmountVOList;
 
 
+    @ApiModelProperty("项目章数量集合")
+    private List<SingPfx> pfxList = new ArrayList<>();
+
     /**
     /**
      * 当前用户待办工单
      * 当前用户待办工单
      */
      */
-    private List<UserOpinion> userOpinionList = new ArrayList<>();
+    private List<UserOpinionFlow> userOpinionFlowList = new ArrayList<>();
 
 
-    public void setUserOpinionList(String userOpinionId, String title, Integer currentLink, Integer newNumber, String currentLinkId, boolean operation){
-        this.userOpinionList.add(new UserOpinion(userOpinionId, title, currentLink, newNumber, currentLinkId, operation));
+    public void setUserOpinionFlowList(String userOpinionId, String title, Integer currentLink, Integer newNumber, String currentLinkId, boolean operation){
+        this.userOpinionFlowList.add(new UserOpinionFlow(userOpinionId, title, currentLink, newNumber, currentLinkId, operation));
     }
     }
 
 
     public OpinionDetails getOpinionDetails(String projectName, String contractName, String opinionContent, String submitUserName, String submitUser, String submitPhone, String manageTime, List<String> fileUrl){
     public OpinionDetails getOpinionDetails(String projectName, String contractName, String opinionContent, String submitUserName, String submitUser, String submitPhone, String manageTime, List<String> fileUrl){
         return new OpinionDetails(projectName, contractName, opinionContent, submitUserName, submitUser, submitPhone, manageTime, fileUrl);
         return new OpinionDetails(projectName, contractName, opinionContent, submitUserName, submitUser, submitPhone, manageTime, fileUrl);
     }
     }
 
 
+    public void setUserOpinionList(String projectId, String projectName, String problemType, String problemTypeAmount){
+        userOpinionList.add(new UserOpinion(projectId, projectName, Arrays.asList(problemType.split(",")), Arrays.asList(problemTypeAmount.split(","))));
+    }
+
+    public void setPfxList(String projectName, String enterpriseCount, String personalCount){
+        this.pfxList.add(new SingPfx(projectName, enterpriseCount, personalCount));
+    }
+
+    @Data
+    public static class SingPfx {
+        @ApiModelProperty("项目名称")
+        private String projectName;
+        @ApiModelProperty("企业章数量")
+        private String enterpriseCount;
+        @ApiModelProperty("个人章数量")
+        private String personalCount;
+
+        public SingPfx(String projectName, String enterpriseCount, String personalCount){
+            this.projectName = projectName;
+            this.enterpriseCount = enterpriseCount;
+            this.personalCount = personalCount;
+        }
+
+    }
+
+    @Data
+    public static class UserOpinion {
+        @ApiModelProperty("项目ID")
+        private String projectId;
+        @ApiModelProperty("项目名称")
+        private String projectName;
+        @ApiModelProperty("问题类型")
+        private List<String> problemType;
+        @ApiModelProperty("问题数量")
+        private List<String> problemTypeAmount;
+
+        public UserOpinion(String projectId, String projectName, List<String> problemType, List<String> problemTypeAmount){
+            this.projectId = projectId;
+            this.projectName = projectName;
+            this.problemType = problemType;
+            this.problemTypeAmount = problemTypeAmount;
+        }
+
+    }
+
     @Data
     @Data
     public static class OpinionDetails {
     public static class OpinionDetails {
         @ApiModelProperty("项目名称")
         @ApiModelProperty("项目名称")
@@ -58,12 +114,10 @@ public class ManagerHomePageVO {
             this.fileUrl = fileUrl;
             this.fileUrl = fileUrl;
         }
         }
 
 
-        public OpinionDetails(){}
-
     }
     }
 
 
     @Data
     @Data
-    public static class UserOpinion {
+    public static class UserOpinionFlow {
         //工单ID
         //工单ID
         @ApiModelProperty("工单ID")
         @ApiModelProperty("工单ID")
         private String userOpinionId;
         private String userOpinionId;
@@ -88,7 +142,7 @@ public class ManagerHomePageVO {
         @ApiModelProperty("是否有操作权限")
         @ApiModelProperty("是否有操作权限")
         private boolean operation;
         private boolean operation;
 
 
-        public UserOpinion(String userOpinionId, String title, Integer currentLink, Integer newNumber, String currentLinkId, boolean operation){
+        public UserOpinionFlow(String userOpinionId, String title, Integer currentLink, Integer newNumber, String currentLinkId, boolean operation){
             this.userOpinionId = userOpinionId;
             this.userOpinionId = userOpinionId;
             this.title = title;
             this.title = title;
             this.currentLink = currentLink;
             this.currentLink = currentLink;
@@ -96,8 +150,6 @@ public class ManagerHomePageVO {
             this.currentLinkId = currentLinkId;
             this.currentLinkId = currentLinkId;
             this.operation = operation;
             this.operation = operation;
         }
         }
-
-        public UserOpinion(){}
     }
     }
 
 
 }
 }

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SingPfxManagementVO.java

@@ -27,4 +27,11 @@ public class SingPfxManagementVO {
     @ApiModelProperty("合同段ID")
     @ApiModelProperty("合同段ID")
     private Long contractId;
     private Long contractId;
 
 
+    public SingPfxManagementVO(Integer current, Integer size){
+        this.current = current;
+        this.size = size;
+    }
+
+    public SingPfxManagementVO(){}
+
 }
 }

+ 1065 - 1009
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -62,7 +62,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
- * 资料填报及查询控制器
+ *  资料填报及查询控制器
  *
  *
  * @author BladeX
  * @author BladeX
  * @since 2022-06-08
  * @since 2022-06-08
@@ -73,37 +73,99 @@ import java.util.stream.Collectors;
 @Api(tags = "资料查询接口")
 @Api(tags = "资料查询接口")
 public class InformationWriteQueryController extends BladeController {
 public class InformationWriteQueryController extends BladeController {
 
 
-    private final ContractClient contractClient;
-
-    private final WbsTreeContractClient wbsTreeContractClient;
-
-    private final WbsTreePrivateClient wbsTreePrivateClient;
-
-    private final IInformationQueryService informationQueryService;
-
-    private final IDictBizClient dictBizClient;
-
-    private final IContractTreeDrawingsService contractTreeDrawingsService;
-
-    private final ClientTreePublicCodeClientImpl clientTreePublicCodeClient;
-
-    private final ITreeContractFirstService treeContractFirstService;
-
-    private final IConstructionLedgerService constructionLedgerService;
-
-    private final TaskClient taskClient;
-
-    private final OperationLogClient operationLogClient;
-
-    /**
-     * 本地验签
-     */
-    @PostMapping("/localVerify")
-    @ApiOperationSupport(order = 21)
-    @ApiOperation(value = "本地验签")
-    public R<Boolean> localVerify(@RequestParam String ids) {
-        return R.data(false);
-    }
+	private final ContractClient contractClient;
+
+	private final WbsTreeContractClient wbsTreeContractClient;
+
+	private final WbsTreePrivateClient wbsTreePrivateClient;
+
+	private final IInformationQueryService informationQueryService;
+
+	private final IDictBizClient dictBizClient;
+
+	private final IContractTreeDrawingsService contractTreeDrawingsService;
+
+	private final ClientTreePublicCodeClientImpl clientTreePublicCodeClient;
+
+	private final ITreeContractFirstService treeContractFirstService;
+
+	private final IConstructionLedgerService constructionLedgerService;
+
+	private final TaskClient taskClient;
+
+	private final OperationLogClient operationLogClient;
+
+	/**
+	 * 单个废除
+	 */
+	@PostMapping("/abolishOne")
+	@ApiOperationSupport(order = 24)
+	@ApiOperation(value = "单个废除")
+	public R<Boolean> abolishOne(@RequestParam String primaryKeyId, @RequestParam String classify){
+		//查询填报状态
+		InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify));
+		if(businessData != null){
+			//使用批量废除接口
+			return this.batchAbolish(businessData.getId().toString());
+		}
+		return R.data(300, false, "废除失败,未找到业务数据");
+	}
+
+	/**
+	 * 查询节点状态
+	 */
+	@PostMapping("/queryNodeStatus")
+	@ApiOperationSupport(order = 23)
+	@ApiOperation(value = "/查询节点状态")
+	public R<String> queryNodeStatus(@RequestParam String primaryKeyId, @RequestParam String classify){
+		//查询填报状态
+		InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, primaryKeyId).eq(InformationQuery::getClassify, classify));
+		if(businessData != null){
+			switch (businessData.getStatus()){
+				case 0:
+				case 3:
+					//0属于未上报,3属于已废除,统一为待上报
+					return R.data("2");
+				case 1:
+				case 2:
+					//1属于待审批,2属于已审批,统一为已上报
+					return R.data("3");
+				default:
+					//如果不匹配,默认为未填报
+					return R.data("1");
+			}
+		}
+		return R.data("1");
+	}
+
+	/**
+	 * 填报页单个上报
+	 */
+	@PostMapping("/taskOne")
+	@ApiOperationSupport(order = 22)
+	@ApiOperation(value = "填报页单个上报")
+	public R<Boolean> taskOne(@RequestBody StartTaskVO startTaskVO){
+		//此时的ids是当前节点的primaryKeyId但并不是业务数据ID,需要根据ids和classify去查询具体的业务ID
+		InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()));
+		//处理上报信息
+		if(businessData != null){
+			//设置业务数据ID
+			startTaskVO.setIds(businessData.getId().toString());
+			return this.batchTask(startTaskVO);
+		}
+
+		return R.data(300,false,"上报失败");
+	}
+
+	/**
+	 * 本地验签
+	 */
+	@PostMapping("/localVerify")
+	@ApiOperationSupport(order = 21)
+	@ApiOperation(value = "本地验签")
+	public R<Boolean> localVerify(@RequestParam String ids){
+		return R.data(false);
+	}
 
 
     /**
     /**
      * 在线验签
      * 在线验签
@@ -133,981 +195,975 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperation(value = "批量下载")
     @ApiOperation(value = "批量下载")
     public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
     public void batchDownloadFileToZip(String ids, HttpServletResponse response) {
 
 
-    }
-
-    /**
-     * 批量废除
-     */
-    @PostMapping("/batchAbolish")
-    @ApiOperationSupport(order = 18)
-    @ApiOperation(value = "批量废除")
-    public R<Boolean> batchAbolish(@RequestParam String ids) {
-        //获取所有相关任务记录
-        List<Task> taskList = this.taskClient.queryTaskListByFormDataId(ids);
-        if (taskList != null && taskList.size() > 0) {
-            //执行废除
-            for (Task task : taskList) {
-                if (new Integer("1").equals(task.getStatus())) {
-                    //正在审批,调用废除
-                    this.taskClient.abolishTask(task);
-                } else if (new Integer("2").equals(task.getStatus())) {
-                    //已审批的任务,修改业务数据的审批状态为未上报并撤签即可
-                    this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, 3).in(InformationQuery::getId, Arrays.asList(task.getFormDataId().split(","))));
-                    // todo ================== 调用撤签
-                    // todo ================== 调用撤签
-                }
-                //保存操作记录
-                this.operationLogClient.saveUserOperationLog(6, "资料管理", "工序资料", task.getFormDataId());
-            }
-        }
-        return R.data(true);
-    }
-
-    /**
-     * 批量上报
-     */
-    @PostMapping("/batchTask")
-    @ApiOperationSupport(order = 17)
-    @ApiOperation(value = "批量上报")
-    public R<Boolean> batchTask(@RequestBody StartTaskVO startTaskVO) {
-        if (StringUtils.isNotEmpty(startTaskVO.getIds())) {
-            //获取数据源id
-            String[] ids = startTaskVO.getIds().split(",");
-            if (ids.length > 0) {
-                for (String id : ids) {
-                    //生成任务实体
-                    TaskVO taskVO = new TaskVO();
-                    BeanUtils.copyProperties(startTaskVO, taskVO);
-                    //设置数据源指向
-                    taskVO.setFormDataId(id);
-                    //设置上报类型
-                    taskVO.setApprovalType(1);
-                    //上报
-                    if (this.taskClient.startTask(taskVO).getData()) {
-                        //查询审批人
-                        List<TaskParallel> taskUsers = this.taskClient.queryApprovalUser(id);
-                        if (taskUsers.size() > 0) {
-                            //生成审批人信息
-                            StringBuilder stringBuilder = new StringBuilder();
-                            taskUsers.forEach(users -> stringBuilder.append(",").append(users.getTaskUser()).append("-").append(users.getTaskUserName()));
-                            //修改记录
-                            this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, 1).set(InformationQuery::getAuditUserIdAndName, stringBuilder.substring(1)).eq(InformationQuery::getId, id));
-                        }
-                    }
-                }
-                //保存操作记录
-                this.operationLogClient.saveUserOperationLog(5, "资料管理", "工序资料", startTaskVO.getIds());
-                return R.data(true);
-            }
-        }
-        return R.data(false);
-    }
-
-    /**
-     * 自定义排序
-     */
-    @PostMapping("/diySort")
-    @ApiOperationSupport(order = 16)
-    @ApiOperation(value = "自定义排序")
-    public R<Boolean> diySort(@RequestBody DiySortVO vo) {
-        //获取排序集合
-        List<String> sortList = vo.getSortList();
-        if (sortList.size() > 0) {
-            for (int i = 0, l = sortList.size(); i < l; i++) {
-                try {
-                    WbsTreeContract newData = new WbsTreeContract();
-                    newData.setPKeyId(Long.parseLong(sortList.get(i)));
-                    newData.setSort(i);
-                    //修改排序
-                    this.wbsTreeContractClient.updateContractNodeParameter(newData);
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        }
-
-        return R.data(false);
-    }
-
-    /**
-     * 复制节点
-     */
-    @PostMapping("/copyContractTreeNode")
-    @ApiOperationSupport(order = 15)
-    @ApiOperation(value = "复制节点")
-    public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
-
-        //首先查询需要复制的节点及其下级所有子节点的信息
-        WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
-
-        List<WbsTreeContract> parentList = new ArrayList<>(), childList = new ArrayList<>(), allList = new ArrayList<>(), saveList = new ArrayList<>();
-        //新增施工台账
-        List<ConstructionLedger> saveLedger = new ArrayList<>();
-
-        parentList.add(needCopyNode);
-        //查询所有有效子节点
-        this.foreachQueryChildContract(parentList, childList);
-        allList.addAll(parentList);
-        allList.addAll(childList);
-
-        if ("1".equals(vo.getCopyType())) {
-            if (StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())) {
-                WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
-                //重塑关键信息
-                Map<Long, Long> oldToNewIdMap = new HashMap<>();
-                allList.forEach(node -> oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId()));
-                //todo 单份复制
-                allList.forEach(node -> {
-                    WbsTreeContract newData = new WbsTreeContract();
-                    BeanUtils.copyProperties(node, newData);
-
-                    //重塑关键信息
-                    //重塑primaryKeyId
-                    newData.setPKeyId(SnowFlakeUtil.getId());
-                    //设置旧ID
-                    newData.setOldId(node.getId().toString());
-                    //设置新ID
-                    newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
-                    //设置父节点ID
-                    if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
-                        //找到复制的节点,将parentId更改为 parent.getId()
-                        newData.setParentId(parent.getId());
-                        //设置新名称
-                        newData.setDeptName(vo.getNeedCopyNodeName());
-                        newData.setFullName(vo.getNeedCopyNodeName());
-                    } else {
-                        newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
-                    }
-                    newData.setCreateTime(new Date());
-                    newData.setUpdateTime(new Date());
-                    newData.setCreateUser(AuthUtil.getUserId());
-                    //保存到集合中
-                    saveList.add(newData);
-
-                    if (new Integer("6").equals(node.getDeptCategory())) {
-                        //生成施工日志
-                        this.createLedger(newData, saveLedger);
-                    }
-                });
-            }
-
-        } else {
-            //todo 多份复制
-            //获取需要复制到的位置集合
-            List<CopyContractTreeNodeVO.CopyBatch> copyBatches = vo.getCopyBatchToPaths();
-            if (copyBatches.size() > 0) {
-                copyBatches.forEach(copyBatch -> {
-                    //查询复制到的位置信息
-                    WbsTreeContract copyPath = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(copyBatch.getPrimaryKeyId());
-
-                    //重塑关键信息
-                    Map<Long, Long> oldToNewIdMap = new HashMap<>();
-                    allList.forEach(node -> oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId()));
-
-                    allList.forEach(node -> {
-                        WbsTreeContract newData = new WbsTreeContract();
-                        BeanUtils.copyProperties(node, newData);
-
-                        //重塑关键信息
-                        //设置旧ID
-                        newData.setOldId(node.getId().toString());
-                        //重塑primaryKeyId
-                        newData.setPKeyId(SnowFlakeUtil.getId());
-                        //设置新ID
-                        newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
-                        //设置父节点ID
-                        if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
-                            //找到复制的节点,将parentId更改为 parent.getId()
-                            newData.setParentId(copyPath.getId());
-                            //设置新名称
-                            newData.setDeptName(copyBatch.getNodeName());
-                            newData.setFullName(copyBatch.getNodeName());
-                        } else {
-                            newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
-                        }
-                        newData.setCreateTime(new Date());
-                        newData.setUpdateTime(new Date());
-                        newData.setCreateUser(AuthUtil.getUserId());
-
-                        //重塑父节点关联关系
-                        String ancestors = newData.getAncestors();
-                        if (StringUtils.isNotEmpty(ancestors)) {
-                            //重组后的链表
-                            StringBuilder stringBuilder = new StringBuilder();
-                            //拆分重组
-                            String[] ancestorsArray = ancestors.split(",");
-                            for (String oldParentId : ancestorsArray) {
-                                if (StringUtils.isNotEmpty(oldParentId)) {
-                                    //获取新的
-                                    Long newParentId = oldToNewIdMap.get(Long.parseLong(oldParentId));
-                                    //如果新的id为空,说明不变
-                                    stringBuilder.append(",").append(newParentId == null ? oldParentId : newParentId);
-                                }
-                            }
-                            //将新链表设置进对象中
-                            newData.setAncestors(stringBuilder.substring(1));
-                        }
-
-                        //保存到集合中
-                        saveList.add(newData);
-
-                        if (new Integer("6").equals(node.getDeptCategory())) {
-                            //生成施工日志
-                            this.createLedger(newData, saveLedger);
-                        }
-                    });
-
-                });
-            }
-        }
-        return this.saveOrCopyNodeTree(saveList, saveLedger);
-    }
-
-    /**
-     * 生成施工日志记录
-     */
-    private void createLedger(WbsTreeContract newData, List<ConstructionLedger> saveLedger) {
-        //工序,需要新增施工台账
-        ConstructionLedger ledger = new ConstructionLedger();
-        ledger.setSite(newData.getDeptName());
-        ledger.setIsBeton(newData.getIsConcrete());
-        ledger.setWbsId(newData.getPKeyId());
-        ledger.setContractId(Long.parseLong(newData.getContractId()));
-        ledger.setProjectId(Long.parseLong(newData.getProjectId()));
-        ledger.setCreateTime(new Date());
-        ledger.setCreateUser(AuthUtil.getUserId());
-        ledger.setIsDeleted(0);
-        saveLedger.add(ledger);
-    }
-
-    /**
-     * 循环查询子节点
-     *
-     * @param parentList 父节点集合
-     * @param childList  保存集合
-     */
-    private void foreachQueryChildContract(List<WbsTreeContract> parentList, List<WbsTreeContract> childList) {
-        parentList.forEach(parent -> {
-            if (!new Integer("6").equals(parent.getDeptCategory())) {
-                //查询子节点
-                List<WbsTreeContract> childs = this.wbsTreeContractClient.queryChildByParentId(parent, "notQueryTable");
-                if (childs != null && childs.size() > 0) {
-                    //添加入结果集
-                    childList.addAll(childs);
-                    //还有子级,继续向下
-                    this.foreachQueryChildContract(childs, childList);
-                }
-            } else {
-                //工序,则查询对应的表格数据
-                List<WbsTreeContract> childs = this.wbsTreeContractClient.queryChildByParentId(parent, "queryTable");
-                if (childs != null && childs.size() > 0) {
-                    //添加入结果集
-                    childList.addAll(childs);
-                }
-            }
-        });
-    }
-
-    /**
-     * 导图结构树节点查询
-     *
-     * @return 结果
-     */
-    @GetMapping("/queryMappingStructureTree")
-    @ApiOperationSupport(order = 14)
-    @ApiOperation(value = "导图结构树节点查询")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "parentId", value = "父节点,首次进入传0、null、''", required = true),
-            @ApiImplicitParam(name = "wbsType", value = "模板类型, 1质检,2试验", required = true),
-            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-    })
-    public R<List<WbsTreeContractTreeVOS>> queryMappingStructureTree(@RequestParam String parentId, @RequestParam Integer wbsType, @RequestParam String contractId, @RequestParam String contractIdRelation) {
-        List<WbsTreeContractTreeVOS> result;
-
-        //获取合同段,检查是否是监理合同段
-        ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(contractId));
-
-        if (contractInfo.getContractType() != null && new Integer("2").equals(contractInfo.getContractType())) {
-            //监理合同段
-            List<WbsTreeContractTreeVOS> childList = this.wbsTreeContractClient.lazyTree(StringUtils.isNotEmpty(parentId) ? Long.parseLong(parentId) : 0, contractId, contractIdRelation, contractInfo.getContractType());
-            //设置合同段根节点的名称
-            this.setRootNodeName(parentId, childList);
-            if (childList != null && childList.size() == 1) {
-                //需要向下展开
-                this.foreachQueryChildNode(childList, childList.get(0).getContractIdRelation(), 1);
-            }
-            if (StringUtils.isEmpty(contractIdRelation) && "0".equals(parentId)) {
-                //给个顶点
-                WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
-                vos.setTitle(contractInfo.getContractName());
-                vos.setChildren(childList);
-                result = new ArrayList<>();
-                result.add(vos);
-            } else {
-                result = childList;
-            }
-
-        } else {
-            if (StringUtils.isEmpty(parentId) || "0".equals(parentId)) {
-                //直接返回
-                result = this.clientTreePublicCodeClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, "0");
-            } else {
-                //不是根节点,则获取子节点
-                result = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
-                //判断当前节点下是不是只有一个子节点
-                if (result != null && result.size() == 1) {
-                    this.foreachQueryChildNode(result, contractId, contractInfo.getContractType());
-                }
-            }
-        }
-
-        if (result != null) {
-            //获取当前父节点下所有工序节点及填报资料
-            List<QueryProcessDataVO> queryDataResult;
-            if (new Integer("2").equals(contractInfo.getContractType())) {
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 2, contractIdRelation);
-            } else {
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 1, contractId);
-            }
-            result.forEach(vos -> {
-                if (StringUtils.isEmpty(parentId) || "0".equals(parentId)) {
-                    vos.setTitle(contractInfo.getContractName());
-                }
-                if (queryDataResult != null && queryDataResult.size() > 0) {
-                    //设置颜色
-                    this.setNodeColor(vos, queryDataResult, false);
-                }
-                //处理子节点
-                if (vos.getChildren() != null && vos.getChildren().size() > 0) {
-                    //循环处理节点颜色
-                    this.foreachSetNodeColor(vos.getChildren(), queryDataResult);
-                }
-
-            });
-        }
-
-        return R.data(result);
-    }
-
-    /**
-     * 循环处理节点颜色
-     */
-    private void foreachSetNodeColor(List<WbsTreeContractTreeVOS> children, List<QueryProcessDataVO> queryDataResult) {
-        children.forEach(vos -> {
-            this.setNodeColor(vos, queryDataResult, false);
-            if (vos.getChildren() != null && vos.getChildren().size() > 0) {
-                //进一步处理
-                this.foreachSetNodeColor(vos.getChildren(), queryDataResult);
-            }
-        });
-
-    }
-
-    /**
-     * 监理合同段设置关联合同段的根节点名称
-     */
-    private void setRootNodeName(@RequestParam String parentId, List<WbsTreeContractTreeVOS> childList) {
-        if (StringUtils.isEmpty(parentId) || "0".equals(parentId)) {
-            if (childList != null && childList.size() > 0) {
-                childList.forEach(treeNode -> {
-                    ContractInfo clientContract = this.contractClient.getContractById(Long.parseLong(treeNode.getContractIdRelation()));
-                    if (clientContract != null) {
-                        treeNode.setTitle(clientContract.getContractName());
-                    }
-                });
-            }
-        }
-    }
-
-    /**
-     * 如果子节点只有一个,则进一步查询该子节点的下级节点
-     *
-     * @param result 子节点集合
-     */
-    private void foreachQueryChildNode(List<WbsTreeContractTreeVOS> result, String contractId, Integer initialContractType) {
-        result.forEach(vos -> {
-            String id = new Integer("2").equals(initialContractType) ? vos.getPrimaryKeyId() : vos.getId();
-            String primaryKeyId = new Integer("2").equals(initialContractType) ? vos.getId() : vos.getPrimaryKeyId();
-
-            List<WbsTreeContractTreeVOS> child = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, id);
-            if (child != null && child.size() == 1) {
-                //如果子节点还是只有一个,则进一步向下查询
-                this.foreachQueryChildNode(child, contractId, initialContractType);
-            }
-            //判断当前节点是否被标记为首件
-            TreeContractFirst first = this.treeContractFirstService.getOne(Wrappers.<TreeContractFirst>lambdaQuery().eq(TreeContractFirst::getIsDeleted, 0).eq(TreeContractFirst::getWbsNodeId, primaryKeyId));
-            vos.setIsFirst(first != null);
-
-            vos.setChildren(child);
-        });
-    }
-
-    /**
-     * 修改节点信息
-     *
-     * @return 修改结果
-     */
-    @PostMapping("/updateContractNodeParameter")
-    @ApiOperationSupport(order = 13)
-    @ApiOperation(value = "修改节点信息")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "pKeyId", value = "节点的primaryKeyId", required = true),
-            @ApiImplicitParam(name = "deptName", value = "节点的title", required = true),
-            @ApiImplicitParam(name = "partitionCode", value = "划分编号")
-    })
-    public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @RequestParam String deptName, @RequestParam String partitionCode) {
-        WbsTreeContract node = new WbsTreeContract();
-        node.setPKeyId(pKeyId);
-        node.setDeptName(deptName);
-        node.setPartitionCode(partitionCode);
-
-        //只允许修改节点名称
-        if (StringUtils.isEmpty(node.getDeptName()) || "null".equals(String.valueOf(node.getPKeyId())) || StringUtils.isEmpty(String.valueOf(node.getPKeyId()))) {
-            return R.data(-1, false, "缺少参数");
-        }
-        //保存操作记录
-        this.operationLogClient.saveUserOperationLog(3, "资料管理", "工序资料", pKeyId);
-        return R.data(this.wbsTreeContractClient.updateContractNodeParameter(node));
-    }
-
-    /**
-     * 获取节点信息
-     *
-     * @param primaryKeyId 节点的primaryKeyId
-     * @return 节点信息
-     */
-    @GetMapping("/getContractNodeByPrimaryKeyId")
-    @ApiOperationSupport(order = 12)
-    @ApiOperation(value = "获取节点信息")
-    @ApiImplicitParam(name = "primaryKeyId", value = "节点的primaryKeyId")
-    public R<WbsTreeContract> getContractNodeByPrimaryKeyId(@RequestParam String primaryKeyId) {
-        return R.data(this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(primaryKeyId));
-    }
-
-
-    /**
-     * 删除节点
-     *
-     * @param ids 节点的primaryKeyId
-     * @return 删除结果
-     */
-    @PostMapping("/removeContractTreeNode")
-    @ApiOperationSupport(order = 11)
-    @ApiOperation(value = "删除节点")
-    @ApiImplicitParam(name = "ids", value = "节点的primaryKeyId")
-    public R<Boolean> removeContractTreeNode(@RequestParam String ids) {
-        //保存操作记录
-        this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", ids);
-        return R.data(this.wbsTreeContractClient.removeContractTreeNode(ids));
-    }
-
-    /**
-     * 新增子节点
-     *
-     * @return 新增结果
-     */
-    @PostMapping("/saveContractTreeNode")
-    @ApiOperationSupport(order = 10)
-    @ApiOperation(value = "新增节点及其子节点")
-    public R<Boolean> saveContractTreeNode(@RequestBody AddContractTreeNodeVO vo) {
-        //先获取当前节点的信息
-        WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(vo.getCurrentNodePrimaryKeyId()));
-
-        //半选
-        List<AddContractTreeNodeVO.Node> halfSelectedNodeList = vo.getHalfSelectedList();
-        //全选
-        List<AddContractTreeNodeVO.Node> allSelectedNodeList = vo.getAllSelectedList();
-        //勾选的数据
-        List<AddContractTreeNodeVO.Node> selectList = new ArrayList<>();
-        selectList.addAll(halfSelectedNodeList);
-        selectList.addAll(allSelectedNodeList);
-
-        //所有相关节点集合
-        List<WbsTreePrivate> selectedNodeList = new ArrayList<>();
-
-        //检查新增类型
-        if ("1".equals(vo.getSaveType())) {
-            //todo 当前节点及其子节点
-            //当前节点及其子节点时,半选说明其下的子节点并不是全部选中的,所以这时候只需要根据全选的查询其全部子节点即可
-            if (allSelectedNodeList.size() > 0) {
-                //获取主键
-                List<String> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
-                //查询对应数据
-                selectedNodeList = this.wbsTreePrivateClient.queryByPKeyIds(allSelectedList);
-                //剔除与当前操作节点相同的ID
-                selectedNodeList.removeIf(wbsTreePrivate -> treeContract.getId().equals(wbsTreePrivate.getId()));
-
-                //全选的集合则进一步向下查询
-                List<WbsTreePrivate> childList = new ArrayList<>();
-                this.foreachQueryChild(selectedNodeList, childList);
-
-                if (childList.size() > 0) {
-                    //处理重复的数据
-                    Iterator<WbsTreePrivate> iterator = childList.iterator();
-                    while (iterator.hasNext()) {
-                        WbsTreePrivate next = iterator.next();
-                        for (WbsTreePrivate treePrivate : selectedNodeList) {
-                            if (treePrivate.getPKeyId().equals(next.getPKeyId())) {
-                                //删掉重复数据
-                                iterator.remove();
-                            }
-                        }
-                    }
-                }
-                //处理完重复数据后,设置进集合中
-                selectedNodeList.addAll(childList);
-            }
-            //处理半选
-            this.disposeHalfSelectList(vo, halfSelectedNodeList, selectedNodeList);
-
-        } else {
-            //todo 仅当前节点操作
-            if (halfSelectedNodeList.size() > 0) {
-                //获取主键
-                List<String> halfSelectedList = halfSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
-                //查询数据
-                selectedNodeList = this.wbsTreePrivateClient.queryByPKeyIds(halfSelectedList);
-                //剔除与当前操作节点相同的ID
-                selectedNodeList.removeIf(wbsTreePrivate -> treeContract.getId().equals(wbsTreePrivate.getId()));
-            }
-            //处理半选
-            this.disposeHalfSelectList(vo, allSelectedNodeList, selectedNodeList);
-
-        }
-
-        //保存集合
-        List<WbsTreeContract> saveList = new ArrayList<>();
-        List<ConstructionLedger> saveLedger = new ArrayList<>();
-        if (selectedNodeList.size() > 0) {
-            //重塑关键信息
-            Map<Long, Long> OldIdToNewIdMap = new HashMap<>();
-            selectedNodeList.forEach(half -> OldIdToNewIdMap.put(half.getId(), SnowFlakeUtil.getId()));
-
-            //处理数据
-            selectedNodeList.forEach(half -> {
-                //处理合同段数据
-                WbsTreeContract newData = new WbsTreeContract();
-                BeanUtils.copyProperties(half, newData);
-
-                //重塑pKeyId、id和parentId
-                newData.setPKeyId(SnowFlakeUtil.getId());
-                newData.setId(OldIdToNewIdMap.containsKey(half.getId()) ? OldIdToNewIdMap.get(half.getId()) : SnowFlakeUtil.getId());
-                newData.setParentId(OldIdToNewIdMap.containsKey(half.getParentId()) ? OldIdToNewIdMap.get(half.getParentId()) : treeContract.getId().equals(half.getParentId()) ? treeContract.getId() : SnowFlakeUtil.getId());
-                //记录旧ID
-                newData.setOldId(half.getId().toString());
-                //设置合同段等信息
-                newData.setWbsType(treeContract.getWbsType());
-                newData.setContractId(vo.getContractId());
-                newData.setContractIdRelation(treeContract.getContractIdRelation());
-                newData.setContractType(treeContract.getContractType());
-                newData.setCreateTime(new Date());
-
-                //重塑父节点关联关系
-                String ancestors = newData.getAncestors();
-                if (StringUtils.isNotEmpty(ancestors)) {
-                    //重组后的链表
-                    StringBuilder stringBuilder = new StringBuilder();
-                    //拆分重组
-                    String[] ancestorsArray = ancestors.split(",");
-                    for (String oldParentId : ancestorsArray) {
-                        if (StringUtils.isNotEmpty(oldParentId)) {
-                            //获取新的
-                            Long newParentId = OldIdToNewIdMap.get(Long.parseLong(oldParentId));
-                            //如果新的id为空,说明不变
-                            stringBuilder.append(",").append(newParentId == null ? oldParentId : newParentId);
-                        }
-                    }
-                    //将新链表设置进对象中
-                    newData.setAncestors(stringBuilder.substring(1));
-                }
-
-                //设置名称
-                Iterator<AddContractTreeNodeVO.Node> iterator = selectList.iterator();
-                while (iterator.hasNext()) {
-                    AddContractTreeNodeVO.Node next = iterator.next();
-                    if (next.getPrimaryKeyId().equals(half.getPKeyId().toString())) {
-                        newData.setFullName(next.getNodeName());
-                        iterator.remove();
-                        break;
-                    }
-                }
-
-                //设置到保存集合中
-                saveList.add(newData);
-
-                if (new Integer("6").equals(newData.getDeptCategory())) {
-                    //生成施工日志
-                    this.createLedger(newData, saveLedger);
-                }
-
-            });
-        }
-
-        return this.saveOrCopyNodeTree(saveList, saveLedger);
-    }
-
-    @NotNull
-    private R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger) {
-        if (saveList.size() > 0) {
-            //保存施工日志
-            if (saveLedger.size() > 0) {
-                this.constructionLedgerService.saveBatch(saveLedger);
-            }
-            try {
-                //保存操作记录
-                this.operationLogClient.saveUserOperationLog(2, "资料管理", "工序资料", String.join(",", JSONArray.parseArray(JSONObject.toJSONString(saveList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList())), String.class)));
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-            //保存节点
-            return R.data(this.wbsTreeContractClient.saveBatch(saveList));
-        }
-
-        return R.data(false);
-    }
-
-    /**
-     * 处理半选集合
-     */
-    private void disposeHalfSelectList(@RequestBody AddContractTreeNodeVO vo, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList) {
-        if (allSelectedNodeList != null && allSelectedNodeList.size() > 0) {
-            //获取主键
-            List<String> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
-            //查询对应数据
-            List<WbsTreePrivate> allSelectedNodeLists = this.wbsTreePrivateClient.queryByPKeyIds(allSelectedList);
-            //剔除与当前操作节点相同的ID
-            allSelectedNodeLists.removeIf(wbsTreePrivate -> vo.getCurrentNodePrimaryKeyId().equals(wbsTreePrivate.getId().toString()));
-            //设置到集合中
-            selectedNodeList.addAll(allSelectedNodeLists);
-        }
-    }
-
-    /**
-     * 循环查询子节点
-     *
-     * @param parentList 父节点集合
-     * @param childList  保存集合
-     */
-    private void foreachQueryChild(List<WbsTreePrivate> parentList, List<WbsTreePrivate> childList) {
-        parentList.forEach(parent -> {
-            if (!new Integer("6").equals(parent.getDeptCategory())) {
-                //查询子节点
-                List<WbsTreePrivate> childs = this.wbsTreePrivateClient.queryChildByParentId(parent);
-                if (childs != null && childs.size() > 0) {
-                    //添加入结果集
-                    childList.addAll(childs);
-                    //还有子级,继续向下
-                    this.foreachQueryChild(childs, childList);
-                }
-            } else {
-                //说明是工序,查询这个节点下是否存在表格数据
-                List<WbsTreePrivate> exlTables = this.wbsTreePrivateClient.queryExcelTableByParentId(parent);
-                if (exlTables != null && exlTables.size() > 0) {
-                    childList.addAll(exlTables);
-                }
-            }
-        });
-    }
-
-    /**
-     * 懒加载项目级工程划分树
-     *
-     * @param projectId 项目ID
-     * @param id        节点ID
-     * @return 结果集
-     */
-    @PostMapping("/queryWbsTreePrivateByProjectIdAndId")
-    @ApiOperationSupport(order = 9)
-    @ApiOperation(value = "懒加载项目级工程划分树")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "projectId", value = "项目ID"),
-            @ApiImplicitParam(name = "id", value = "点击节点ID")
-    })
-    public R<List<WbsTreeContractTreeVOS>> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam String id) {
-        return R.data(this.wbsTreePrivateClient.queryWbsTreePrivateByProjectIdAndId(projectId, Long.parseLong(id)));
-    }
-
-    /**
-     * 获取与当前节点平级的项目级节点
-     *
-     * @param primaryKeyId 主键
-     * @return 结果
-     */
-    @PostMapping("/queryPeersNode")
-    @ApiOperationSupport(order = 8)
-    @ApiOperation(value = "获取与当前节点平级的项目级节点")
-    @ApiImplicitParam(name = "primaryKeyId", value = "需要新增子节点的节点ID,即当前点出菜单栏的节点ID")
-    public R<WbsTreePrivate> queryPeersNode(@RequestParam String primaryKeyId) {
-        if (StringUtils.isEmpty(primaryKeyId) || "null".equals(primaryKeyId)) {
-            return R.data(null);
-        }
-
-        //首先获取当前节点信息
-        WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(primaryKeyId));
-        //获取与其平级对应的项目级节点
-        WbsTreePrivate treePrivate = this.wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
-
-        return R.data(treePrivate);
-    }
-
-
-    /**
-     * 获取流程状态分类和文件类型分类
-     */
-    @GetMapping("/getDictBizClassifyByCode")
-    @ApiOperationSupport(order = 7)
-    @ApiOperation(value = "获取流程状态分类和文件类型分类")
-    @ApiImplicitParam(name = "code", value = "获取流程状态分类:flowTaskStatus;获取文件类型分类:fileType")
-    public R<List<DictBiz>> getDictBizClassifyByCode(@RequestParam String code) {
-        return this.dictBizClient.getList(code, "notRoot");
-    }
-
-    /**
-     * 获取当前合同段下所有的上报批次
-     *
-     * @param contractId 合同段ID
-     * @return 结果
-     */
-    @GetMapping("/getReportNumberByContractId")
-    @ApiOperationSupport(order = 6)
-    @ApiOperation(value = "获取当前合同段下所有的上报批次")
-    @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-    public R<List<Integer>> getReportNumberByContractId(@RequestParam String contractId) {
-        //获取合同段信息
-        ContractInfo contract = this.contractClient.getContractById(Long.valueOf(contractId));
-        return R.data(this.informationQueryService.getReportNumberByContractId(contract.getContractType() == null ? 1 : contract.getContractType(), contractId));
-    }
-
-    /**
-     * 根据合同段ID获取所有填报人
-     *
-     * @param contractId 合同段ID
-     * @return 填报人集合
-     */
-    @GetMapping("/getFileUserByContractId")
-    @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "根据合同段ID获取所有填报人")
-    @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-    public R<List<FileUserVO>> getFileUserByContractId(@RequestParam String contractId) {
-        //获取合同段信息
-        ContractInfo contract = this.contractClient.getContractById(Long.valueOf(contractId));
-        return R.data(this.informationQueryService.queryFileUserByContractId(contract.getContractType() == null ? 1 : contract.getContractType(), contractId));
-    }
-
-    /**
-     * 分页
-     *
-     * @param vo 查询条件
-     * @return 结果
-     */
-    @PostMapping("/page")
-    @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "分页")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "size", value = "当前页条数", required = true),
-            @ApiImplicitParam(name = "current", value = "当前页", required = true),
-            @ApiImplicitParam(name = "wbsId", value = "节点ID", required = true),
-            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-    })
-    public R<IPage<InformationQueryVO>> page(@RequestBody InformationQueryVO vo) {
-        if ("null".equals(String.valueOf(vo.getContractId())) || StringUtils.isEmpty(String.valueOf(vo.getContractId()))) {
-            return R.data(-1, null, "数据查询失败");
-        }
-        //封装分页信息
-        Query query = new Query();
-        query.setSize(vo.getSize());
-        query.setCurrent(vo.getCurrent());
-        //获取合同段信息
-        ContractInfo contract = this.contractClient.getContractById(vo.getContractId());
-        vo.setClassify(contract.getContractType() == null ? 1 : contract.getContractType());
-
-        return R.data(this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo));
-    }
-
-    /**
-     * 获取当前合同段的划分树
-     *
-     * @return 结果
-     */
-    @GetMapping("/queryContractWbsTreeByContractIdAndType")
-    @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "获取当前合同段的划分树")
-    @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
-            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
-    })
-    public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation) {
-        List<WbsTreeContractTreeVOS> rootTreeNode;
-
-        //获取合同段,检查是否是监理合同段
-        ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(contractId));
-        if (new Integer("2").equals(contractInfo.getContractType())) {
-            //监理合同段,需要获取关联的施工方合同段根节点数据
-            rootTreeNode = this.wbsTreeContractClient.lazyTree(StringUtils.isNotEmpty(parentId) ? Long.parseLong(parentId) : 0, contractId, contractIdRelation, contractInfo.getContractType());
-            //设置合同段根节点的名称
-            //this.setRootNodeName(parentId, rootTreeNode);
-
-        } else {
-            if (com.alibaba.nacos.common.utils.StringUtils.isEmpty(parentId)) {
-                //为空,说明初始化
-                //获取根节点
-                rootTreeNode = this.clientTreePublicCodeClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
-            } else {
-                //不为空,获取其下子节点
-                rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
-            }
-        }
-
-        //其他参数
-        if (rootTreeNode != null && rootTreeNode.size() > 0) {
-            //获取当前父节点下所有工序节点及填报资料
-            List<QueryProcessDataVO> queryDataResult;
-            if (new Integer("2").equals(contractInfo.getContractType())) {
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 2, contractIdRelation);
-            } else {
-                queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 1, contractId);
-            }
-
-            rootTreeNode.forEach(vo -> {
-                String primaryKeyId = new Integer("2").equals(contractInfo.getContractType()) ? vo.getId() : vo.getPrimaryKeyId();
-
-                //施工修改根节点名称
-                if (new Integer("1").equals(contractInfo.getContractType())) {
-                    if (StringUtils.isEmpty(parentId) || "0".equals(parentId)) {
-                        vo.setTitle(contractInfo.getContractName());
-                    }
-                }
-
-                //获取上传的图纸
-                ContractTreeDrawings drawings = this.contractTreeDrawingsService.queryCurrentNodeDrawings(primaryKeyId);
-                if (drawings != null) {
-                    //主键
-                    vo.setDrawingsId(drawings.getId());
-                    //文件路径
-                    vo.setFileUrl(drawings.getFileUrl());
-                }
-
-                //处理颜色
-                if (queryDataResult != null && queryDataResult.size() > 0) {
-                    this.setNodeColor(vo, queryDataResult, true);
-                }
-
-                //判断当前节点是否被标记为首件
-                TreeContractFirst first = this.treeContractFirstService.getOne(Wrappers.<TreeContractFirst>lambdaQuery().eq(TreeContractFirst::getIsDeleted, 0).eq(TreeContractFirst::getWbsNodeId, primaryKeyId));
-                vo.setIsFirst(first != null);
-            });
-        }
-
-        return R.data(rootTreeNode);
-    }
-
-    /**
-     * 设置节点颜色
-     * 填报节点:
-     * 未填报1 < 已填报-未上报2 < 已填报-待审批3 < 已审批4
-     * <p>
-     * 非填报节点
-     * 未填报1(其下所有工序节点均未填报) < 已填报2(未上报和待审批) < 已审批4(其下所有工序节点均审批)
-     */
-    private void setNodeColor(WbsTreeContractTreeVOS vos, List<QueryProcessDataVO> queryDataResult, boolean isRemove) {
-        if (queryDataResult != null && queryDataResult.size() > 0) {
-            Iterator<QueryProcessDataVO> iterator = queryDataResult.iterator();
-            //默认均未填报
-            StringBuilder colorStatusValue = new StringBuilder();
-            while (iterator.hasNext()) {
-                QueryProcessDataVO query = iterator.next();
-                if (StringUtils.isNotEmpty(query.getAncestors()) && StringUtils.isNotEmpty(vos.getId())) {
-                    if (query.getAncestors().contains(vos.getId()) || query.getAncestors().startsWith(vos.getParentId() + ",") || query.getTreeId().equals(vos.getId())) {
-                        //如果为空,说明未填报
-                        if (query.getStatus() == null || query.getStatus() == -1) {
-                            colorStatusValue.append("1");
-                        } else {
-                            switch (query.getStatus()) {
-                                case 0:
-                                case 3:
-                                    //未上报
-                                    colorStatusValue.append("2");
-                                    break;
-                                case 1:
-                                    //待审批
-                                    colorStatusValue.append("3");
-                                    break;
-                                case 2:
-                                    //已审批
-                                    colorStatusValue.append("4");
-                                    break;
-                                default:
-                                    colorStatusValue.append("1");
-                                    break;
-                            }
-                            if (isRemove) {
-                                iterator.remove();
-                            }
-                        }
-                    }
-                } else {
-                    colorStatusValue.append("1");
-                }
-            }
-            //检查字符串
-            if (StringUtils.isNotEmpty(colorStatusValue.toString())) {
-                if (new Integer("6").equals(vos.getDeptCategory())) {
-                    //工序,则直接使用字符串的判断
-                    vos.setColorStatus(new Integer(colorStatusValue.toString()));
-                } else {
-                    if (colorStatusValue.toString().contains("1")) {
-                        //含有1
-                        if (colorStatusValue.toString().contains("2") || colorStatusValue.toString().contains("3") || colorStatusValue.toString().contains("4")) {
-                            //同时含有2/3/4,取2
-                            vos.setColorStatus(2);
-                        } else {
-                            //否则,取1
-                            vos.setColorStatus(1);
-                        }
-                    } else {
-                        //不含有1
-                        if (colorStatusValue.toString().contains("4") && !colorStatusValue.toString().contains("2") && !colorStatusValue.toString().contains("3")) {
-                            //只含有4,取4
-                            vos.setColorStatus(4);
-                        } else {
-                            //反之包含2/3,取2
-                            vos.setColorStatus(2);
-                        }
-                    }
-                }
-            } else {
-                vos.setColorStatus(1);
-            }
-        }
-    }
-
-    /**
-     * 修改
-     */
-    @PostMapping("/update")
-    @ApiOperationSupport(order = 1)
-    @ApiOperation(value = "修改(只能修改编号和文件名)")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "name", value = "文件名称, 必须有值", required = true),
-            @ApiImplicitParam(name = "number", value = "文件编号,可以为空")
-    })
-    public R<Boolean> update(@Valid @RequestBody InformationQuery informationQuery) {
-        if ("null".equals(String.valueOf(informationQuery.getId())) || StringUtils.isEmpty(String.valueOf(informationQuery.getId()))) {
-            return R.data(-1, false, "数据操作失败");
-        }
-        return R.status(informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getName, informationQuery.getName()).set(InformationQuery::getNumber, informationQuery.getNumber()).eq(InformationQuery::getId, informationQuery.getId())));
-    }
-
-
-    /**
-     * 删除
-     */
-    @PostMapping("/remove")
-    @ApiOperationSupport(order = 2)
-    @ApiOperation(value = "逻辑删除", notes = "传入ids")
-    public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        return R.status(informationQueryService.deleteLogic(Func.toLongList(ids)));
-    }
-
-
+	}
+
+	/**
+	 * 批量废除
+	 */
+	@PostMapping("/batchAbolish")
+	@ApiOperationSupport(order = 18)
+	@ApiOperation(value = "批量废除")
+	public R<Boolean> batchAbolish(@RequestParam String ids){
+		//获取所有相关任务记录
+		List<Task> taskList =  this.taskClient.queryTaskListByFormDataId(ids);
+		if(taskList != null && taskList.size() > 0){
+			try{
+				//执行废除
+				for(Task task : taskList){
+					if(new Integer("1").equals(task.getStatus())){
+						//正在审批,调用废除
+						this.taskClient.abolishTask(task);
+					} else if(new Integer("2").equals(task.getStatus())) {
+						//已审批的任务,修改业务数据的审批状态为未上报并撤签即可
+						this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, 3).in(InformationQuery::getId, Arrays.asList(task.getFormDataId().split(","))));
+						// todo ================== 调用撤签
+						// todo ================== 调用撤签
+					}
+					//保存操作记录
+					this.operationLogClient.saveUserOperationLog(6, "资料管理", "工序资料", task.getFormDataId());
+				}
+			}catch (Exception e){
+				e.printStackTrace();
+				return R.data(300, false, "废除失败");
+			}
+		}
+		return R.data(true, "废除成功");
+	}
+
+	/**
+	 * 批量上报
+	 */
+	@PostMapping("/batchTask")
+	@ApiOperationSupport(order = 17)
+	@ApiOperation(value = "批量上报")
+	public R<Boolean> batchTask(@RequestBody StartTaskVO startTaskVO){
+		if(StringUtils.isNotEmpty(startTaskVO.getIds())){
+			//获取数据源id
+			String[] ids = startTaskVO.getIds().split(",");
+			if(ids.length > 0){
+				try{
+					for(String id : ids){
+						//生成任务实体
+						TaskVO taskVO = new TaskVO();
+						BeanUtils.copyProperties(startTaskVO, taskVO);
+						//设置数据源指向
+						taskVO.setFormDataId(id);
+						//设置上报类型
+						taskVO.setApprovalType(1);
+						//上报
+						if(this.taskClient.startTask(taskVO).getData()){
+							//查询审批人
+							List<TaskParallel> taskUsers = this.taskClient.queryApprovalUser(id);
+							if(taskUsers.size() > 0){
+								//生成审批人信息
+								StringBuilder stringBuilder = new StringBuilder();
+								taskUsers.forEach(users -> stringBuilder.append(",").append(users.getTaskUser()).append("-").append(users.getTaskUserName()));
+								//修改记录
+								this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getStatus, 1).set(InformationQuery::getAuditUserIdAndName, stringBuilder.substring(1)).eq(InformationQuery::getId, id));
+							}
+						}
+					}
+				}catch (Exception e){
+					e.printStackTrace();
+					return R.data(300, false, "上报失败");
+				}
+				//保存操作记录
+				this.operationLogClient.saveUserOperationLog(5, "资料管理", "工序资料", startTaskVO.getIds());
+				return R.data(true);
+			}
+		}
+		return R.data(false);
+	}
+
+	/**
+	 * 自定义排序
+	 */
+	@PostMapping("/diySort")
+	@ApiOperationSupport(order = 16)
+	@ApiOperation(value = "自定义排序")
+	public R<Boolean> diySort(@RequestBody DiySortVO vo){
+		//获取排序集合
+		List<String> sortList = vo.getSortList();
+		if(sortList.size() > 0){
+			for(int i = 0, l = sortList.size(); i < l; i ++){
+				try{
+					WbsTreeContract newData = new WbsTreeContract();
+					newData.setPKeyId(Long.parseLong(sortList.get(i)));
+					newData.setSort(i);
+					//修改排序
+					this.wbsTreeContractClient.updateContractNodeParameter(newData);
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+			}
+		}
+
+		return R.data(false);
+	}
+
+	/**
+	 * 复制节点
+	 */
+	@PostMapping("/copyContractTreeNode")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "复制节点")
+	public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo){
+
+		//首先查询需要复制的节点及其下级所有子节点的信息
+		WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+
+		List<WbsTreeContract> parentList = new ArrayList<>(), childList = new ArrayList<>(), allList = new ArrayList<>(), saveList = new ArrayList<>();
+		//新增施工台账
+		List<ConstructionLedger> saveLedger = new ArrayList<>();
+
+		parentList.add(needCopyNode);
+		//查询所有有效子节点
+		this.foreachQueryChildContract(parentList, childList);
+		allList.addAll(parentList);
+		allList.addAll(childList);
+
+		if("1".equals(vo.getCopyType())){
+			if(StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())){
+				WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
+				//重塑关键信息
+				Map<Long,Long> oldToNewIdMap = new HashMap<>();
+				allList.forEach(node -> oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId()));
+				//todo 单份复制
+				allList.forEach(node -> {
+					WbsTreeContract newData = new WbsTreeContract();
+					BeanUtils.copyProperties(node, newData);
+
+					//重塑关键信息
+					//重塑primaryKeyId
+					newData.setPKeyId(SnowFlakeUtil.getId());
+					//设置旧ID
+					newData.setOldId(node.getId().toString());
+					//设置新ID
+					newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
+					//设置父节点ID
+					if(vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())){
+						//找到复制的节点,将parentId更改为 parent.getId()
+						newData.setParentId(parent.getId());
+						//设置新名称
+						newData.setDeptName(vo.getNeedCopyNodeName());
+						newData.setFullName(vo.getNeedCopyNodeName());
+					} else {
+						newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
+					}
+					newData.setCreateTime(new Date());
+					newData.setUpdateTime(new Date());
+					newData.setCreateUser(AuthUtil.getUserId());
+					//保存到集合中
+					saveList.add(newData);
+
+					if(new Integer("6").equals(node.getDeptCategory())){
+						//生成施工日志
+						this.createLedger(newData, saveLedger);
+					}
+				});
+			}
+
+		} else {
+			//todo 多份复制
+			//获取需要复制到的位置集合
+			List<CopyContractTreeNodeVO.CopyBatch> copyBatches = vo.getCopyBatchToPaths();
+			if(copyBatches.size() > 0){
+				copyBatches.forEach(copyBatch -> {
+					//查询复制到的位置信息
+					WbsTreeContract copyPath = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(copyBatch.getPrimaryKeyId());
+
+					//重塑关键信息
+					Map<Long,Long> oldToNewIdMap = new HashMap<>();
+					allList.forEach(node -> oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId()));
+
+					allList.forEach(node -> {
+						WbsTreeContract newData = new WbsTreeContract();
+						BeanUtils.copyProperties(node, newData);
+
+						//重塑关键信息
+						//设置旧ID
+						newData.setOldId(node.getId().toString());
+						//重塑primaryKeyId
+						newData.setPKeyId(SnowFlakeUtil.getId());
+						//设置新ID
+						newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
+						//设置父节点ID
+						if(vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())){
+							//找到复制的节点,将parentId更改为 parent.getId()
+							newData.setParentId(copyPath.getId());
+							//设置新名称
+							newData.setDeptName(copyBatch.getNodeName());
+							newData.setFullName(copyBatch.getNodeName());
+						} else {
+							newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
+						}
+						newData.setCreateTime(new Date());
+						newData.setUpdateTime(new Date());
+						newData.setCreateUser(AuthUtil.getUserId());
+
+						//重塑父节点关联关系
+						String ancestors = newData.getAncestors();
+						if(StringUtils.isNotEmpty(ancestors)){
+							//重组后的链表
+							StringBuilder stringBuilder = new StringBuilder();
+							//拆分重组
+							String[] ancestorsArray = ancestors.split(",");
+							for(String oldParentId : ancestorsArray){
+								if(StringUtils.isNotEmpty(oldParentId)){
+									//获取新的
+									Long newParentId = oldToNewIdMap.get(Long.parseLong(oldParentId));
+									//如果新的id为空,说明不变
+									stringBuilder.append(",").append(newParentId == null ? oldParentId : newParentId);
+								}
+							}
+							//将新链表设置进对象中
+							newData.setAncestors(stringBuilder.substring(1));
+						}
+
+						//保存到集合中
+						saveList.add(newData);
+
+						if(new Integer("6").equals(node.getDeptCategory())){
+							//生成施工日志
+							this.createLedger(newData, saveLedger);
+						}
+					});
+
+				});
+			}
+		}
+		return this.saveOrCopyNodeTree(saveList, saveLedger);
+	}
+
+	/**
+	 * 生成施工日志记录
+	 */
+	private void createLedger(WbsTreeContract newData, List<ConstructionLedger> saveLedger){
+		//工序,需要新增施工台账
+		ConstructionLedger ledger = new ConstructionLedger();
+		ledger.setSite(newData.getDeptName());
+		ledger.setIsBeton(newData.getIsConcrete());
+		ledger.setWbsId(newData.getPKeyId());
+		ledger.setContractId(Long.parseLong(newData.getContractId()));
+		ledger.setProjectId(Long.parseLong(newData.getProjectId()));
+		ledger.setCreateTime(new Date());
+		ledger.setCreateUser(AuthUtil.getUserId());
+		ledger.setIsDeleted(0);
+		saveLedger.add(ledger);
+	}
+
+	/**
+	 * 循环查询子节点
+	 * @param parentList 父节点集合
+	 * @param childList 保存集合
+	 */
+	private void foreachQueryChildContract(List<WbsTreeContract> parentList, List<WbsTreeContract> childList){
+		parentList.forEach(parent -> {
+			if(!new Integer("6").equals(parent.getDeptCategory())){
+				//查询子节点
+				List<WbsTreeContract> childs = this.wbsTreeContractClient.queryChildByParentId(parent, "notQueryTable");
+				if(childs != null && childs.size() > 0){
+					//添加入结果集
+					childList.addAll(childs);
+					//还有子级,继续向下
+					this.foreachQueryChildContract(childs, childList);
+				}
+			} else {
+				//工序,则查询对应的表格数据
+				List<WbsTreeContract> childs = this.wbsTreeContractClient.queryChildByParentId(parent, "queryTable");
+				if(childs != null && childs.size() > 0){
+					//添加入结果集
+					childList.addAll(childs);
+				}
+			}
+		});
+	}
+
+	/**
+	 * 导图结构树节点查询
+	 * @return 结果
+	 */
+	@GetMapping("/queryMappingStructureTree")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "导图结构树节点查询")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "parentId", value = "父节点,首次进入传0、null、''", required = true),
+			@ApiImplicitParam(name = "wbsType", value = "模板类型, 1质检,2试验", required = true),
+			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	})
+	public R<List<WbsTreeContractTreeVOS>> queryMappingStructureTree(@RequestParam String parentId, @RequestParam Integer wbsType, @RequestParam String contractId, @RequestParam String contractIdRelation){
+		List<WbsTreeContractTreeVOS> result;
+
+		//获取合同段,检查是否是监理合同段
+		ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(contractId));
+
+		if(contractInfo.getContractType() != null && new Integer("2").equals(contractInfo.getContractType())){
+			//监理合同段
+			List<WbsTreeContractTreeVOS> childList = this.wbsTreeContractClient.lazyTree(StringUtils.isNotEmpty(parentId) ? Long.parseLong(parentId) : 0, contractId, contractIdRelation, contractInfo.getContractType());
+			//设置合同段根节点的名称
+			this.setRootNodeName(parentId, childList);
+			if(childList != null && childList.size() == 1){
+				//需要向下展开
+				this.foreachQueryChildNode(childList, childList.get(0).getContractIdRelation(), contractInfo.getContractType());
+			}
+			if(StringUtils.isEmpty(contractIdRelation) && "0".equals(parentId)){
+				//给个顶点
+				WbsTreeContractTreeVOS vos = new WbsTreeContractTreeVOS();
+				vos.setTitle(contractInfo.getContractName());
+				vos.setChildren(childList);
+				result = new ArrayList<>();
+				result.add(vos);
+			} else {
+				result = childList;
+			}
+
+		} else {
+			if(StringUtils.isEmpty(parentId) || "0".equals(parentId)){
+				//直接返回
+				result = this.clientTreePublicCodeClient.queryContractWbsTreeByContractIdAndType(contractId, wbsType, "0");
+			} else {
+				//不是根节点,则获取子节点
+				result = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
+				//判断当前节点下是不是只有一个子节点
+				if(result != null && result.size() == 1){
+					this.foreachQueryChildNode(result, contractId, contractInfo.getContractType());
+				}
+			}
+		}
+
+		if(result != null){
+			//获取当前父节点下所有工序节点及填报资料
+			List<QueryProcessDataVO> queryDataResult;
+			if(new Integer("2").equals(contractInfo.getContractType())){
+				queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 2, contractIdRelation);
+			} else {
+				queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 1, contractId);
+			}
+			result.forEach(vos -> {
+				if(StringUtils.isEmpty(parentId) || "0".equals(parentId)){
+					vos.setTitle(contractInfo.getContractName());
+				}
+				if(queryDataResult != null && queryDataResult.size() > 0){
+					//设置颜色
+					this.setNodeColor(vos, queryDataResult, false);
+				}
+				//处理子节点
+				if(vos.getChildren() != null && vos.getChildren().size() > 0){
+					//循环处理节点颜色
+					this.foreachSetNodeColor(vos.getChildren(), queryDataResult);
+				}
+
+			});
+		}
+
+		return R.data(result);
+	}
+
+	/**
+	 * 循环处理节点颜色
+	 */
+	private void foreachSetNodeColor(List<WbsTreeContractTreeVOS> children, List<QueryProcessDataVO> queryDataResult){
+		children.forEach(vos -> {
+			this.setNodeColor(vos, queryDataResult, false);
+			if(vos.getChildren() != null && vos.getChildren().size() > 0){
+				//进一步处理
+				this.foreachSetNodeColor(vos.getChildren(), queryDataResult);
+			}
+		});
+
+	}
+
+	/**
+	 * 监理合同段设置关联合同段的根节点名称
+	 */
+	private void setRootNodeName(@RequestParam String parentId, List<WbsTreeContractTreeVOS> childList) {
+		if(StringUtils.isEmpty(parentId) || "0".equals(parentId)){
+			if(childList != null && childList.size() > 0){
+				childList.forEach(treeNode -> {
+					ContractInfo clientContract = this.contractClient.getContractById(Long.parseLong(treeNode.getContractIdRelation()));
+					if(clientContract != null){
+						treeNode.setTitle(clientContract.getContractName());
+					}
+				});
+			}
+		}
+	}
+
+	/**
+	 * 如果子节点只有一个,则进一步查询该子节点的下级节点
+	 * @param result 子节点集合
+	 */
+	private void foreachQueryChildNode(List<WbsTreeContractTreeVOS> result, String contractId, Integer initialContractType){
+		result.forEach(vos -> {
+			String id = new Integer("2").equals(initialContractType) ? vos.getPrimaryKeyId() : vos.getId();
+			String primaryKeyId = new Integer("2").equals(initialContractType) ? vos.getId() : vos.getPrimaryKeyId();
+
+			List<WbsTreeContractTreeVOS> child = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, id);
+			if(child != null && child.size() == 1){
+				//如果子节点还是只有一个,则进一步向下查询
+				this.foreachQueryChildNode(child, contractId, initialContractType);
+			}
+			//判断当前节点是否被标记为首件
+			TreeContractFirst first = this.treeContractFirstService.getOne(Wrappers.<TreeContractFirst>lambdaQuery().eq(TreeContractFirst::getIsDeleted, 0).eq(TreeContractFirst::getWbsNodeId, primaryKeyId));
+			vos.setIsFirst(first != null);
+
+			vos.setChildren(child);
+		});
+	}
+
+	/**
+	 * 修改节点信息
+	 * @return 修改结果
+	 */
+	@PostMapping("/updateContractNodeParameter")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "修改节点信息")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "pKeyId", value = "节点的primaryKeyId", required = true),
+			@ApiImplicitParam(name = "deptName", value = "节点的title", required = true),
+			@ApiImplicitParam(name = "partitionCode", value = "划分编号")
+	})
+	public R<Boolean> updateContractNodeParameter(@RequestParam Long pKeyId, @RequestParam String deptName, @RequestParam String partitionCode){
+		WbsTreeContract node = new WbsTreeContract();
+		node.setPKeyId(pKeyId);
+		node.setDeptName(deptName);
+		node.setPartitionCode(partitionCode);
+
+		//只允许修改节点名称
+		if(StringUtils.isEmpty(node.getDeptName()) || "null".equals(String.valueOf(node.getPKeyId())) || StringUtils.isEmpty(String.valueOf(node.getPKeyId()))){
+			return R.data(-1, false , "缺少参数");
+		}
+		//保存操作记录
+		this.operationLogClient.saveUserOperationLog(3, "资料管理", "工序资料", pKeyId);
+		return R.data(this.wbsTreeContractClient.updateContractNodeParameter(node));
+	}
+
+	/**
+	 * 获取节点信息
+	 * @param primaryKeyId 节点的primaryKeyId
+	 * @return 节点信息
+	 */
+	@GetMapping("/getContractNodeByPrimaryKeyId")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "获取节点信息")
+	@ApiImplicitParam(name = "primaryKeyId", value = "节点的primaryKeyId")
+	public R<WbsTreeContract> getContractNodeByPrimaryKeyId(@RequestParam String primaryKeyId){
+		return R.data(this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(primaryKeyId));
+	}
+
+
+	/**
+	 * 删除节点
+	 * @param ids 节点的primaryKeyId
+	 * @return 删除结果
+	 */
+	@PostMapping("/removeContractTreeNode")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "删除节点")
+	@ApiImplicitParam(name = "ids", value = "节点的primaryKeyId")
+	public R<Boolean> removeContractTreeNode(@RequestParam String ids){
+		//保存操作记录
+		this.operationLogClient.saveUserOperationLog(4, "资料管理", "工序资料", ids);
+		return R.data(this.wbsTreeContractClient.removeContractTreeNode(ids));
+	}
+
+	/**
+	 * 新增子节点
+	 * @return 新增结果
+	 */
+	@PostMapping("/saveContractTreeNode")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "新增节点及其子节点")
+	public R<Boolean> saveContractTreeNode(@RequestBody AddContractTreeNodeVO vo){
+		//先获取当前节点的信息
+		WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(vo.getCurrentNodePrimaryKeyId()));
+
+		//半选
+		List<AddContractTreeNodeVO.Node> halfSelectedNodeList = vo.getHalfSelectedList();
+		//全选
+		List<AddContractTreeNodeVO.Node> allSelectedNodeList = vo.getAllSelectedList();
+		//勾选的数据
+		List<AddContractTreeNodeVO.Node> selectList = new ArrayList<>();
+		selectList.addAll(halfSelectedNodeList);
+		selectList.addAll(allSelectedNodeList);
+
+		//所有相关节点集合
+		List<WbsTreePrivate> selectedNodeList = new ArrayList<>();
+
+		//检查新增类型
+		if("1".equals(vo.getSaveType())){
+			//todo 当前节点及其子节点
+			//当前节点及其子节点时,半选说明其下的子节点并不是全部选中的,所以这时候只需要根据全选的查询其全部子节点即可
+			if(allSelectedNodeList.size() > 0){
+				//获取主键
+				List<String> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
+				//查询对应数据
+				selectedNodeList = this.wbsTreePrivateClient.queryByPKeyIds(allSelectedList);
+				//剔除与当前操作节点相同的ID
+				selectedNodeList.removeIf(wbsTreePrivate -> treeContract.getId().equals(wbsTreePrivate.getId()));
+
+				//全选的集合则进一步向下查询
+				List<WbsTreePrivate> childList = new ArrayList<>();
+				this.foreachQueryChild(selectedNodeList, childList);
+
+				if(childList.size() > 0){
+					//处理重复的数据
+					Iterator<WbsTreePrivate> iterator = childList.iterator();
+					while (iterator.hasNext()){
+						WbsTreePrivate next = iterator.next();
+						for(WbsTreePrivate treePrivate : selectedNodeList){
+							if(treePrivate.getPKeyId().equals(next.getPKeyId())){
+								//删掉重复数据
+								iterator.remove();
+							}
+						}
+					}
+				}
+				//处理完重复数据后,设置进集合中
+				selectedNodeList.addAll(childList);
+			}
+			//处理半选
+			this.disposeHalfSelectList(vo, halfSelectedNodeList, selectedNodeList);
+
+		} else {
+			//todo 仅当前节点操作
+			if(halfSelectedNodeList.size() > 0){
+				//获取主键
+				List<String> halfSelectedList = halfSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
+				//查询数据
+				selectedNodeList = this.wbsTreePrivateClient.queryByPKeyIds(halfSelectedList);
+				//剔除与当前操作节点相同的ID
+				selectedNodeList.removeIf(wbsTreePrivate -> treeContract.getId().equals(wbsTreePrivate.getId()));
+			}
+			//处理半选
+			this.disposeHalfSelectList(vo, allSelectedNodeList, selectedNodeList);
+
+		}
+
+		//保存集合
+		List<WbsTreeContract> saveList = new ArrayList<>();
+		List<ConstructionLedger> saveLedger = new ArrayList<>();
+		if(selectedNodeList.size() > 0){
+			//重塑关键信息
+			Map<Long, Long> OldIdToNewIdMap = new HashMap<>();
+			selectedNodeList.forEach(half -> OldIdToNewIdMap.put(half.getId(), SnowFlakeUtil.getId()));
+
+			//处理数据
+			selectedNodeList.forEach(half -> {
+				//处理合同段数据
+				WbsTreeContract newData = new WbsTreeContract();
+				BeanUtils.copyProperties(half, newData);
+
+				//重塑pKeyId、id和parentId
+				newData.setPKeyId(SnowFlakeUtil.getId());
+				newData.setId(OldIdToNewIdMap.containsKey(half.getId()) ? OldIdToNewIdMap.get(half.getId()) : SnowFlakeUtil.getId());
+				newData.setParentId(OldIdToNewIdMap.containsKey(half.getParentId()) ? OldIdToNewIdMap.get(half.getParentId()) : treeContract.getId().equals(half.getParentId()) ? treeContract.getId() : SnowFlakeUtil.getId());
+				//记录旧ID
+				newData.setOldId(half.getId().toString());
+				//设置合同段等信息
+				newData.setWbsType(treeContract.getWbsType());
+				newData.setContractId(vo.getContractId());
+				newData.setContractIdRelation(treeContract.getContractIdRelation());
+				newData.setContractType(treeContract.getContractType());
+				newData.setCreateTime(new Date());
+
+				//重塑父节点关联关系
+				String ancestors = newData.getAncestors();
+				if(StringUtils.isNotEmpty(ancestors)){
+					//重组后的链表
+					StringBuilder stringBuilder = new StringBuilder();
+					//拆分重组
+					String[] ancestorsArray = ancestors.split(",");
+					for(String oldParentId : ancestorsArray){
+						if(StringUtils.isNotEmpty(oldParentId)){
+							//获取新的
+							Long newParentId = OldIdToNewIdMap.get(Long.parseLong(oldParentId));
+							//如果新的id为空,说明不变
+							stringBuilder.append(",").append(newParentId == null ? oldParentId : newParentId);
+						}
+					}
+					//将新链表设置进对象中
+					newData.setAncestors(stringBuilder.substring(1));
+				}
+
+				//设置名称
+				Iterator<AddContractTreeNodeVO.Node> iterator = selectList.iterator();
+				while (iterator.hasNext()){
+					AddContractTreeNodeVO.Node next = iterator.next();
+					if(next.getPrimaryKeyId().equals(half.getPKeyId().toString())){
+						newData.setFullName(next.getNodeName());
+						iterator.remove();
+						break;
+					}
+				}
+
+				//设置到保存集合中
+				saveList.add(newData);
+
+				if(new Integer("6").equals(newData.getDeptCategory())){
+					//生成施工日志
+					this.createLedger(newData, saveLedger);
+				}
+
+			});
+		}
+
+		return this.saveOrCopyNodeTree(saveList, saveLedger);
+	}
+
+	@NotNull
+	private R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger) {
+		if(saveList.size() > 0){
+			//保存施工日志
+			if(saveLedger.size() > 0){
+				this.constructionLedgerService.saveBatch(saveLedger);
+			}
+			try{
+				//保存操作记录
+				this.operationLogClient.saveUserOperationLog(2, "资料管理", "工序资料", String.join(",", JSONArray.parseArray(JSONObject.toJSONString(saveList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList())), String.class)));
+			}catch (Exception e){
+				e.printStackTrace();
+			}
+			//保存节点
+			return R.data(this.wbsTreeContractClient.saveBatch(saveList));
+		}
+
+		return R.data(false);
+	}
+
+	/**
+	 * 处理半选集合
+	 */
+	private void disposeHalfSelectList(@RequestBody AddContractTreeNodeVO vo, List<AddContractTreeNodeVO.Node> allSelectedNodeList, List<WbsTreePrivate> selectedNodeList) {
+		if(allSelectedNodeList != null && allSelectedNodeList.size() > 0){
+			//获取主键
+			List<String> allSelectedList = allSelectedNodeList.stream().map(AddContractTreeNodeVO.Node::getPrimaryKeyId).distinct().collect(Collectors.toList());
+			//查询对应数据
+			List<WbsTreePrivate> allSelectedNodeLists = this.wbsTreePrivateClient.queryByPKeyIds(allSelectedList);
+			//剔除与当前操作节点相同的ID
+			allSelectedNodeLists.removeIf(wbsTreePrivate -> vo.getCurrentNodePrimaryKeyId().equals(wbsTreePrivate.getId().toString()));
+			//设置到集合中
+			selectedNodeList.addAll(allSelectedNodeLists);
+		}
+	}
+
+	/**
+	 * 循环查询子节点
+	 * @param parentList 父节点集合
+	 * @param childList 保存集合
+	 */
+	private void foreachQueryChild(List<WbsTreePrivate> parentList, List<WbsTreePrivate> childList){
+		parentList.forEach(parent -> {
+			if(!new Integer("6").equals(parent.getDeptCategory())){
+				//查询子节点
+				List<WbsTreePrivate> childs = this.wbsTreePrivateClient.queryChildByParentId(parent);
+				if(childs != null && childs.size() > 0){
+					//添加入结果集
+					childList.addAll(childs);
+					//还有子级,继续向下
+					this.foreachQueryChild(childs, childList);
+				}
+			} else {
+				//说明是工序,查询这个节点下是否存在表格数据
+				List<WbsTreePrivate> exlTables = this.wbsTreePrivateClient.queryExcelTableByParentId(parent);
+				if(exlTables != null && exlTables.size() > 0){
+					childList.addAll(exlTables);
+				}
+			}
+		});
+	}
+
+	/**
+	 * 懒加载项目级工程划分树
+	 * @param projectId 项目ID
+	 * @param id 节点ID
+	 * @return 结果集
+	 */
+	@PostMapping("/queryWbsTreePrivateByProjectIdAndId")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "懒加载项目级工程划分树")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "projectId", value = "项目ID"),
+			@ApiImplicitParam(name = "id", value = "点击节点ID")
+	})
+	public R<List<WbsTreeContractTreeVOS>> queryWbsTreePrivateByProjectIdAndId(@RequestParam String projectId, @RequestParam String id){
+		return R.data(this.wbsTreePrivateClient.queryWbsTreePrivateByProjectIdAndId(projectId, Long.parseLong(id)));
+	}
+
+	/**
+	 * 获取与当前节点平级的项目级节点
+	 * @param primaryKeyId 主键
+	 * @return 结果
+	 */
+	@PostMapping("/queryPeersNode")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "获取与当前节点平级的项目级节点")
+	@ApiImplicitParam(name = "primaryKeyId", value = "需要新增子节点的节点ID,即当前点出菜单栏的节点ID")
+	public R<WbsTreePrivate> queryPeersNode(@RequestParam String primaryKeyId){
+		if(StringUtils.isEmpty(primaryKeyId) || "null".equals(primaryKeyId)){
+			return R.data(null);
+		}
+
+		//首先获取当前节点信息
+		WbsTreeContract treeContract = this.wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.parseLong(primaryKeyId));
+		//获取与其平级对应的项目级节点
+		WbsTreePrivate treePrivate = this.wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
+
+		return R.data(treePrivate);
+	}
+
+
+	/**
+	 * 获取流程状态分类和文件类型分类
+	 */
+	@GetMapping("/getDictBizClassifyByCode")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "获取流程状态分类和文件类型分类")
+	@ApiImplicitParam(name = "code", value = "获取流程状态分类:flowTaskStatus;获取文件类型分类:fileType")
+	public R<List<DictBiz>> getDictBizClassifyByCode(@RequestParam String code){
+		return this.dictBizClient.getList(code, "notRoot");
+	}
+
+	/**
+	 * 获取当前合同段下所有的上报批次
+	 * @param contractId 合同段ID
+	 * @return 结果
+	 */
+	@GetMapping("/getReportNumberByContractId")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "获取当前合同段下所有的上报批次")
+	@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	public R<List<Integer>> getReportNumberByContractId(@RequestParam String contractId){
+		//获取合同段信息
+		ContractInfo contract = this.contractClient.getContractById(Long.valueOf(contractId));
+		return R.data(this.informationQueryService.getReportNumberByContractId(contract.getContractType() == null ? 1 : contract.getContractType(), contractId));
+	}
+
+	/**
+	 * 根据合同段ID获取所有填报人
+	 * @param contractId 合同段ID
+	 * @return 填报人集合
+	 */
+	@GetMapping("/getFileUserByContractId")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "根据合同段ID获取所有填报人")
+	@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	public R<List<FileUserVO>> getFileUserByContractId(@RequestParam String contractId){
+		//获取合同段信息
+		ContractInfo contract = this.contractClient.getContractById(Long.valueOf(contractId));
+		return R.data(this.informationQueryService.queryFileUserByContractId(contract.getContractType() == null ? 1 : contract.getContractType(), contractId));
+	}
+
+	/**
+	 * 分页
+	 * @param vo 查询条件
+	 * @return 结果
+	 */
+	@PostMapping("/page")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "分页")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "size", value = "当前页条数", required = true),
+			@ApiImplicitParam(name = "current", value = "当前页", required = true),
+			@ApiImplicitParam(name = "wbsId", value = "节点ID", required = true),
+			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	})
+	public R<IPage<InformationQueryVO>> page(@RequestBody InformationQueryVO vo){
+		if("null".equals(String.valueOf(vo.getContractId())) || StringUtils.isEmpty(String.valueOf(vo.getContractId()))){
+			return R.data(-1, null, "数据查询失败");
+		}
+		//封装分页信息
+		Query query = new Query();
+		query.setSize(vo.getSize());
+		query.setCurrent(vo.getCurrent());
+		//获取合同段信息
+		ContractInfo contract = this.contractClient.getContractById(vo.getContractId());
+		vo.setClassify(contract.getContractType() == null ? 1 : contract.getContractType());
+
+		return R.data(this.informationQueryService.selectInformationQueryPage(Condition.getPage(query), vo));
+	}
+
+	/**
+	 * 获取当前合同段的划分树
+	 * @return 结果
+	 */
+	@GetMapping("/queryContractWbsTreeByContractIdAndType")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "获取当前合同段的划分树")
+	@ApiImplicitParams(value = {
+			@ApiImplicitParam(name = "parentId", value = "父节点,为空则查询第一级节点"),
+			@ApiImplicitParam(name = "contractId", value = "合同段ID", required = true)
+	})
+	public R<List<WbsTreeContractTreeVOS>> queryContractWbsTreeByContractIdAndType(@RequestParam String parentId, @RequestParam String contractId, @RequestParam String contractIdRelation){
+		List<WbsTreeContractTreeVOS> rootTreeNode;
+
+		//获取合同段,检查是否是监理合同段
+		ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(contractId));
+		if(new Integer("2").equals(contractInfo.getContractType())){
+			//监理合同段,需要获取关联的施工方合同段根节点数据
+			rootTreeNode = this.wbsTreeContractClient.lazyTree(StringUtils.isNotEmpty(parentId) ? Long.parseLong(parentId) : 0, contractId, contractIdRelation, contractInfo.getContractType());
+			//设置合同段根节点的名称
+			this.setRootNodeName(parentId, rootTreeNode);
+
+		} else {
+			if(com.alibaba.nacos.common.utils.StringUtils.isEmpty(parentId)){
+				//为空,说明初始化
+				//获取根节点
+				rootTreeNode = this.clientTreePublicCodeClient.queryContractWbsTreeByContractIdAndType(contractId, 1, "0");
+			} else {
+				//不为空,获取其下子节点
+				rootTreeNode = this.wbsTreeContractClient.queryContractWbsTreeByContractIdAndType(contractId, 1, parentId);
+			}
+		}
+
+		//其他参数
+		if(rootTreeNode != null && rootTreeNode.size() > 0){
+			//获取当前父节点下所有工序节点及填报资料
+			List<QueryProcessDataVO> queryDataResult;
+			if(new Integer("2").equals(contractInfo.getContractType())){
+				queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 2, contractIdRelation);
+			} else {
+				queryDataResult = this.informationQueryService.queryProcessDataByParentIdAndContractId(parentId, 1, contractId);
+			}
+
+			rootTreeNode.forEach(vo -> {
+				String primaryKeyId = new Integer("2").equals(contractInfo.getContractType()) ? vo.getId() : vo.getPrimaryKeyId();
+
+				if(StringUtils.isEmpty(parentId) || "0".equals(parentId)){
+					vo.setTitle(contractInfo.getContractName());
+				}
+
+				//获取上传的图纸
+				ContractTreeDrawings drawings = this.contractTreeDrawingsService.queryCurrentNodeDrawings(primaryKeyId);
+				if(drawings != null){
+					//主键
+					vo.setDrawingsId(drawings.getId());
+					//文件路径
+					vo.setFileUrl(drawings.getFileUrl());
+				}
+
+				//处理颜色
+				if(queryDataResult != null && queryDataResult.size() > 0){
+					this.setNodeColor(vo, queryDataResult, true);
+				}
+
+				//判断当前节点是否被标记为首件
+				TreeContractFirst first = this.treeContractFirstService.getOne(Wrappers.<TreeContractFirst>lambdaQuery().eq(TreeContractFirst::getIsDeleted, 0).eq(TreeContractFirst::getWbsNodeId, primaryKeyId));
+				vo.setIsFirst(first != null);
+			});
+		}
+
+		return R.data(rootTreeNode);
+	}
+
+	/**
+	 * 设置节点颜色
+	 * 填报节点:
+	 * 未填报1 < 已填报-未上报2 < 已填报-待审批3 < 已审批4
+	 *
+	 * 非填报节点
+	 * 未填报1(其下所有工序节点均未填报) < 已填报2(未上报和待审批) < 已审批4(其下所有工序节点均审批)
+	 *
+	 */
+	private void setNodeColor(WbsTreeContractTreeVOS vos, List<QueryProcessDataVO> queryDataResult, boolean isRemove){
+		if(queryDataResult != null && queryDataResult.size() > 0){
+			Iterator<QueryProcessDataVO> iterator =  queryDataResult.iterator();
+			//默认均未填报
+			StringBuilder colorStatusValue = new StringBuilder();
+			while (iterator.hasNext()) {
+				QueryProcessDataVO query = iterator.next();
+				if(StringUtils.isNotEmpty(query.getAncestors()) && StringUtils.isNotEmpty(vos.getId())){
+					if(query.getAncestors().contains(vos.getId()) || query.getAncestors().startsWith(vos.getParentId() + ",") || query.getTreeId().equals(vos.getId())){
+						//如果为空,说明未填报
+						if(query.getStatus() == null || query.getStatus() == -1){
+							colorStatusValue.append("1");
+						} else {
+							switch (query.getStatus()){
+								case 0:
+								case 3:
+									//未上报
+									colorStatusValue.append("2");
+									break;
+								case 1:
+									//待审批
+									colorStatusValue.append("3");
+									break;
+								case 2:
+									//已审批
+									colorStatusValue.append("4");
+									break;
+								default:
+									colorStatusValue.append("1");
+									break;
+							}
+							if(isRemove){
+								iterator.remove();
+							}
+						}
+					}
+				} else {
+					colorStatusValue.append("1");
+				}
+			}
+			//检查字符串
+			if(StringUtils.isNotEmpty(colorStatusValue.toString())){
+				if(new Integer("6").equals(vos.getDeptCategory())){
+					//工序,则直接使用字符串的判断
+					vos.setColorStatus(new Integer(colorStatusValue.toString()));
+				} else {
+					if(colorStatusValue.toString().contains("1")){
+						//含有1
+						if(colorStatusValue.toString().contains("2") || colorStatusValue.toString().contains("3") || colorStatusValue.toString().contains("4")){
+							//同时含有2/3/4,取2
+							vos.setColorStatus(2);
+						} else {
+							//否则,取1
+							vos.setColorStatus(1);
+						}
+					} else {
+						//不含有1
+						if(colorStatusValue.toString().contains("4") && !colorStatusValue.toString().contains("2") && !colorStatusValue.toString().contains("3")){
+							//只含有4,取4
+							vos.setColorStatus(4);
+						} else {
+							//反之包含2/3,取2
+							vos.setColorStatus(2);
+						}
+					}
+				}
+			} else {
+				vos.setColorStatus(1);
+			}
+		}
+	}
+
+	/**
+	 * 修改 
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "修改(只能修改编号和文件名)")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "name", value = "文件名称, 必须有值", required = true),
+			@ApiImplicitParam(name = "number", value = "文件编号,可以为空")
+	})
+	public R<Boolean> update(@Valid @RequestBody InformationQuery informationQuery) {
+		if("null".equals(String.valueOf(informationQuery.getId())) || StringUtils.isEmpty(String.valueOf(informationQuery.getId()))){
+			return R.data(-1, false, "数据操作失败");
+		}
+		return R.status(informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getName, informationQuery.getName()).set(InformationQuery::getNumber, informationQuery.getNumber()).eq(InformationQuery::getId, informationQuery.getId())));
+	}
+
+	
+	/**
+	 * 删除 
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R<Boolean> remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(informationQueryService.deleteLogic(Func.toLongList(ids)));
+	}
+
+	
 }
 }

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/OpinionUserClientImpl.java

@@ -33,6 +33,11 @@ public class OpinionUserClientImpl implements OpinionUserClient {
 
 
     private final IUserOpinionFileService userOpinionFileService;
     private final IUserOpinionFileService userOpinionFileService;
 
 
+    @Override
+    public List<UserOpinion> queryOpinionTypeAmount() {
+        return this.userOpinionService.queryOpinionTypeAmount();
+    }
+
     @Override
     @Override
     public BusinessUserOpinionVO queryOpinionDetailsById(String userOpinionId) {
     public BusinessUserOpinionVO queryOpinionDetailsById(String userOpinionId) {
         UserOpinion userOpinion = this.userOpinionService.getById(userOpinionId);
         UserOpinion userOpinion = this.userOpinionService.getById(userOpinionId);

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.java

@@ -32,6 +32,8 @@ import java.util.List;
  */
  */
 public interface UserOpinionMapper extends BaseMapper<UserOpinion> {
 public interface UserOpinionMapper extends BaseMapper<UserOpinion> {
 
 
+	List<UserOpinion> queryOpinionTypeAmount();
+
 	List<BusinessUserOpinionVO> queryManageUserOpinionList(@Param("currentUser") String currentUser);
 	List<BusinessUserOpinionVO> queryManageUserOpinionList(@Param("currentUser") String currentUser);
 
 
 	List<UserOpinion> queryCurrentUserOpinionList(@Param("userId")Long userId);
 	List<UserOpinion> queryCurrentUserOpinionList(@Param("userId")Long userId);

+ 4 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/UserOpinionMapper.xml

@@ -37,6 +37,10 @@
         <result column="manage_user_name" property="managerUserName"/>
         <result column="manage_user_name" property="managerUserName"/>
     </resultMap>
     </resultMap>
 
 
+    <select id="queryOpinionTypeAmount" resultMap="userOpinionResultMap">
+        select project_id, problem_type from u_user_opinion where is_deleted = 0
+    </select>
+
     <select id="queryManageUserOpinionList" resultMap="businessUserOpinionMap">
     <select id="queryManageUserOpinionList" resultMap="businessUserOpinionMap">
         select
         select
             re.*
             re.*

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IUserOpinionService.java

@@ -18,6 +18,8 @@ import java.util.List;
  */
  */
 public interface IUserOpinionService extends BaseService<UserOpinion> {
 public interface IUserOpinionService extends BaseService<UserOpinion> {
 
 
+	List<UserOpinion> queryOpinionTypeAmount();
+
 	/**
 	/**
 	 * 获取所有工单及相应进度
 	 * 获取所有工单及相应进度
 	 * @return 结果集
 	 * @return 结果集

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/UserOpinionServiceImpl.java

@@ -49,6 +49,11 @@ public class UserOpinionServiceImpl extends BaseServiceImpl<UserOpinionMapper, U
 
 
 	private final IUserOpinionGoodService userOpinionGoodService;
 	private final IUserOpinionGoodService userOpinionGoodService;
 
 
+	@Override
+	public List<UserOpinion> queryOpinionTypeAmount() {
+		return this.baseMapper.queryOpinionTypeAmount();
+	}
+
 	@Override
 	@Override
 	public IPage<BusinessUserOpinionVO> queryBusinessUserOpinionListAll(Query query) {
 	public IPage<BusinessUserOpinionVO> queryBusinessUserOpinionListAll(Query query) {
 		return this.queryBusinessUserOpinionList(null, query);
 		return this.queryBusinessUserOpinionList(null, query);

+ 152 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ManagerHomePageController.java

@@ -2,11 +2,16 @@ package org.springblade.manager.controller;
 
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import org.springblade.business.entity.UserOpinion;
 import org.springblade.business.feign.OpinionUserClient;
 import org.springblade.business.feign.OpinionUserClient;
 import org.springblade.business.vo.BusinessUserOpinionVO;
 import org.springblade.business.vo.BusinessUserOpinionVO;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.manager.service.ISignPfxFileService;
 import org.springblade.manager.vo.ManagerHomePageVO;
 import org.springblade.manager.vo.ManagerHomePageVO;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.api.R;
@@ -15,13 +20,20 @@ import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.vo.ProjectUserAmountVO;
 import org.springblade.manager.vo.ProjectUserAmountVO;
+import org.springblade.manager.vo.SingPfxManagementVO;
+import org.springblade.system.entity.DictBiz;
+import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 @RestController
 @RestController
 @AllArgsConstructor
 @AllArgsConstructor
@@ -37,6 +49,128 @@ public class ManagerHomePageController extends BladeController {
 
 
     private final IContractInfoService contractInfoService;
     private final IContractInfoService contractInfoService;
 
 
+    private final IDictBizClient dictBizClient;
+
+    private final ISignPfxFileService signPfxFileService;
+
+    /**
+     * 证书统计
+     */
+    @PostMapping("/queryProjectPfx")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation(value = "证书统计")
+    public R<ManagerHomePageVO> queryProjectPfx(){
+        Query query = new Query();
+        query.setSize(6000);
+        query.setCurrent(1);
+
+        //返回参数
+        ManagerHomePageVO reVO = new ManagerHomePageVO();
+
+        List<SingPfxManagementVO> result = this.signPfxFileService.singPfxManagementPage(Condition.getPage(query), new SingPfxManagementVO(1, 6000)).getRecords();
+        if(result != null && result.size() > 0){
+            //过滤掉企业证书和个人证书数量都为0的项目
+            result.removeIf(vo -> (StringUtils.isEmpty(vo.getEnterpriseCount()) || "0".equals(vo.getEnterpriseCount()))
+                    && (StringUtils.isEmpty(vo.getPersonalCount()) || "0".equals(vo.getPersonalCount())));
+            //设置参数
+            result.forEach(vo -> reVO.setPfxList(vo.getProjectName(), vo.getEnterpriseCount(), vo.getPersonalCount()));
+
+        }
+        return R.data(reVO);
+    }
+
+    /**
+     * 维护类型统计汇总
+     */
+    @PostMapping("/queryOpinionTypeAmount")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "维护类型统计汇总")
+    public R<ManagerHomePageVO> queryOpinionTypeAmount(){
+        //获取所有工单信息
+        List<UserOpinion> opinions = this.opinionUserClient.queryOpinionTypeAmount();
+
+        //生成返回对象
+        ManagerHomePageVO resultVO = new ManagerHomePageVO();
+
+        //获取当前所有有效项目
+        List<ProjectInfo> projectInfos = this.projectInfoService.list();
+
+        //处理数据
+        if(opinions != null && opinions.size() > 0 && opinions.get(0) != null){
+            //获取当前系统规定的分类
+            List<DictBiz> opinionTypes = this.dictBizClient.getList("opinion_type", "").getData();
+            //找到根节点后找到一级节点
+            StringBuilder opinionTypeValue = new StringBuilder();
+            for(DictBiz dictBiz : opinionTypes){
+                if(Long.valueOf("0").equals(dictBiz.getParentId())){
+                    //继续寻找一级节点
+                    for(DictBiz biz : opinionTypes){
+                        if(biz.getParentId().equals(dictBiz.getId())){
+                            opinionTypeValue.append(",").append(biz.getDictValue());
+                        }
+                    }
+                    break;
+                }
+            }
+
+            //删除掉项目ID为空或是-1的数据
+            opinions.removeIf(opinion -> opinion.getProjectId() == null || opinion.getProjectId() == -1);
+
+            String[] opinionTypeValues = opinionTypeValue.toString().split(",");
+
+            //根据项目获取对应的数据结果
+            Iterator<ProjectInfo> projectIterator = projectInfos.iterator();
+            while (projectIterator.hasNext()) {
+                ProjectInfo project = projectIterator.next();
+                //如果找不到自己的数据则删除这个项目
+                boolean isRemove = true;
+                //生成问题map
+                Map<String, Integer> opinionTypeMap = new HashMap<>();
+
+                //循环规定的问题分类
+                for(String key : opinionTypeValues){
+                    if(StringUtils.isNotEmpty(key)){
+                        //找到自己的数据
+                        Iterator<UserOpinion> opinionIterator = opinions.iterator();
+                        while (opinionIterator.hasNext()){
+                            UserOpinion userOpinion = opinionIterator.next();
+                            if(userOpinion.getProjectId().equals(project.getId()) && userOpinion.getProblemType().contains(key)){
+                                isRemove = false;
+                                if(!opinionTypeMap.containsKey(key)){
+                                    opinionTypeMap.put(key, 1);
+                                } else {
+                                    opinionTypeMap.put(key, opinionTypeMap.get(key) + 1);
+                                }
+                                //已经处理,删除
+                                opinionIterator.remove();
+                            }
+                        }
+                    }
+                }
+
+                if(isRemove){
+                    //找不到自己的数据,删除
+                    projectIterator.remove();
+                    continue;
+                }
+
+                //根据 opinionTypeMap 的结果设置当前项目的信息
+                StringBuilder typeValue = new StringBuilder();
+                for(String key : opinionTypeValues){
+                    if(StringUtils.isNotEmpty(key)){
+                        typeValue.append(",").append(opinionTypeMap.get(key));
+                    }
+                }
+                //设置信息
+                resultVO.setUserOpinionList(project.getId().toString(), project.getProjectName(), opinionTypeValue.substring(1).replaceAll("null", "0"), typeValue.substring(1).replaceAll("null", "0"));
+            }
+        }
+        //设置项目
+        resultVO.setProjectInfos(projectInfos);
+
+        return R.data(resultVO);
+    }
+
     /**
     /**
      * 项目人员统计
      * 项目人员统计
      */
      */
@@ -46,13 +180,23 @@ public class ManagerHomePageController extends BladeController {
     public R<ManagerHomePageVO> queryProjectUserAmount(){
     public R<ManagerHomePageVO> queryProjectUserAmount(){
         //查询各项目下人员数量
         //查询各项目下人员数量
         List<ProjectUserAmountVO> result = this.projectInfoService.queryProjectUserAmount();
         List<ProjectUserAmountVO> result = this.projectInfoService.queryProjectUserAmount();
-        ManagerHomePageVO vo = new ManagerHomePageVO();
-        vo.setProjectUserAmountVOList(result);
 
 
         //统计数量
         //统计数量
-        final int[] amount = {0};
-        result.forEach(amountVO -> amount[0] = amount[0] + amountVO.getContractor() + amountVO.getSupervision() + amountVO.getOwner());
-        vo.setProjectUserAmount(amount[0]);
+        int amount = 0;
+        Iterator<ProjectUserAmountVO> iterator = result.iterator();
+        while (iterator.hasNext()) {
+            ProjectUserAmountVO vo = iterator.next();
+            int count = vo.getOwner() + vo.getSupervision() + vo.getContractor();
+            if(count <= 0){
+                iterator.remove();
+            }
+            amount = amount + count;
+        }
+
+        //设置返回
+        ManagerHomePageVO vo = new ManagerHomePageVO();
+        vo.setProjectUserAmountVOList(result);
+        vo.setProjectUserAmount(amount);
 
 
         return R.data(vo);
         return R.data(vo);
     }
     }
@@ -99,7 +243,7 @@ public class ManagerHomePageController extends BladeController {
                 String title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
                 String title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
                         "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
                         "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
 
 
-                resultVO.setUserOpinionList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
+                resultVO.setUserOpinionFlowList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
             });
             });
         }catch (Exception e){
         }catch (Exception e){
             e.printStackTrace();
             e.printStackTrace();
@@ -132,10 +276,10 @@ public class ManagerHomePageController extends BladeController {
                             "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
                             "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向您反馈" + "\"" + vo.getProblemType() + "\"";
                 } else {
                 } else {
                     title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
                     title = "待办工单任务:" + vo.getManageTime() + "来自" + "【" + vo.getProjectName() + "-" + vo.getContractName() + "】" +
-                            "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向" + vo.getManagerUserName() + "反馈" + "\"" + vo.getProblemType() + "\"";
+                            "的【" + "资料员" + vo.getSubmitUserName() + "】" + "向" + vo.getManagerUserName() + "反馈" + "\"" + vo.getProblemType() + "\"";
                 }
                 }
 
 
-                resultVO.setUserOpinionList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
+                resultVO.setUserOpinionFlowList(vo.getUserOpinionId().toString(), title, vo.getCurrentLink(), vo.getNewNumber(), vo.getCurrentLinkId().toString(), vo.getOperation());
             });
             });
 
 
         }catch (Exception e){
         }catch (Exception e){

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ProjectInfoMapper.xml

@@ -42,7 +42,7 @@
     </resultMap>
     </resultMap>
 
 
     <resultMap id="projectUserAmount" type="org.springblade.manager.vo.ProjectUserAmountVO">
     <resultMap id="projectUserAmount" type="org.springblade.manager.vo.ProjectUserAmountVO">
-        <result column="project_name" property="projectName"/>
+        <result column="project_alias" property="projectName"/>
         <result column="contractor" property="contractor"/>
         <result column="contractor" property="contractor"/>
         <result column="supervision" property="supervision"/>
         <result column="supervision" property="supervision"/>
         <result column="owner" property="owner"/>
         <result column="owner" property="owner"/>
@@ -50,7 +50,7 @@
 
 
     <select id="queryProjectUserAmount" resultMap="projectUserAmount">
     <select id="queryProjectUserAmount" resultMap="projectUserAmount">
         select
         select
-            mpi.project_name,
+            mpi.project_alias,
             (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537247986361782274' or parent_id = '1537247986361782274')) as contractor,
             (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537247986361782274' or parent_id = '1537247986361782274')) as contractor,
             (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246384519335938' or parent_id = '1537246384519335938')) as supervision,
             (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246384519335938' or parent_id = '1537246384519335938')) as supervision,
             (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246243393589249' or parent_id = '1537246243393589249')) as owner
             (select count(id) end from m_project_assignment_user where project_id = mpi.id and role_id in(select id from blade_role where id = '1537246243393589249' or parent_id = '1537246243393589249')) as owner