Browse Source

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

yangyj 2 years ago
parent
commit
86cfeec101
21 changed files with 927 additions and 621 deletions
  1. 7 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java
  2. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StartTaskVO.java
  3. 1 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java
  4. 39 23
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO.java
  5. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  6. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  7. 29 10
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java
  8. 9 5
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java
  9. 102 34
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java
  10. 7 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  11. 9 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  12. 21 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/EVisaConfigClientImpl.java
  13. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  14. 21 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  15. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  16. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  17. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  18. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java
  19. 169 133
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  20. 60 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  21. 434 395
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java

@@ -28,6 +28,13 @@ public interface TaskClient {
     String QUERY_BUSINESS_DATA_TASK = API_PREFIX + "/query-business-data-task";
     String QUERY_APPROVAL_USER = API_PREFIX + "/query-approval-user";
     String QUERY_BUSINESS_TABLE_E_VISA_CONFIG = API_PREFIX + "/query-business-table-e-visa-config";
+    String QUERY_TASK_CONTRACT_ID = API_PREFIX + "/query-task-contract-id";
+
+    /**
+     * 获取当前任务所在的合同段
+     */
+    @PostMapping(QUERY_TASK_CONTRACT_ID)
+    String queryTaskContractId(@RequestParam String taskId);
 
     /**
      * 获取当前任务绑定的表格

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

@@ -62,7 +62,7 @@ public class StartTaskVO {
     }
 
     @Data
-    public class CustomUserTask {
+    public static class CustomUserTask {
         private String userId;
         private String userName;
 

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java

@@ -71,7 +71,7 @@ public class TaskVO extends Task {
 	}
 
 	@Data
-	public class CustomUserTask {
+	public static class CustomUserTask {
 		private String userId;
 		private String userName;
 

+ 39 - 23
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO.java

@@ -7,17 +7,20 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 import org.springblade.core.tool.node.INode;
 import org.springblade.core.tool.node.TreeNode;
+import org.springblade.manager.entity.WbsTreeContract;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @Data
-public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
+public class WbsTreeContractVO extends WbsTreeContract implements INode<WbsTreeContractVO> {
     private static final long serialVersionUID = 1L;
 
     @JsonSerialize(using = ToStringSerializer.class)
     private Long id;
 
+    private Long pKeyId;
+
     @JsonSerialize(using = ToStringSerializer.class)
     private Long parentId;
 
@@ -54,6 +57,8 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
 
     private String importMatchingInfo;
 
+    private String contractId;
+
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Boolean hasChildren;
 
@@ -153,6 +158,38 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
         this.importMatchingInfo = importMatchingInfo;
     }
 
+    public String getContractId() {
+        return contractId;
+    }
+
+    public void setContractId(String contractId) {
+        this.contractId = contractId;
+    }
+
+    @Override
+    public String toString() {
+        return "WbsTreeContractVO{" +
+                "id=" + id +
+                ", contractId=" + contractId +
+                ", parentId=" + parentId +
+                ", children=" + children +
+                ", title='" + title +
+                ", key=" + key +
+                ", value=" + value +
+                ", nodeName='" + nodeName +
+                ", fullName='" + fullName +
+                ", type=" + type +
+                ", wbsType=" + wbsType +
+                ", nodeType=" + nodeType +
+                ", primaryKeyId='" + primaryKeyId +
+                ", partitionCode='" + partitionCode +
+                ", oldId='" + oldId +
+                ", isImportIdentificationNode='" + isImportIdentificationNode +
+                ", importMatchingInfo='" + importMatchingInfo +
+                ", hasChildren=" + hasChildren +
+                '}';
+    }
+
     public boolean equals(final Object o) {
         if (o == this) {
             return true;
@@ -219,26 +256,5 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
         return result;
     }
 
-    @Override
-    public String toString() {
-        return "WbsTreeContractVO{" +
-                "id=" + id +
-                ", parentId=" + parentId +
-                ", children=" + children +
-                ", title='" + title +
-                ", key=" + key +
-                ", value=" + value +
-                ", nodeName='" + nodeName +
-                ", fullName='" + fullName +
-                ", type=" + type +
-                ", wbsType=" + wbsType +
-                ", nodeType=" + nodeType +
-                ", primaryKeyId='" + primaryKeyId +
-                ", partitionCode='" + partitionCode +
-                ", oldId='" + oldId +
-                ", isImportIdentificationNode='" + isImportIdentificationNode +
-                ", importMatchingInfo='" + importMatchingInfo +
-                ", hasChildren=" + hasChildren +
-                '}';
-    }
+
 }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -78,13 +78,13 @@ public class EVisaTaskCheckController {
             //获取这些审批人在当前合同段的权限
             List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, json.getString("contractId"));
             if(userRoleList == null || userRoleList.size() <= 0){
-                return R.data(300, null, "所选审批人均未找到对应权限,请联系服务人员处理");
+                return R.data(300, false, "所选审批人均未找到对应权限,请联系服务人员处理");
             }
 
             //获取电签配置
             List<JSONObject> jsonList = this.queryTableEVisaConfig(json);
             if(jsonList == null){
-                return R.data(300, null, "未找到符合电签配置的相关流程,请联系服务人员处理");
+                return R.data(300, false, "未找到符合电签配置的相关流程,请联系服务人员处理");
             }
 
             //汇总电签配置的审批角色

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -465,6 +465,7 @@ public class InformationWriteQueryController extends BladeController {
 	public R<Boolean> taskOne(@RequestBody StartTaskVO startTaskVO){
 		//此时的ids是当前节点的primaryKeyId但并不是业务数据ID,需要根据ids和classify去查询具体的业务ID
 		InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()));
+
 		//处理上报信息
 		if(businessData != null){
 			//设置业务数据ID

+ 29 - 10
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java

@@ -29,8 +29,35 @@ public class TaskClientImpl implements TaskClient {
 
     private final ITaskParallelService taskParallelService;
 
+    @Override
+    public String queryTaskContractId(String taskId) {
+        //找到任务
+        Task task = this.queryTask(taskId);
+        if(task != null){
+            return task.getContractId();
+        }
+        return null;
+    }
+
     @Override
     public List<JSONObject> queryBusinessTableEVisaConfig(String taskId, String isFinal) {
+        //找到任务
+        Task task = this.queryTask(taskId);
+        if(task != null){
+            //存在任务,根据formDataId查询
+            List<String> privatePrimaryKeyIds = this.informationQueryService.queryBusinessTableData(task.getFormDataId());
+            if(privatePrimaryKeyIds != null && privatePrimaryKeyIds.size() > 0){
+                //查询这些表格的电签配置
+                return this.eVisaConfigClient.queryEVisaConfigByTableIds(privatePrimaryKeyIds, task.getContractId(), isFinal);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取对应任务
+     */
+    private Task queryTask(String taskId){
         //获取任务
         Task task = this.taskService.getById(taskId);
         if(task == null || StringUtils.isEmpty(task.getFormDataId())){
@@ -45,18 +72,10 @@ public class TaskClientImpl implements TaskClient {
                     return null;
                 }
             } else {
-                //未找到任务,直接返回
-                return null;
+                return task;
             }
         }
-        //存在任务,根据formDataId查询
-        List<String> privatePrimaryKeyIds = this.informationQueryService.queryBusinessTableData(task.getFormDataId());
-        if(privatePrimaryKeyIds != null && privatePrimaryKeyIds.size() > 0){
-            //查询这些表格的电签配置
-            return this.eVisaConfigClient.queryEVisaConfigByTableIds(privatePrimaryKeyIds, task.getContractId(), isFinal);
-        }
-
-        return null;
+        return task;
     }
 
     @Override

+ 9 - 5
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -79,8 +79,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final ContractClient contractClient;
 
-    private final Integer FOREACH_MAX = 10;
-
     @Override
     public List<TaskParallel> queryApprovalUser(String formDataIds) {
         //返回结果
@@ -130,7 +128,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                  }
              } else {
                 try{
-                    if(foreachNumber < FOREACH_MAX){
+                    if(foreachNumber < 10){
                         //如果存在锁,则等待解锁
                         TimeUnit.MILLISECONDS.sleep(5);
                         foreachNumber ++;
@@ -327,8 +325,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     if(eVisaStatus.contains("@@@@")){
                         finalPdfUrl = eVisaStatus.split("@@@@")[1];
                     }
-                    //执行合同章,返回的是盖有合同章的PDF路径
-//                    finalPdfUrl = this.eVisaClient.eVisaContractSeal(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class), finalPdfUrl);
+                    //todo ===================== 执行合同章
+                    try{
+                        //执行合同章,返回的是盖有合同章的PDF路径
+                        finalPdfUrl = this.eVisaClient.eVisaContractSeal(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class), finalPdfUrl);
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                    //todo ===================== 执行合同章
 
                     //根据主表的业务ID(processInstanceId)获取主流程的taskId
                     String masterTaskId = this.newFlowClient.queryTaskIdByProcessInstanceId(masterTask.getProcessInstanceId());

+ 102 - 34
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -198,6 +198,83 @@ public class EVisaServiceImpl implements EVisaService {
 
     @Override
     public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
+        //获取任务对应表格的电签配置
+        List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "true");
+        if(eVisaConfigList == null || eVisaConfigList.size() == 0){
+            //没有电签配置,默认当前任务为不签字审批,返回成功
+            return finalPdfUrl;
+        }
+
+        String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
+        int batch = 2;
+        if(CommonUtil.checkIsBigDecimal(sysBatch)){
+            batch = new Integer(sysBatch);
+        }
+
+        //确定合同段并获取合同章
+        List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId("", this.taskClient.queryTaskContractId(task.getParallelProcessInstanceId()));
+        if(userPfxList == null || userPfxList.size() <= 0){
+            //没有签章,不执行电签
+            return finalPdfUrl;
+        }
+
+        //上锁
+        if(DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)){
+            try{
+                //准备签章策略
+                List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
+                for(JSONObject eVisaConfig : eVisaConfigList){
+                    //找到类型与之对应的合同章
+                    Iterator<SignPfxFile> iterator = userPfxList.iterator();
+                    while (iterator.hasNext()){
+                        SignPfxFile next = iterator.next();
+                        if(eVisaConfig.getString("type").equals(next.getPfxType())){
+                            //设置签章策略
+                            SealStrategyVO vo = new SealStrategyVO();
+                            vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + next.getCertificatePassword());
+                            vo.setSealPassword(next.getCertificatePassword());
+                            vo.setSealPerson(next.getCertificateUserName() + System.currentTimeMillis());
+                            //设置签字文件
+                            vo.setImageUrl(next.getSignatureFileUrl());
+                            vo.setSealType("3");
+
+                            vo.setCompanySeal(true);
+
+                            vo.setKeyword(eVisaConfig.getString("KEY"));
+                            vo.setOffSetX(eVisaConfig.getString("X"));
+                            vo.setOffSetY(eVisaConfig.getString("Y"));
+
+                            sealStrategyVOS.add(vo);
+                            iterator.remove();
+                            break;
+                        }
+                    }
+                }
+
+                SealPdfVO pdfVO = new SealPdfVO();
+                pdfVO.setStrategyVoList(sealStrategyVOS);
+
+                //获取字节
+                byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(finalPdfUrl));
+                //执行电签
+                Object[] result = this.signPdf(pdfVO, fileByte);
+                if(result != null){
+                    if(result[0] != null){
+                        MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[])result[0])));
+                        //重新上传
+                        BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
+                        if(bladeFile != null){
+                            finalPdfUrl = bladeFile.getLink();
+                        }
+                    }
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+        //释放锁
+        DistributedRedisLock.release(AuthUtil.getUserId().toString());
+
         return finalPdfUrl;
     }
 
@@ -226,7 +303,7 @@ public class EVisaServiceImpl implements EVisaService {
             return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
         }
 
-        //首先获取当前用户的证书信息
+        //获取当前用户的证书信息
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
         if(userPfxList == null || userPfxList.size() <= 0){
             //没有签章,不执行电签
@@ -241,32 +318,23 @@ public class EVisaServiceImpl implements EVisaService {
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
                 //这里的文件只会是一张拼接好的PDF
                 for(TaskApprovalVO.ApprovalFile file : files){
-                    //获取PDF文件
-//                    PDDocument document = PDDocument.load(CommonUtil.getOSSInputStream(file.getFileUrl()));
-//                    int page = document.getPages().getCount();
-
                     //准备签章策略
                     List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
-//                    for(int i = 0; i <page; i ++){
-                        for(JSONObject eVisaConfig : eVisaConfigList){
-                            //设置签章策略
-                            SealStrategyVO vo = new SealStrategyVO();
-                            vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + AuthUtil.getUserId());
-                            vo.setSealPassword(AuthUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
-                            vo.setSealPerson(AuthUtil.getNickName());
-                            //设置签字文件
-                            vo.setImageUrl(userPfxList.get(0).getSignatureFileUrl());
-                            vo.setSealType("3");
-
-                            vo.setKeyword(eVisaConfig.getString("KEY"));
-                            vo.setLx(eVisaConfig.getString("X"));
-                            vo.setLy(eVisaConfig.getString("Y"));
-
-                            //设置页
-//                            vo.setPage(( i + 1) + "");
-                            sealStrategyVOS.add(vo);
-                        }
-//                    }
+                    for (JSONObject eVisaConfig : eVisaConfigList) {
+                        //设置签章策略
+                        SealStrategyVO vo = new SealStrategyVO();
+                        vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + AuthUtil.getUserId());
+                        vo.setSealPassword(AuthUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                        vo.setSealPerson(AuthUtil.getNickName());
+                        //设置签字文件
+                        vo.setImageUrl(userPfxList.get(0).getSignatureFileUrl());
+                        vo.setSealType("3");
+
+                        vo.setKeyword(eVisaConfig.getString("KEY"));
+                        vo.setOffSetX(eVisaConfig.getString("X"));
+                        vo.setOffSetY(eVisaConfig.getString("Y"));
+                        sealStrategyVOS.add(vo);
+                    }
                     SealPdfVO pdfVO = new SealPdfVO();
                     pdfVO.setStrategyVoList(sealStrategyVOS);
 
@@ -426,7 +494,6 @@ public class EVisaServiceImpl implements EVisaService {
                 String visible = "1";
                 sealStrategy.setVisible(visible);
 
-                byte[] imageData = null;
                 if(!"authentication".equals(vo.getImageUrl())){
                     String imageUrl = vo.getImageUrl();
                     if(StringUtils.isEmpty(imageUrl)){
@@ -434,7 +501,7 @@ public class EVisaServiceImpl implements EVisaService {
                         return null;
                     }
                     //获取字节
-                    imageData = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(imageUrl));
+                    byte[] imageData = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(imageUrl));
                     //对图片进行扣白底
                     imageData = ImageUtil.transferAlpha(imageData);
 
@@ -443,21 +510,22 @@ public class EVisaServiceImpl implements EVisaService {
                         imageData = ImageUtil.resizeImage(imageData,540,540);
                     }else {
                         imageData = ImageUtil.resizeImage(imageData,480,132);
+//                        imageData = ImageUtil.resizeImage(imageData,540,540);
                     }
 
                     //图片dpi设置
                     imageData = this.handleDpi(imageData);
-                }
-                if (imageData != null) {
-                    //图片进行Base64编码/
-                    String imageDataString =  new String(Base64.encode(imageData), StandardCharsets.UTF_8);
-                    sealStrategy.setSealImage(imageDataString);
-                }
 
-                if("authentication".equals(vo.getImageUrl())){
+                    if (imageData != null) {
+                        //图片进行Base64编码/
+                        String imageDataString =  new String(Base64.encode(imageData), StandardCharsets.UTF_8);
+                        sealStrategy.setSealImage(imageDataString);
+                    }
+                } else {
                     //工程文件认证的 是要用透明图片
                     sealStrategy.setSealImage(EVisaConstant.base64String);
                 }
+
                 sealStrategy.setSealMiscInfo(vo.getSealPerson(), vo.getSealLocation(),  vo.getSealReason());
 
                 //关键字签章

+ 7 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -50,19 +50,20 @@ public class WbsTreeContractController extends BladeController {
 
     @PostMapping("/import-wbs-contract")
     @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "导入合同段wbs划分", notes = "传入file、contractId、type、isSplicingNumber")
+    @ApiOperation(value = "导入合同段wbs划分", notes = "传入file、primaryKeyId、isSplicingNumber")
     @ApiImplicitParams(value = {
             @ApiImplicitParam(name = "file", value = "excel模板", required = true),
-            @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true),
-            @ApiImplicitParam(name = "type", value = "工程类别", required = true),
+            @ApiImplicitParam(name = "primaryKeyId", value = "节点primaryKeyId", required = true),
             @ApiImplicitParam(name = "isSplicingNumber", value = "是否拼接划分编号", required = true)
     })
-    public R<WbsTreeContractVO4> importWbsContract(@RequestPart("file") MultipartFile file, @RequestParam("contractId") String contractId, @RequestParam("type") Integer type, @RequestParam("isSplicingNumber") Integer isSplicingNumber) throws IOException {
-        WbsTreeContractVO4 data = iWbsTreeContractService.importWbsContract(file, contractId, type, isSplicingNumber);
+    public R<WbsTreeContractVO4> importWbsContract2(@RequestPart("file") MultipartFile file,
+                                                    @RequestParam("primaryKeyId") String primaryKeyId,
+                                                    @RequestParam("isSplicingNumber") Integer isSplicingNumber) throws IOException {
+        WbsTreeContractVO4 data = iWbsTreeContractService.importWbsContract(file, primaryKeyId, isSplicingNumber);
         if (data != null) {
             return R.data(data);
         }
-        return R.fail(400, "从excel模板中未能找到对应的工程类别数据,解析失败,请重试!");
+        return R.fail(400, "导入失败");
     }
 
     @PostMapping("/import-relation")

+ 9 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -399,5 +399,14 @@ public class WbsTreePrivateController extends BladeController {
         return R.status(wbsTreePrivateService.syncNodeParam(projectId));
     }
 
+    /**
+     * 同步项目下节点的元素表
+     */
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "同步项目下节点下的元素表", notes = "传入节点primaryKeyId")
+    @RequestMapping(value = "/sync-node-table", method = RequestMethod.POST)
+    public R syncNodeTable(@RequestParam String primaryKeyId) {
+        return R.status(wbsTreePrivateService.syncNodeTable(primaryKeyId));
+    }
 
 }

+ 21 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/EVisaConfigClientImpl.java

@@ -40,26 +40,37 @@ public class EVisaConfigClientImpl implements EVisaConfigClient {
     public List<JSONObject> queryEVisaConfigByTableIds(List<String> tableIds, String contractId, String isFinal) {
         List<JSONObject> jsonResult = new ArrayList<>();
 
-        //需要获取这条任务对应合同段下当前用户的岗位
-        List<SaveUserInfoByProjectDTO> contractUserList = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getUserId, AuthUtil.getUserId()));
+        List<TextdictInfo> configResult;
+
+        if(Boolean.parseBoolean(isFinal)){
+            //最后,属于合同章
+            configResult = this.textdictInfoService.list(Wrappers.<TextdictInfo>lambdaQuery().in(TextdictInfo::getTabId, tableIds).eq(TextdictInfo::getType, 6));
 
-        List<String> userRoleList;
-        if(contractUserList != null && contractUserList.size() > 0){
-            userRoleList = contractUserList.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList());
         } else {
-            userRoleList = Arrays.asList(AuthUtil.getUser().getRoleId().split(","));
-        }
+            //需要获取这条任务对应合同段下当前用户的岗位
+            List<SaveUserInfoByProjectDTO> contractUserList = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getUserId, AuthUtil.getUserId()));
 
-        List<TextdictInfo> configResult = this.textdictInfoService.list(Wrappers.<TextdictInfo>lambdaQuery().in(TextdictInfo::getTabId, tableIds).in(TextdictInfo::getSigRoleId, userRoleList));
+            List<String> userRoleList;
+            if(contractUserList != null && contractUserList.size() > 0){
+                userRoleList = contractUserList.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList());
+            } else {
+                userRoleList = Arrays.asList(AuthUtil.getUser().getRoleId().split(","));
+            }
+
+            configResult = this.textdictInfoService.list(Wrappers.<TextdictInfo>lambdaQuery().in(TextdictInfo::getTabId, tableIds).in(TextdictInfo::getSigRoleId, userRoleList));
+        }
 
         if(configResult != null && configResult.size() > 0){
             configResult.forEach(config -> {
                 JSONObject jsonObject = new JSONObject();
                 //标识
-                jsonObject.put("KEY", config.getId());
+                jsonObject.put("KEY", Boolean.parseBoolean(isFinal) ? config.getColName() : config.getId());
+                if(Boolean.parseBoolean(isFinal)){
+                    jsonObject.put("type", config.getSigRoleId());
+                }
                 //X/Y轴偏移量
                 jsonObject.put("X", config.getPyzbx());
-                jsonObject.put("Y", config.getColKey());
+                jsonObject.put("Y", config.getPyzby());
 
                 jsonResult.add(jsonObject);
             });

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java

@@ -61,6 +61,9 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
                                   @Param("wbsType") Integer wbsType,
                                   @Param("parentId") String parentId);
 
+    List<WbsTreeContractVO> tree4(@Param("contractId") String contractId,
+                                  @Param("parentId") String parentId);
+
     List<WbsTreeContractVO3> selectLists(@Param("contractInfo") ContractInfo contractInfo, @Param("contractType") Integer contractType);
 
     void insertContractRelationJLYZ(Long id, Long contractId, String contractIdSG);

+ 21 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -79,6 +79,7 @@
         <result column="old_id" property="oldId"/>
         <result column="nodeName" property="nodeName"/>
         <result column="fullName" property="fullName"/>
+        <result column="contractId" property="contractId"/>
     </resultMap>
 
     <resultMap id="resultMap2" type="org.springblade.manager.vo.ContractInfoVO">
@@ -375,5 +376,25 @@
         SELECT id FROM m_contract_info WHERE p_id = #{project_id} AND contract_type = 1  AND is_deleted = 0 AND status = 1
     </select>
 
+    <select id="tree4" resultType="org.springblade.manager.vo.WbsTreeContractVO">
+        SELECT
+        d.*,
+        /*IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,*/
+        (select CASE WHEN count(1) > 0 THEN 1 ELSE 0 END from m_wbs_tree_contract c where c.parent_id = d.id and
+        c.contract_id = d.contract_id and c.is_deleted = 0 ) AS "has_children"
+        FROM m_wbs_tree_contract d
+        WHERE
+        d.is_deleted = 0
+        AND d.status = 1
+        AND d.type = 1
+        <if test="contractId!=null and contractId!=''">
+            AND contract_id = #{contractId}
+        </if>
+        <if test="parentId != null and parentId != ''">
+            AND (FIND_IN_SET(#{parentId},ancestors) OR id = #{parentId})
+        </if>
+        ORDER BY d.create_time,d.sort
+    </select>
+
 
 </mapper>

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java

@@ -10,6 +10,8 @@ import java.util.List;
 
 public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
 
+    int deleteByIds(@Param("ids") List<Long> ids);
+
     List<WbsTreeContract> selectQueryCurrentNodeByAncestors(@Param("ids") List<String> ids, @Param("contractId") String contractId);
 
     List<WbsTreeContract> selectQueryValueLikeNodeName(@Param("queryValue") String queryValue, @Param("contractId") String contractId);

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -139,6 +139,13 @@
           AND status = 1
     </update>
 
+    <delete id="deleteByIds">
+        DELETE FROM m_wbs_tree_contract WHERE p_key_id IN
+        <foreach item="ids" collection="ids" open="(" close=")" separator=",">
+            #{ids}
+        </foreach>
+    </delete>
+
     <select id="selectAll" resultMap="resultMap2">
         SELECT wtc.id,
                wtc.wbs_id,

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

@@ -40,7 +40,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     List<WbsTreeContract> updateAllNodeTabById(WbsTreePrivate aPrivate);
 
-    WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type, Integer isSplicingNumber) throws IOException;
+    WbsTreeContractVO4 importWbsContract(MultipartFile file, String primaryKeyId, Integer isSplicingNumber) throws IOException;
 
     boolean submitRelation(WbsTreeContractDTO2 wbsTreeContractDTO2);
 

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreePrivateService.java

@@ -47,4 +47,6 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
 
     boolean syncNodeParam(String projectId);
 
+    boolean syncNodeTable(String primaryKeyId);
+
 }

+ 169 - 133
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -2,6 +2,7 @@ package org.springblade.manager.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
@@ -13,6 +14,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.WbsTreeContractDTO;
@@ -36,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.IOException;
+import java.sql.Timestamp;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -154,8 +157,11 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         }
                     });
                 });
-                this.saveBatch(wbsTreeContracts, 10000);
+
+                //同步新增
+                this.insertBatch(wbsTreeContracts, 1000);
             }
+
         } else {
 
             //删除
@@ -240,7 +246,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 });
 
                 //新增合同段节点、表
-                insertBatch(wbsTreeContractList, 1000);
+                this.insertBatch(wbsTreeContractList, 1000);
 
                 //新增施工台账
                 constructionLedgerFeign.initConstructionLedger(constructionLedgerList);
@@ -365,35 +371,6 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return baseMapper.updateAllNodeTabById(aPrivate);
     }
 
-    @Override
-    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type, Integer isSplicingNumber) throws IOException {
-        File file = WbsExcelUtil.convert(excelFile);
-        String canonicalPath = file.getCanonicalPath();
-        try {
-            if (StringUtils.isNotEmpty(contractId) && type != null && isSplicingNumber != null) {
-                //解析excel
-                WbsExcelUtil excelUtil = new WbsExcelUtil();
-                ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract(canonicalPath);
-                //获取对应工程类别树信息
-                ArrayList<Map<String, String>> resultNow = excelUtil.getDataListByType(result, type);
-                if (resultNow.size() <= 0) {
-                    throw new ServiceException("请选择一个工程类别进行匹配导入");
-                }
-                //匹配对应工程类别修改对应合同段节点名称
-                return this.updateContractNodeNames(resultNow, contractId, isSplicingNumber);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            File file2 = new File(canonicalPath);
-            if (file2.isFile() && file2.exists()) {
-                file2.delete();
-                System.gc();
-            }
-        }
-        return null;
-    }
-
     @Override
     public boolean submitRelation(WbsTreeContractDTO2 wbsTreeContractDTO2) {
         if (StringUtils.isEmpty(wbsTreeContractDTO2.getPKeyIdOld())) {
@@ -441,9 +418,63 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return true;
     }
 
-    private WbsTreeContractVO4 updateContractNodeNames(ArrayList<Map<String, String>> resultNow, String contractId, Integer isSplicingNumber) {
-        //获取当前合同段树
-        List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree2(null, null, contractId, null, null);
+    private WbsTreeContract buildFailData(Integer nodeType, String nodeName, String partitionCode) {
+        WbsTreeContract wbsTreeContract = new WbsTreeContract();
+        Long id = SnowFlakeUtil.getId();
+        wbsTreeContract.setPKeyId(id);
+        wbsTreeContract.setId(id);
+        wbsTreeContract.setNodeName(nodeName);
+        wbsTreeContract.setFullName(nodeName);
+        wbsTreeContract.setImportMatchingInfo(nodeName);
+        wbsTreeContract.setPartitionCode(partitionCode);
+        wbsTreeContract.setType(1);
+        wbsTreeContract.setNodeType(nodeType);
+        wbsTreeContract.setIsImportIdentificationNode(0);  //识别失败
+        return wbsTreeContract;
+    }
+
+    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String wbsId) {
+        String[] ids = wbsTreeIds.split(",");
+        List<WbsTreeContract> list = new ArrayList<>();
+        for (String id : ids) {
+            WbsTreeContract contract = baseMapper.selectByCondition(id, projectId, contractId, wbsId);
+            list.add(contract);
+        }
+        return list;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String primaryKeyId, Integer isSplicingNumber) throws IOException {
+        File file = WbsExcelUtil.convert(excelFile);
+        String canonicalPath = file.getCanonicalPath();
+        try {
+            if (StringUtils.isNotEmpty(primaryKeyId) && isSplicingNumber != null) {
+                //解析excel
+                WbsExcelUtil excelUtil = new WbsExcelUtil();
+                ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract(canonicalPath);
+                //匹配对应工程类别修改对应合同段节点名称
+                return this.importSubmitWbsContractNodes(result, primaryKeyId, isSplicingNumber);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            File file2 = new File(canonicalPath);
+            if (file2.isFile() && file2.exists()) {
+                file2.delete();
+                System.gc();
+            }
+        }
+        return null;
+    }
+
+    private WbsTreeContractVO4 importSubmitWbsContractNodes(ArrayList<Map<String, String>> result, String primaryKeyId, Integer isSplicingNumber) {
+        //获取当前根节点
+        WbsTreeContract wbsTreeContractRoot = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                .eq(WbsTreeContract::getPKeyId, primaryKeyId)
+        );
+        //获取当前节点下所有子节点
+        List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree4(wbsTreeContractRoot.getContractId(), String.valueOf(wbsTreeContractRoot.getId()));
         if (wbsTreeContractVOS.size() <= 0) {
             throw new ServiceException("未查询到当前合同段的wbs树,请先分配该合同的合同段wsb树");
         }
@@ -451,7 +482,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //构造resultList
         List<Map<Integer, String>> resultList = new ArrayList<>();
         String str = "\\s*|\r|\n|\t";
-        for (Map<String, String> map : resultNow) {
+        for (Map<String, String> map : result) {
             Map<Integer, String> maps = new HashMap<>();
             map.forEach((k1, value1) -> {
                 String v1 = value1.replaceAll(str, "");
@@ -530,12 +561,11 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             resultList.add(maps);
         }
 
+        //解析resultList
         List<WbsTreeContractVO> successData = new ArrayList<>();
         List<WbsTreeContractVO> failData = new ArrayList<>();
-
-        //解析resultList
-        for (Map<Integer, String> map : resultList) {
-            for (Map.Entry<Integer, String> entry : map.entrySet()) {
+        for (Map<Integer, String> map : resultList) {//行
+            for (Map.Entry<Integer, String> entry : map.entrySet()) {//列
                 Integer k = entry.getKey();
                 String v = entry.getValue();
                 if (StringUtil.isEmpty(v.replaceAll(":::", ""))) {
@@ -546,55 +576,80 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 String partitionCode = split[1];
 
                 int count = 0;
-                if (successData.size() > 0) {   //todo 此处未解决类似名称问题
-                    for (WbsTreeContractVO successDatum : successData) {
-                        //同类型、名称相似、且划分编码不一样
-                        if (successDatum.getNodeType().equals(k)
-                                && nodeName.contains(successDatum.getImportMatchingInfo())
-                                && !successDatum.getPartitionCode().equals(partitionCode)) {
-                            //构造类似名称节点
-                            Long id = SnowFlakeUtil.getId();
-                            successDatum.setPrimaryKeyId(String.valueOf(id));
-                            successDatum.setId(id);
-                            successDatum.setFullName(nodeName);
-                            successDatum.setPartitionCode(partitionCode);
-                            successDatum.setIsImportIdentificationNode(1); //识别成功
-                            WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(successDatum, WbsTreeContract.class);
-                            assert wbsTreeContract != null;
-                            wbsTreeContract.setPKeyId(id);
-                            wbsTreeContract.setId(id);
-                            baseMapper.insert(wbsTreeContract);
-                            successData.add(successDatum);
-                            count = 1;
-                            break;
-                        }
-                    }
-                }
-                if (count == 1) {
-                    continue;
-                }
-
                 for (WbsTreeContractVO nodeOld : wbsTreeContractVOS) {
                     if (nodeOld.getNodeType().equals(k)) {
                         String nodeNameOld = nodeOld.getNodeName();
                         String importMatchingInfoOld = nodeOld.getImportMatchingInfo();
+
+                        //不存在类似名称节点,修改
                         List<WbsTreeContractVO> collect = successData.stream().filter(f -> f.getFullName().contains(nodeName) && f.getPartitionCode().equals(partitionCode)).collect(Collectors.toList());
-                        //匹配名称、别名
                         if (collect.size() == 0) {
                             if (nodeName.contains(nodeNameOld) || (StringUtils.isNotEmpty(importMatchingInfoOld) && nodeName.contains(importMatchingInfoOld))) {
+                                WbsTreeContractVO wbsTreeContractVO2 = BeanUtil.copyProperties(nodeOld, WbsTreeContractVO.class);
+                                assert wbsTreeContractVO2 != null;
                                 //匹配成功 修改名称、划分编号 不修改原始节点id,只修改别名id
-                                nodeOld.setFullName(nodeName);
-                                nodeOld.setPartitionCode(partitionCode);
-                                nodeOld.setIsImportIdentificationNode(1); //识别成功
-                                nodeOld.setImportMatchingInfo(importMatchingInfoOld);
-                                successData.add(nodeOld);
-                                count = 2;
+                                wbsTreeContractVO2.setFullName(nodeName);
+                                wbsTreeContractVO2.setPartitionCode(partitionCode);
+                                wbsTreeContractVO2.setIsImportIdentificationNode(1); //识别成功
+                                wbsTreeContractVO2.setImportMatchingInfo(importMatchingInfoOld);
+                                //判断是否存在pKeyId一样
+                                boolean b = false;
+                                for (WbsTreeContractVO successDatum : successData) {
+                                    if (successDatum.getPKeyId().equals(wbsTreeContractVO2.getPKeyId())) {
+                                        b = true;
+                                        break;
+                                    }
+                                }
+                                if (!b) {
+                                    LambdaUpdateWrapper<WbsTreeContract> updateWrapper = new LambdaUpdateWrapper<>();
+                                    updateWrapper.eq(WbsTreeContract::getPKeyId, wbsTreeContractVO2.getPKeyId());
+                                    updateWrapper.set(WbsTreeContract::getFullName, wbsTreeContractVO2.getFullName());
+                                    updateWrapper.set(WbsTreeContract::getPartitionCode, wbsTreeContractVO2.getPartitionCode());
+                                    updateWrapper.set(WbsTreeContract::getIsImportIdentificationNode, wbsTreeContractVO2.getIsImportIdentificationNode());
+                                    updateWrapper.set(WbsTreeContract::getImportMatchingInfo, wbsTreeContractVO2.getImportMatchingInfo());
+                                    baseMapper.update(null, updateWrapper);
+                                    successData.add(wbsTreeContractVO2);
+                                    //nodeOld.getFullName()重新赋值用于下方条件判断
+                                    nodeOld.setFullName(wbsTreeContractVO2.getFullName());
+                                    count = 1;
+                                    break;
+                                }
+                            }
+                        }
+
+                        //存在类似名称节点,新增
+                        List<WbsTreeContractVO> collect1 = successData.stream().filter(f ->
+                                (DiffListUtil.getSimilarityRatio(nodeName, f.getFullName()) > 0 && DiffListUtil.getSimilarityRatio(nodeName, f.getFullName()) != 100)
+                                        && !f.getPartitionCode().equals(partitionCode)).collect(Collectors.toList());
+                        if (collect1.size() > 0) {
+                            if (nodeName.equals(nodeOld.getFullName())) {
+                                count = 1;
                                 break;
+                            } else {
+                                if ((nodeName.contains(nodeOld.getFullName()) && DiffListUtil.getSimilarityRatio(nodeName, nodeOld.getFullName()) != 100)
+                                        && !nodeOld.getPartitionCode().equals(partitionCode)) {
+                                    //构造类似名称节点
+                                    WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(nodeOld, WbsTreeContract.class);
+                                    assert wbsTreeContract != null;
+                                    Long id = SnowFlakeUtil.getId();
+                                    wbsTreeContract.setPKeyId(id);
+                                    wbsTreeContract.setId(id);
+                                    wbsTreeContract.setNodeName(nodeOld.getNodeName() + "_copy");
+                                    wbsTreeContract.setFullName(nodeName);
+                                    wbsTreeContract.setPartitionCode(partitionCode);
+                                    wbsTreeContract.setIsImportIdentificationNode(1);
+
+                                    baseMapper.insert(wbsTreeContract);
+                                    WbsTreeContractVO wbsTreeContractVO = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContractVO.class);
+                                    successData.add(wbsTreeContractVO);
+                                    count = 1;
+                                    break;
+                                }
                             }
                         }
                     }
                 }
-                if (count == 2) {
+                if (count == 1) {
                     continue;
                 }
 
@@ -612,31 +667,33 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
         WbsTreeContractVO4 res = new WbsTreeContractVO4();
         try {
-            //修改节点信息
-            List<WbsTreeContract> wbsTreeContracts = BeanUtil.copyProperties(successData, WbsTreeContract.class);
-            if (wbsTreeContracts.size() > 0) {
-                this.saveOrUpdateBatch(wbsTreeContracts, 1000);
-            }
+            //重复导入时删除多余节点信息
+            List<WbsTreeContract> wbsTreeContractDel = baseMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()));
+            List<WbsTreeContract> collect = wbsTreeContractDel.stream().filter(f -> f.getNodeName().contains(("_copy_copy")) && f.getId().equals(f.getPKeyId())).collect(Collectors.toList());
+            List<Long> delIds = collect.stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+            baseMapper.deleteByIds(delIds);
 
             //构建成功树
-            ArrayList<WbsTreeContractVO> collect = successData.stream().collect(
+            List<WbsTreeContractVO> collect1 = successData.stream().collect(
                     Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(
-                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new)
-            );
-            List<WbsTreeContractVO> successWbsTreeContractVOS = this.buildWbsTreeByStream(collect);
-            res.setMatchedData(successWbsTreeContractVOS);
+                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new))
+                    .stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
+
+            List<WbsTreeContractVO> successWbsTreeContractVOS = this.buildWbsTreeByStream(collect1, wbsTreeContractRoot.getParentId());
+            List<WbsTreeContractVO> collect2 = successWbsTreeContractVOS.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
+            res.setMatchedData(collect2);
 
-            List<WbsTreeContractVO> successDataCopyToFail = WbsExcelBatchUtil.deepCopy(collect);
+            List<WbsTreeContractVO> successDataCopyToFail = WbsExcelBatchUtil.deepCopy(collect1);
             //构建失败树
-            List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(resultList, failData, successDataCopyToFail);
-            List<WbsTreeContractVO> collect1 = failDataTree.stream().collect(
+            List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(resultList, failData, successDataCopyToFail, wbsTreeContractRoot.getParentId());
+            List<WbsTreeContractVO> collect3 = failDataTree.stream().collect(
                     Collectors.collectingAndThen(
                             Collectors.toCollection(() -> new TreeSet<>(
-                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new)
-            );
-            List<WbsTreeContractVO> failWbsTreeContractVOS = this.buildWbsTreeByStream(collect1);
-            res.setUnmatchedData(failWbsTreeContractVOS);
+                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new));
+            List<WbsTreeContractVO> failWbsTreeContractVOS = this.buildWbsTreeByStream(collect3, wbsTreeContractRoot.getParentId());
+            List<WbsTreeContractVO> collect4 = failWbsTreeContractVOS.stream().sorted(Comparator.comparing(WbsTreeContract::getCreateTime, Comparator.reverseOrder())).collect(Collectors.toList());
+            res.setUnmatchedData(collect4);
 
             return res;
         } catch (IOException | ClassNotFoundException e) {
@@ -645,13 +702,16 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return res;
     }
 
-    private List<WbsTreeContractVO> buildFailDataTree(List<Map<Integer, String>> resultList, List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData) {
+    private List<WbsTreeContractVO> buildFailDataTree(List<Map<Integer, String>> resultList, List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData, Long id) {
+        if (id == null) {
+            id = 0L;
+        }
         List<WbsTreeContractVO> resultData = new ArrayList<>();
         for (Map<Integer, String> map : resultList) {//行
-            Long nodeParentIdLv1 = 0L;
-            Long nodeParentIdLv2 = 0L;
-            Long nodeParentIdLv3 = 0L;
-            Long nodeParentIdLv4 = 0L;
+            Long nodeParentIdLv1 = id;
+            Long nodeParentIdLv2 = id;
+            Long nodeParentIdLv3 = id;
+            Long nodeParentIdLv4 = id;
             //当前行,失败节点
             List<WbsTreeContractVO> failList = new ArrayList<>();
             //当前行,成功节点
@@ -715,24 +775,24 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             if (failList.size() > 0) {
                 for (WbsTreeContractVO failDatum : failList) {
                     if (failDatum.getNodeType() == 1) {
-                        failDatum.setParentId(0L);
+                        failDatum.setParentId(id);
 
                     } else if (failDatum.getNodeType() == 2) {
                         failDatum.setParentId(nodeParentIdLv1);
                         nodeParentIdLv2 = failDatum.getId();
 
                     } else if (failDatum.getNodeType() == 3) {
-                        if (nodeParentIdLv2 == 0L) {
-                            failDatum.setParentId(0L);
+                        if (nodeParentIdLv2.equals(id)) {
+                            failDatum.setParentId(id);
                         } else {
                             failDatum.setParentId(nodeParentIdLv2);
                             nodeParentIdLv3 = failDatum.getId();
                         }
 
                     } else if (failDatum.getNodeType() == 4) {
-                        if (nodeParentIdLv3 == 0L) {
-                            if (nodeParentIdLv2 == 0L) {
-                                failDatum.setParentId(0L);
+                        if (nodeParentIdLv3.equals(id)) {
+                            if (nodeParentIdLv2.equals(id)) {
+                                failDatum.setParentId(id);
                             } else {
                                 failDatum.setParentId(nodeParentIdLv2);
                                 nodeParentIdLv4 = failDatum.getId();
@@ -743,10 +803,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         }
 
                     } else if (failDatum.getNodeType() == 5) {
-                        if (nodeParentIdLv4 == 0L) {
-                            if (nodeParentIdLv3 == 0L) {
-                                if (nodeParentIdLv2 == 0L) {
-                                    failDatum.setParentId(0L);
+                        if (nodeParentIdLv4.equals(id)) {
+                            if (nodeParentIdLv3.equals(id)) {
+                                if (nodeParentIdLv2.equals(id)) {
+                                    failDatum.setParentId(id);
                                 } else {
                                     failDatum.setParentId(nodeParentIdLv2);
                                 }
@@ -770,23 +830,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return resultData;
     }
 
-    private WbsTreeContract buildFailData(Integer nodeType, String nodeName, String partitionCode) {
-        WbsTreeContract wbsTreeContract = new WbsTreeContract();
-        Long id = SnowFlakeUtil.getId();
-        wbsTreeContract.setPKeyId(id);
-        wbsTreeContract.setId(id);
-        wbsTreeContract.setNodeName(nodeName);
-        wbsTreeContract.setFullName(nodeName);
-        wbsTreeContract.setImportMatchingInfo(nodeName);
-        wbsTreeContract.setPartitionCode(partitionCode);
-        wbsTreeContract.setType(1);
-        wbsTreeContract.setNodeType(nodeType);
-        wbsTreeContract.setIsImportIdentificationNode(0);  //识别失败
-        return wbsTreeContract;
-    }
-
-    private List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s) {
-        List<WbsTreeContractVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+    private List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s, Long id) {
+        List<WbsTreeContractVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId().equals(id)).collect(Collectors.toList());
         Map<Long, List<WbsTreeContractVO>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreeContractVO::getParentId));
         this.recursionFnTree(list, map);
         return list;
@@ -803,14 +848,5 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         }
     }
 
-    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String wbsId) {
-        String[] ids = wbsTreeIds.split(",");
-        List<WbsTreeContract> list = new ArrayList<>();
-        for (String id : ids) {
-            WbsTreeContract contract = baseMapper.selectByCondition(id, projectId, contractId, wbsId);
-            list.add(contract);
-        }
-        return list;
-    }
 
 }

+ 60 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -39,6 +39,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private final WbsInfoMapper wbsInfoMapper;
     private final WbsParamServiceImpl wbsParamServiceImpl;
     private final WbsParamMapper wbsParamMapper;
+    private final ProjectInfoMapper projectInfoMapper;
 
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
@@ -540,4 +541,63 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return false;
     }
 
+    @Override
+    public boolean syncNodeTable(String primaryKeyId) {
+        if (StringUtils.isNotEmpty(primaryKeyId)) {
+            //获取当前节点对应节点信息
+            WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
+            //获取项目信息
+            ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>query().lambda().eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
+            if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
+                /*-------------------------------------公有引用同步--------------------------------------------*/
+                //获取当前节点对应的公有引用树下的元素表
+                WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
+                        .eq(WbsTree::getId, wbsTreePrivate.getId())
+                );
+                List<WbsTree> wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                        .eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                        .eq(WbsTree::getType, 2)
+                        .eq(WbsTree::getStatus, 1)
+                        .eq(WbsTree::getParentId, wbsTree.getId())
+                        .like(WbsTree::getAncestors, wbsTree.getId())
+                );
+
+                //获取当前项目树下的元素表
+                List<WbsTreePrivate> wbsTreePrivatesProjectTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                        .eq(WbsTreePrivate::getType, 2)
+                        .eq(WbsTreePrivate::getStatus, 1)
+                        .eq(WbsTreePrivate::getParentId, wbsTreePrivate.getId())
+                        .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
+                );
+
+                //获取新增的元素表addPublicTable
+                List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+                        !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
+                        .collect(Collectors.toList());
+
+                //构造
+                for (WbsTree tree : addPublicTable) {
+                    WbsTreePrivate data = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                    if (data != null){
+                        Long id = SnowFlakeUtil.getId();
+                        data.setPKeyId(id);
+
+                    }
+                }
+
+
+            } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
+                /*-------------------------------------私有引用同步--------------------------------------------*/
+
+            }
+
+
+            return true;
+        }
+        return false;
+    }
+
+
 }

+ 434 - 395
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -26,6 +26,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.manager.utils.DiffListUtil;
 import org.springblade.manager.utils.WbsElementUtil;
 import org.springblade.manager.vo.*;
+import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -36,6 +37,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Service
 @AllArgsConstructor
@@ -48,6 +50,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final WbsTreePrivateServiceImpl wbsTreePrivateService;
     private final ProjectInfoMapper projectInfoMapper;
     private final WbsTreeContractMapper wbsTreeContractMapper;
+    private final WbsTreeContractServiceImpl wbsTreeContractService;
     private final ContractInfoMapper contractInfoMapper;
     private final TextdictInfoServiceImpl textDictInfoService;
     private final TextdictInfoMapper textdictInfoMapper;
@@ -591,290 +594,315 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     @Transactional(rollbackFor = Exception.class)
     //@AvoidRepeatableCommit
     public Boolean submitWbsTreeInProject(WbsTreeContractDTO pawDTO) {
-        if (StringUtils.isEmpty(pawDTO.getWbsId())) {
-            throw new ServiceException("请正确选择一个wbs模板");
-        }
-        String wbsTreeIds = pawDTO.getWbsTreeIds();
-        String[] ids = wbsTreeIds.split(",");
-        List<String> idList = Arrays.asList(ids);
-        List<String> idList1 = idList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
-
-        //当前项目存在的引用ids
-        List<String> idList2 = new ArrayList<>();
-
-        //当前公有引用ids
-        if (pawDTO.getReferenceType().equals("public")) {
-            List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                    .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
-                    .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                    .eq(WbsTreePrivate::getType, 1)
-            );
-            wbsTreePrivates.forEach(wbsTreePrivate -> {
-                idList2.add(String.valueOf(wbsTreePrivate.getId()));
-            });
-        }
-
-        //当前私有引用ids
-        else if (pawDTO.getReferenceType().equals("private")) {
-            List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                    .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
-                    .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                    .eq(WbsTreePrivate::getType, 1)
-            );
-            wbsTreePrivates2.forEach(wbsTreePrivate -> {
-                idList2.add(String.valueOf(wbsTreePrivate.getId()));
-            });
-        }
+        try {
+            if (StringUtils.isEmpty(pawDTO.getWbsId())) {
+                throw new ServiceException("请正确选择一个wbs模板");
+            }
+            String wbsTreeIds = pawDTO.getWbsTreeIds();
+            String[] ids = wbsTreeIds.split(",");
+            List<String> idList = Arrays.asList(ids);
+            List<String> idList1 = idList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
 
-        //新增节点ids
-        List<String> saveIds = idList1.stream().filter(f -> !idList2.contains(f)).collect(Collectors.toList());
-        //删除节点ids
-        List<String> delIds = idList2.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
+            //当前项目存在的引用ids
+            List<String> idList2 = new ArrayList<>();
 
-        if (saveIds.size() == 0 && delIds.size() == 0) {
-            //1.项目表单同步
+            //当前公有引用ids
             if (pawDTO.getReferenceType().equals("public")) {
-                //公有同步新增元素表
-                //获取公有wbs树新增的元素表
-                List<WbsTree> allNodeList = findAllNodeList(wbsTreeIds);
-
-                //获取公有wbs树所有的节点、元素表
-                List<WbsTree> wbsTreeListAll = new ArrayList<>();
-                if (allNodeList != null) {
-                    List<WbsTree> wbsTreeList = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                            .eq(WbsTree::getWbsId, pawDTO.getWbsId())
-                            .eq(WbsTree::getStatus, 1)
+                List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
+                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                        .eq(WbsTreePrivate::getType, 1)
+                );
+                wbsTreePrivates.forEach(wbsTreePrivate -> {
+                    idList2.add(String.valueOf(wbsTreePrivate.getId()));
+                });
+            }
+
+            //当前私有引用ids
+            else if (pawDTO.getReferenceType().equals("private")) {
+                List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                        .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
+                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                        .eq(WbsTreePrivate::getType, 1)
+                );
+                wbsTreePrivates2.forEach(wbsTreePrivate -> {
+                    idList2.add(String.valueOf(wbsTreePrivate.getId()));
+                });
+            }
+
+            //新增节点ids
+            List<String> saveIds = idList1.stream().filter(f -> !idList2.contains(f)).collect(Collectors.toList());
+            //删除节点ids
+            List<String> delIds = idList2.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
+
+            /*-----------------1.同步-----------------*/
+            if (saveIds.size() == 0 && delIds.size() == 0) {
+                //同步的元素表DataList
+                List<WbsTreePrivate> insertDataPrivate1 = new ArrayList<>();
+                //同步到该项目下所有合同段下的DataList
+                List<WbsTreeContract> insertDataContract1 = new ArrayList<>();
+                //同步到该合同段下所有复制或新增的节点下的DataList
+                List<WbsTreeContract> insertDataContract2 = new ArrayList<>();
+
+                //1.项目表单同步
+                if (pawDTO.getReferenceType().equals("public")) {
+                    //公有同步新增元素表
+                    //获取公有wbs树新增的元素表
+                    List<WbsTree> allNodeList = findAllNodeList(wbsTreeIds);
+
+                    //获取公有wbs树所有的节点、元素表
+                    List<WbsTree> wbsTreeListAll = new ArrayList<>();
+                    if (allNodeList != null) {
+                        List<WbsTree> wbsTreeList = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .eq(WbsTree::getWbsId, pawDTO.getWbsId())
+                                .eq(WbsTree::getStatus, 1)
+                        );
+                        wbsTreeListAll.addAll(wbsTreeList);
+                    }
+
+                    //公有元素表的id
+                    List<WbsTree> wbsTreeListTables = wbsTreeListAll.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
+                    List<String> collect1 = wbsTreeListTables.stream().map(WbsTree::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+
+                    //获取项目私有wbs树下所有的节点、元素表
+                    List<WbsTreePrivate> wbsTreePrivatesAll = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
+                            .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                            .eq(WbsTreePrivate::getStatus, 1)
                     );
-                    wbsTreeListAll.addAll(wbsTreeList);
-                }
 
-                //所有表单信息
-                List<WbsTree> wbsTreeListTables = wbsTreeListAll.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
+                    //私有元素表的id
+                    List<WbsTreePrivate> collect = wbsTreePrivatesAll.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
+                    List<String> collect2 = collect.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
 
-                //公有元素表的id
-                List<String> collect1 = wbsTreeListTables.stream().map(WbsTree::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                    List<String> diffRent1 = DiffListUtil.getDiffRent(collect1, collect2);
 
-                //获取项目私有wbs树下所有的节点、元素表
-                List<WbsTreePrivate> wbsTreePrivatesAll = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
-                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                        .eq(WbsTreePrivate::getStatus, 1)
-                );
+                    //修改公有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
+                    this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, pawDTO.getProjectId());
 
-                //私有下元素表id
-                List<WbsTreePrivate> collect = wbsTreePrivatesAll.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
-                List<String> collect2 = collect.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
-
-                List<String> diffRent1 = DiffListUtil.getDiffRent(collect1, collect2);
-
-                //修改公有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
-                this.updateWbsInfoPrivateAsync(wbsTreeListAll, wbsTreePrivatesAll, pawDTO.getProjectId());
-
-                if (diffRent1.size() == 0) {
-                    return true;
-
-                } else {
-                    if (collect1.size() > collect2.size()) {
-                        //获取当前项目下所有施工合同段id
-                        List<ContractInfo> contractInfoIds = contractInfoMapper.selectContractIdByProjectId(pawDTO.getProjectId());
-                        //公有同步元素表
-                        diffRent1.forEach(tableId -> {
-                            WbsTree wbsTree = wbsTreeMapper.selectById(tableId);
-                            //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                            WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .eq(WbsTreePrivate::getId, wbsTree.getParentId())
-                                    .eq(WbsTreePrivate::getWbsId, wbsTree.getWbsId())
-                                    .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                                    .eq(WbsTreePrivate::getStatus, 1)
-                            );
-
-                            if (wbsTreePrivate1 != null) {
-                                //同步元素表
-                                Long snowId1 = SnowFlakeUtil.getId();
-                                wbsTreePrivateMapper.insertCombination1(snowId1, wbsTree, pawDTO.getWbsType(), pawDTO.getProjectId());
-
-                                //2.同步到该项目下所有合同段wbs树
-                                //找到当前新增成功的元素表
-                                WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, snowId1));
-
-                                for (ContractInfo contractInfoId : contractInfoIds) {
-                                    WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(wbsTreePrivate, WbsTreeContract.class);
-                                    if (wbsTreeContract != null) {
-                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                        wbsTreeContract.setWbsId(pawDTO.getWbsId());
-                                        wbsTreeContract.setProjectId(pawDTO.getProjectId());
-                                        wbsTreeContract.setContractType(pawDTO.getContractType());
-                                        wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
-                                        wbsTreeContract.setIsBussShow(1);
-                                        if (wbsTreePrivate.getType() == 2) {
-                                            wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
-                                        }
+                    if (diffRent1.size() == 0) {
+                        return true;
 
-                                        //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                        WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                                .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
-                                                .eq(WbsTreeContract::getContractId, contractInfoId.getId())
-                                                .eq(WbsTreeContract::getType, 1)
-                                                .eq(WbsTreeContract::getId, wbsTreePrivate.getParentId())
-                                        );
-                                        if (wbsTreeContract1 != null) {
-                                            wbsTreeContractMapper.insert(wbsTreeContract);
-
-                                            //新增同步到对应的复制或新增的父级节点下
-                                            //获取当前新增表单的上级父节点
-                                            WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
+                    } else {
+                        if (collect1.size() > collect2.size()) {
+                            //获取当前项目下所有施工合同段id
+                            List<ContractInfo> contractInfoIds = contractInfoMapper.selectContractIdByProjectId(pawDTO.getProjectId());
+                            //公有同步元素表
+                            for (String tableId : diffRent1) {
+                                WbsTree wbsTree = wbsTreeMapper.selectById(tableId);
+                                if (wbsTree == null) {
+                                    continue;
+                                }
+                                //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                                WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                                        .eq(WbsTreePrivate::getId, wbsTree.getParentId())
+                                        .eq(WbsTreePrivate::getWbsId, wbsTree.getWbsId())
+                                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                                        .eq(WbsTreePrivate::getStatus, 1)
+                                );
+
+                                if (wbsTreePrivate1 != null) {
+                                    //同步元素表
+                                    Long snowId1 = SnowFlakeUtil.getId();
+                                    WbsTreePrivate wbsTreePrivate2 = BeanUtil.copyProperties(wbsTree, WbsTreePrivate.class);
+                                    assert wbsTreePrivate2 != null;
+                                    wbsTreePrivate2.setPKeyId(snowId1);
+                                    wbsTreePrivate2.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                                    wbsTreePrivate2.setProjectId(pawDTO.getProjectId());
+                                    insertDataPrivate1.add(wbsTreePrivate2);
+                                    //wbsTreePrivateMapper.insert(wbsTreePrivate2);
+                                    //wbsTreePrivateMapper.insertCombination1(snowId1, wbsTree, pawDTO.getWbsType(), pawDTO.getProjectId());
+
+                                    /*//2.同步到该项目下所有合同段wbs树
+                                    //找到当前新增成功的元素表
+                                    //WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, snowId1));
+                                    WbsTreePrivate wbsTreePrivate = insertDataPrivate1.stream().filter(f -> f.getPKeyId().equals(snowId1)).findAny().orElse(null);
+
+                                    for (ContractInfo contractInfoId : contractInfoIds) {
+                                        WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(wbsTreePrivate, WbsTreeContract.class);
+                                        if (wbsTreeContract != null) {
+                                            wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                            wbsTreeContract.setWbsId(pawDTO.getWbsId());
+                                            wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                                            wbsTreeContract.setContractType(pawDTO.getContractType());
+                                            wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
+                                            wbsTreeContract.setIsBussShow(1);
+                                            if (wbsTreePrivate.getType() == 2) {
+                                                wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
+                                            }
+
+                                            //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
+                                            WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                    .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
                                                     .eq(WbsTreeContract::getContractId, contractInfoId.getId())
-                                                    .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
-                                                    .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
                                                     .eq(WbsTreeContract::getType, 1)
+                                                    .eq(WbsTreeContract::getId, wbsTreePrivate.getParentId())
                                             );
-                                            if (wbsTreeContracts1 != null) {
-                                                //获取上级父级节点同级别的复制或新增节点
-                                                List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                                                        .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                            if (wbsTreeContract1 != null) {
+                                                insertDataContract1.add(wbsTreeContract);
+                                                //wbsTreeContractMapper.insert(wbsTreeContract);
+
+                                                //新增同步到对应的复制或新增的父级节点下
+                                                //获取当前新增表单的上级父节点
+                                                WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                        .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
                                                         .eq(WbsTreeContract::getContractId, contractInfoId.getId())
                                                         .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
                                                         .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
                                                         .eq(WbsTreeContract::getType, 1)
                                                 );
-                                                if (wbsTreeContracts2.size() > 0) {
-                                                    //将表单同步到复制或新增的节点下
-                                                    for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                                        wbsTreeContract.setParentId(treeContract.getId());
-                                                        wbsTreeContractMapper.insert(wbsTreeContract);
+                                                if (wbsTreeContracts1 != null) {
+                                                    //获取上级父级节点同级别的复制或新增节点
+                                                    List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                                                            .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                                            .eq(WbsTreeContract::getContractId, contractInfoId.getId())
+                                                            .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
+                                                            .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
+                                                            .eq(WbsTreeContract::getType, 1)
+                                                    );
+                                                    if (wbsTreeContracts2.size() > 0) {
+                                                        //将表单同步到复制或新增的节点下
+                                                        for (WbsTreeContract treeContract : wbsTreeContracts2) {
+                                                            wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                                            wbsTreeContract.setParentId(treeContract.getId());
+                                                            //wbsTreeContractMapper.insert(wbsTreeContract);
+                                                            insertDataContract2.add(wbsTreeContract);
+                                                        }
                                                     }
                                                 }
                                             }
                                         }
                                     }
+                                    */
                                 }
                             }
-                        });
-                        return true;
+                            return true;
+                        }
                     }
-                }
-
-            } else if (pawDTO.getReferenceType().equals("private")) {
-                //私有同步新增元素表
-                //获取私有引用项目的wbs树的所有节点、元素表
-                WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getPKeyId, pawDTO.getPrimaryKeyId()));
-                List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                        .eq(WbsTreePrivate::getStatus, 1)
-                );
-
-                //私有引用项目的表单id
-                List<WbsTreePrivate> WbsTreePrivateTables = wbsTreePrivateAllOld.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
-                List<String> collect1 = WbsTreePrivateTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
 
-                //获取当前项目私有wbs树下当前所有节点、元素表
-                List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
-                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                );
+                } else if (pawDTO.getReferenceType().equals("private")) {
+                    //私有同步新增元素表
+                    //获取私有引用项目的wbs树的所有节点、元素表
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getPKeyId, pawDTO.getPrimaryKeyId()));
+                    List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                            .eq(WbsTreePrivate::getStatus, 1)
+                    );
 
-                //当前存在的表单的id
-                List<WbsTreePrivate> wbsTreePrivateNowTables = wbsTreePrivatesAllNow.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
-                List<String> collect2 = wbsTreePrivateNowTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+                    //私有引用项目的表单id
+                    List<WbsTreePrivate> WbsTreePrivateTables = wbsTreePrivateAllOld.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
+                    List<String> collect1 = WbsTreePrivateTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
 
-                List<String> diffRent1 = DiffListUtil.getDiffRent(collect1, collect2);
+                    //获取当前项目私有wbs树下当前所有节点、元素表
+                    List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
+                            .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                    );
 
-                //同步私有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
-                this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, pawDTO.getProjectId(), pawDTO.getPrimaryKeyId());
+                    //当前存在的表单的id
+                    List<WbsTreePrivate> wbsTreePrivateNowTables = wbsTreePrivatesAllNow.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
+                    List<String> collect2 = wbsTreePrivateNowTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
 
-                //同步私有-电签匹配数据、默认信息数据
-                this.insertTextDictInfoAsync(WbsTreePrivateTables, wbsTreePrivateNowTables);
+                    List<String> diffRent1 = DiffListUtil.getDiffRent(collect1, collect2);
 
-                if (diffRent1.size() == 0) {
-                    return true;
+                    //同步私有wbs节点信息、元素表基础信息到项目级wbs、合同段wbs
+                    this.updateWbsInfoContractAsync(wbsTreePrivateAllOld, wbsTreePrivatesAllNow, pawDTO.getProjectId(), pawDTO.getPrimaryKeyId());
 
-                } else {
-                    if (collect1.size() > collect2.size()) {
-                        //获取当前项目下所有施工合同段id
-                        List<ContractInfo> contractInfoIds = contractInfoMapper.selectContractIdByProjectId(pawDTO.getProjectId());
-                        //私有同步元素表
-                        List<WbsTreePrivate> lists = new ArrayList<>();
+                    //同步私有-电签匹配数据、默认信息数据
+                    this.insertTextDictInfoAsync(WbsTreePrivateTables, wbsTreePrivateNowTables);
 
-                        diffRent1.forEach(tableId -> {
-                            List<WbsTreePrivate> wbsTreePrivates3 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .eq(WbsTreePrivate::getId, tableId)
-                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                                    .eq(WbsTreePrivate::getType, 2)
-                            );
-                            lists.addAll(wbsTreePrivates3);
-                        });
+                    if (diffRent1.size() == 0) {
+                        return true;
 
-                        lists.forEach(list -> {
-                            //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                            WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .eq(WbsTreePrivate::getId, list.getParentId())
-                                    .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
-                                    .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
-                                    .eq(WbsTreePrivate::getStatus, 1)
-                            );
-
-                            if (wbsTreePrivate1 != null) {
-                                //初始化元素表信息
-                                list.setPKeyId(SnowFlakeUtil.getId());
-                                list.setWbsId(pawDTO.getPrimaryKeyId());
-                                list.setProjectId(pawDTO.getProjectId());
-                                //同步新增元素表
-                                wbsTreePrivateService.save(list);
-
-                                //同步到该项目下的所有合同段
-                                for (ContractInfo contractInfoId : contractInfoIds) {
-                                    WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(list, WbsTreeContract.class);
-                                    if (wbsTreeContract != null) {
-                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                        wbsTreeContract.setWbsId(pawDTO.getPrimaryKeyId());
-                                        wbsTreeContract.setProjectId(pawDTO.getProjectId());
-                                        wbsTreeContract.setContractType(pawDTO.getContractType());
-                                        wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
-                                        wbsTreeContract.setIsBussShow(1);
-                                        if (list.getType() == 2) {
-                                            wbsTreeContract.setIsTypePrivatePid(list.getPKeyId());
-                                        }
+                    } else {
+                        if (collect1.size() > collect2.size()) {
+                            //获取当前项目下所有施工合同段id
+                            List<ContractInfo> contractInfoIds = contractInfoMapper.selectContractIdByProjectId(pawDTO.getProjectId());
+                            //私有同步元素表
+                            List<WbsTreePrivate> lists = new ArrayList<>();
+
+                            diffRent1.forEach(tableId -> {
+                                List<WbsTreePrivate> wbsTreePrivates3 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                        .eq(WbsTreePrivate::getId, tableId)
+                                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                                        .eq(WbsTreePrivate::getType, 2)
+                                );
+                                lists.addAll(wbsTreePrivates3);
+                            });
+
+                            for (WbsTreePrivate list : lists) {
+                                //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+                                WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                                        .eq(WbsTreePrivate::getId, list.getParentId())
+                                        .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
+                                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                                        .eq(WbsTreePrivate::getStatus, 1)
+                                );
+
+                                if (wbsTreePrivate1 != null) {
+                                    //初始化元素表信息
+                                    list.setPKeyId(SnowFlakeUtil.getId());
+                                    list.setWbsId(pawDTO.getPrimaryKeyId());
+                                    list.setProjectId(pawDTO.getProjectId());
+                                    //同步新增元素表
+                                    //wbsTreePrivateService.save(list);
+                                    insertDataPrivate1.add(list);
+
+                                    //同步到该项目下的所有合同段
+                                    for (ContractInfo contractInfoId : contractInfoIds) {
+                                        WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(list, WbsTreeContract.class);
+                                        if (wbsTreeContract != null) {
+                                            wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                            wbsTreeContract.setWbsId(pawDTO.getPrimaryKeyId());
+                                            wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                                            wbsTreeContract.setContractType(pawDTO.getContractType());
+                                            wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
+                                            wbsTreeContract.setIsBussShow(1);
+                                            if (list.getType() == 2) {
+                                                wbsTreeContract.setIsTypePrivatePid(list.getPKeyId());
+                                            }
 
-                                        //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                        WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                                .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
-                                                .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId())
-                                                .eq(WbsTreeContract::getWbsId, wbsTreeContract.getWbsId())
-                                                .eq(WbsTreeContract::getType, 1)
-                                                .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
-                                        );
-                                        if (wbsTreeContract1 != null) {
-                                            wbsTreeContractMapper.insert(wbsTreeContract);
-
-                                            //新增同步到对应的复制或新增的父级节点下
-                                            //获取当前新增表单的上级父节点
-                                            WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
-                                                    .eq(WbsTreeContract::getContractId, contractInfoId.getId())
-                                                    .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
-                                                    .eq(WbsTreeContract::getWbsId, pawDTO.getPrimaryKeyId())
+                                            //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
+                                            WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                    .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
+                                                    .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId())
+                                                    .eq(WbsTreeContract::getWbsId, wbsTreeContract.getWbsId())
                                                     .eq(WbsTreeContract::getType, 1)
+                                                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
                                             );
-                                            if (wbsTreeContracts1 != null) {
-                                                //获取上级父级节点同级别的复制或新增节点
-                                                List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                                                        .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                            if (wbsTreeContract1 != null) {
+                                                //wbsTreeContractMapper.insert(wbsTreeContract);
+                                                insertDataContract1.add(wbsTreeContract);
+
+                                                //新增同步到对应的复制或新增的父级节点下
+                                                //获取当前新增表单的上级父节点
+                                                WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                        .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
                                                         .eq(WbsTreeContract::getContractId, contractInfoId.getId())
                                                         .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
                                                         .eq(WbsTreeContract::getWbsId, pawDTO.getPrimaryKeyId())
                                                         .eq(WbsTreeContract::getType, 1)
                                                 );
-                                                if (wbsTreeContracts2.size() > 0) {
-                                                    //将表单同步到复制或新增的节点下
-                                                    for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                                        wbsTreeContract.setParentId(treeContract.getId());
-                                                        wbsTreeContractMapper.insert(wbsTreeContract);
+                                                if (wbsTreeContracts1 != null) {
+                                                    //获取上级父级节点同级别的复制或新增节点
+                                                    List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                                                            .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                                            .eq(WbsTreeContract::getContractId, contractInfoId.getId())
+                                                            .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
+                                                            .eq(WbsTreeContract::getWbsId, pawDTO.getPrimaryKeyId())
+                                                            .eq(WbsTreeContract::getType, 1)
+                                                    );
+                                                    if (wbsTreeContracts2.size() > 0) {
+                                                        //将表单同步到复制或新增的节点下
+                                                        for (WbsTreeContract treeContract : wbsTreeContracts2) {
+                                                            wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                                            wbsTreeContract.setParentId(treeContract.getId());
+                                                            //wbsTreeContractMapper.insert(wbsTreeContract);
+                                                            insertDataContract2.add(wbsTreeContract);
+                                                        }
                                                     }
                                                 }
                                             }
@@ -882,193 +910,204 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                     }
                                 }
                             }
-                        });
+                        }
                     }
                 }
-            }
 
-        } else {
-            //节点id改变,进行新增或删除节点以及该节点下的元素表
-            //1.删除
-            if (delIds.size() > 0) {
-                if (pawDTO.getReferenceType().equals("public")) {
-                    List<Long> ids1 = delIds.stream().map(Long::parseLong).collect(Collectors.toList());
-                    //判断是否被合同段引用
-                    List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectContractList(pawDTO.getWbsId(), pawDTO.getProjectId(), ids1);
-
-                    if (wbsTreeContractList.size() > 0) {
-                        List<ContractInfo> contractInfoArrayList = new ArrayList<>();
-                        wbsTreeContractList.forEach(list -> {
-                            ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
-                                    .eq(ContractInfo::getId, list.getContractId())
-                            );
-                            contractInfoArrayList.add(contractInfos);
-                        });
-                        List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
+                //同步新增
+                if (insertDataPrivate1.size() > 0) {
+                    this.insertBatch(insertDataPrivate1, 1000);
+                } else if (insertDataContract1.size() > 0) {
+                    wbsTreeContractService.insertBatch(insertDataContract1, 1000);
+                } else if (insertDataContract2.size() > 0) {
+                    wbsTreeContractService.insertBatch(insertDataContract2, 1000);
+                }
+
+            } else {
+
+                /*-----------------2.删除-----------------*/
+                if (delIds.size() > 0) {
+                    if (pawDTO.getReferenceType().equals("public")) {
+                        List<Long> ids1 = delIds.stream().map(Long::parseLong).collect(Collectors.toList());
+                        //判断是否被合同段引用
+                        List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectContractList(pawDTO.getWbsId(), pawDTO.getProjectId(), ids1);
+
                         if (wbsTreeContractList.size() > 0) {
-                            String join = StringUtils.join(names, ",");
-                            throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
+                            List<ContractInfo> contractInfoArrayList = new ArrayList<>();
+                            wbsTreeContractList.forEach(list -> {
+                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
+                                        .eq(ContractInfo::getId, list.getContractId())
+                                );
+                                contractInfoArrayList.add(contractInfos);
+                            });
+                            List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
+                            if (wbsTreeContractList.size() > 0) {
+                                String join = StringUtils.join(names, ",");
+                                throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
+                            }
                         }
-                    }
 
-                    baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId());
-                    baseMapper.deleteBatch2(ids1, pawDTO.getWbsId(), pawDTO.getProjectId());
+                        baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId());
+                        baseMapper.deleteBatch2(ids1, pawDTO.getWbsId(), pawDTO.getProjectId());
+
+                    } else if (pawDTO.getReferenceType().equals("private")) {
+                        List<Long> ids2 = delIds.stream().map(Long::parseLong).collect(Collectors.toList());
+                        //判断是否被合同段引用
+                        List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectContractList(pawDTO.getPrimaryKeyId(), pawDTO.getProjectId(), ids2);
 
-                } else if (pawDTO.getReferenceType().equals("private")) {
-                    List<Long> ids2 = delIds.stream().map(Long::parseLong).collect(Collectors.toList());
-                    //判断是否被合同段引用
-                    List<WbsTreeContract> wbsTreeContractList = wbsTreeContractMapper.selectContractList(pawDTO.getPrimaryKeyId(), pawDTO.getProjectId(), ids2);
-
-                    if (wbsTreeContractList.size() > 0) {
-                        List<ContractInfo> contractInfoArrayList = new ArrayList<>();
-                        wbsTreeContractList.forEach(list -> {
-                            ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
-                                    .eq(ContractInfo::getId, list.getContractId())
-                            );
-                            contractInfoArrayList.add(contractInfos);
-                        });
-                        List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
                         if (wbsTreeContractList.size() > 0) {
-                            String join = StringUtils.join(names, ",");
-                            throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
+                            List<ContractInfo> contractInfoArrayList = new ArrayList<>();
+                            wbsTreeContractList.forEach(list -> {
+                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
+                                        .eq(ContractInfo::getId, list.getContractId())
+                                );
+                                contractInfoArrayList.add(contractInfos);
+                            });
+                            List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
+                            if (wbsTreeContractList.size() > 0) {
+                                String join = StringUtils.join(names, ",");
+                                throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
+                            }
                         }
+                        baseMapper.deleteBatch(ids2, pawDTO.getPrimaryKeyId(), pawDTO.getProjectId());
+                        baseMapper.deleteBatch2(ids2, pawDTO.getPrimaryKeyId(), pawDTO.getProjectId());
                     }
-                    baseMapper.deleteBatch(ids2, pawDTO.getPrimaryKeyId(), pawDTO.getProjectId());
-                    baseMapper.deleteBatch2(ids2, pawDTO.getPrimaryKeyId(), pawDTO.getProjectId());
                 }
-            }
 
-            //2.新增
-            if (saveIds.size() > 0) {
-                if (saveIds.size() >= 1000) { //新增1000个以上节点时
-                    String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
-                    if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
-                        throw new ServiceException("请勿重复提交,请60秒后再次尝试!");
+                /*-----------------3.新增-----------------*/
+                if (saveIds.size() > 0) {
+                    if (saveIds.size() >= 1000) { //新增1000个以上节点时
+                        String redisValue = bladeRedis.get("submit-wbs-project:" + pawDTO.getProjectId());
+                        if (StringUtils.isNotEmpty(redisValue) && redisValue.equals("1")) {
+                            throw new ServiceException("请勿重复提交,请60秒后再次尝试!");
+                        }
                     }
-                }
-
-                //公有-数据初始化节点
-                List<WbsTreePrivate> insertData1 = new ArrayList<>();
-                //私有-数据初始化节点
-                List<WbsTreePrivate> insertData2 = new ArrayList<>();
-                //私有-电签匹配数据、默认信息数据
-                List<TextdictInfo> insertData3 = new ArrayList<>();
 
-                if (pawDTO.getReferenceType().equals("public")) {
-                    //引用公有
-                    //查询所有公共节点、表 saveIds=新增的节点id
-                    List<WbsTree> addListData = new ArrayList<>();
-                    //查询出当前wbs树下所有节点、表信息
-                    List<WbsTree> treesAll = baseMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                            .eq(WbsTree::getWbsId, pawDTO.getWbsId()));
-
-                    for (WbsTree wbsTree : treesAll) {
-                        for (String id : saveIds) {
-                            if (Long.parseLong(id) == (wbsTree.getId())) {
-                                //节点
-                                addListData.add(wbsTree);
-                            } else if (Long.parseLong(id) == (wbsTree.getParentId()) && wbsTree.getType() == 2) {
-                                //表
-                                addListData.add(wbsTree);
+                    //公有-数据初始化节点
+                    List<WbsTreePrivate> insertData1 = new ArrayList<>();
+                    //私有-数据初始化节点
+                    List<WbsTreePrivate> insertData2 = new ArrayList<>();
+                    //私有-电签匹配数据、默认信息数据
+                    List<TextdictInfo> insertData3 = new ArrayList<>();
+
+                    if (pawDTO.getReferenceType().equals("public")) {
+                        //引用公有
+                        //查询所有公共节点、表 saveIds=新增的节点id
+                        List<WbsTree> addListData = new ArrayList<>();
+                        //查询出当前wbs树下所有节点、表信息
+                        List<WbsTree> treesAll = baseMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .eq(WbsTree::getWbsId, pawDTO.getWbsId()));
+
+                        for (WbsTree wbsTree : treesAll) {
+                            for (String id : saveIds) {
+                                if (Long.parseLong(id) == (wbsTree.getId())) {
+                                    //节点
+                                    addListData.add(wbsTree);
+                                } else if (Long.parseLong(id) == (wbsTree.getParentId()) && wbsTree.getType() == 2) {
+                                    //表
+                                    addListData.add(wbsTree);
+                                }
                             }
                         }
-                    }
 
-                    addListData.forEach(tree -> {
-                        WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                        if (wbsTreePrivate != null) {
-                            wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
-                            wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
-                            wbsTreePrivate.setProjectId(pawDTO.getProjectId());
-                            wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
-                        }
-                        insertData1.add(wbsTreePrivate);
-                    });
+                        addListData.forEach(tree -> {
+                            WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (wbsTreePrivate != null) {
+                                wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                                wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                                wbsTreePrivate.setProjectId(pawDTO.getProjectId());
+                                wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+                            }
+                            insertData1.add(wbsTreePrivate);
+                        });
 
-                } else if (pawDTO.getReferenceType().equals("private")) {
-                    //引用私有
-                    //查询所有私有节点、表 saveIds=新增的节点id
-                    List<WbsTreePrivate> addListData = new ArrayList<>();
-
-                    //私有引用-电签匹配数据、默认信息数据
-                    Map<Long, List<TextdictInfo>> textDictInfoData = new HashMap<>();
-
-                    //查询出当前wbs树下所有节点、表信息
-                    List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectNodeAndTable(null, pawDTO.getWbsId(), pawDTO.getReferencePrivateWbsProjectId());
-
-                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
-                        for (String id : saveIds) {
-                            if (Long.parseLong(id) == (wbsTreePrivate.getId())) {
-                                //节点
-                                addListData.add(wbsTreePrivate);
-                            } else if (Long.parseLong(id) == (wbsTreePrivate.getParentId()) && wbsTreePrivate.getType() == 2) {
-                                //表
-                                addListData.add(wbsTreePrivate);
-
-                                //根据元素表pKeyId,获取电签位置匹配信息、编辑默认信息
-                                List<TextdictInfo> textDictInfos = textdictInfoMapper.selectList(Wrappers.<TextdictInfo>query().lambda().eq(TextdictInfo::getTabId, wbsTreePrivate.getPKeyId()));
-                                if (textDictInfos.size() > 0) {
-                                    textDictInfoData.put(wbsTreePrivate.getPKeyId(), textDictInfos);
+                    } else if (pawDTO.getReferenceType().equals("private")) {
+                        //引用私有
+                        //查询所有私有节点、表 saveIds=新增的节点id
+                        List<WbsTreePrivate> addListData = new ArrayList<>();
+
+                        //私有引用-电签匹配数据、默认信息数据
+                        Map<Long, List<TextdictInfo>> textDictInfoData = new HashMap<>();
+
+                        //查询出当前wbs树下所有节点、表信息
+                        List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectNodeAndTable(null, pawDTO.getWbsId(), pawDTO.getReferencePrivateWbsProjectId());
+
+                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
+                            for (String id : saveIds) {
+                                if (Long.parseLong(id) == (wbsTreePrivate.getId())) {
+                                    //节点
+                                    addListData.add(wbsTreePrivate);
+                                } else if (Long.parseLong(id) == (wbsTreePrivate.getParentId()) && wbsTreePrivate.getType() == 2) {
+                                    //表
+                                    addListData.add(wbsTreePrivate);
+
+                                    //根据元素表pKeyId,获取电签位置匹配信息、编辑默认信息
+                                    List<TextdictInfo> textDictInfos = textdictInfoMapper.selectList(Wrappers.<TextdictInfo>query().lambda().eq(TextdictInfo::getTabId, wbsTreePrivate.getPKeyId()));
+                                    if (textDictInfos.size() > 0) {
+                                        textDictInfoData.put(wbsTreePrivate.getPKeyId(), textDictInfos);
+                                    }
                                 }
                             }
                         }
-                    }
 
-                    addListData.forEach(tree -> {
-                        //构造参数
-                        WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                        if (wbsTreePrivate != null) {
-                            wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
-                            wbsTreePrivate.setWbsId(pawDTO.getPrimaryKeyId());
-                            wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
-                            wbsTreePrivate.setProjectId(pawDTO.getProjectId());
-                            wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
-
-                            insertData2.add(wbsTreePrivate);
-
-                            //构造电签位置配置信息、编辑默认信息数据
-                            if (wbsTreePrivate.getType() == 2) {
-                                if (textDictInfoData.size() > 0) {
-                                    textDictInfoData.forEach((k, v) -> {
-                                        if (tree.getPKeyId().equals(k)) {
-                                            for (TextdictInfo textdictInfo : v) {
-                                                textdictInfo.setTabId(String.valueOf(wbsTreePrivate.getPKeyId()));
-                                                textdictInfo.setId(SnowFlakeUtil.getId());
+                        addListData.forEach(tree -> {
+                            //构造参数
+                            WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (wbsTreePrivate != null) {
+                                wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                                wbsTreePrivate.setWbsId(pawDTO.getPrimaryKeyId());
+                                wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                                wbsTreePrivate.setProjectId(pawDTO.getProjectId());
+                                wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+
+                                insertData2.add(wbsTreePrivate);
+
+                                //构造电签位置配置信息、编辑默认信息数据
+                                if (wbsTreePrivate.getType() == 2) {
+                                    if (textDictInfoData.size() > 0) {
+                                        textDictInfoData.forEach((k, v) -> {
+                                            if (tree.getPKeyId().equals(k)) {
+                                                for (TextdictInfo textdictInfo : v) {
+                                                    textdictInfo.setTabId(String.valueOf(wbsTreePrivate.getPKeyId()));
+                                                    textdictInfo.setId(SnowFlakeUtil.getId());
+                                                }
+                                                insertData3.addAll(v);
                                             }
-                                            insertData3.addAll(v);
-                                        }
-                                    });
+                                        });
+                                    }
                                 }
                             }
-                        }
-                    });
-                }
+                        });
+                    }
 
-                //新增
-                if (pawDTO.getReferenceType().equals("public")) {
-                    //批量插入
-                    insertBatch(insertData1, 1000);
+                    //新增
+                    if (pawDTO.getReferenceType().equals("public")) {
+                        //批量插入
+                        this.insertBatch(insertData1, 1000);
 
-                    projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
+                        projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
 
-                } else if (pawDTO.getReferenceType().equals("private")) {
-                    //批量插入
-                    insertBatch(insertData2, 1000);
+                    } else if (pawDTO.getReferenceType().equals("private")) {
+                        //批量插入
+                        this.insertBatch(insertData2, 1000);
 
-                    //同步电签位置配置信息、编辑默认信息数据
-                    textDictInfoService.saveBatch(insertData3, 1000);
+                        //同步电签位置配置信息、编辑默认信息数据
+                        textDictInfoService.saveBatch(insertData3, 1000);
 
-                    projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
-                }
+                        projectInfoMapper.updateTemplateIdById(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
+                    }
 
-                if (saveIds.size() >= 1000) {
-                    bladeRedis.set("submit-wbs-project:" + pawDTO.getProjectId(), "1");
-                    bladeRedis.expire("submit-wbs-project:" + pawDTO.getProjectId(), 60);
+                    if (saveIds.size() >= 1000) {
+                        bladeRedis.set("submit-wbs-project:" + pawDTO.getProjectId(), "1");
+                        bladeRedis.expire("submit-wbs-project:" + pawDTO.getProjectId(), 60);
+                    }
                 }
             }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
         }
-
-        return true;
+        return false;
     }
 
     @Transactional(rollbackFor = Exception.class)