Browse Source

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 years ago
parent
commit
c16d1b05aa

+ 124 - 96
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -58,6 +58,8 @@ import org.springblade.core.boot.ctrl.BladeController;
 
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -1455,11 +1457,29 @@ public class InformationWriteQueryController extends BladeController {
                     }
                 }
 
-                //结果集
+                //缓存需要的节点信息、表信息
+                WbsTreeContract needCopyNodeRoot = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+                Map<String, List<WbsTreeContract>> needCopyNodeAndTabMap = new HashMap<>();
+                List<WbsTreeContract> needCopyChildNodes = this.getChildNodes(needCopyNodeRoot);
+                if (ObjectUtil.isEmpty(needCopyChildNodes) || needCopyChildNodes.size() == 0) {
+                    //最下层级节点复制
+                    needCopyChildNodes = new ArrayList<>();
+                    needCopyChildNodes.add(needCopyNodeRoot);
+                }
+                needCopyNodeAndTabMap.put("node:" + needCopyNodeRoot.getPKeyId(), needCopyChildNodes);
+                List<WbsTreeContract> addChildNodesTables = this.getChildNodesTables(needCopyChildNodes, needCopyNodeRoot.getContractId());
+                needCopyNodeAndTabMap.put("tab:" + needCopyNodeRoot.getPKeyId(), addChildNodesTables);
+
+                //TODO 结果集
+                //节点
                 List<WbsTreeContract> addNodeList = new ArrayList<>();
+                //表单
                 List<WbsTreeContract> addTabList = new ArrayList<>();
+                //redis同步信息
                 List<WbsTreeContract> asyncWbsTreeNodes = new ArrayList<>();
-                Set<WbsTreeContract> addChildNodesTablesOldAll = new HashSet<>();
+                //表单附件数据源
+                Set<WbsTreeContract> addChildNodesTablesOldAll = new HashSet<>(addChildNodesTables);
+                //表单数据
                 List<String> resultTablesData = new ArrayList<>();
 
                 //表单所属方
@@ -1475,116 +1495,135 @@ public class InformationWriteQueryController extends BladeController {
                     tabOwner = "1,2,3,4,5,6";
                 }
 
-                //解析位置信息,进行复制数据构造
-                if (toCopyNodes.size() == copyBatches.size()) {
-                    for (int i = 0; i < toCopyNodes.size(); i++) {
-                        //首先查询需要复制的节点的信息
-                        WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
-                        WbsTreeContract toCopyNode = toCopyNodes.get(i);
-                        asyncWbsTreeNodes.add(toCopyNode);
-                        CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
-
-                        if (toCopyNode != null && toCopyVO != null && needCopyNode != null) {
-                            //TODO 同节点复制
-                            if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
-                                //1.1 选择当前节点的父级节点,新增
-                                if (needCopyNode.getParentId().equals(toCopyNode.getId())) {
-                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
-
-                                    //获取需要复制的所有子节点
-                                    List<WbsTreeContract> addChildNodes = this.getChildNodes(needCopyNode);
-
-                                    if (ObjectUtil.isEmpty(addChildNodes) || addChildNodes.size() == 0) {
-                                        //最下层级节点复制
-                                        addChildNodes = new ArrayList<>();
-                                        addChildNodes.add(needCopyNode);
-                                    }
-
-                                    //获取所有复制的表
-                                    List<WbsTreeContract> addChildNodesTables = this.getChildNodesTables(addChildNodes, toCopyNode.getContractId());
-
-                                    //复制数据源表,文件附件用
-                                    List<WbsTreeContract> oldTab = BeanUtil.copyProperties(addChildNodesTables, WbsTreeContract.class);
-                                    addChildNodesTablesOldAll.addAll(oldTab);
-
-                                    //构造新的节点、表、数据
-                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, addChildNodes, addChildNodesTables, needCopyNode, toCopyNode, resultTablesData, 1, tabOwner, vo.getIsCopyData());
+                //创建线程池,默认设置8个线程
+                ExecutorService executor = Executors.newFixedThreadPool(8);
+                try {
+                    //解析位置信息,进行复制数据构造
+                    if (toCopyNodes.size() == copyBatches.size()) {
+                        for (int i = 0; i < toCopyNodes.size(); i++) {
+                            //首先查询需要复制的节点的信息
+                            WbsTreeContract toCopyNode = toCopyNodes.get(i);
+                            CopyContractTreeNodeVO.CopyBatch toCopyVO = copyBatches.get(i);
+
+                            String finalTabOwner = tabOwner;
+                            //使用线程池提交任务
+                            executor.submit(() -> {
+                                //redis缓存node
+                                asyncWbsTreeNodes.add(toCopyNode);
+
+                                if (toCopyNode != null && toCopyVO != null && needCopyNodeAndTabMap.size() > 0) {
+                                    //TODO 同节点复制
+                                    if (new Integer(1).equals(toCopyVO.getIsSameNode())) {
+                                        //1.1 选择当前节点的父级节点,新增
+                                        if (needCopyNodeRoot.getParentId().equals(toCopyNode.getId())) {
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
+
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNodeRoot, toCopyNode, resultTablesData, 1, finalTabOwner, vo.getIsCopyData());
+
+                                            //1.2 选择同父级的同级节点,只复制数据
+                                        } else if (needCopyNodeRoot.getParentId().equals(toCopyNode.getParentId())) {
+                                            //构造数据
+                                            this.addCopyTabData(needCopyNodeRoot, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData());
+                                        }
 
-                                    //1.2 选择同父级的同级节点,只复制数据
-                                } else if (needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
-                                    //构造数据
-                                    this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addChildNodesTablesOldAll, addTabList, vo.getIsCopyData());
-                                }
+                                        //TODO 跨节点复制
+                                    } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
+                                        //获取需要复制节点的上级
+                                        WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNodeRoot.getParentId(), Long.parseLong(needCopyNodeRoot.getContractId()));
 
-                                //TODO 跨节点复制
-                            } else if (new Integer(0).equals(toCopyVO.getIsSameNode())) {
-                                //获取需要复制节点的上级
-                                WbsTreeContract parentNodeNeed = wbsTreeContractClient.getContractWbsTreeByContractIdAndId(needCopyNode.getParentId(), Long.parseLong(needCopyNode.getContractId()));
+                                        //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点)
+                                        if (parentNodeNeed != null && parentNodeNeed.getParentId().equals(toCopyNode.getParentId())) {
+                                            toCopyNode.setNodeName(toCopyVO.getNodeName());
+                                            toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
 
-                                //2.1 选择的父级的同级的父级节点,新增(当复制节点父级与选择复制到的位置节点的父级id相同时,表示跨节点)
-                                if (parentNodeNeed != null && parentNodeNeed.getParentId().equals(toCopyNode.getParentId())) {
-                                    toCopyNode.setNodeName(toCopyVO.getNodeName());
-                                    toCopyNode.setPartitionCode(toCopyVO.getPartitionCode());
+                                            //获取缓存节点、表信息
+                                            List<WbsTreeContract> needCopyNodes = needCopyNodeAndTabMap.get("node:" + needCopyNodeRoot.getPKeyId());
+                                            List<WbsTreeContract> needCopyTab = needCopyNodeAndTabMap.get("tab:" + needCopyNodeRoot.getPKeyId());
 
-                                    //获取需要复制的所有子节点
-                                    List<WbsTreeContract> addChildNodes = this.getChildNodes(needCopyNode);
+                                            //构造新的节点、表、数据
+                                            this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, needCopyNodes, needCopyTab, needCopyNodeRoot, toCopyNode, resultTablesData, 0, finalTabOwner, vo.getIsCopyData());
 
-                                    //最下层级节点复制
-                                    if (ObjectUtil.isEmpty(addChildNodes) || addChildNodes.size() == 0) {
-                                        addChildNodes = new ArrayList<>();
-                                        addChildNodes.add(needCopyNode);
+                                            //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据)
+                                        } else if (needCopyNodeRoot.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNodeRoot.getParentId().equals(toCopyNode.getParentId())) {
+                                            //构造数据
+                                            this.addCopyTabData(needCopyNodeRoot, toCopyNode, finalTabOwner, resultTablesData, addTabList, vo.getIsCopyData());
+                                        }
                                     }
-
-                                    //获取所有复制的表
-                                    List<WbsTreeContract> addChildNodesTables = this.getChildNodesTables(addChildNodes, toCopyNode.getContractId());
-
-                                    //复制数据源表,文件附件用
-                                    List<WbsTreeContract> oldTab = BeanUtil.copyProperties(addChildNodesTables, WbsTreeContract.class);
-                                    addChildNodesTablesOldAll.addAll(oldTab);
-
-                                    //构造新的节点、表、数据
-                                    this.addCopyNodesAndTabsBuildData(addNodeList, addTabList, addChildNodes, addChildNodesTables, needCopyNode, toCopyNode, resultTablesData, 0, tabOwner, vo.getIsCopyData());
-
-                                    //2.2 如果点击选择的是当前复制节点本身的同等级节点,那么就只复制数据。(如果是跨节点,类型相同的情况下,只复制数据)
-                                } else if (needCopyNode.getNodeType().equals(toCopyNode.getNodeType()) && !needCopyNode.getParentId().equals(toCopyNode.getParentId())) {
-                                    //构造数据
-                                    this.addCopyTabData(needCopyNode, toCopyNode, tabOwner, resultTablesData, addChildNodesTablesOldAll, addTabList, vo.getIsCopyData());
                                 }
-                            }
+                            });
                         }
                     }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    //关闭线程池
+                    executor.shutdown();
+                    //等待所有线程执行完毕
+                    while (!executor.isTerminated()) {
+                    }
                 }
 
                 //节点
+                Boolean aBoolean = false;
                 if (addNodeList.size() > 0) {
-                    wbsTreeContractClient.saveBatch(addNodeList);
-                    //更新redis缓存
-                    if (asyncWbsTreeNodes.size() > 0) {
-                        for (WbsTreeContract asyncWbsTreeNode : asyncWbsTreeNodes) {
-                            informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getParentId() + "", contractId, "", "1");
-                        }
-                    }
+                    //重构祖级id
+                    this.reBuildAncestors(addNodeList, needCopyNodeRoot);
+                    aBoolean = wbsTreeContractClient.saveBatch(addNodeList);
                 }
+
                 //元素表
                 if (addTabList.size() > 0) {
-                    wbsTreeContractClient.saveBatch(addTabList);
-
+                    this.reBuildAncestors(addTabList, null);
+                    aBoolean = wbsTreeContractClient.saveBatch(addTabList);
                     //表单文件附件
                     if (addChildNodesTablesOldAll.size() > 0 && vo.getIsCopyData() == 1) {
                         this.addCopyTabFile(addTabList, addChildNodesTablesOldAll);
                     }
                 }
+
                 //实体表数据
                 if (resultTablesData.size() > 0) {
                     jdbcTemplate.execute(StringUtils.join(resultTablesData, ""));
                 }
+
+                //更新redis缓存
+                if (aBoolean && asyncWbsTreeNodes.size() > 0) {
+                    List<WbsTreeContract> collect = asyncWbsTreeNodes.stream().distinct().collect(Collectors.toList());
+                    for (WbsTreeContract asyncWbsTreeNode : collect) {
+                        informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getId() + "", contractId, "", "1");
+                        informationQueryService.AsyncWbsTree("", asyncWbsTreeNode.getParentId() + "", contractId, "", "1");
+                    }
+                }
+
                 return R.success("操作成功");
             }
         }
         return R.fail("操作失败");
     }
 
+    /**
+     * 重构祖级id
+     */
+    private void reBuildAncestors(List<WbsTreeContract> result, WbsTreeContract needCopyNodeRoot) {
+        for (WbsTreeContract wbsTreeContract : result) {
+            //根节点
+            if (ObjectUtil.isNotEmpty(needCopyNodeRoot) && wbsTreeContract.getOldId().equals(needCopyNodeRoot.getId().toString())) {
+                wbsTreeContract.setAncestors(needCopyNodeRoot.getAncestors());
+            }//非根节点
+            if (ObjectUtil.isNotEmpty(wbsTreeContract.getParentId()) && ObjectUtil.isNotEmpty(wbsTreeContract.getAncestors()) && !wbsTreeContract.getAncestors().contains(wbsTreeContract.getParentId() + "")) {
+                String[] split = wbsTreeContract.getAncestors().split(",");
+                String s = split[split.length - 1];
+                wbsTreeContract.setAncestors(wbsTreeContract.getAncestors().replace(s, wbsTreeContract.getParentId() + ""));
+            }
+        }
+    }
+
     /**
      * 新增复制的表单文件
      */
@@ -1620,11 +1659,11 @@ public class InformationWriteQueryController extends BladeController {
     /**
      * 新增复制的数据
      */
-    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String tabOwner, List<String> resultTablesData, Set<WbsTreeContract> addChildNodesTablesOldAll, List<WbsTreeContract> addChildNodesTablesAll, Integer isCopyData) {
+    private void addCopyTabData(WbsTreeContract needCopyNode, WbsTreeContract toCopyNode, String tabOwner, List<String> resultTablesData, List<WbsTreeContract> addChildNodesTablesAll, Integer isCopyData) {
         List<WbsTreeContract> wbsTreeContractsNeed = Collections.singletonList(needCopyNode);
         List<WbsTreeContract> wbsTreeContractsTo = Collections.singletonList(toCopyNode);
-        List<WbsTreeContract> needCopyNodeTabs = getChildNodesTables(wbsTreeContractsNeed, needCopyNode.getContractId());
-        List<WbsTreeContract> toCopyNodeTabs = getChildNodesTables(wbsTreeContractsTo, needCopyNode.getContractId());
+        List<WbsTreeContract> needCopyNodeTabs = this.getChildNodesTables(wbsTreeContractsNeed, needCopyNode.getContractId());
+        List<WbsTreeContract> toCopyNodeTabs = this.getChildNodesTables(wbsTreeContractsTo, needCopyNode.getContractId());
         if (needCopyNodeTabs.size() > 0) {
             for (WbsTreeContract needTab : needCopyNodeTabs) {
                 for (WbsTreeContract toCopyNodeTab : toCopyNodeTabs) {
@@ -1640,7 +1679,6 @@ public class InformationWriteQueryController extends BladeController {
                         if (tabOwner.contains(needTab.getTableOwner()) && isCopyData == 1) {
 
                             //源表obj对象,文件附件使用
-                            addChildNodesTablesOldAll.add(needTab);
                             if (!needTab.getTabFileType().equals(toCopyNodeTab.getTabFileType())) {
                                 toCopyNodeTab.setTabFileType(needTab.getTabFileType()); //已上传
                             }
@@ -1694,10 +1732,6 @@ public class InformationWriteQueryController extends BladeController {
                     if (isSameNode == 0) {
                         //跨节点复制,更改父级id
                         obj.setParentId(toCopyNode.getId());
-                        //设置祖级id
-                        String[] split = obj.getAncestors().split(",");
-                        String lastId = split[split.length - 1];
-                        obj.setAncestors(obj.getAncestors().replace(lastId, toCopyNode.getId().toString()));
                     }
                     obj.setOldId(needNode.getId() + "");
                     obj.setPKeyId(SnowFlakeUtil.getId());
@@ -1718,7 +1752,6 @@ public class InformationWriteQueryController extends BladeController {
                 WbsTreeContract obj = BeanUtil.copyProperties(needTab, WbsTreeContract.class);
                 if (obj != null) {
                     Long oldPKeyId = needTab.getPKeyId();
-                    obj.setAncestors(needTab.getAncestors().replace(needTab.getParentId().toString(), id.toString()));
                     obj.setId(SnowFlakeUtil.getId());
                     obj.setParentId(id);
                     obj.setPKeyId(SnowFlakeUtil.getId());
@@ -1787,8 +1820,7 @@ public class InformationWriteQueryController extends BladeController {
                     Long id = SnowFlakeUtil.getId();
                     //数据源节点的老id与新的id的Map,作为下一级的节点的父级id的替换
                     parentIdToId.put(node.getId(), id);
-                    //重设祖级id
-                    this.restoreParent(obj, parentIdToId);
+
                     //重设Id
                     obj.setId(id);
                     obj.setParentId(newParentId);
@@ -1808,7 +1840,6 @@ public class InformationWriteQueryController extends BladeController {
                                 Long oldPKeyId = needTab.getPKeyId();
                                 String tableName = needTab.getInitTableName();
                                 Long tabId = SnowFlakeUtil.getId();
-                                objTab.setAncestors(needTab.getAncestors().replace(needTab.getParentId().toString(), id.toString()));
                                 objTab.setId(tabId);
                                 objTab.setParentId(id);
                                 objTab.setPKeyId(SnowFlakeUtil.getId());
@@ -1850,14 +1881,11 @@ public class InformationWriteQueryController extends BladeController {
             } else {
                 //跨节点
                 toCopyNode.setParentId(toCopyNodeOldId);
-                //重设祖级id
-                toCopyNode.setAncestors(needCopyNode.getAncestors().replace(needCopyNode.getParentId().toString(), toCopyNode.getId().toString()));
             }
             toCopyNode.setPKeyId(SnowFlakeUtil.getId());
             toCopyNode.setNodeName(toCopyNode.getNodeName());
             toCopyNode.setFullName(toCopyNode.getNodeName());
             toCopyNode.setPartitionCode(toCopyNode.getPartitionCode());
-            needNodes.add(toCopyNode);
             addNodeList.add(toCopyNode);
         }
     }

+ 128 - 122
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -51,21 +51,22 @@ public class WbsParamController {
 
     /**
      * 保存或修改
+     *
      * @param wp
      */
     @PostMapping("/saveOrUpdate")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "保存或修改参数", notes = "保存或修改参数")
     public R saveOrUpdate(@RequestBody WbsParamBean wp) {
-        if(wp.getId()==null){
-            WbsParam e= new WbsParam();
-            BeanUtils.copyProperties(wp,e);
+        if (wp.getId() == null) {
+            WbsParam e = new WbsParam();
+            BeanUtils.copyProperties(wp, e);
             e.setIsDeleted(0);
             return R.status(this.service.save(e));
-        }else{
+        } else {
             WbsParam old = this.service.getById(wp.getId());
-            if(old!=null){
-                BeanUtils.copyProperties(wp,old);
+            if (old != null) {
+                BeanUtils.copyProperties(wp, old);
                 old.setIsDeleted(0);
                 return R.status(service.updateById(old));
             }
@@ -78,66 +79,66 @@ public class WbsParamController {
     @ApiOperation(value = "批量保存或修改参数", notes = "批量保存或修改参数")
     public R saveOrUpdateBatch(@RequestBody ParamBean pb) {
         try {
-            List<WbsParamBean> wps =pb.getWps();
+            List<WbsParamBean> wps = pb.getWps();
             /*执行顺序,删>增>改*/
-            if(Func.isNotEmpty(pb.getDelIds())){
+            if (Func.isNotEmpty(pb.getDelIds())) {
                 List<Long> delIds = pb.getDelIds().stream().filter(Func::isNotEmpty).collect(Collectors.toList());
-                if(Func.isNotEmpty(delIds)){
+                if (Func.isNotEmpty(delIds)) {
                     this.service.deleteLogic(pb.getDelIds());
-                    if(!pb.isCommon()){
-                        this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted,1).in(ElementFormulaMapping::getParamId,pb.getDelIds()));
+                    if (!pb.isCommon()) {
+                        this.elementFormulaMappingService.update(Wrappers.<ElementFormulaMapping>lambdaUpdate().set(ElementFormulaMapping::getIsDeleted, 1).in(ElementFormulaMapping::getParamId, pb.getDelIds()));
                     }
                 }
                 /*应该检查接触关联的参数公式还是否存在引用,不存在的情况也要删去*/
             }
-            if(CollectionUtil.isNotEmpty(wps)){
-                Map<Boolean,List<WbsParamBean>> map = wps.stream().collect(Collectors.partitioningBy(e->e.getId()!=null));
+            if (CollectionUtil.isNotEmpty(wps)) {
+                Map<Boolean, List<WbsParamBean>> map = wps.stream().collect(Collectors.partitioningBy(e -> e.getId() != null));
                 List<WbsParamBean> saveList = map.get(false);
                 List<WbsParamBean> updateList = map.get(true);
-                if(CollectionUtil.isNotEmpty(saveList)){
-                    List<WbsParam>entityList=BeanUtil.copy(saveList,WbsParam.class);
+                if (CollectionUtil.isNotEmpty(saveList)) {
+                    List<WbsParam> entityList = BeanUtil.copy(saveList, WbsParam.class);
                     this.service.saveBatch(entityList);
-                    if(!pb.isCommon()){
+                    if (!pb.isCommon()) {
                         /*新建的时候需要初始化绑定表单元素*/
-                        List<Map<String,Object>> elementMap=new ArrayList<>();
-                        if(pb.isWbs()){
-                            elementMap= this.jdbcTemplate.queryForList(
+                        List<Map<String, Object>> elementMap = new ArrayList<>();
+                        if (pb.isWbs()) {
+                            elementMap = this.jdbcTemplate.queryForList(
                                     "select a.e_name as name ,a.id " +
                                             "from m_wbs_form_element a " +
                                             "inner join m_wbs_tree b on a.f_id=b.init_table_id " +
                                             "inner join m_wbs_tree c on b.parent_id=c.id " +
-                                            "where a.is_deleted=0 and c.id="+pb.getNodeId()
+                                            "where a.is_deleted=0 and c.id=" + pb.getNodeId()
                             );
-                        }else if(pb.isPrivate()){
-                            elementMap= this.jdbcTemplate.queryForList(
+                        } else if (pb.isPrivate()) {
+                            elementMap = this.jdbcTemplate.queryForList(
                                     "select c.e_name as name ,c.id from m_wbs_tree_private a " +
                                             "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.wbs_id=b.wbs_id) " +
                                             "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
-                                            "where  b.project_id="+pb.getProjectId()+" and a.p_key_id="+pb.getNodeId()+"  and b.is_deleted=0 and c.is_deleted=0 ");
+                                            "where  b.project_id=" + pb.getProjectId() + " and a.p_key_id=" + pb.getNodeId() + "  and b.is_deleted=0 and c.is_deleted=0 ");
                         }
-                        if(!elementMap.isEmpty()){
-                            Map<String,Object> tmpMap=new HashMap<>();
+                        if (!elementMap.isEmpty()) {
+                            Map<String, Object> tmpMap = new HashMap<>();
                             List<Map<String, Object>> finalElementMap = elementMap;
-                            entityList.forEach(e->{
+                            entityList.forEach(e -> {
                                 Formula formula = new Formula();
                                 formula.setOutm(Formula.FULL);
                                 formula.setParamId(e.getId());
-                                Map<String,String> keyMap= new HashMap<>();
-                                keyMap.put("name",e.getName());
-                                keyMap.put("id",e.getId().toString());
-                                tmpMap.put(e.getK(),keyMap);
-                                if(RegexUtil.match(ParamElements.LEVEL_REG,e.getV().trim())){
+                                Map<String, String> keyMap = new HashMap<>();
+                                keyMap.put("name", e.getName());
+                                keyMap.put("id", e.getId().toString());
+                                tmpMap.put(e.getK(), keyMap);
+                                if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
                                     /*取层级*/
-                                    formula.setFormula("FC.tree(trees,WP["+e.getK()+"])");
-                                }else{
+                                    formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
+                                } else {
                                     /*直接取数*/
-                                    formula.setFormula("WP["+e.getK()+"]");
+                                    formula.setFormula("WP[" + e.getK() + "]");
                                 }
                                 formula.setMap(JSON.toJSONString(tmpMap));
                                 this.formulaService.save(formula);
                                 tmpMap.clear();
-                                finalElementMap.forEach(m->{
-                                    if(StringUtils.handleNull(m.get("name")).contains(e.getName())){
+                                finalElementMap.forEach(m -> {
+                                    if (StringUtils.handleNull(m.get("name")).contains(e.getName())) {
                                         ElementFormulaMapping efm = new ElementFormulaMapping();
                                         efm.setScope(FormulaBean.PARAM);
                                         efm.setParamId(e.getId());
@@ -150,34 +151,34 @@ public class WbsParamController {
                         }
                     }
                 }
-                if(CollectionUtil.isNotEmpty(updateList)){
+                if (CollectionUtil.isNotEmpty(updateList)) {
                     List<WbsParam> ul = new ArrayList<>();
-                    for(WbsParamBean b:updateList){
+                    for (WbsParamBean b : updateList) {
                         WbsParam old = this.service.getById(b.getId());
-                        if(pb.isCommon()){
-                            if(old!=null&&!old.getK().equals(b.getK())){
+                        if (pb.isCommon()) {
+                            if (old != null && !old.getK().equals(b.getK())) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
-                                BeanUtils.copyProperties(b,old);
+                                BeanUtils.copyProperties(b, old);
                                 ul.add(old);
                             }
-                        }else{
-                            if(old!=null&&!old.getV().equals(b.getV())){
+                        } else {
+                            if (old != null && !old.getV().equals(b.getV())) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
-                                BeanUtils.copyProperties(b,old);
+                                BeanUtils.copyProperties(b, old);
                                 ul.add(old);
                             }
                         }
 
                     }
-                    if(Func.isNotEmpty(ul)){
+                    if (Func.isNotEmpty(ul)) {
                         this.service.saveOrUpdateBatch(ul);
                     }
                 }
             }
             return R.success("操作成功");
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return R.fail("操作失败");
         }
@@ -185,25 +186,27 @@ public class WbsParamController {
     }
 
     /**
+     * /**
      * 删除
      */
     @PostMapping("/remove")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "删除", notes = "传入id集合")
-    public R remove(@ApiParam(value="需要删除的Id,多个用逗号逗号分开",required = true)@RequestParam String ids) {
+    public R remove(@ApiParam(value = "需要删除的Id,多个用逗号逗号分开", required = true) @RequestParam String ids) {
         return R.status(this.service.deleteLogic(Func.toLongList(ids)));
     }
+
     /**
      * 查询单条
      */
-    @ApiOperationSupport(order =3)
+    @ApiOperationSupport(order = 3)
     @ApiOperation(value = "查看详情", notes = "传入id")
     @GetMapping("/detail")
     @ApiIgnore
     public R<WbsParamBean> detail(WbsParam wp) {
         WbsParam detail = service.getOne(Condition.getQueryWrapper(wp));
-        if(detail!=null){
-            return R.data(BeanUtil.copy(detail,WbsParamBean.class));
+        if (detail != null) {
+            return R.data(BeanUtil.copy(detail, WbsParamBean.class));
         }
         return R.success("无数据");
     }
@@ -211,9 +214,9 @@ public class WbsParamController {
     @ApiOperationSupport(order = 4)
     @ApiOperation(value = "节点参数列表(翻页)", notes = "节点参数列表(翻页)")
     @GetMapping("/page")
-    public IPage<WbsParamBean> list( WbsParamBean param,  Query query) {
+    public IPage<WbsParamBean> list(WbsParamBean param, Query query) {
         LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda();
-        IPage<WbsParam> pages  = this.service.page(Condition.getPage(query),queryWrapper);
+        IPage<WbsParam> pages = this.service.page(Condition.getPage(query), queryWrapper);
         return WbsParamWrapper.build().pageVO(pages);
     }
 
@@ -221,10 +224,10 @@ public class WbsParamController {
     @ApiOperation(value = "获取名称字典", notes = "获取名称字典")
     @GetMapping("/keymap")
     public R<List<WbsParamBean>> list2() {
-        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType,0);
+        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getType, 0);
         List<WbsParamBean> list = new ArrayList<>();
-        List<WbsParam> data =  this.service.list(queryWrapper);
-        if(CollectionUtil.isNotEmpty(data)){
+        List<WbsParam> data = this.service.list(queryWrapper);
+        if (CollectionUtil.isNotEmpty(data)) {
             list = WbsParamWrapper.build().listVO(this.service.list(queryWrapper));
         }
         return R.data(list);
@@ -234,77 +237,80 @@ public class WbsParamController {
     @ApiOperation(value = "节点参数列表", notes = "节点参数列表")
     @GetMapping("/list")
     public R<List<WbsParamBean>> list3(@ApiParam(value = "wbs节点id", required = true) Long wbsId) {
-        LambdaQueryWrapper<WbsParam> queryWrapper = Wrappers.<WbsParam>query().lambda().eq(WbsParam::getNodeId,wbsId).eq(WbsParam::getType,1);
-        List<WbsParam> data =  this.service.list(queryWrapper);
-        if(CollectionUtil.isNotEmpty(data)){
-          return   R.data(WbsParamWrapper.build().listVO(this.service.list(queryWrapper)));
+        List<WbsParam> data = this.service.list(Wrappers.<WbsParam>lambdaQuery()
+                .select(WbsParam::getId, WbsParam::getName, WbsParam::getK, WbsParam::getV, WbsParam::getRemark, WbsParam::getNodeId, WbsParam::getProjectId)
+                .eq(WbsParam::getNodeId, wbsId)
+                .eq(WbsParam::getType, 1));
+        if (data.size() > 0) {
+            return R.data(BeanUtil.copyProperties(data, WbsParamBean.class));
         }
-        return R.data(Collections.emptyList());
+        return R.data(null);
     }
 
     @ApiOperationSupport(order = 7)
     @ApiOperation(value = "参数关联元素", notes = "参数关联元素")
     @GetMapping("/get-param-elements")
-    public R<List<Map<String,Object>>> associated(ParamSearch ps) {
+    public R<List<Map<String, Object>>> associated(ParamSearch ps) {
         /*R.data(listMap.stream().map(m->BeanUtil.toBean(m, TableElementParam.class)).collect(Collectors.toList()));*/
-        if(ParamSearch.WBS.equals(ps.getScopeType())){
-            return  R.data(this.jdbcTemplate.queryForList(
+        if (ParamSearch.WBS.equals(ps.getScopeType())) {
+            return R.data(this.jdbcTemplate.queryForList(
                     "select AA.id,AA.tableName,BB.elementName,BB.mappingId from " +
-                            "(select id ,node_name AS tableName from m_wbs_tree where  parent_id="+ps.getNodeId()+" and is_deleted=0) as AA" +
+                            "(select id ,node_name AS tableName from m_wbs_tree where  parent_id=" + ps.getNodeId() + " and is_deleted=0) as AA" +
                             " left join " +
                             "(select a.id as id, b.e_name as elementName ,c.id as mappingId,c.is_deleted " +
                             "from m_wbs_tree a " +
                             "inner join m_wbs_form_element b on b.f_id=a.init_table_id " +
                             "inner join  m_element_formula_mapping  c on c.element_id=b.id " +
-                            "where c.is_deleted=0 and a.is_deleted=0 and a.parent_id="+ps.getNodeId()+" and c.param_id ="+ps.getParamId()+")as BB " +
+                            "where c.is_deleted=0 and a.is_deleted=0 and a.parent_id=" + ps.getNodeId() + " and c.param_id =" + ps.getParamId() + ")as BB " +
                             "on AA.id=BB.id"));
-        }else if(ParamSearch.PRI.equals(ps.getScopeType())){
-           List<Map<String,Object>> listMaps=  this.jdbcTemplate.queryForList("select b.wbs_id wbsId from m_wbs_param a join m_wbs_tree_private b on a.node_id=b.p_key_id where a.id= "+ps.getParamId());
+        } else if (ParamSearch.PRI.equals(ps.getScopeType())) {
+            List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList("select b.wbs_id wbsId from m_wbs_param a join m_wbs_tree_private b on a.node_id=b.p_key_id where a.id= " + ps.getParamId());
             String wbsId = StringUtils.handleNull(listMaps.get(0).get("wbsId"));
             return R.data(this.jdbcTemplate.queryForList(
                     "select AA.id,AA.tableName,BB.elementName,BB.mappingId from (" +
-                    "        select id ,node_name AS tableName,init_table_id" +
-                    "        FROM m_wbs_tree_private AS wt" +
-                    "        WHERE type = 2" +
-                    "          AND is_deleted = 0" +
-                    "          AND parent_id = " +ps.getNodeId()+
-                    "          AND project_id = " +ps.getProjectId()+
-                    "          AND wbs_id= "+wbsId+
-                    "        ORDER BY wt.sort, wt.node_name, wt.create_time) as AA left join (select a.id as id, b.e_name as elementName ,c.id as mappingId,c.is_deleted from m_wbs_tree_private a inner join m_wbs_form_element b on b.f_id=a.init_table_id inner join  m_element_formula_mapping  c on c.element_id=b.id " +
-                            "where  a.project_id="+ps.getProjectId()+" and c.is_deleted=0 and a.is_deleted=0 and a.parent_id="+ps.getNodeId()+" and c.scope=35 and c.param_id ="+ps.getParamId()+" and a.wbs_id="+wbsId+" )as BB on AA.id=BB.id"));
+                            "        select id ,node_name AS tableName,init_table_id" +
+                            "        FROM m_wbs_tree_private AS wt" +
+                            "        WHERE type = 2" +
+                            "          AND is_deleted = 0" +
+                            "          AND parent_id = " + ps.getNodeId() +
+                            "          AND project_id = " + ps.getProjectId() +
+                            "          AND wbs_id= " + wbsId +
+                            "        ORDER BY wt.sort, wt.node_name, wt.create_time) as AA left join (select a.id as id, b.e_name as elementName ,c.id as mappingId,c.is_deleted from m_wbs_tree_private a inner join m_wbs_form_element b on b.f_id=a.init_table_id inner join  m_element_formula_mapping  c on c.element_id=b.id " +
+                            "where  a.project_id=" + ps.getProjectId() + " and c.is_deleted=0 and a.is_deleted=0 and a.parent_id=" + ps.getNodeId() + " and c.scope=35 and c.param_id =" + ps.getParamId() + " and a.wbs_id=" + wbsId + " )as BB on AA.id=BB.id"));
         }
         return R.fail("暂无数据");
     }
+
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "解除参数关联元素", notes = "解除参数关联元素")
     @GetMapping("/del-param-elements")
     public R<Boolean> disassociate(@ApiParam(value = "关联id", required = true) Long mappingId) {
-         return R.status(this.elementFormulaMappingService.deleteLogic(Collections.singletonList(mappingId)));
+        return R.status(this.elementFormulaMappingService.deleteLogic(Collections.singletonList(mappingId)));
     }
 
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "指定关联元素", notes = "指定关联元素")
     @PostMapping("/specified-param-elements")
-    public R<Boolean> specified(@ApiParam(value = "关联id", required = true) Long paramId,Long elementId) {
+    public R<Boolean> specified(@ApiParam(value = "关联id", required = true) Long paramId, Long elementId) {
         /*先删旧关联,检查是否存在公式,没有就新增 再增新关联*/
-        this.jdbcTemplate.execute("update m_element_formula_mapping set is_deleted=1 where element_id="+elementId+" and param_id="+paramId);
-        Formula formula= this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId,paramId));
-        if(formula==null){
-            Map<String,Object> tmpMap=new HashMap<>();
-            formula=new Formula();
+        this.jdbcTemplate.execute("update m_element_formula_mapping set is_deleted=1 where element_id=" + elementId + " and param_id=" + paramId);
+        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, paramId));
+        if (formula == null) {
+            Map<String, Object> tmpMap = new HashMap<>();
+            formula = new Formula();
             WbsParam param = this.service.getById(paramId);
             formula.setOutm(Formula.FULL);
             formula.setParamId(param.getId());
-            Map<String,String> keyMap= new HashMap<>();
-            keyMap.put("name",param.getName());
-            keyMap.put("id",param.getId().toString());
-            tmpMap.put(param.getK(),keyMap);
-            if(RegexUtil.match(ParamElements.LEVEL_REG,param.getV().trim())){
+            Map<String, String> keyMap = new HashMap<>();
+            keyMap.put("name", param.getName());
+            keyMap.put("id", param.getId().toString());
+            tmpMap.put(param.getK(), keyMap);
+            if (RegexUtil.match(ParamElements.LEVEL_REG, param.getV().trim())) {
                 /*取层级*/
-                formula.setFormula("FC.tree(trees,WP["+param.getK()+"])");
-            }else{
+                formula.setFormula("FC.tree(trees,WP[" + param.getK() + "])");
+            } else {
                 /*直接取数*/
-                formula.setFormula("WP["+param.getK()+"]");
+                formula.setFormula("WP[" + param.getK() + "]");
             }
             formula.setMap(JSON.toJSONString(tmpMap));
             this.formulaService.save(formula);
@@ -314,68 +320,68 @@ public class WbsParamController {
         efm.setParamId(paramId);
         efm.setElementId(elementId);
         efm.setFormulaId(formula.getId());
-       return   R.status(this.elementFormulaMappingService.save(efm));
+        return R.status(this.elementFormulaMappingService.save(efm));
     }
 
     @GetMapping("/refresh")
     @ApiOperationSupport(order = 1)
     @ApiOperation(value = "刷新当前节点的节点参数", notes = "刷新当前节点的节点参数")
-    public R refresh(Long nodeId,Integer type,Long projectId) {
+    public R refresh(Long nodeId, Integer type, Long projectId) {
         try {
             /*先查出所有的节点参数*/
-            List<WbsParam> paramList=  this.service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId,nodeId));
-            if(Func.isNotEmpty(paramList)){
-                List<Map<String,Object>> elementMap=new ArrayList<>();
+            List<WbsParam> paramList = this.service.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getNodeId, nodeId));
+            if (Func.isNotEmpty(paramList)) {
+                List<Map<String, Object>> elementMap = new ArrayList<>();
                 /*当前节点所包含的所有元素*/
-                if(StringUtils.isEquals(0,type)){
+                if (StringUtils.isEquals(0, type)) {
                     /*wbs*/
-                    elementMap= this.jdbcTemplate.queryForList(
+                    elementMap = this.jdbcTemplate.queryForList(
                             "select a.e_name as name ,a.id " +
                                     "from m_wbs_form_element a " +
                                     "inner join m_wbs_tree b on a.f_id=b.init_table_id " +
                                     "inner join m_wbs_tree c on b.parent_id=c.id " +
-                                    "where a.is_deleted=0 and c.id="+nodeId
+                                    "where a.is_deleted=0 and c.id=" + nodeId
                     );
-                }else{
+                } else {
                     /*project*/
-                    elementMap= this.jdbcTemplate.queryForList(
+                    elementMap = this.jdbcTemplate.queryForList(
                             "select c.e_name as name ,c.id from m_wbs_tree_private a " +
                                     "inner join m_wbs_tree_private b on (a.id=b.parent_id and a.wbs_id=b.wbs_id) " +
                                     "inner join m_wbs_form_element c on  b.init_table_id=c.f_id " +
-                                    "where  b.project_id="+projectId+" and a.p_key_id="+nodeId+"  and b.is_deleted=0 and c.is_deleted=0 ");
+                                    "where  b.project_id=" + projectId + " and a.p_key_id=" + nodeId + "  and b.is_deleted=0 and c.is_deleted=0 ");
                 }
 
-                List<Long> longList=this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where is_deleted=0 and scope=35 and param_id in("+paramList.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining(","))+")",Long.class);
-                if(Func.isNotEmpty(elementMap)){
-                    Map<String,Object> tmpMap=new HashMap<>();
+                List<Long> longList = this.jdbcTemplate.queryForList("select element_id from m_element_formula_mapping where is_deleted=0 and scope=35 and param_id in(" + paramList.stream().map(WbsParam::getId).map(String::valueOf).collect(Collectors.joining(",")) + ")", Long.class);
+                if (Func.isNotEmpty(elementMap)) {
+                    Map<String, Object> tmpMap = new HashMap<>();
                     List<Map<String, Object>> finalElementMap = elementMap;
-                    paramList.forEach(e->{
-                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId,e.getId()));
-                        if(formula==null){
-                            formula=new Formula();
+                    paramList.forEach(e -> {
+                        Formula formula = this.formulaService.getOne(Wrappers.<Formula>lambdaQuery().eq(Formula::getParamId, e.getId()));
+                        if (formula == null) {
+                            formula = new Formula();
                             formula.setOutm(Formula.FULL);
                             formula.setParamId(e.getId());
-                            Map<String,String> keyMap= new HashMap<>();
-                            keyMap.put("name",e.getName());
-                            keyMap.put("id",e.getId().toString());
-                            tmpMap.put(e.getK(),keyMap);
-                            if(RegexUtil.match(ParamElements.LEVEL_REG,e.getV().trim())){
+                            Map<String, String> keyMap = new HashMap<>();
+                            keyMap.put("name", e.getName());
+                            keyMap.put("id", e.getId().toString());
+                            tmpMap.put(e.getK(), keyMap);
+                            if (RegexUtil.match(ParamElements.LEVEL_REG, e.getV().trim())) {
                                 /*取层级*/
-                                formula.setFormula("FC.tree(trees,WP["+e.getK()+"])");
-                            }else{
+                                formula.setFormula("FC.tree(trees,WP[" + e.getK() + "])");
+                            } else {
                                 /*直接取数*/
-                                formula.setFormula("WP["+e.getK()+"]");
+                                formula.setFormula("WP[" + e.getK() + "]");
                             }
                             formula.setMap(JSON.toJSONString(tmpMap));
                             this.formulaService.save(formula);
                             tmpMap.clear();
                         }
                         Formula finalFormula = formula;
-                        String name=e.getName().replace("【水】","").trim();
-                        finalElementMap.forEach(m->{
-                            if(StringUtils.handleNull(m.get("name")).contains(name)){
+                        String name = e.getName().replace("【水】", "").trim();
+                        finalElementMap.forEach(m -> {
+                            if (StringUtils.handleNull(m.get("name")).contains(name)) {
                                 /*匹配名称,且该元素没有绑定任何节点参数公式*/
-                                if(longList.stream().noneMatch(k->StringUtils.isEquals(k,m.get("id")))){
+                                if (longList.stream().noneMatch(k -> StringUtils.isEquals(k, m.get("id")))) {
                                     ElementFormulaMapping efm = new ElementFormulaMapping();
                                     efm.setScope(FormulaBean.PARAM);
                                     efm.setParamId(e.getId());
@@ -390,7 +396,7 @@ public class WbsParamController {
             }
 
             return R.success("操作成功");
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
             return R.fail("操作失败");
         }

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -111,6 +111,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         //TODO ---------节点未变只同步元素表---------
         if (saveIds.size() == 0 && delIds.size() == 0) {
             List<WbsTreePrivate> wbsTreePrivateListResult = new ArrayList<>();
+            //当前合同段所有表
             List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .eq(WbsTreePrivate::getProjectId, Long.parseLong(pawDTO.getProjectId()))
                     .eq(WbsTreePrivate::getWbsId, Long.parseLong(pawDTO.getWbsId()))
@@ -152,7 +153,38 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     }
                 }
             });
+
+            //获取当前合同段的复制节点或者新增节点
+            List<WbsTreeContract> copyAndAddNodeList = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                    .select(WbsTreeContract::getId, WbsTreeContract::getOldId)
+                    .eq(WbsTreeContract::getContractId, pawDTO.getContractId())
+                    .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
+                    .eq(WbsTreeContract::getStatus, 1)
+                    .isNotNull(WbsTreeContract::getOldId));
+
+            List<WbsTreeContract> copyAddNodeTabs = new ArrayList<>();
+            if (copyAndAddNodeList.size() > 0) {
+                for (WbsTreeContract synTab : wbsTreeContractResultData) {
+                    for (WbsTreeContract copyAddNode : copyAndAddNodeList) {
+                        if (synTab.getParentId().toString().equals(copyAddNode.getOldId())) {
+                            WbsTreeContract copyAddNodeTab = BeanUtil.copyProperties(synTab, WbsTreeContract.class);
+                            if (copyAddNodeTab != null) {
+                                copyAddNodeTab.setParentId(copyAddNode.getId());
+                                copyAddNodeTab.setAncestors(synTab.getAncestors().replace(synTab.getParentId() + "", copyAddNodeTab.getParentId() + ""));
+                                copyAddNodeTab.setPKeyId(SnowFlakeUtil.getId());
+                                copyAddNodeTab.setCreateTime(new Date());
+                                copyAddNodeTabs.add(copyAddNodeTab);
+                            }
+                        }
+                    }
+                }
+            }
+
             if (wbsTreeContractResultData.size() > 0) {
+                if (copyAddNodeTabs.size() > 0) {
+                    //新增复制节点的表
+                    wbsTreeContractResultData.addAll(copyAddNodeTabs);
+                }
                 this.insertBatch(wbsTreeContractResultData, 1000);
             }
 

+ 234 - 501
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -45,8 +45,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -68,8 +67,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     private final TextdictInfoServiceImpl textDictInfoService;
     private final InformationQueryClient informationQueryClient;
 
-    @Resource(name = "taskExecutor1")
-    private final ThreadPoolExecutor executor;
+    //创建线程池任务
+    private final ExecutorService executor = Executors.newFixedThreadPool(4);
 
     @Override
     public List<WbsTreePrivateVO> tree(String wbsId, String projectId) {
@@ -598,218 +597,245 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     public boolean syncNodeParam(String projectId) {
         if (StringUtils.isNotEmpty(projectId)) {
-            //获取项目节点树
+            //结果集
+            List<WbsParam> updateList = new ArrayList<>();
+            List<WbsParam> insertList = new ArrayList<>();
+
+            //获取项目节点树、包括试验、资料填报
             List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId, WbsTreePrivate::getWbsId)
-                    .eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
-            String wbsId = wbsTreePrivateAllNow.stream().map(WbsTreePrivate::getWbsId).findAny().orElse(null);
-            if (StringUtils.isNotEmpty(wbsId)) {
-                List<WbsParamVO> paramListData = new ArrayList<>();
-                //获取公有树
-                Map<Long, WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                        .select(WbsTree::getId)
-                        .eq(WbsTree::getWbsId, wbsId).eq(WbsTree::getStatus, 1)
-                        .eq(WbsTree::getType, 1))
-                        .stream().collect(Collectors.toMap(WbsTree::getId, Function.identity()));
-
-                if (treePublicNodeAll.size() > 0) {
-                    //TODO ---------公有引用同步---------
-                    Map<String, Long> map = new HashMap<>();
-                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                        WbsTree wbsTree = treePublicNodeAll.get(wbsTreePrivate.getId());
-                        if (wbsTree != null) {
-                            map.put(wbsTreePrivate.getPKeyId() + "," + wbsTree.getId(), wbsTree.getId());
+                    .eq(WbsTreePrivate::getProjectId, projectId)
+                    .eq(WbsTreePrivate::getStatus, 1)
+                    .eq(WbsTreePrivate::getType, 1)
+                    .in(WbsTreePrivate::getWbsType, Arrays.asList(1, 2)));
+
+            Map<String, List<String>> collect = wbsTreePrivateAllNow.stream().map(WbsTreePrivate::getWbsId).collect(Collectors.groupingBy(Object::toString));
+            for (Map.Entry<String, List<String>> wbsIds : collect.entrySet()) {
+                String wbsId = wbsIds.getKey();
+                if (StringUtils.isNotEmpty(wbsId)) {
+                    List<WbsParamVO> paramListData = new ArrayList<>();
+                    //获取公有树
+                    Map<Long, WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                            .select(WbsTree::getId)
+                            .eq(WbsTree::getWbsId, wbsId)
+                            .eq(WbsTree::getStatus, 1)
+                            .eq(WbsTree::getType, 1))
+                            .stream().collect(Collectors.toMap(WbsTree::getId, Function.identity()));
+
+                    if (treePublicNodeAll.size() > 0) {
+                        //TODO ---------公有引用同步---------
+                        Map<String, Long> map = new HashMap<>();
+                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                            WbsTree wbsTree = treePublicNodeAll.get(wbsTreePrivate.getId());
+                            if (wbsTree != null) {
+                                map.put(wbsTreePrivate.getPKeyId() + "," + wbsTree.getId(), wbsTree.getId());
+                            }
                         }
-                    }
 
-                    Set<String> keyIds = map.keySet();
-                    List<Long> wbsTreeIds = new ArrayList<>(map.values());
-                    List<WbsParam> wbsParamList = new ArrayList<>();
-                    //分组查询
-                    List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
-                    for (List<Long> ids : partition) {
-                        String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-                        List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
-                        wbsParamList.addAll(wbsParams);
-                    }
+                        Set<String> keyIds = map.keySet();
+                        List<Long> wbsTreeIds = new ArrayList<>(map.values());
+                        List<WbsParam> wbsParamList = new ArrayList<>();
+                        //分组查询
+                        List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
+                        for (List<Long> ids : partition) {
+                            String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                            List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
+                            wbsParamList.addAll(wbsParams);
+                        }
 
-                    for (String ids : keyIds) {
-                        String nodePKeyIdNow = ids.split(",")[0];
-                        String nodeIdOld = ids.split(",")[1];
-                        List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodeIdOld)).collect(Collectors.toList());
-                        //获取引用的节点参数
-                        if (wbsParams.size() > 0) {
-                            for (WbsParam wbsParam : wbsParams) {
-                                WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
-                                if (param != null) {
-                                    param.setProjectId(Long.parseLong(projectId));
-                                    param.setId(SnowFlakeUtil.getId());
-                                    param.setNodeId(Long.parseLong(nodePKeyIdNow));
-                                    param.setOldId(wbsParam.getId());
-                                    param.setType(1);
-                                    param.setStatus(1);
-                                    param.setIsDeleted(0);
-                                    paramListData.add(param);
+                        for (String ids : keyIds) {
+                            String nodePKeyIdNow = ids.split(",")[0];
+                            String nodeIdOld = ids.split(",")[1];
+                            List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodeIdOld)).collect(Collectors.toList());
+                            //获取引用的节点参数
+                            if (wbsParams.size() > 0) {
+                                for (WbsParam wbsParam : wbsParams) {
+                                    WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
+                                    if (param != null) {
+                                        param.setProjectId(Long.parseLong(projectId));
+                                        param.setId(SnowFlakeUtil.getId());
+                                        param.setNodeId(Long.parseLong(nodePKeyIdNow));
+                                        param.setOldId(wbsParam.getId());
+                                        param.setType(1);
+                                        param.setStatus(1);
+                                        param.setIsDeleted(0);
+                                        paramListData.add(param);
+                                    }
                                 }
                             }
                         }
-                    }
 
 
-                } else {
-                    //TODO ---------私有引用同步---------
-                    Map<String, Long> map = new HashMap<>();
-                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
-                            .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
-                            .eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
-
-                    Map<Long, WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId)
-                            .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
-                            .eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1)).stream().collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
-
-                    for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                        WbsTreePrivate wbsTreePrivateYS = treePrivateNodeAll.get(wbsTreePrivate.getId());
-                        if (wbsTreePrivateYS != null) {
-                            map.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivateYS.getPKeyId(), wbsTreePrivateYS.getPKeyId());
+                    } else {
+                        //TODO ---------私有引用同步---------
+                        Map<String, Long> map = new HashMap<>();
+                        WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                                .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
+                                .eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+
+                        Map<Long, WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId)
+                                .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
+                                .eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1)).stream().collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
+
+                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
+                            WbsTreePrivate wbsTreePrivateYS = treePrivateNodeAll.get(wbsTreePrivate.getId());
+                            if (wbsTreePrivateYS != null) {
+                                map.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivateYS.getPKeyId(), wbsTreePrivateYS.getPKeyId());
+                            }
                         }
-                    }
 
-                    Set<String> keyIds = map.keySet();
-                    List<Long> wbsTreeIds = new ArrayList<>(map.values());
-                    List<WbsParam> wbsParamList = new ArrayList<>();
-                    //分组查询
-                    List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
-                    for (List<Long> ids : partition) {
-                        String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-                        List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
-                        wbsParamList.addAll(wbsParams);
-                    }
+                        Set<String> keyIds = map.keySet();
+                        List<Long> wbsTreeIds = new ArrayList<>(map.values());
+                        List<WbsParam> wbsParamList = new ArrayList<>();
+                        //分组查询
+                        List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
+                        for (List<Long> ids : partition) {
+                            String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                            List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
+                            wbsParamList.addAll(wbsParams);
+                        }
 
-                    for (String ids : keyIds) {
-                        String nodePKeyIdNow = ids.split(",")[0];
-                        String nodePKeyIdYs = ids.split(",")[1];
-                        List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodePKeyIdYs)).collect(Collectors.toList());
-                        //获取引用的节点参数
-                        if (wbsParams.size() > 0) {
-                            for (WbsParam wbsParam : wbsParams) {
-                                WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
-                                if (param != null) {
-                                    param.setProjectId(Long.parseLong(projectId));
-                                    param.setId(SnowFlakeUtil.getId());
-                                    param.setNodeId(Long.parseLong(nodePKeyIdNow));
-                                    param.setOldId(wbsParam.getId());
-                                    param.setType(1);
-                                    param.setStatus(1);
-                                    param.setIsDeleted(0);
-                                    paramListData.add(param);
+                        for (String ids : keyIds) {
+                            String nodePKeyIdNow = ids.split(",")[0];
+                            String nodePKeyIdYs = ids.split(",")[1];
+                            List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodePKeyIdYs)).collect(Collectors.toList());
+                            //获取引用的节点参数
+                            if (wbsParams.size() > 0) {
+                                for (WbsParam wbsParam : wbsParams) {
+                                    WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
+                                    if (param != null) {
+                                        param.setProjectId(Long.parseLong(projectId));
+                                        param.setId(SnowFlakeUtil.getId());
+                                        param.setNodeId(Long.parseLong(nodePKeyIdNow));
+                                        param.setOldId(wbsParam.getId());
+                                        param.setType(1);
+                                        param.setStatus(1);
+                                        param.setIsDeleted(0);
+                                        paramListData.add(param);
+                                    }
                                 }
                             }
                         }
                     }
-                }
 
-                List<WbsParam> updateList = new ArrayList<>();
-                List<WbsParam> insertList = new ArrayList<>();
-                List<WbsParam> paramListOldAll = new ArrayList<>();
+                    List<WbsParam> paramListOldAll = new ArrayList<>();
 
-                List<Long> oldIds = paramListData.stream().map(WbsParamVO::getOldId).distinct().collect(Collectors.toList());
-                //分组查询
-                List<List<Long>> partition = Lists.partition(oldIds, 1000);
-                for (List<Long> ids : partition) {
-                    String sql1 = "select id,name,k,v,node_id,remark from m_wbs_param where id in( " + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-                    List<WbsParam> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class));
-                    paramListOldAll.addAll(query);
-                }
-
-                //转换为map
-                Map<Long, WbsParam> mapOld = paramListOldAll.stream().collect(Collectors.toMap(WbsParam::getId, Function.identity()));
-
-                //获取当前项目的节点参数
-                List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery()
-                        .select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId)
-                        .eq(WbsParam::getProjectId, Long.parseLong(projectId)));
-
-                //判断是否存在
-                Iterator<WbsParamVO> iterator = paramListData.iterator();
-                while (iterator.hasNext()) {
-                    WbsParamVO next = iterator.next();
-
-                    //获取引用的节点上的源参数信息
-                    WbsParam oldObj = mapOld.get(next.getOldId());
-                    //获取被引用的节点上的现参数信息
-                    WbsParam newObj = paramListNow.stream().filter(f -> f.getK().equals(next.getK())
-                            && f.getV().equals(next.getV())
-                            && f.getName().equals(next.getName())
-                            && f.getRemark().equals(next.getRemark())
-                            && f.getNodeId().equals(next.getNodeId())
-                    ).findAny().orElse(null);
-
-                    if (oldObj != null && newObj != null) {
-                        //如果源节点参数与现节点参数名称、K、V、备注一致,那么就跳过
-                        if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && oldObj.getV().equals(newObj.getV()) && oldObj.getRemark().equals(newObj.getRemark())) {
-                            iterator.remove();
-
-                            //如果源节点参数与现节点参数名称、K一致,V、备注不一致,那么就修改当前名称下的节点参数
-                        } else if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && (!oldObj.getV().equals(newObj.getV()) || !oldObj.getRemark().equals(newObj.getRemark()))) {
-                            newObj.setProjectId(Long.parseLong(projectId));
-                            newObj.setName(oldObj.getName());
-                            newObj.setK(oldObj.getK());
-                            newObj.setV(oldObj.getV());
-                            newObj.setRemark(oldObj.getRemark());
-                            newObj.setType(1);
-                            newObj.setStatus(1);
-                            newObj.setIsDeleted(0);
-                            updateList.add(newObj);
-
-                            //如果源节点参数与现节点参数名称不一致,那么新增
-                        } else if (!oldObj.getName().equals(newObj.getName())) {
-                            insertList.add(next);
-                        }
+                    List<Long> oldIds = paramListData.stream().map(WbsParamVO::getOldId).distinct().collect(Collectors.toList());
+                    //分组查询
+                    List<List<Long>> partition = Lists.partition(oldIds, 1000);
+                    for (List<Long> ids : partition) {
+                        String sql1 = "select id,name,k,v,node_id,remark from m_wbs_param where id in( " + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                        List<WbsParam> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class));
+                        paramListOldAll.addAll(query);
+                    }
 
-                    } else if (oldObj != null) {
-                        //二次过滤,节点名称、节点id相同,修改
-                        List<WbsParam> query = paramListNow.stream().filter(f -> f.getName().equals(next.getName())
+                    //转换为map
+                    Map<Long, WbsParam> mapOld = paramListOldAll.stream().collect(Collectors.toMap(WbsParam::getId, Function.identity()));
+
+                    //获取当前项目的节点参数
+                    List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery()
+                            .select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId)
+                            .eq(WbsParam::getProjectId, Long.parseLong(projectId)));
+
+                    //判断是否存在
+                    Iterator<WbsParamVO> iterator = paramListData.iterator();
+                    while (iterator.hasNext()) {
+                        WbsParamVO next = iterator.next();
+
+                        //获取引用的节点上的源参数信息
+                        WbsParam oldObj = mapOld.get(next.getOldId());
+                        //获取被引用的节点上的现参数信息
+                        WbsParam newObj = paramListNow.stream().filter(f -> f.getK().equals(next.getK())
+                                && f.getV().equals(next.getV())
+                                && f.getName().equals(next.getName())
+                                && f.getRemark().equals(next.getRemark())
                                 && f.getNodeId().equals(next.getNodeId())
-                        ).collect(Collectors.toList());
-
-                        if (query.size() > 0) {
-                            for (WbsParam wbsParam : query) {
-                                if (oldObj.getName().equals(wbsParam.getName())) {
-                                    //修改
-                                    wbsParam.setProjectId(Long.parseLong(projectId));
-                                    wbsParam.setName(next.getName());
-                                    wbsParam.setK(next.getK());
-                                    wbsParam.setV(next.getV());
-                                    wbsParam.setRemark(next.getRemark());
-                                    wbsParam.setType(1);
-                                    wbsParam.setStatus(1);
-                                    wbsParam.setIsDeleted(0);
-                                    updateList.add(wbsParam);
+                        ).findAny().orElse(null);
+
+                        if (oldObj != null && newObj != null) {
+                            //如果源节点参数与现节点参数名称、K、V、备注一致,那么就跳过
+                            if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && oldObj.getV().equals(newObj.getV()) && oldObj.getRemark().equals(newObj.getRemark())) {
+                                iterator.remove();
+
+                                //如果源节点参数与现节点参数名称、K一致,V、备注不一致,那么就修改当前名称下的节点参数
+                            } else if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && (!oldObj.getV().equals(newObj.getV()) || !oldObj.getRemark().equals(newObj.getRemark()))) {
+                                newObj.setProjectId(Long.parseLong(projectId));
+                                newObj.setName(oldObj.getName());
+                                newObj.setK(oldObj.getK());
+                                newObj.setV(oldObj.getV());
+                                newObj.setRemark(oldObj.getRemark());
+                                newObj.setType(1);
+                                newObj.setStatus(1);
+                                newObj.setIsDeleted(0);
+                                updateList.add(newObj);
+
+                                //如果源节点参数与现节点参数名称不一致,那么新增
+                            } else if (!oldObj.getName().equals(newObj.getName())) {
+                                insertList.add(next);
+                            }
+
+                        } else if (oldObj != null) {
+                            //二次过滤,节点名称、节点id相同,修改
+                            List<WbsParam> query = paramListNow.stream().filter(f -> f.getName().equals(next.getName())
+                                    && f.getNodeId().equals(next.getNodeId())
+                            ).collect(Collectors.toList());
+
+                            if (query.size() > 0) {
+                                for (WbsParam wbsParam : query) {
+                                    if (oldObj.getName().equals(wbsParam.getName())) {
+                                        //修改
+                                        wbsParam.setProjectId(Long.parseLong(projectId));
+                                        wbsParam.setName(next.getName());
+                                        wbsParam.setK(next.getK());
+                                        wbsParam.setV(next.getV());
+                                        wbsParam.setRemark(next.getRemark());
+                                        wbsParam.setType(1);
+                                        wbsParam.setStatus(1);
+                                        wbsParam.setIsDeleted(0);
+                                        updateList.add(wbsParam);
+                                    }
                                 }
+                            } else {
+                                //新增
+                                insertList.add(next);
                             }
-                        } else {
-                            //新增
-                            insertList.add(next);
                         }
-                    }
-
-                }
 
-                if (updateList.size() > 0) {
-                    this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
+                    }
                 }
-                if (insertList.size() > 0) {
+            }
 
+            if (updateList.size() > 0) {
+                this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
+            }
+            if (insertList.size() > 0) {
+                try {
                     List<List<WbsParam>> partition1 = Lists.partition(insertList, 1000);
-                    CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                            CompletableFuture.runAsync(() -> {
-                                wbsParamServiceImpl.insertBatch(addList, 1000);
-                            }, executor)).toArray(CompletableFuture[]::new));
-                    handle.join();
+                    CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                    for (List<WbsParam> addList : partition1) {
+                        completionService.submit(() -> {
+                            wbsParamServiceImpl.insertBatch(addList, 1000);
+                            return null;
+                        });
+                    }
+                    for (int i = 0; i < partition1.size(); i++) {
+                        try {
+                            completionService.take().get();
+                        } catch (ExecutionException e) {
+                            // 异常处理
+                            e.printStackTrace();
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    //释放线程
+                    executor.shutdown();
                 }
-                return true;
+
             }
+            return true;
         }
         return false;
     }
@@ -825,7 +851,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     .eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
 
             List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
-            //List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
             if (("1").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
@@ -863,16 +888,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>lambdaQuery()
-                            .select(ContractInfo::getId, ContractInfo::getContractType)
-                            .eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTree tree : addPublicTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -885,75 +900,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setInitTableId(tree.getInitTableId().toString());
                             //新增
                             insertDataPrivateList.add(dataPrivate);
-
-                            /*同步到该项目下所有合同段*/
-                            //找到当前新增成功的元素表
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (dataContract != null) {
-                                    Long idContract = SnowFlakeUtil.getId();
-                                    dataContract.setPKeyId(idContract);
-                                    dataContract.setContractType(contractInfo.getContractType());
-                                    dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    dataContract.setWbsId(dataPrivate.getWbsId());
-                                    dataContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    dataContract.setFullName(dataContract.getNodeName());
-                                    dataContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(dataContract.getId())
-                                                    && f.getNodeName().equals(dataContract.getNodeName())
-                                                    && f.getWbsId().equals(dataContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
-                                    WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getProjectId().equals(dataContract.getProjectId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(dataContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (dataContractParent != null) {
-                                        //新增
-                                        insertDataContractList.add(dataContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(dataContractParent.getWbsId())
-                                                        && f.getProjectId().equals(dataContractParent.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (dataContractEquallyNodes.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
-                                                WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
-                                                if (dataContractCopyOrAdd != null) {
-                                                    dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
-                                                    dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
-
-                                                    insertDataContractList.add(dataContractCopyOrAdd);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
 
@@ -992,14 +938,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTreePrivate tree : addPrivateTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -1010,73 +948,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
                             dataPrivate.setInitTableId(tree.getInitTableId());
                             insertDataPrivateList.add(dataPrivate);
-
-                            //同步到该项目下的所有合同段
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (wbsTreeContract != null) {
-                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                    wbsTreeContract.setWbsId(dataPrivate.getWbsId());
-                                    wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
-                                    wbsTreeContract.setContractType(contractInfo.getContractType());
-                                    wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    wbsTreeContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(wbsTreeContract.getId())
-                                                    && f.getNodeName().equals(wbsTreeContract.getNodeName())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                    WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(wbsTreeContract.getContractId())
-                                                    && f.getProjectId().equals(wbsTreeContract.getProjectId())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(wbsTreeContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (wbsTreeContract1 != null) {
-                                        insertDataContractList.add(wbsTreeContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(wbsTreePrivate.getWbsId())
-                                                        && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (wbsTreeContracts2.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
-                                                if (wbsTreeContract2 != null) {
-                                                    wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
-                                                    wbsTreeContract2.setParentId(treeContract.getId());
-
-                                                    insertDataContractList.add(wbsTreeContract2);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
                 }
@@ -1114,14 +985,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTree tree : addPublicTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -1134,75 +997,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
                             //新增
                             insertDataPrivateList.add(dataPrivate);
-
-                            /*同步到该项目下所有合同段*/
-                            //找到当前新增成功的元素表
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract dataContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (dataContract != null) {
-                                    Long idContract = SnowFlakeUtil.getId();
-                                    dataContract.setPKeyId(idContract);
-                                    dataContract.setContractType(contractInfo.getContractType());
-                                    dataContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    dataContract.setWbsId(dataPrivate.getWbsId());
-                                    dataContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    dataContract.setFullName(dataContract.getNodeName());
-                                    dataContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        dataContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则表示没被引用,新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(dataContract.getId())
-                                                    && f.getNodeName().equals(dataContract.getNodeName())
-                                                    && f.getWbsId().equals(dataContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表在合同段wbs树中是否存在上级节点,存在则新增;不存在则不新增
-                                    WbsTreeContract dataContractParent = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getProjectId().equals(dataContract.getProjectId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(dataContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (dataContractParent != null) {
-                                        //新增
-                                        insertDataContractList.add(dataContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> dataContractEquallyNodes = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(dataContractParent.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(dataContractParent.getWbsId())
-                                                        && f.getProjectId().equals(dataContractParent.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (dataContractEquallyNodes.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContractCopy : dataContractEquallyNodes) {
-                                                WbsTreeContract dataContractCopyOrAdd = BeanUtil.copyProperties(dataContract, WbsTreeContract.class);
-                                                if (dataContractCopyOrAdd != null) {
-                                                    dataContractCopyOrAdd.setPKeyId(SnowFlakeUtil.getId());
-                                                    dataContractCopyOrAdd.setParentId(treeContractCopy.getId());
-
-                                                    insertDataContractList.add(dataContractCopyOrAdd);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
 
@@ -1239,14 +1033,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //获取当前项目下所有施工合同段id
-                    /*List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
-
-                    //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
-                    List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());*/
-
                     //构造
                     for (WbsTreePrivate tree : addPrivateTables) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
@@ -1258,73 +1044,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
 
                             insertDataPrivateList.add(dataPrivate);
-
-                            //同步到该项目下的所有合同段
-                            /*for (ContractInfo contractInfo : contractInfos) {
-                                WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(dataPrivate, WbsTreeContract.class);
-                                if (wbsTreeContract != null) {
-                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                    wbsTreeContract.setWbsId(dataPrivate.getWbsId());
-                                    wbsTreeContract.setWbsType(Integer.valueOf(dataPrivate.getWbsType()));
-                                    wbsTreeContract.setProjectId(wbsTreePrivate.getProjectId());
-                                    wbsTreeContract.setContractType(contractInfo.getContractType());
-                                    wbsTreeContract.setContractId(String.valueOf(contractInfo.getId()));
-                                    wbsTreeContract.setIsBussShow(1);
-                                    if (dataPrivate.getType() == 2) {
-                                        wbsTreeContract.setIsTypePrivatePid(dataPrivate.getPKeyId());
-                                    }
-
-                                    //判断元素表是否存在合同段,存在则不新增;不存在则新增
-                                    WbsTreeContract resultTreeContract = treeContractListAllTables.stream().filter(f ->
-                                            f.getId().equals(wbsTreeContract.getId())
-                                                    && f.getNodeName().equals(wbsTreeContract.getNodeName())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                    && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                    && f.getStatus().equals(1)
-                                    ).findAny().orElse(null);
-                                    if (resultTreeContract != null) {
-                                        continue;
-                                    }
-
-                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                    WbsTreeContract wbsTreeContract1 = treeContractListAllNodes.stream().filter(f ->
-                                            f.getContractId().equals(wbsTreeContract.getContractId())
-                                                    && f.getProjectId().equals(wbsTreeContract.getProjectId())
-                                                    && f.getWbsId().equals(wbsTreeContract.getWbsId())
-                                                    && f.getStatus().equals(1)
-                                                    && f.getType().equals(1)
-                                                    && f.getId().equals(wbsTreeContract.getParentId())
-                                    ).findAny().orElse(null);
-
-                                    if (wbsTreeContract1 != null) {
-                                        insertDataContractList.add(wbsTreeContract);
-
-                                        //获取上级父级节点同级别的复制或新增节点
-                                        List<WbsTreeContract> wbsTreeContracts2 = treeContractListAllNodes.stream().filter(f ->
-                                                (ObjectUtils.isNotEmpty(f.getOldId()) && f.getOldId().equals(String.valueOf(wbsTreeContract1.getId())))
-                                                        && f.getContractId().equals(String.valueOf(contractInfo.getId()))
-                                                        && f.getWbsId().equals(wbsTreePrivate.getWbsId())
-                                                        && f.getProjectId().equals(wbsTreePrivate.getProjectId())
-                                                        && f.getStatus().equals(1)
-                                                        && f.getType().equals(1)
-                                        ).collect(Collectors.toList());
-
-                                        if (wbsTreeContracts2.size() > 0) {
-                                            //将表单同步到复制或新增的节点下
-                                            for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                WbsTreeContract wbsTreeContract2 = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContract.class);
-                                                if (wbsTreeContract2 != null) {
-                                                    wbsTreeContract2.setPKeyId(SnowFlakeUtil.getId());
-                                                    wbsTreeContract2.setParentId(treeContract.getId());
-
-                                                    insertDataContractList.add(wbsTreeContract2);
-                                                }
-                                            }
-                                        }
-                                    }
-                                }
-                            }*/
                         }
                     }
                 }
@@ -1333,9 +1052,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             if (insertDataPrivateList.size() > 0) {
                 this.insertBatch(insertDataPrivateList, 1000);
             }
-            /*if (insertDataContractList.size() > 0) {
-                wbsTreeContractService.insertBatch(insertDataContractList, 1000);
-            }*/
             return true;
         }
         return false;
@@ -1432,12 +1148,29 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     jdbcTemplate.execute(delSql);
                 }
 
-                List<List<TextdictInfo>> partition1 = Lists.partition(insertData, 1000);
-                CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                        CompletableFuture.runAsync(() -> {
+                try {
+                    List<List<TextdictInfo>> partition1 = Lists.partition(insertData, 1000);
+                    CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                    for (List<TextdictInfo> addList : partition1) {
+                        completionService.submit(() -> {
                             textDictInfoService.insertBatch(addList, 1000);
-                        }, executor)).toArray(CompletableFuture[]::new));
-                handle.join();
+                            return null;
+                        });
+                    }
+                    for (int i = 0; i < partition1.size(); i++) {
+                        try {
+                            completionService.take().get();
+                        } catch (ExecutionException e) {
+                            // 异常处理
+                            e.printStackTrace();
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                } finally {
+                    //释放线程
+                    executor.shutdown();
+                }
 
                 return true;
             } else {

+ 47 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -37,8 +37,7 @@ import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -62,8 +61,8 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final JdbcTemplate jdbcTemplate;
     private final ITableInfoService tableInfoService;
 
-    @Resource(name = "taskExecutor1")
-    private final ThreadPoolExecutor executor;
+    //创建线程池任务
+    private final ExecutorService executor = Executors.newFixedThreadPool(4);
 
     @Override
     public IPage<WbsTreeVO> selectWbsTreePage(IPage<WbsTreeVO> page, WbsTreeVO wbsTree) {
@@ -802,13 +801,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
 
                     if (pawDTO.getReferenceType().equals("public")) {
-
-                        List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData1, 1000);
-                        CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                                CompletableFuture.runAsync(() -> {
+                        try {
+                            List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData1, 1000);
+                            CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                            for (List<WbsTreePrivate> addList : partition1) {
+                                completionService.submit(() -> {
                                     wbsTreePrivateService.insertBatch(addList, 1000);
-                                }, executor)).toArray(CompletableFuture[]::new));
-                        handle.join();
+                                    return null;
+                                });
+                            }
+                            for (int i = 0; i < partition1.size(); i++) {
+                                try {
+                                    completionService.take().get();
+                                } catch (ExecutionException e) {
+                                    // 异常处理
+                                    e.printStackTrace();
+                                }
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            //释放线程
+                            executor.shutdown();
+                        }
 
                         //修改状态
                         if (pawDTO.getWbsType() == 1) {
@@ -819,13 +834,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         }
 
                     } else if (pawDTO.getReferenceType().equals("private")) {
-
-                        List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
-                        CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
-                                CompletableFuture.runAsync(() -> {
+                        try {
+                            List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
+                            CompletionService<Void> completionService = new ExecutorCompletionService<>(executor);
+                            for (List<WbsTreePrivate> addList : partition1) {
+                                completionService.submit(() -> {
                                     wbsTreePrivateService.insertBatch(addList, 1000);
-                                }, executor)).toArray(CompletableFuture[]::new));
-                        handle.join();
+                                    return null;
+                                });
+                            }
+                            for (int i = 0; i < partition1.size(); i++) {
+                                try {
+                                    completionService.take().get();
+                                } catch (ExecutionException e) {
+                                    // 异常处理
+                                    e.printStackTrace();
+                                }
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        } finally {
+                            //释放线程
+                            executor.shutdown();
+                        }
 
                         //异步修改htmlUrl ,数据都在insertData2里
                         wbsTreePrivateService.batchResetHtmlUrl(insertData2);

+ 0 - 191
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ThreadPoolMonitor.java

@@ -1,191 +0,0 @@
-package org.springblade.manager.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class ThreadPoolMonitor extends ThreadPoolExecutor {
-    private final Logger logger = LoggerFactory.getLogger(getClass());
-
-    /**
-     * ActiveCount
-     */
-    int ac = 0;
-
-    /**
-     * 当前所有线程消耗的时间
-     */
-    private AtomicLong totalCostTime = new AtomicLong();
-
-    /**
-     * 当前执行的线程总数
-     */
-    private AtomicLong totalTasks = new AtomicLong();
-
-    /**
-     * 线程池名称
-     */
-    private String poolName;
-
-    /**
-     * 最短 执行时间
-     */
-    private long minCostTime;
-
-    /**
-     * 最长执行时间
-     */
-    private long maxCostTime;
-
-
-    /**
-     * 保存任务开始执行的时间
-     */
-    private ThreadLocal<Long> startTime = new ThreadLocal<>();
-
-    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
-                             TimeUnit unit, BlockingQueue<Runnable> workQueue, String poolName) {
-        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
-                Executors.defaultThreadFactory(), poolName);
-    }
-
-    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
-                             TimeUnit unit, BlockingQueue<Runnable> workQueue,
-                             ThreadFactory threadFactory, String poolName) {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
-        this.poolName = poolName;
-    }
-
-    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler, String poolName) {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
-        this.poolName = poolName;
-    }
-
-    /**
-     * 线程池延迟关闭时(等待线程池里的任务都执行完毕),统计线程池情况
-     */
-    @Override
-    public void shutdown() {
-        // 统计已执行任务、正在执行任务、未执行任务数量
-        logger.info("{} Going to shutdown. Executed tasks: {}, Running tasks: {}, Pending tasks: {}",
-                this.poolName, this.getCompletedTaskCount(), this.getActiveCount(), this.getQueue().size());
-        super.shutdown();
-    }
-
-    @Override
-    public List<Runnable> shutdownNow() {
-        // 统计已执行任务、正在执行任务、未执行任务数量
-        logger.info("{} Going to immediately shutdown. Executed tasks: {}, Running tasks: {}, Pending tasks: {}",
-                this.poolName, this.getCompletedTaskCount(), this.getActiveCount(), this.getQueue().size());
-        return super.shutdownNow();
-    }
-
-    /**
-     * 任务执行之前,记录任务开始时间
-     */
-    @Override
-    protected void beforeExecute(Thread t, Runnable r) {
-        logger.info("{}-before: " +
-                        " PoolSize: {}, CorePoolSize: {}, ActiveCount: {}, " +
-                        "Completed: {}, Task: {}, Queue: {}, LargestPoolSize: {}, " +
-                        "MaximumPoolSize: {},  KeepAliveTime: {}, isShutdown: {}, isTerminated: {}",
-                this.poolName,
-                this.getPoolSize(), this.getCorePoolSize(), super.getActiveCount(),
-                this.getCompletedTaskCount(), this.getTaskCount(), this.getQueue().size(), this.getLargestPoolSize(),
-                this.getMaximumPoolSize(), this.getKeepAliveTime(TimeUnit.MILLISECONDS), this.isShutdown(), this.isTerminated());
-        startTime.set(System.currentTimeMillis());
-    }
-
-    /**
-     * 任务执行之后,计算任务结束时间
-     */
-    @Override
-    protected void afterExecute(Runnable r, Throwable t) {
-        long costTime = System.currentTimeMillis() - startTime.get();
-        startTime.remove();  //删除,避免占用太多内存
-        //设置最大最小执行时间
-        maxCostTime = maxCostTime > costTime ? maxCostTime : costTime;
-        if (totalTasks.get() == 0) {
-            minCostTime = costTime;
-        }
-        minCostTime = minCostTime < costTime ? minCostTime : costTime;
-        totalCostTime.addAndGet(costTime);
-        totalTasks.incrementAndGet();
-        ac = this.getActiveCount();  //获取ActiveCount的值
-
-        logger.info("{}-after: " +
-                        "Duration: {} ms, PoolSize: {}, CorePoolSize: {}, ActiveCount: {}, " +
-                        "Completed: {}, Task: {}, Queue: {}, LargestPoolSize: {}, " +
-                        "MaximumPoolSize: {},  KeepAliveTime: {}, isShutdown: {}, isTerminated: {}",
-                this.poolName,
-                costTime, this.getPoolSize(), this.getCorePoolSize(), super.getActiveCount(),
-                this.getCompletedTaskCount(), this.getTaskCount(), this.getQueue().size(), this.getLargestPoolSize(),
-                this.getMaximumPoolSize(), this.getKeepAliveTime(TimeUnit.MILLISECONDS), this.isShutdown(), this.isTerminated());
-    }
-
-    public int getAc() {
-        return ac;
-    }
-
-    /**
-     * 线程平均耗时
-     *
-     * @return
-     */
-    public float getAverageCostTime() {
-        return totalCostTime.get() / totalTasks.get();
-    }
-
-    /**
-     * 线程最大耗时
-     */
-    public long getMaxCostTime() {
-        return maxCostTime;
-    }
-
-    /**
-     * 线程最小耗时
-     */
-    public long getMinCostTime() {
-        return minCostTime;
-    }
-
-    /**
-     * 生成线程池所用的线程,改写了线程池默认的线程工厂
-     */
-    static class EventThreadFactory implements ThreadFactory {
-        private static final AtomicInteger poolNumber = new AtomicInteger(1);
-        private final ThreadGroup group;
-        private final AtomicInteger threadNumber = new AtomicInteger(1);
-        private final String namePrefix;
-
-        /**
-         * 初始化线程工厂
-         *
-         * @param poolName 线程池名称
-         */
-        EventThreadFactory(String poolName) {
-            SecurityManager s = System.getSecurityManager();
-            group = Objects.nonNull(s) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
-            namePrefix = poolName + "-pool-" + poolNumber.getAndIncrement() + "-thread-";
-        }
-
-        @Override
-        public Thread newThread(Runnable r) {
-            Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
-
-            if (t.isDaemon()) {
-                t.setDaemon(false);
-            }
-            if (t.getPriority() != Thread.NORM_PRIORITY) {
-                t.setPriority(Thread.NORM_PRIORITY);
-            }
-            return t;
-        }
-    }
-}