Эх сурвалжийг харах

监理合同段关联合同段wbs树相关

liuyc 3 жил өмнө
parent
commit
ceae25a44f
13 өөрчлөгдсөн 1689 нэмэгдсэн , 1346 устгасан
  1. 29 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractRelationJlyz.java
  2. 70 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeVO3.java
  3. 1038 1022
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  4. 14 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  5. 12 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java
  6. 68 30
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  7. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml
  8. 10 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  9. 319 262
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  10. 5 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  11. 5 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  12. 82 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  13. 36 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

+ 29 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ContractRelationJlyz.java

@@ -0,0 +1,29 @@
+package org.springblade.manager.entity;
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+@Data
+@TableName("m_contract_relation_jlyz")
+public class ContractRelationJlyz implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    private Long id;
+
+    /**
+     * 监理业主id
+     */
+    private Long contractIdJlyz;
+
+    /**
+     * 施工id
+     */
+    private Long contractIdSg;
+}

+ 70 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeVO3.java

@@ -0,0 +1,70 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.node.INode;
+import org.springblade.manager.entity.WbsTreeContract;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class WbsTreeContractTreeVO3 implements INode<WbsTreeContractTreeVO3> {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    /**
+     * 父节点ID
+     */
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long parentId;
+
+    /**
+     * 子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<WbsTreeContractTreeVO3> children;
+
+    /**
+     * 是否有子孙节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<WbsTreeContractTreeVO3> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    private String deptCategory;
+
+    private Long tenantId;
+
+    private Integer contractType;
+
+    private Long contractId;
+
+    private String contractIdRelation;
+
+    private String ancestors;
+
+    private Integer wbsType;
+
+    private Long  primaryKeyId;
+
+    private Integer type;
+
+    private String title;
+
+}

+ 1038 - 1022
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;
 
 /**
- *  资料填报及查询控制器
+ * 资料填报及查询控制器
  *
  * @author BladeX
  * @since 2022-06-08
@@ -73,1025 +73,1041 @@ import java.util.stream.Collectors;
 @Api(tags = "资料查询接口")
 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);
-	}
-
-	/**
-	 * 在线验签
-	 */
-	@PostMapping("/onlineVerify")
-	@ApiOperationSupport(order = 21)
-	@ApiOperation(value = "在线验签")
-	public R<Boolean> onlineVerify(@RequestParam String ids){
-		return R.data(false);
-	}
-
-	/**
-	 * 批量打印
-	 */
-	@PostMapping("/batchPrint")
-	@ApiOperationSupport(order = 20)
-	@ApiOperation(value = "批量打印")
-	public R<String> batchPrint(@RequestParam String ids){
-		return R.data(null);
-	}
-
-	/**
-	 * 批量下载
-	 */
-	@PostMapping("/batchDownloadFileToZip")
-	@ApiOperationSupport(order = 19)
-	@ApiOperation(value = "批量下载")
-	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(), 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)));
-	}
-
-	
+    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);
+    }
+
+    /**
+     * 在线验签
+     */
+    @PostMapping("/onlineVerify")
+    @ApiOperationSupport(order = 21)
+    @ApiOperation(value = "在线验签")
+    public R<Boolean> onlineVerify(@RequestParam String ids) {
+        return R.data(false);
+    }
+
+    /**
+     * 批量打印
+     */
+    @PostMapping("/batchPrint")
+    @ApiOperationSupport(order = 20)
+    @ApiOperation(value = "批量打印")
+    public R<String> batchPrint(@RequestParam String ids) {
+        return R.data(null);
+    }
+
+    /**
+     * 批量下载
+     */
+    @PostMapping("/batchDownloadFileToZip")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "批量下载")
+    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)));
+    }
+
+
 }

+ 14 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -35,6 +35,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.dto.WbsTreeContractDTO;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.mapper.SaveUserInfoByProjectMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
@@ -166,7 +167,7 @@ public class ContractInfoController extends BladeController {
     @ApiOperationSupport(order = 6)
     @ApiOperation(value = "新增或修改", notes = "传入contractInfo")
     public R submit(@Valid @RequestBody ContractInfoVO contractInfo) {
-        boolean b = contractInfoService.saveAndUpdateContract(contractInfo);
+        boolean b = contractInfoService.saveAndUpdateContract2(contractInfo);
         if (b) {
             return R.data(contractInfo, "操作成功");
         }
@@ -476,5 +477,17 @@ public class ContractInfoController extends BladeController {
         return R.fail(200, "未查询到信息");
     }
 
+    /**
+     * 查询监理or业主合同段关联信息
+     */
+    @GetMapping("/searchContractRelationInfo")
+    @ApiOperationSupport(order = 21)
+    @ApiOperation(value = "查询监理or业主合同段关联信息", notes = "合同段id")
+    @ApiImplicitParam(name = "contractId", value = "合同段id")
+    public R<List<ContractRelationJlyz>> searchContractRelationInfo(@RequestParam String contractId) {
+        List<ContractRelationJlyz> list = contractInfoService.searchContractRelationInfo(contractId);
+        return R.data(list);
+    }
+
 
 }

+ 12 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsTreeContractClientImpl.java

@@ -13,6 +13,7 @@ import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.vo.WbsTreeContractTreeVO;
+import org.springblade.manager.vo.WbsTreeContractTreeVO3;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
@@ -32,7 +33,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     @Override
     public List<WbsTreeContract> queryChildByParentId(WbsTreeContract treeNode, String queryTable) {
-        if("queryTable".equals(queryTable)){
+        if ("queryTable".equals(queryTable)) {
             //查询表格
             return this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, treeNode.getId()).eq(WbsTreeContract::getContractId, treeNode.getContractId()).eq(WbsTreeContract::getType, "2").eq(WbsTreeContract::getWbsType, "2"));
         } else {
@@ -47,7 +48,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
 
     @Override
     public List<WbsTreeContractTreeVOS> lazyTree(Long parentId, String contractId, String contractIdRelation, Integer type) {
-        List<WbsTreeContractTreeVO> result = this.wbsTreeContractService.lazyTreeTwo(contractIdRelation, parentId, type, contractId);
+        List<WbsTreeContractTreeVO3> result = this.wbsTreeContractService.lazyTreeThree(contractIdRelation, parentId, contractId);
 
         List<WbsTreeContractTreeVOS> vos = JSONArray.parseArray(JSONObject.toJSONString(result), WbsTreeContractTreeVOS.class);
 
@@ -57,6 +58,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
             List<WbsTreeContractTreeVO> childs = this.contractInfoService.queryContractWbsTreeByContractIdAndType(voData.getContractIdRelation(), voData.getWbsType(), voData.getKey());
             voData.setExsitChild(childs == null || childs.size() == 0);
         });
+
         return vos;
     }
 
@@ -64,13 +66,13 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
     public Boolean updateContractNodeParameter(WbsTreeContract node) {
 
         LambdaUpdateWrapper<WbsTreeContract> wrappers = Wrappers.lambdaUpdate();
-        if(StringUtils.isNotEmpty(node.getDeptName())){
+        if (StringUtils.isNotEmpty(node.getDeptName())) {
             wrappers.set(WbsTreeContract::getFullName, node.getDeptName());
         }
-        if(StringUtils.isNotEmpty(node.getPartitionCode())){
+        if (StringUtils.isNotEmpty(node.getPartitionCode())) {
             wrappers.set(WbsTreeContract::getPartitionCode, node.getPartitionCode());
         }
-        if(StringUtils.isNotEmpty(node.getSort()) && CommonUtil.checkBigDecimal(node.getSort())){
+        if (StringUtils.isNotEmpty(node.getSort()) && CommonUtil.checkBigDecimal(node.getSort())) {
             wrappers.set(WbsTreeContract::getSort, node.getSort());
         }
 
@@ -130,7 +132,7 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
     @Override
     public List<WbsTreeContractTreeVOS> queryCurrentContractLogList(String contractId) {
         List<WbsTreeContract> result = this.wbsTreeContractService.queryCurrentContractLogList(contractId);
-        if(result != null && result.size() != 0){
+        if (result != null && result.size() != 0) {
             List<WbsTreeContractTreeVOS> vosResult = new ArrayList<>();
             result.forEach(node -> {
                 //转换
@@ -145,18 +147,18 @@ public class WbsTreeContractClientImpl implements WbsTreeContractClient {
             List<WbsTreeContractTreeVOS> finalResult = new ArrayList<>();
             //排序顺序
             List<DictBiz> dictBizList = this.dictBizClient.getList("contract_log_sort", "notRoot").getData();
-            if(dictBizList == null || dictBizList.size() == 0){
+            if (dictBizList == null || dictBizList.size() == 0) {
                 return vosResult;
             }
             //存在排序,则根据排序规则对数据进行排序
             dictBizList.sort(Comparator.comparingInt(DictBiz::getSort));
             dictBizList.forEach(dictBiz -> {
                 Iterator<WbsTreeContractTreeVOS> iterator = vosResult.iterator();
-                while (iterator.hasNext()){
+                while (iterator.hasNext()) {
                     WbsTreeContractTreeVOS next = iterator.next();
-                    if(next.getTitle().contains(dictBiz.getDictValue())){
+                    if (next.getTitle().contains(dictBiz.getDictValue())) {
                         //设置图标
-                        switch (next.getDeptCategory()){
+                        switch (next.getDeptCategory()) {
                             case 7:
                                 //施工日志
                                 next.setIconValue("hcicon-Excavator-3");

+ 68 - 30
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -73,37 +73,67 @@
         </collection>
     </resultMap>
 
+    <insert id="insertContractRelationJLYZ">
+        insert into m_contract_relation_jlyz (id, contract_id_jlyz, contract_id_sg)
+        values (#{id}, #{contractId}, #{contractIdSG})
+    </insert>
+
+    <delete id="deleteContractRelationJLYZ">
+        delete
+        from m_contract_relation_jlyz
+        where contract_id_jlyz = #{id}
+    </delete>
+
     <select id="selectContractByProjectIds" resultMap="contractInfoResultMap">
-        select id, p_id, contract_name, contract_number, contract_type from m_contract_info where is_deleted = 0 and p_id in
+        select id, p_id, contract_name, contract_number, contract_type from m_contract_info where is_deleted = 0 and
+        p_id in
         <foreach collection="ids" item="pId" open="(" separator="," close=")">
             #{pId}
         </foreach>
     </select>
 
     <update id="updatePasswordByUserId">
-        update blade_user set password = #{password} where id = #{userId}
+        update blade_user
+        set password = #{password}
+        where id = #{userId}
     </update>
     <update id="deleteFile">
-        update blade_attach set is_deleted = 1 where link = #{url} and `status`= 1
+        update blade_attach
+        set is_deleted = 1
+        where link = #{url}
+          and `status` = 1
     </update>
 
     <select id="selectContractInfoPage" resultMap="contractInfoResultMap">
-        select c.* ,p.project_name as project_name from m_contract_info c INNER JOIN m_project_info p on c.p_id=p.id where c.is_deleted = 0
+        select c.*, p.project_name as project_name
+        from m_contract_info c
+                 INNER JOIN m_project_info p on c.p_id = p.id
+        where c.is_deleted = 0
     </select>
 
     <select id="selectContractInfoCount" resultMap="contractInfoResultMap1">
-        select c.contract_name,count(*) as contract_counts from m_contract_info c where c.is_deleted = 0  GROUP BY c.p_id
+        select c.contract_name, count(*) as contract_counts
+        from m_contract_info c
+        where c.is_deleted = 0
+        GROUP BY c.p_id
     </select>
 
     <select id="selectContractInfoPageByPid" resultMap="contractInfoResultMap">
-        select c.*,p.project_name as project_name  from m_contract_info c
-        INNER JOIN m_project_info p on c.p_id=p.id where p.id = #{pid} and c.is_deleted = 0
+        select c.*, p.project_name as project_name
+        from m_contract_info c
+                 INNER JOIN m_project_info p on c.p_id = p.id
+        where p.id = #{pid}
+          and c.is_deleted = 0
     </select>
 
     <select id="findJobByRoleId" resultType="org.springblade.manager.vo.CRolePostVO">
-        select p.id,p.post_name from blade_post p INNER JOIN m_role_post m ON p.id = m.p_id
-        INNER JOIN blade_role r ON r.id = m.r_id WHERE p.is_deleted = 0 and p.`status`= 1
-        and r.id = #{id}
+        select p.id, p.post_name
+        from blade_post p
+                 INNER JOIN m_role_post m ON p.id = m.p_id
+                 INNER JOIN blade_role r ON r.id = m.r_id
+        WHERE p.is_deleted = 0
+          and p.`status` = 1
+          and r.id = #{id}
     </select>
 
     <select id="findAllUserByCondition" resultType="org.springblade.system.user.vo.UserVO2">
@@ -160,7 +190,11 @@
     </select>
 
     <select id="findUserList" resultType="org.springblade.system.user.entity.User">
-        select `id`,`name`,account,`password` from blade_user WHERE is_deleted = 0 and `status` = 1 order by create_time
+        select `id`, `name`, account, `password`
+        from blade_user
+        WHERE is_deleted = 0
+          and `status` = 1
+        order by create_time
     </select>
 
     <select id="tree" resultMap="treeNodeResultMap">
@@ -203,30 +237,34 @@
     </select>
 
     <select id="selectByCondition" resultMap="resultMap2">
-        SELECT
-        t.p_key_id AS "pKeyId",t.contract_id AS "contractId",t.contract_id_relation AS "contractIdRelation",
-        c.*
-        FROM
-        m_contract_info c
-        INNER JOIN m_wbs_tree_contract t ON c.id = t.contract_id
+        SELECT t.p_key_id             AS "pKeyId",
+               t.contract_id          AS "contractId",
+               t.contract_id_relation AS "contractIdRelation",
+               c.*
+        FROM m_contract_info c
+                 INNER JOIN m_wbs_tree_contract t ON c.id = t.contract_id
         WHERE c.id = #{contractInfo.id}
-        AND t.parent_id = 0
+          AND t.parent_id = 0
     </select>
 
     <select id="selectLists" resultType="org.springblade.manager.vo.WbsTreeContractVO3">
-        SELECT
-        full_name AS "fullName",
-        id AS "id",
-        p_key_id AS "pKeyId",
-        contract_id AS "contractId",
-        contract_id_relation  AS "contractIdRelation"
+        SELECT full_name            AS "fullName",
+               id                   AS "id",
+               p_key_id             AS "pKeyId",
+               contract_id          AS "contractId",
+               contract_id_relation AS "contractIdRelation"
         FROM m_wbs_tree_contract
-        WHERE
-        contract_id = #{contractInfo.id}
-        AND contract_type = #{contractType}
-        AND parent_id = 0
-        AND status = 1
-        AND is_deleted = 0
+        WHERE contract_id = #{contractInfo.id}
+          AND contract_type = #{contractType}
+          AND parent_id = 0
+          AND status = 1
+          AND is_deleted = 0
+    </select>
+
+    <select id="selectByContractRelationJlyz" resultType="org.springblade.manager.entity.ContractRelationJlyz">
+        SELECT contract_id_sg AS "id", contract_id_jlyz
+        FROM m_contract_relation_jlyz
+        WHERE contract_id_jlyz = #{id}
     </select>
 
 

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml

@@ -73,6 +73,7 @@
         AND type = 2
         ORDER BY sort
     </select>
+
     <select id="selectDetailById" resultType="org.springblade.manager.vo.WbsFormElementVO">
         SELECT
         *,

+ 10 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java

@@ -2,14 +2,8 @@ package org.springblade.manager.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
-import org.springblade.manager.entity.WbsTableOwnerRole;
-import org.springblade.manager.entity.WbsTree;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
-import org.springblade.manager.vo.WbsTreeContractTreeVO;
-import org.springblade.manager.vo.WbsTreeContractTreeVO2;
-import org.springblade.manager.vo.WbsTreeContractVO;
-import org.springblade.manager.vo.WbsTreeContractVO2;
+import org.springblade.manager.entity.*;
+import org.springblade.manager.vo.*;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -69,6 +63,7 @@ public interface WbsTreeContractMapper extends BaseMapper<WbsTreeContract> {
 
     List<WbsTreeContractTreeVO> lazyTreeTwo(String contractIdRelation, Long parentId, Integer contractType, String contractId);
 
+    List<WbsTreeContractTreeVO3> lazyTreeThree(List<Long> contractIdRelation, Long parentId);
 
     List<WbsTreeContract> searchParentAllNode(long primaryKeyId, Long contractId);
 
@@ -80,4 +75,11 @@ public interface WbsTreeContractMapper extends BaseMapper<WbsTreeContract> {
                                                     String wbsId, String contractId,
                                                     Long parentId, String contractIdRelation,
                                                     List<String> tableOwnerList);
+
+    SaveUserInfoByProject selectRoleInfo(Long userId, String contractId, String projectId);
+
+    List<ContractRelationJlyz> selectContractRelationInfo(Long id);
+
+    ContractInfo selectContractInfo(String contractId);
+
 }

+ 319 - 262
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -68,29 +68,43 @@
 
 
     <insert id="insertWbsTreeContract1">
-        INSERT INTO m_wbs_tree_contract(
-        p_key_id,id,wbs_id,wbs_type,project_id,contract_id,contract_type,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
-        table_type,create_time,create_user,create_dept,update_user,update_time,`STATUS`,is_deleted,
-        unique_code,partition_code,is_expernode,is_concrete,table_owner,major_data_type,init_table_name,is_link_table,excel_id)
-        VALUES(
-        #{snowId},#{wbsTree.id},#{wbsTree.wbsId},#{wbsType},#{wbsTree.projectId},#{contractId},1,#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
-        #{wbsTree.deptCategory},#{wbsTree.deptName},#{wbsTree.fullName},#{wbsTree.sort},#{wbsTree.remark},#{wbsTree.type},
-        #{wbsTree.tableType},#{wbsTree.createTime},#{wbsTree.createUser},#{wbsTree.createDept},#{wbsTree.updateUser},#{wbsTree.updateTime},
-        #{wbsTree.status},#{wbsTree.isDeleted},#{wbsTree.uniqueCode},#{wbsTree.partitionCode},#{wbsTree.isExpernode},#{wbsTree.isConcrete},
-        #{wbsTree.tableOwner},#{wbsTree.majorDataType},#{wbsTree.initTableName},#{wbsTree.isLinkTable},#{wbsTree.excelId})
+        INSERT INTO m_wbs_tree_contract(p_key_id, id, wbs_id, wbs_type, project_id, contract_id, contract_type,
+                                        tenant_id, parent_id, ancestors, dept_category, dept_name, full_name, sort,
+                                        remark, `type`,
+                                        table_type, create_time, create_user, create_dept, update_user, update_time,
+                                        `STATUS`, is_deleted,
+                                        unique_code, partition_code, is_expernode, is_concrete, table_owner,
+                                        major_data_type, init_table_name, is_link_table, excel_id)
+        VALUES (#{snowId}, #{wbsTree.id}, #{wbsTree.wbsId}, #{wbsType}, #{wbsTree.projectId}, #{contractId}, 1,
+                #{wbsTree.tenantId}, #{wbsTree.parentId}, #{wbsTree.ancestors},
+                #{wbsTree.deptCategory}, #{wbsTree.deptName}, #{wbsTree.fullName}, #{wbsTree.sort}, #{wbsTree.remark},
+                #{wbsTree.type},
+                #{wbsTree.tableType}, #{wbsTree.createTime}, #{wbsTree.createUser}, #{wbsTree.createDept},
+                #{wbsTree.updateUser}, #{wbsTree.updateTime},
+                #{wbsTree.status}, #{wbsTree.isDeleted}, #{wbsTree.uniqueCode}, #{wbsTree.partitionCode},
+                #{wbsTree.isExpernode}, #{wbsTree.isConcrete},
+                #{wbsTree.tableOwner}, #{wbsTree.majorDataType}, #{wbsTree.initTableName}, #{wbsTree.isLinkTable},
+                #{wbsTree.excelId})
     </insert>
 
     <insert id="insertByCondition">
-        INSERT INTO m_wbs_tree_contract(
-        p_key_id,id,wbs_id,wbs_type,project_id,contract_id,contract_type,tenant_id,parent_id,ancestors,dept_category,dept_name,full_name,sort,remark,`type`,
-        table_type,create_time,create_user,create_dept,update_user,update_time,`STATUS`,is_deleted,
-        unique_code,partition_code,is_expernode,is_concrete,table_owner,major_data_type,init_table_name,is_link_table,excel_id)
-        VALUES(
-        #{pKeyId},#{wbsTree.id},#{wbsTree.wbsId},#{wbsType},#{wbsTree.projectId},#{contractId},1,#{wbsTree.tenantId},#{wbsTree.parentId},#{wbsTree.ancestors},
-        #{wbsTree.deptCategory},#{wbsTree.deptName},#{wbsTree.fullName},#{wbsTree.sort},#{wbsTree.remark},#{wbsTree.type},
-        #{wbsTree.tableType},#{wbsTree.createTime},#{wbsTree.createUser},#{wbsTree.createDept},#{wbsTree.updateUser},#{wbsTree.updateTime},
-        #{wbsTree.status},#{wbsTree.isDeleted},#{wbsTree.uniqueCode},#{wbsTree.partitionCode},#{wbsTree.isExpernode},#{wbsTree.isConcrete},
-        #{wbsTree.tableOwner},#{wbsTree.majorDataType},#{wbsTree.initTableName},#{wbsTree.isLinkTable},#{wbsTree.excelId})
+        INSERT INTO m_wbs_tree_contract(p_key_id, id, wbs_id, wbs_type, project_id, contract_id, contract_type,
+                                        tenant_id, parent_id, ancestors, dept_category, dept_name, full_name, sort,
+                                        remark, `type`,
+                                        table_type, create_time, create_user, create_dept, update_user, update_time,
+                                        `STATUS`, is_deleted,
+                                        unique_code, partition_code, is_expernode, is_concrete, table_owner,
+                                        major_data_type, init_table_name, is_link_table, excel_id)
+        VALUES (#{pKeyId}, #{wbsTree.id}, #{wbsTree.wbsId}, #{wbsType}, #{wbsTree.projectId}, #{contractId}, 1,
+                #{wbsTree.tenantId}, #{wbsTree.parentId}, #{wbsTree.ancestors},
+                #{wbsTree.deptCategory}, #{wbsTree.deptName}, #{wbsTree.fullName}, #{wbsTree.sort}, #{wbsTree.remark},
+                #{wbsTree.type},
+                #{wbsTree.tableType}, #{wbsTree.createTime}, #{wbsTree.createUser}, #{wbsTree.createDept},
+                #{wbsTree.updateUser}, #{wbsTree.updateTime},
+                #{wbsTree.status}, #{wbsTree.isDeleted}, #{wbsTree.uniqueCode}, #{wbsTree.partitionCode},
+                #{wbsTree.isExpernode}, #{wbsTree.isConcrete},
+                #{wbsTree.tableOwner}, #{wbsTree.majorDataType}, #{wbsTree.initTableName}, #{wbsTree.isLinkTable},
+                #{wbsTree.excelId})
     </insert>
 
     <update id="deleteBatch">
@@ -114,276 +128,254 @@
         UPDATE m_wbs_tree_contract
         SET is_deleted = 0
         WHERE id = #{id}
-        AND wbs_id = #{wbsId}
-        AND project_id =#{projectId}
-        AND contract_id = #{contractId}
+          AND wbs_id = #{wbsId}
+          AND project_id = #{projectId}
+          AND contract_id = #{contractId}
     </update>
 
     <update id="updateByCondition1">
         UPDATE m_wbs_tree_contract
-        SET dept_category = #{wbsTP.deptCategory},
-            dept_name = #{wbsTP.deptName},
-            unique_code = #{wbsTP.uniqueCode},
-            partition_code = #{wbsTP.partitionCode},
+        SET dept_category   = #{wbsTP.deptCategory},
+            dept_name       = #{wbsTP.deptName},
+            unique_code     = #{wbsTP.uniqueCode},
+            partition_code  = #{wbsTP.partitionCode},
             major_data_type = #{wbsTP.majorDataType}
-        WHERE
-            project_id = #{wbsTP.projectId}
-        AND id = #{wbsTP.id}
-        AND wbs_id = #{wbsTP.wbsId}
+        WHERE project_id = #{wbsTP.projectId}
+          AND id = #{wbsTP.id}
+          AND wbs_id = #{wbsTP.wbsId}
     </update>
 
     <update id="updateByCondition2">
         UPDATE m_wbs_tree_contract
         SET is_deleted = 0
         WHERE contract_id = #{contractId}
-        AND contract_id_relation = #{contractIdRelation}
-        AND status = 1
+          AND contract_id_relation = #{contractIdRelation}
+          AND status = 1
     </update>
 
     <select id="selectAll" resultMap="resultMap2">
-        SELECT
-            wtc.id,
-            wtc.wbs_id,
-            wtc.project_id,
-            ( SELECT project_name FROM m_project_info pi WHERE wtc.project_id = pi.id ) AS project_name,
-            contract_id
-        FROM
-            m_wbs_tree_contract wtc
-        WHERE
-            is_deleted = 0
-            AND STATUS = 1
-        GROUP BY
-            project_id
+        SELECT wtc.id,
+               wtc.wbs_id,
+               wtc.project_id,
+               (SELECT project_name FROM m_project_info pi WHERE wtc.project_id = pi.id) AS project_name,
+               contract_id
+        FROM m_wbs_tree_contract wtc
+        WHERE is_deleted = 0
+          AND STATUS = 1
+        GROUP BY project_id
     </select>
 
     <select id="selectByCondition" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT
-            id,
-            p_key_id,
-            wbs_id,
-            wbs_type,
-            project_id,
-            contract_id,
-            contract_type,
-            contract_id_relation,
-            tenant_id,
-            parent_id,
-            dept_category,
-            type,
-            dept_name,
-            full_name,
-            table_type,
-            sort,
-            ancestors,
-            remark,
-            unique_code,
-            partition_code,
-            is_expernode,
-            is_concrete,
-            table_owner,
-            major_data_type,
-            init_table_name,
-            is_link_table,
-            create_user,
-            create_dept,
-            create_time,
-            update_user,
-            update_time,
-            STATUS,
-            is_deleted,
-            excel_id
-        FROM
-            m_wbs_tree_contract
-        WHERE
-            id = #{id}
-        AND project_id = #{projectId}
-        AND contract_id = #{contractId}
-        AND wbs_id = #{wbsId}
-        AND STATUS = 1
-        AND is_deleted = 0
+        SELECT id,
+               p_key_id,
+               wbs_id,
+               wbs_type,
+               project_id,
+               contract_id,
+               contract_type,
+               contract_id_relation,
+               tenant_id,
+               parent_id,
+               dept_category,
+               type,
+               dept_name,
+               full_name,
+               table_type,
+               sort,
+               ancestors,
+               remark,
+               unique_code,
+               partition_code,
+               is_expernode,
+               is_concrete,
+               table_owner,
+               major_data_type,
+               init_table_name,
+               is_link_table,
+               create_user,
+               create_dept,
+               create_time,
+               update_user,
+               update_time,
+               STATUS,
+               is_deleted,
+               excel_id
+        FROM m_wbs_tree_contract
+        WHERE id = #{id}
+          AND project_id = #{projectId}
+          AND contract_id = #{contractId}
+          AND wbs_id = #{wbsId}
+          AND STATUS = 1
+          AND is_deleted = 0
     </select>
 
     <select id="selectByCondition2" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT
-            id,
-            p_key_id,
-            wbs_id,
-            wbs_type,
-            project_id,
-            contract_id,
-            contract_type,
-            contract_id_relation,
-            tenant_id,
-            parent_id,
-            dept_category,
-            type,
-            dept_name,
-            full_name,
-            table_type,
-            sort,
-            ancestors,
-            remark,
-            unique_code,
-            partition_code,
-            is_expernode,
-            is_concrete,
-            table_owner,
-            major_data_type,
-            init_table_name,
-            is_link_table,
-            create_user,
-            create_dept,
-            create_time,
-            update_user,
-            update_time,
-            STATUS,
-            is_deleted,
-            excel_id
-        FROM
-            m_wbs_tree_contract
-        WHERE
-            id = #{id}
-        AND project_id = #{projectId}
-        AND contract_id = #{contractId}
-        AND wbs_id = #{wbsId}
-        AND STATUS = 1
+        SELECT id,
+               p_key_id,
+               wbs_id,
+               wbs_type,
+               project_id,
+               contract_id,
+               contract_type,
+               contract_id_relation,
+               tenant_id,
+               parent_id,
+               dept_category,
+               type,
+               dept_name,
+               full_name,
+               table_type,
+               sort,
+               ancestors,
+               remark,
+               unique_code,
+               partition_code,
+               is_expernode,
+               is_concrete,
+               table_owner,
+               major_data_type,
+               init_table_name,
+               is_link_table,
+               create_user,
+               create_dept,
+               create_time,
+               update_user,
+               update_time,
+               STATUS,
+               is_deleted,
+               excel_id
+        FROM m_wbs_tree_contract
+        WHERE id = #{id}
+          AND project_id = #{projectId}
+          AND contract_id = #{contractId}
+          AND wbs_id = #{wbsId}
+          AND STATUS = 1
     </select>
 
     <select id="findAllNodeList2" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT
-            id,
-            p_key_id,
-            wbs_id,
-            wbs_type,
-            project_id,
-            contract_id,
-            contract_type,
-            contract_id_relation,
-            tenant_id,
-            parent_id,
-            dept_category,
-            type,
-            dept_name,
-            full_name,
-            table_type,
-            sort,
-            ancestors,
-            remark,
-            unique_code,
-            partition_code,
-            is_expernode,
-            is_concrete,
-            table_owner,
-            major_data_type,
-            init_table_name,
-            is_link_table,
-            create_user,
-            create_dept,
-            create_time,
-            update_user,
-            update_time,
-            STATUS,
-            is_deleted,
-            excel_id
-        FROM
-            m_wbs_tree_contract
-        WHERE
-            project_id = #{projectId}
-        AND contract_id = #{contractId}
-        AND wbs_id = #{wbsId}
-        AND STATUS = 1
-        AND is_deleted = 0
+        SELECT id,
+               p_key_id,
+               wbs_id,
+               wbs_type,
+               project_id,
+               contract_id,
+               contract_type,
+               contract_id_relation,
+               tenant_id,
+               parent_id,
+               dept_category,
+               type,
+               dept_name,
+               full_name,
+               table_type,
+               sort,
+               ancestors,
+               remark,
+               unique_code,
+               partition_code,
+               is_expernode,
+               is_concrete,
+               table_owner,
+               major_data_type,
+               init_table_name,
+               is_link_table,
+               create_user,
+               create_dept,
+               create_time,
+               update_user,
+               update_time,
+               STATUS,
+               is_deleted,
+               excel_id
+        FROM m_wbs_tree_contract
+        WHERE project_id = #{projectId}
+          AND contract_id = #{contractId}
+          AND wbs_id = #{wbsId}
+          AND STATUS = 1
+          AND is_deleted = 0
     </select>
 
     <select id="selectParent" resultType="org.springblade.manager.entity.WbsTreePrivate">
-        SELECT p_key_id,dept_name,full_name FROM m_wbs_tree_private
-        WHERE
-            project_id = #{projectId}
-        AND wbs_id = #{wbsId}
-        AND id = #{parentId}
+        SELECT p_key_id, dept_name, full_name
+        FROM m_wbs_tree_private
+        WHERE project_id = #{projectId}
+          AND wbs_id = #{wbsId}
+          AND id = #{parentId}
     </select>
 
     <select id="queryCurrentContractLogList" resultMap="ResultMap">
-        select
-            p_key_id,
-            dept_name,
-            full_name,
-            dept_category
-        from
-          m_wbs_tree_contract
-        where
-          is_deleted = 0
-        and major_data_type = 5
-        and contract_id = #{contractId}
+        select p_key_id,
+               dept_name,
+               full_name,
+               dept_category
+        from m_wbs_tree_contract
+        where is_deleted = 0
+          and major_data_type = 5
+          and contract_id = #{contractId}
     </select>
 
     <select id="selectListByCondition" resultType="org.springblade.manager.vo.WbsTreeContractVO2">
-        SELECT
-            p_key_id AS "pKeyId",
-            id AS "id",
-            dept_name AS "deptName",
-            full_name AS "fullName",
-            wbs_type AS "wbsType",
-            wbs_id AS "wbsId",
-            project_id AS "projectId",
-            (select project_name from m_project_info where id =#{projectId}) AS "projectName",
-            contract_id AS "contractId",
-            contract_type AS "contractType",
-            (select contract_name from m_contract_info ci where ci.id = t.contract_id) AS "contractName"
-        FROM
-            m_wbs_tree_contract t
+        SELECT p_key_id                                                                   AS "pKeyId",
+               id                                                                         AS "id",
+               dept_name                                                                  AS "deptName",
+               full_name                                                                  AS "fullName",
+               wbs_type                                                                   AS "wbsType",
+               wbs_id                                                                     AS "wbsId",
+               project_id                                                                 AS "projectId",
+               (select project_name from m_project_info where id = #{projectId})          AS "projectName",
+               contract_id                                                                AS "contractId",
+               contract_type                                                              AS "contractType",
+               (select contract_name from m_contract_info ci where ci.id = t.contract_id) AS "contractName"
+        FROM m_wbs_tree_contract t
         WHERE project_id = #{projectId}
-        AND contract_type = 1
-        AND parent_id = 0
-        AND is_deleted = 0
-        AND status = 1
+          AND contract_type = 1
+          AND parent_id = 0
+          AND is_deleted = 0
+          AND status = 1
     </select>
 
     <select id="selectCondition" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT
-            id,
-            p_key_id,
-            wbs_id,
-            wbs_type,
-            project_id,
-            contract_id,
-            contract_type,
-            contract_id_relation,
-            tenant_id,
-            parent_id,
-            dept_category,
-            type,
-            dept_name,
-            full_name,
-            table_type,
-            sort,
-            ancestors,
-            remark,
-            unique_code,
-            partition_code,
-            is_expernode,
-            is_concrete,
-            table_owner,
-            major_data_type,
-            init_table_name,
-            is_link_table,
-            create_user,
-            create_dept,
-            create_time,
-            update_user,
-            update_time,
-            STATUS,
-            is_deleted,
-            excel_id
-        FROM
-            m_wbs_tree_contract
-        WHERE
-            is_deleted = 1
-        AND parent_id = 0
-        AND contract_id = #{getContractId}
-        AND id = #{id}
-        AND contract_id_relation = #{getContractIdRelation}
-        AND contract_type = #{contractType}
+        SELECT id,
+               p_key_id,
+               wbs_id,
+               wbs_type,
+               project_id,
+               contract_id,
+               contract_type,
+               contract_id_relation,
+               tenant_id,
+               parent_id,
+               dept_category,
+               type,
+               dept_name,
+               full_name,
+               table_type,
+               sort,
+               ancestors,
+               remark,
+               unique_code,
+               partition_code,
+               is_expernode,
+               is_concrete,
+               table_owner,
+               major_data_type,
+               init_table_name,
+               is_link_table,
+               create_user,
+               create_dept,
+               create_time,
+               update_user,
+               update_time,
+               STATUS,
+               is_deleted,
+               excel_id
+        FROM m_wbs_tree_contract
+        WHERE is_deleted = 1
+          AND parent_id = 0
+          AND contract_id = #{getContractId}
+          AND id = #{id}
+          AND contract_id_relation = #{getContractIdRelation}
+          AND contract_type = #{contractType}
     </select>
 
     <select id="lazyTreeTwo" resultMap="treeNodeResultMap">
@@ -420,21 +412,66 @@
         ORDER BY dept.sort
     </select>
 
+
+    <select id="lazyTreeThree" resultType="org.springblade.manager.vo.WbsTreeContractTreeVO3">
+        SELECT c.id AS "primaryKeyId",
+        c.p_key_id AS "id",
+        c.type AS "type",
+        c.wbs_type AS "wbsType",
+        c.contract_type AS "contractType",
+        c.contract_id AS "contractId",
+        c.dept_category AS "deptCategory",
+        c.parent_id,
+        c.tenant_id AS "tenantId",
+        IFNULL(c.full_name, c.dept_name) AS "title",
+        c.contract_id AS "contractIdRelation",
+        (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+        FROM m_wbs_tree_contract
+        WHERE parent_id = c.id
+        AND is_deleted = 0) AS "has_children"
+        FROM m_wbs_tree_contract c
+        WHERE (major_data_type != 5 or major_data_type is null)
+        AND c.contract_id in
+        <foreach item="contractIdRelation" collection="contractIdRelation" open="(" close=")" separator=",">
+            #{contractIdRelation}
+        </foreach>
+        AND parent_id = #{parentId}
+        AND c.contract_type = 1
+        AND c.type = 1
+        AND c.status = 1
+        AND c.is_deleted = 0
+        ORDER BY c.sort
+    </select>
+
     <select id="searchParentAllNode" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT DISTINCT T2.id, T2.full_name, T2.parent_id ,T2.p_key_id FROM (
-        SELECT @r AS _id,(SELECT @r := parent_id FROM m_wbs_tree_contract WHERE id = _id and contract_id = h.contract_id ) AS pid, @l := @l + 1 AS lvl
-        FROM (SELECT @r := #{primaryKeyId}, @l := 0) vars, m_wbs_tree_contract h WHERE @r != 0 and contract_id=#{contractId}
-        union ALL
-        (SELECT id, parent_id ,0 FROM m_wbs_tree_contract where parent_id=#{primaryKeyId} and contract_id=#{contractId} LIMIT 1)
-        ) T1 JOIN m_wbs_tree_contract T2  ON T1._id = T2.id where T2.contract_id=#{contractId}
+        SELECT DISTINCT T2.id, T2.full_name, T2.parent_id, T2.p_key_id
+        FROM (
+                 SELECT @r AS _id,(SELECT @r := parent_id FROM m_wbs_tree_contract WHERE id = _id and contract_id = h.contract_id ) AS pid, @l := @l + 1 AS lvl
+                 FROM (SELECT @r := #{primaryKeyId}, @l := 0) vars, m_wbs_tree_contract h
+                 WHERE @r != 0 and contract_id=#{contractId}
+                 union ALL
+                 (
+                 SELECT id, parent_id, 0
+                 FROM m_wbs_tree_contract
+                 where parent_id=#{primaryKeyId}
+                   and contract_id=#{contractId} LIMIT 1)
+             ) T1
+                 JOIN m_wbs_tree_contract T2 ON T1._id = T2.id
+        where T2.contract_id=#{contractId}
     </select>
 
     <select id="updateAllNodeTabById" resultType="org.springblade.manager.entity.WbsTreeContract">
-        update m_wbs_tree_contract set excel_id=#{aPrivate.excelId} ,is_link_table=2 , html_url=#{aPrivate.htmlUrl} where type =2 and project_id = #{aPrivate.projectId} and id =#{aPrivate.id};
+        update m_wbs_tree_contract
+        set excel_id=#{aPrivate.excelId},
+            is_link_table=2,
+            html_url=#{aPrivate.htmlUrl}
+        where type = 2
+          and project_id = #{aPrivate.projectId}
+          and id = #{aPrivate.id};
     </select>
 
     <select id="selectWbsTableOwnerRoleList" resultType="org.springblade.manager.entity.WbsTableOwnerRole">
-        select id,role_id as "roleId",table_owner_number as "tableOwnerNumber"
+        select id, role_id as "roleId", table_owner_number as "tableOwnerNumber"
         from m_wbs_table_owner_role
         where role_id = #{roleId}
     </select>
@@ -465,5 +502,25 @@
         ORDER BY sort
     </select>
 
+    <select id="selectRoleInfo" resultType="org.springblade.manager.entity.SaveUserInfoByProject">
+        SELECT role_id
+        FROM m_project_assignment_user
+        WHERE user_id = #{userId}
+          AND contract_id = #{contractId}
+          AND project_id = #{projectId}
+          AND status = 1
+          AND is_deleted = 0
+    </select>
+
+    <select id="selectContractRelationInfo" resultType="org.springblade.manager.entity.ContractRelationJlyz">
+        SELECT *
+        FROM m_contract_relation_jlyz
+        WHERE contract_id_jlyz = #{id}
+    </select>
+
+    <select id="selectContractInfo" resultType="org.springblade.manager.entity.ContractInfo">
+        SELECT contract_name FROM  m_contract_info WHERE id = #{contractId}
+    </select>
+
 
 </mapper>

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java

@@ -19,6 +19,7 @@ package org.springblade.manager.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.vo.*;
 import org.springblade.core.mp.base.BaseService;
@@ -68,10 +69,14 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
     boolean saveAndUpdateContract(ContractInfoVO contractInfo);
 
+    boolean saveAndUpdateContract2(ContractInfoVO contractInfo);
+
     List<ContractInfo> findContractInProject(String ids);
 
     ContractInfo selectById(String contractId);
 
     ContractInfoVO2 selectByCondition(ContractInfo contractInfo);
 
+    List<ContractRelationJlyz> searchContractRelationInfo(String contractId);
+
 }

+ 5 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -5,10 +5,7 @@ import org.springblade.manager.dto.WbsTreeContractDTO;
 import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
-import org.springblade.manager.vo.WbsTreeContractTreeVO;
-import org.springblade.manager.vo.WbsTreeContractTreeVO2;
-import org.springblade.manager.vo.WbsTreeContractVO2;
-import org.springblade.manager.vo.WbsTreeVO;
+import org.springblade.manager.vo.*;
 
 import java.util.List;
 
@@ -23,9 +20,11 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     List<WbsTreeContractTreeVO> lazyTreeTwo(String contractIdRelation, Long parentId, Integer contractType, String contractId);
 
-    List<WbsTreeContract> searchNodeAllTable(String primaryKeyId,String tableOwner);
+    List<WbsTreeContractTreeVO3> lazyTreeThree(String contractIdRelation, Long parentId, String contractId);
 
-    List<WbsTreeContract> searchParentAllNode(long primaryKeyId,Long contractId);
+    List<WbsTreeContract> searchNodeAllTable(String primaryKeyId, String tableOwner);
+
+    List<WbsTreeContract> searchParentAllNode(long primaryKeyId, Long contractId);
 
     List<WbsTreeContract> updateAllNodeTabById(WbsTreePrivate aPrivate);
 }

+ 82 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -29,6 +29,7 @@ import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.manager.dto.FindAllUserByConditionDTO;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
 import org.springblade.manager.entity.ContractInfo;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.entity.ProjectContractArea;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.mapper.ProjectContractAreaMapper;
@@ -47,6 +48,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 合同段信息表 服务实现类
@@ -165,9 +167,6 @@ public class ContractInfoServiceImpl
 
     /**
      * 新增合同段保存(施工-监理引用施工合同wbs私有树)
-     *
-     * @param contractInfo
-     * @return
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -386,6 +385,81 @@ public class ContractInfoServiceImpl
     }
 
 
+    /**
+     * 新增合同段保存2(施工-监理引用施工合同wbs私有树)
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public boolean saveAndUpdateContract2(ContractInfoVO contractInfo) {
+        if (contractInfo.getId() == null) {
+            //新增
+            List<ContractInfo> contractInfos = baseMapper.selectList(Wrappers.<ContractInfo>query().lambda()
+                    .eq(ContractInfo::getContractName, contractInfo.getContractName())
+                    .eq(ContractInfo::getPId, contractInfo.getPId())
+            );
+            if (contractInfos.size() > 0) {
+                throw new ServiceException("合同段名称已存在当前项目下,请重新输入");
+            }
+            if (StringUtils.isEmpty(String.valueOf(contractInfo.getContractType()))) {
+                throw new ServiceException("合同类型不能为空");
+            }
+
+            boolean row = saveOrUpdate(contractInfo);
+
+            //新增合同段 监理、业主与施工wbs树信息
+            if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
+                List<WbsTreeContractVO3> infos = contractInfo.getIdList();
+                infos.stream().forEach(info -> {
+                    baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), info.getContractId());
+
+                });
+            }
+
+            return submitContractRelevantInfo(row, contractInfo);
+
+        } else {
+            //编辑
+            List<ContractInfo> contractInfos = baseMapper.selectList(Wrappers.<ContractInfo>query().lambda()
+                    .eq(ContractInfo::getContractName, contractInfo.getContractName())
+                    .eq(ContractInfo::getPId, contractInfo.getPId())
+                    .ne(ContractInfo::getId, contractInfo.getId())
+            );
+            if (contractInfos.size() > 0) {
+                throw new ServiceException("合同段名称已存在当前项目下,请重新输入");
+            }
+
+            //新增合同段
+            boolean row = saveOrUpdate(contractInfo);
+
+            //关联合同段 监理、业主与施工wbs树信息
+            if (contractInfo.getContractType().equals(2) || contractInfo.getContractType().equals(3)) {
+                //获取当前入参的施工合同段IdList
+                List<WbsTreeContractVO3> idList = contractInfo.getIdList();
+                if (idList.isEmpty()) {
+                    throw new ServiceException("请先选择关联的合同段权限");
+                }
+                List<String> idList_SG = idList.stream().map(WbsTreeContractVO3::getContractId).collect(Collectors.toList());
+
+                //获取当前合同段存在的关系信息
+                List<ContractRelationJlyz> resultListJLTZ = baseMapper.selectByContractRelationJlyz(contractInfo.getId());
+
+                //全部删除当前关系信息
+                if (resultListJLTZ.size() > 0) {
+                    baseMapper.deleteContractRelationJLYZ(contractInfo.getId());
+                }
+
+                //新增
+                idList_SG.forEach(ids -> {
+                    baseMapper.insertContractRelationJLYZ(SnowFlakeUtil.getId(), contractInfo.getId(), ids);
+                });
+
+            }
+
+            return submitContractRelevantInfo(row, contractInfo);
+
+        }
+
+    }
+
     @Override
     public List<ContractInfo> findContractInProject(String ids) {
         return baseMapper.selectList(Wrappers.<ContractInfo>query().lambda().in(ContractInfo::getPId, Arrays.asList(ids.split(","))));
@@ -406,4 +480,9 @@ public class ContractInfoServiceImpl
         contractInfoVO2.setWbsTreeContractList(list);
         return contractInfoVO2;
     }
+
+    @Override
+    public List<ContractRelationJlyz> searchContractRelationInfo(String contractId) {
+        return baseMapper.selectByContractRelationJlyz(Long.valueOf(contractId));
+    }
 }

+ 36 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -13,14 +13,14 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.WbsTreeContractDTO;
-import org.springblade.manager.entity.WbsTableOwnerRole;
-import org.springblade.manager.entity.WbsTreeContract;
-import org.springblade.manager.entity.WbsTreePrivate;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsInfoMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
+import org.springblade.manager.vo.TreeNodeVO;
 import org.springblade.manager.vo.WbsTreeContractTreeVO;
+import org.springblade.manager.vo.WbsTreeContractTreeVO3;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -285,6 +285,34 @@ public class WbsTreeContractServiceImpl
         return ForestNodeMerger.merge(baseMapper.lazyTreeTwo(contractIdRelation, parentId, contractType, contractId));
     }
 
+
+    public List<WbsTreeContractTreeVO3> lazyTreeThree(String contractIdRelation, Long parentId, String contractId) {
+        //根据当前监理、业主合同段id,获取关联权限信息
+        List<ContractRelationJlyz> listContractRelationInfo = baseMapper.selectContractRelationInfo(Long.valueOf(contractId));
+
+        //获取关联施工合同段Id
+        List<Long> idsSG = listContractRelationInfo.stream().map(ContractRelationJlyz::getContractIdSg).collect(Collectors.toList());
+
+        if (StringUtils.isNotEmpty(contractIdRelation)) {
+            //施工合同段分节点下的子节点
+            return ForestNodeMerger.merge(baseMapper.lazyTreeThree(Collections.singletonList(Long.parseLong(contractIdRelation)), parentId));
+
+        } else {
+            //监理合同下所引用的所有施工合同段根节点
+            List<WbsTreeContractTreeVO3> wbsTreeContractTreeVOS = baseMapper.lazyTreeThree(idsSG, 0L);
+
+            for (WbsTreeContractTreeVO3 wbsTreeContractTreeVO : wbsTreeContractTreeVOS) {
+                if (wbsTreeContractTreeVO.getParentId().equals(0L)) {
+                    //获取施工合同段名
+                    ContractInfo contractInfo = baseMapper.selectContractInfo(String.valueOf(wbsTreeContractTreeVO.getContractId()));
+                    wbsTreeContractTreeVO.setTitle(contractInfo.getContractName());
+                }
+            }
+            return ForestNodeMerger.merge(wbsTreeContractTreeVOS);
+
+        }
+    }
+
     @Override
     public List<WbsTreeContract> searchNodeAllTable(String primaryKeyId, String tableOwner) {
         //获取当前节点
@@ -294,8 +322,12 @@ public class WbsTreeContractServiceImpl
             throw new ServiceException("未查询到数据");
         }
 
+        //获取当前项目合同段的角色roleId
+        SaveUserInfoByProject userInfo = baseMapper.selectRoleInfo(AuthUtil.getUserId(), wbsTreeContract.getContractId(), wbsTreeContract.getProjectId());
+        String roleId = userInfo.getRoleId();
+
         //获取当前用户角色与表单所属方关系信息
-        List<WbsTableOwnerRole> wbsTableOwnerRoleList = baseMapper.selectWbsTableOwnerRoleList(AuthUtil.getUser().getRoleId());
+        List<WbsTableOwnerRole> wbsTableOwnerRoleList = baseMapper.selectWbsTableOwnerRoleList(roleId);
         if (wbsTableOwnerRoleList.size() == 0) {
             throw new ServiceException("当前用户角色未授权,请先分配角色查看元素表相对应的权限");
         }