Prechádzať zdrojové kódy

合同段wbs同步元素表bug

liuyc 2 rokov pred
rodič
commit
3e7028f03f

+ 18 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1506,10 +1506,18 @@ public class InformationWriteQueryController extends BladeController {
                                 }
                             }
                         }
-                        //去除末尾的逗号
-                        if (newString.length() > 0) {
-                            newString.deleteCharAt(newString.length() - 1);
+
+                        if (newString.length() <= 0) {
+                            //如果没值,那么根据keys构造keys数位的null值字符串
+                            int size = filteredList.size();
+                            for (int i = 0; i < size; i++) {
+                                newString.append("null,");
+                            }
                         }
+                        //去除末尾的逗号
+                        newString.deleteCharAt(newString.length() - 1);
+                        //首位拼接逗号
+                        newString.insert(0, ",");
 
                         //delete SQL (先删除旧数据,再新增)
                         String delSql = "DELETE FROM " + tableName + " WHERE p_key_id = " + newData.getPKeyId() + " ; ";
@@ -1520,8 +1528,7 @@ public class InformationWriteQueryController extends BladeController {
                                 .append(keys)
                                 .append(") VALUES (")
                                 .append(SnowFlakeUtil.getId()).append(",")
-                                .append(newData.getPKeyId()).append(",")
-                                .append("null").append(",")
+                                .append(newData.getPKeyId()).append(",null")
                                 .append(newString).append(") ; ");
                     }
                 }
@@ -3004,7 +3011,9 @@ public class InformationWriteQueryController extends BladeController {
     }
 
     @NotNull
-    public R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
+    public R<Boolean> saveOrCopyNodeTree
+            (List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer
+                    operationType, WbsTreeContract currentNode) {
         if (saveList.size() > 0) {
             //StringBuilder str = new StringBuilder();
             //str.append("-" + saveList.get(0).getFullName());
@@ -3048,7 +3057,9 @@ public class InformationWriteQueryController extends BladeController {
     }
 
     @NotNull
-    private R<Boolean> saveOrCopyNodeTree2(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
+    private R<Boolean> saveOrCopyNodeTree2
+            (List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer
+                    operationType, WbsTreeContract currentNode) {
         if (saveList.size() > 0) {
             //StringBuilder str = new StringBuilder();
             //str.append("-" + saveList.get(0).getFullName());

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -758,11 +758,11 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                             baseMapper.insertWbsTabRelationExcelTab(SnowFlakeUtil.getId(), formElementDTO.getExcelTabId(), formElementDTO.getId());
                         }
 
-                        // 绑定excel 与实体表的关系
+                        /*// 绑定excel 与实体表的关系
                         excelTabService.update(Wrappers.<ExcelTab>lambdaUpdate()
                                 .set(ExcelTab::getTabId, formElementDTO.getInitTableId())
                                 .eq(ExcelTab::getId, formElementDTO.getExcelTabId())
-                        );
+                        );*/
                     }
                 } catch (Exception e) {
                     //删除元素表

+ 118 - 52
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -103,11 +103,12 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     public boolean submitWbsTreeInContract(WbsTreeContractDTO pawDTO) {
         String wbsTreeIds = pawDTO.getWbsTreeIds();
         String[] ids = wbsTreeIds.split(",");
+        //项目对应到合同段的入参节点ids
         List<String> idList = Arrays.asList(ids);
         List<String> idList1 = idList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
 
-        //获取当前合同段所有节点、表单(不包括客户端新增或者复制节点)
-        List<WbsTreeContract> list = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+        //获取当前合同段所有节点、表单(不包括客户端新增或者复制节点)
+        List<WbsTreeContract> nowContractNodeAndTabAll = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
                 .select(WbsTreeContract::getId, WbsTreeContract::getType)
                 .eq(WbsTreeContract::getContractId, pawDTO.getContractId())
                 .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
@@ -115,56 +116,55 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 .isNull(WbsTreeContract::getOldId));
 
         //当前合同段所有表单ids
-        List<String> collect1 = new ArrayList<>();
+        List<String> nowContractTabIds = new ArrayList<>();
         //当前合同段所有节点ids
-        List<String> collect2 = new ArrayList<>();
-        if (list.size() > 0) {
-            collect1 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
-            collect2 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
+        List<String> nowContractNodeIds = new ArrayList<>();
+        if (nowContractNodeAndTabAll.size() > 0) {
+            nowContractTabIds = nowContractNodeAndTabAll.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
+            nowContractNodeIds = nowContractNodeAndTabAll.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).map(String::valueOf).collect(Collectors.toList());
         }
 
-        List<String> collect3 = collect2;
-        List<String> saveIds = idList1.stream().filter(f -> !collect3.contains(f)).collect(Collectors.toList());
-        List<String> delIds = collect3.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
+        List<String> finalNowContractNodeIds = nowContractNodeIds;
+        List<String> saveIds = idList1.stream().filter(f -> !finalNowContractNodeIds.contains(f)).collect(Collectors.toList());
+        List<String> delIds = finalNowContractNodeIds.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
 
         //TODO ---------节点未变只同步元素表---------
         if (saveIds.size() == 0 && delIds.size() == 0) {
-            //当前项目节点下的所有表单Ids
-            List<String> collect = new ArrayList<>();
-
-            //当前项目所有表
-            List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+            //当前项目所有原始表(从公有树到项目私有树同步后的,或是私有到私有的)
+            List<WbsTreePrivate> nowProjectTabs = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getType)
                     .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
                     .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
                     .eq(WbsTreePrivate::getStatus, 1)
                     .eq(WbsTreePrivate::getType, 2)
             );
+            //判断当前的表是否有在合同段中有上级节点(不存在上级节点的表说明没有分配,不参与同步,根据入参的节点id与当前项目表的parentId判断)
+            List<String> saveSyncTabIds = nowProjectTabs.stream()
+                    .flatMap(wbsTreePrivate -> idList1.stream()
+                            .filter(id -> Long.parseLong(id) == (wbsTreePrivate.getParentId()) && wbsTreePrivate.getType() == 2)
+                            .map(id -> String.valueOf(wbsTreePrivate.getId())))
+                    .collect(Collectors.toList());
 
-            wbsTreePrivateList.forEach(wbsTreePrivate -> {
-                idList1.forEach(id -> {
-                    if (Long.parseLong(id) == (wbsTreePrivate.getParentId()) && wbsTreePrivate.getType() == 2) {
-                        collect.add(wbsTreePrivate.getId() + "");
-                    }
-                });
-            });
-
-            if (collect.size() == collect1.size()) {
+            //如果当前项目表与入参合同段的表一样数量,那么不需要同步
+            if (saveSyncTabIds.size() == nowContractTabIds.size()) {
                 return true;
             }
 
-            List<String> finalCollect = collect1;
-            List<String> collect5 = collect.stream().filter(f -> !finalCollect.contains(f)).collect(Collectors.toList());
+            //不同表(需要保存的表),根据当前合同段判断
+            List<String> finalCollect = nowContractTabIds;
+            List<String> saveTabIds = saveSyncTabIds.stream().filter(f -> !finalCollect.contains(f)).collect(Collectors.toList());
 
+            //构造结果集
             List<WbsTreeContract> wbsTreeContractResultData = new ArrayList<>();
-            if (collect5.size() > 0) {
-                List<WbsTreeContract> wbsTreeContractList = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().in(WbsTreeContract::getId, collect5)
-                        .eq(WbsTreeContract::getContractId, pawDTO.getContractId())
-                        .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
-                        .eq(WbsTreeContract::getType, 2)
-                        .eq(WbsTreeContract::getStatus, 1)
-                );
-                wbsTreeContractList.forEach(obj -> {
+            if (!saveTabIds.isEmpty()) {
+                //获取对应需要同步的表信息(项目级)
+                List<WbsTreePrivate> needSaveSyncProjectTabs = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                        .in(WbsTreePrivate::getId, saveTabIds)
+                        .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
+                        .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
+                        .eq(WbsTreePrivate::getType, 2)
+                        .eq(WbsTreePrivate::getStatus, 1));
+                needSaveSyncProjectTabs.forEach(obj -> {
                     WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(obj, WbsTreeContract.class);
                     if (wbsTreeContract != null) {
                         wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
@@ -172,6 +172,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         wbsTreeContract.setProjectId(pawDTO.getProjectId());
                         wbsTreeContract.setContractId(pawDTO.getContractId());
                         wbsTreeContract.setIsTypePrivatePid(obj.getPKeyId());
+                        wbsTreeContract.setCreateTime(new Date());
                         if (obj.getType() == 2) {
                             wbsTreeContract.setIsTypePrivatePid(obj.getPKeyId());
                         }
@@ -181,7 +182,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
 
             if (wbsTreeContractResultData.size() > 0) {
-                //获取当前合同段的复制节点或者新增节点(最底层节点)
+                //获取当前合同段的复制节点或者新增节点最底层节点只有最底层节点存在元素表
                 String sql = "SELECT a.id, a.old_id," +
                         " (SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END" +
                         " FROM m_wbs_tree_contract b" +
@@ -202,38 +203,53 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         " AND a.old_id is not null" +
                         " HAVING hasChildren = 0";
                 List<WbsTreeContract> copyAndAddNodeList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-                List<WbsTreeContract> copyAddNodeTabs = new ArrayList<>();
+
+                //新增复制节点对应的表结果集
+                List<WbsTreeContract> copyAddNodeTabsResult = new ArrayList<>();
                 if (copyAndAddNodeList.size() > 0) {
-                    //转换为Map,oldId作为Key,id作为value
+                    //转换为Map,oldId作为Key,id作为Value
                     Map<String, List<WbsTreeContract>> oldIdToIdMap = copyAndAddNodeList.stream().collect(Collectors.groupingBy(WbsTreeContract::getOldId));
                     for (WbsTreeContract synTab : wbsTreeContractResultData) {
-                        List<WbsTreeContract> nodeIds = oldIdToIdMap.get(synTab.getParentId().toString());
-                        if (nodeIds != null && nodeIds.size() > 0) {
-                            WbsTreeContract copyAddNodeTab = BeanUtil.copyProperties(synTab, WbsTreeContract.class);
-                            for (WbsTreeContract nodeId : nodeIds) {
+                        //获取每张需要同步的表与之对应的新增或复制的节点
+                        List<WbsTreeContract> copyOrAddNodes = oldIdToIdMap.get(synTab.getParentId().toString());
+                        if (copyOrAddNodes != null && copyOrAddNodes.size() > 0) {
+                            for (WbsTreeContract node : copyOrAddNodes) {
+                                WbsTreeContract copyAddNodeTab = BeanUtil.copyProperties(synTab, WbsTreeContract.class);
                                 if (copyAddNodeTab != null) {
-                                    copyAddNodeTab.setParentId(nodeId.getId());
+                                    //把表同步到对应的节点下,重新构造ParentId、Ancestors、PKeyId
+                                    copyAddNodeTab.setParentId(node.getId());
                                     copyAddNodeTab.setAncestors(synTab.getAncestors().replace(synTab.getParentId() + "", copyAddNodeTab.getParentId() + ""));
                                     copyAddNodeTab.setPKeyId(SnowFlakeUtil.getId());
+                                    copyAddNodeTab.setOldId(synTab.getId() + "");
                                     copyAddNodeTab.setCreateTime(new Date());
-                                    copyAddNodeTabs.add(copyAddNodeTab);
+                                    copyAddNodeTabsResult.add(copyAddNodeTab);
                                 }
                             }
                         }
                     }
                 }
-                if (copyAddNodeTabs.size() > 0) {
-                    //新增复制节点的表
-                    wbsTreeContractResultData.addAll(copyAddNodeTabs);
+                if (copyAddNodeTabsResult.size() > 0) {
+                    wbsTreeContractResultData.addAll(copyAddNodeTabsResult);
+                }
+
+                //去重,构造wbsTreeContractResultData列表中的唯一组合(id, parent_id, wbs_id, contract_id)
+                Set<String> uniqueCombinations = new HashSet<>();
+                for (WbsTreeContract contract : wbsTreeContractResultData) {
+                    String combination = contract.getId() + "_" + contract.getParentId() + "_" + contract.getWbsId() + "_" + contract.getContractId();
+                    uniqueCombinations.add(combination);
+                }
+                List<String> existingCombinations = new ArrayList<>();
+                if (!uniqueCombinations.isEmpty()) {
+                    String inClause = "'" + String.join("','", uniqueCombinations) + "'";
+                    String sqlStr = "SELECT CONCAT(id, '_', parent_id, '_', wbs_id, '_', contract_id) AS combination FROM m_wbs_tree_contract WHERE type = 2 AND is_deleted = 0 AND status = 1 AND CONCAT(id, '_', parent_id, '_', wbs_id, '_', contract_id) IN (" + inClause + ")";
+                    existingCombinations = jdbcTemplate.queryForList(sqlStr, String.class);
                 }
                 Iterator<WbsTreeContract> iterator = wbsTreeContractResultData.iterator();
                 while (iterator.hasNext()) {
                     WbsTreeContract next = iterator.next();
-                    if (next != null) {
-                        Long aLong = jdbcTemplate.queryForObject("select count(1) from m_wbs_tree_contract where type = 2 and is_deleted = 0 and status = 1 and id = " + next.getId() + " and parent_id = " + next.getParentId() + " and wbs_id = " + next.getWbsId() + " and contract_id = " + next.getContractId(), Long.class);
-                        if (aLong != null && aLong > 0L) {
-                            iterator.remove();
-                        }
+                    String combination = next.getId() + "_" + next.getParentId() + "_" + next.getWbsId() + "_" + next.getContractId();
+                    if (existingCombinations.contains(combination)) {
+                        iterator.remove();
                     }
                 }
                 this.insertBatch(wbsTreeContractResultData, 1000);
@@ -270,7 +286,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
             //TODO ---------新增---------
             if (saveIds.size() > 0) {
-                List<WbsTreePrivate> wbsTreePrivatesList = new ArrayList<>();
+                /*List<WbsTreePrivate> wbsTreePrivatesList = new ArrayList<>();
                 List<WbsTreeContract> wbsTreeContractList = new ArrayList<>();
                 ArrayList<ConstructionLedger> constructionLedgerList = new ArrayList<>();
 
@@ -320,6 +336,56 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     }
                 });
 
+                this.insertBatch(wbsTreeContractList, 1000);
+                constructionLedgerFeign.initConstructionLedger(constructionLedgerList);*/
+
+                ArrayList<ConstructionLedger> constructionLedgerList = new ArrayList<>();
+                List<WbsTreePrivate> wbsTreePrivatesList = wbsTreePrivateMapper.selectNodeAndTable2(pawDTO.getWbsId(), pawDTO.getProjectId());
+                Set<Long> saveIdsSet = saveIds.stream().map(Long::parseLong).collect(Collectors.toSet());
+                List<WbsTreeContract> wbsTreeContractList = wbsTreePrivatesList.stream()
+                        .filter(wbsTreePrivate -> {
+                            if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
+                                return saveIdsSet.contains(wbsTreePrivate.getId()) ||
+                                        (saveIdsSet.contains(wbsTreePrivate.getParentId()) && wbsTreePrivate.getType() == 2);
+                            }
+                            return false;
+                        })
+                        .map(wbsTreePrivate -> {
+                            WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(wbsTreePrivate, WbsTreeContract.class);
+                            if (wbsTreeContract != null) {
+                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                wbsTreeContract.setWbsId(pawDTO.getWbsId());
+                                wbsTreeContract.setWbsType(Integer.valueOf(wbsTreePrivate.getWbsType()));
+                                wbsTreeContract.setIsBussShow(1);
+                                wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                                wbsTreeContract.setContractId(pawDTO.getContractId());
+                                wbsTreeContract.setIsConcealedWorksNode(0);
+                                wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
+                                wbsTreeContract.setCreateTime(new Date());
+                                if (wbsTreePrivate.getType() == 2) {
+                                    wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
+                                }
+                                if (wbsTreePrivate.getType() == 1) {
+                                    wbsTreeContract.setImportMatchingInfo(wbsTreePrivate.getFullName());
+                                }
+                                //台账
+                                if (wbsTreeContract.getNodeType() == 6) {
+                                    ConstructionLedger constructionLedger = new ConstructionLedger();
+                                    constructionLedger.setIsBeton(0);
+                                    constructionLedger.setWbsId(wbsTreeContract.getPKeyId());
+                                    constructionLedger.setSite(wbsTreeContract.getNodeName());
+                                    constructionLedger.setStation(wbsTreeContract.getNodeName());
+                                    constructionLedger.setContractId(Long.parseLong(pawDTO.getContractId()));
+                                    constructionLedgerList.add(constructionLedger);
+                                }
+                                return wbsTreeContract;
+                            }
+                            return null;
+                        })
+                        .filter(Objects::nonNull)
+                        .collect(Collectors.toList());
+
+                //入库
                 this.insertBatch(wbsTreeContractList, 1000);
                 constructionLedgerFeign.initConstructionLedger(constructionLedgerList);
             }

+ 70 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -796,7 +796,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     List<WbsTreePrivate> insertData2 = new ArrayList<>();
 
                     if (pawDTO.getReferenceType().equals("public")) {
-                        List<WbsTree> addListData = new ArrayList<>();
+                        /*List<WbsTree> addListData = new ArrayList<>();
                         //获取当前树下所有节点、表信息
                         List<WbsTree> treesAll = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, pawDTO.getWbsId()).eq(WbsTree::getStatus, 1));
                         for (WbsTree wbsTree : treesAll) {
@@ -819,16 +819,34 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                 wbsTreePrivate.setInitTableId(ObjectUtil.isNotEmpty(tree.getInitTableId()) ? String.valueOf(tree.getInitTableId()) : null);
                             }
                             insertData1.add(wbsTreePrivate);
-                        });
+                        });*/
+
+                        //获取当前树下所有节点、表信息
+                        List<WbsTree> treesAll = baseMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+                                .eq(WbsTree::getWbsId, pawDTO.getWbsId())
+                                .eq(WbsTree::getStatus, 1));
+
+                        Set<Long> saveIdsSet = saveIds.stream().map(Long::parseLong).collect(Collectors.toSet());
+
+                        insertData1 = treesAll.stream()
+                                .filter(wbsTree -> saveIdsSet.contains(wbsTree.getId()) || (saveIdsSet.contains(wbsTree.getParentId()) && wbsTree.getType() == 2))
+                                .map(tree -> {
+                                    WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                                    if (wbsTreePrivate != null) {
+                                        wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                                        wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                                        wbsTreePrivate.setProjectId(pawDTO.getProjectId());
+                                        wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+                                        wbsTreePrivate.setInitTableId(ObjectUtil.isNotEmpty(tree.getInitTableId()) ? String.valueOf(tree.getInitTableId()) : null);
+                                    }
+                                    return wbsTreePrivate;
+                                })
+                                .collect(Collectors.toList());
 
                     } else if (pawDTO.getReferenceType().equals("private")) {
                         List<WbsTreePrivate> addListData = new ArrayList<>();
 
-                        /*//获取当前树下所有节点、表信息(type=10独立表)
-                        List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId()).and(obj -> obj.eq(WbsTreePrivate::getType, 1).or().eq(WbsTreePrivate::getType, 2)));
-                        List<WbsTreePrivate> wbsTreePrivatesTableDLOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getParentId, -10).isNull(WbsTreePrivate::getWbsId));
-                        wbsTreePrivatesNodeAndTab.addAll(wbsTreePrivatesTableDLOld);*/
-
+                        //获取私有引用模板树信息
                         List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                                 .eq(WbsTreePrivate::getStatus, 1)
                                 .eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId())
@@ -837,7 +855,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         //获取当前项目下的所有独立表
                         List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().select(WbsTreePrivate::getId).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getParentId, -10).eq(WbsTreePrivate::getStatus, 1));
 
-                        for (WbsTreePrivate wbsTreePrivate : wbsTreePrivatesNodeAndTab) {
+                        /*for (WbsTreePrivate wbsTreePrivate : wbsTreePrivatesNodeAndTab) {
                             if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
                                 for (String id : saveIds) {
                                     if (Long.parseLong(id) == (wbsTreePrivate.getId())) {
@@ -880,6 +898,50 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                 }
                                 insertData2.add(wbsTreePrivate);
                             }
+                        });*/
+
+                        Set<Long> saveIdsSet = saveIds.stream().map(Long::parseLong).collect(Collectors.toSet());
+
+                        wbsTreePrivatesNodeAndTab.forEach(wbsTreePrivate -> {
+                            boolean isType1Or2 = wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2;
+                            boolean isType10WithParentIdMinus10 = wbsTreePrivate.getType() == 10 && wbsTreePrivate.getParentId() == -10;
+                            if (isType1Or2) {
+                                boolean isIdInSaveIds = saveIdsSet.contains(wbsTreePrivate.getId());
+                                boolean isParentIdInSaveIds = saveIdsSet.contains(wbsTreePrivate.getParentId()) && wbsTreePrivate.getType() == 2;
+                                if (isIdInSaveIds || isParentIdInSaveIds) {
+                                    addListData.add(wbsTreePrivate);
+                                }
+                            }
+
+                            if (isType10WithParentIdMinus10) {
+                                //判断是否存在独立表单,不存在则添加
+                                boolean existsInWbsTreePrivatesTableDL = wbsTreePrivatesTableDL.stream().anyMatch(t -> t.getId().equals(wbsTreePrivate.getId()));
+                                if (!existsInWbsTreePrivatesTableDL) {
+                                    addListData.add(wbsTreePrivate);
+                                }
+                            }
+                        });
+
+                        List<WbsTreePrivate> collect = addListData.stream()
+                                .filter(f -> f.getType().equals(1) || f.getType().equals(2) || (f.getHtmlUrl() != null && f.getType().equals(10)))
+                                .collect(Collectors.toList());
+                        collect.forEach(tree -> {
+                            WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                            if (wbsTreePrivate != null) {
+                                wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                                wbsTreePrivate.setProjectId(pawDTO.getProjectId());
+                                wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+                                wbsTreePrivate.setInitTableId(ObjectUtil.isNotEmpty(tree.getInitTableId()) ? String.valueOf(tree.getInitTableId()) : null);
+                                wbsTreePrivate.setHtmlUrl(ObjectUtil.isNotEmpty(tree.getHtmlUrl()) ? tree.getHtmlUrl() : null);
+                                if (tree.getType() == 10) {
+                                    wbsTreePrivate.setWbsId(null);
+                                    wbsTreePrivate.setWbsType(null);
+                                } else {
+                                    wbsTreePrivate.setWbsId(pawDTO.getPrimaryKeyId());
+                                    wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                                }
+                                insertData2.add(wbsTreePrivate);
+                            }
                         });
                     }
 
@@ -888,19 +950,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         for (List<WbsTreePrivate> addList : partition1) {
                             wbsTreePrivateService.insertBatch(addList, 1000);
                         }
-
-                        //修改状态
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
                         if (pawDTO.getWbsType() == 2) {
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
-
                         if (pawDTO.getWbsType() == 5) {
                             projectInfoMapper.updateTemplateInfoLar(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
-
                     } else if (pawDTO.getReferenceType().equals("private")) {
                         List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
                         for (List<WbsTreePrivate> addList : partition1) {
@@ -910,14 +968,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         //异步修改htmlUrl
                         wbsTreePrivateService.batchResetHtmlUrl(insertData2);
 
-                        //修改状态
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
                         if (pawDTO.getWbsType() == 2) {
                             projectInfoMapper.updateTemplateInfoTrial(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
-
                         if (pawDTO.getWbsType() == 5) {
                             projectInfoMapper.updateTemplateInfoLar(pawDTO.getProjectId(), pawDTO.getWbsId(), "private");
                         }