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

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex

lvy 4 сар өмнө
parent
commit
38c286e8a1

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/CustomAddContractNodeDTO.java

@@ -48,4 +48,7 @@ public class CustomAddContractNodeDTO implements Serializable {
     @ApiModelProperty(value = "新加的自定义划分编号")
     private String newPartitionCode;
 
+    @ApiModelProperty(value = "模板类型 1模版节点 2底层节点")
+    private Integer templateType;
+
 }

+ 22 - 20
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -4382,26 +4382,28 @@ public R<Object> customAddContractNode(@RequestBody CustomAddContractNodeDTO dto
     }
     WbsTreeContract parentNode = wbsTreeContractClient.getContractNodeByPrimaryKeyId(dto.getPrimaryKeyId());
     if (parentNode != null) {
-        Integer targetType;//当前节点类型
-        Integer sourceType;//父节点类型
-        if(parentNode.getNodeType()!=1){
-            sourceType=parentNode.getNodeType()+1;
-        }else {
-            sourceType=parentNode.getNodeType();
-        }
-        if(parentNode.getNodeType()==18){
-            sourceType=2;
-        }
-        if(dto.getNodeType()!=1){
-            targetType=dto.getNodeType()+1;
-        }else {
-            targetType=dto.getNodeType();
-        }
-        if(dto.getNodeType()==18){
-            targetType=2;
-        }
-        if(sourceType>=targetType){
-            throw new ServiceException("当前新增选择的节点类型不能大于或等于父级节点类型");
+        if(dto.getTemplateType()!=null&&dto.getTemplateType()==2){
+            Integer targetType;//当前节点类型
+            Integer sourceType;//父节点类型
+            if(parentNode.getNodeType()!=1){
+                sourceType=parentNode.getNodeType()+1;
+            }else {
+                sourceType=parentNode.getNodeType();
+            }
+            if(parentNode.getNodeType()==18){
+                sourceType=2;
+            }
+            if(dto.getNodeType()!=1){
+                targetType=dto.getNodeType()+1;
+            }else {
+                targetType=dto.getNodeType();
+            }
+            if(dto.getNodeType()==18){
+                targetType=2;
+            }
+            if(sourceType>=targetType){
+                throw new ServiceException("当前新增选择的节点类型不能大于或等于父级节点类型");
+            }
         }
         WbsTreeContract obj = new WbsTreeContract();
         obj.setPKeyId(SnowFlakeUtil.getId());

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

@@ -65,6 +65,7 @@ public interface IWbsTreePrivateService extends BaseService<WbsTreePrivate> {
     void eVisInfoRepeatDel(String pid);
 
     boolean syncNodeTable(String primaryKeyId);
+    List<WbsTreePrivate> syncNodeTable(String primaryKeyIdm,String a);
 
     R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, Long contractId);
 

+ 562 - 302
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.service.impl;
 
+import cn.hutool.core.lang.func.LambdaUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.log.StaticLog;
@@ -1535,333 +1536,204 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
     }
 
-    @Override
-    public boolean syncNodeTable(String primaryKeyId) {
+
+    public List<WbsTreePrivate> syncNodeTable(String primaryKeyId, String projectId) {
+
         if (StringUtils.isNotEmpty(primaryKeyId)) {
             //获取当前节点对应节点信息
             WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
+
+            //当前节点对应的模板节点信息
+            WbsTree wbsTreeTemplate = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery()
+                    .eq(WbsTree::getId, wbsTreePrivate.getTreePId()));
+
             //获取项目信息
             ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
-            //结果集
-            List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
-            List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
+            //结果集
+            List<WbsTreePrivate> addData = new ArrayList<>();
+            //质检
             if (("1").equals(wbsTreePrivate.getWbsType())) {
+                //当前节点引用的模板为公有模板
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
-                    /*-------------------------------------质检公有引用同步--------------------------------------------*/
-                    //获取当前节点对应的公有引用树下的元素表
-                    List<WbsTree> wbsTrees = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
-                            .select(WbsTree::getAncestors, WbsTree::getWbsId, WbsTree::getId)
-                            .and(wq -> wq.eq(WbsTree::getId, wbsTreePrivate.getId())
-                                    .or()
-                                    .eq(WbsTree::getId, wbsTreePrivate.getTreePId()))
-                    );
-                    List<WbsTree> wbsTreesPublicTables;
-                    WbsTree wbsTree = wbsTrees.get(0);
-                    if (wbsTree.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                                        .select(WbsTree::getId, WbsTree::getParentId)
-                                        .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
-                                /*.eq(WbsTree::getStatus,1)*/
-                        );
+
+                    //模板节点的所有子节点信息
+                    List<WbsTree> wbsTrees = null;
+                    //当前节点信息
+                    List<WbsTreePrivate> wbsTreePrivates = null;
+                    //判断是否为最顶级节点
+                    if (wbsTreeTemplate.getParentId() == 0) {
+                        //如果时最顶级节点  就获取所有节点信息
+                        wbsTrees = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+                                .eq(WbsTree::getWbsId, wbsTreePrivate.getWbsId())
+                                .eq(WbsTree::getIsDeleted, 0));
                     } else {
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                                .select(WbsTree::getId, WbsTree::getParentId)
-                                .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
-                                /*.eq(WbsTree::getStatus,1)*/
-                                .like(WbsTree::getAncestors, wbsTree.getId())
-                        );
+                        //获取列明
+                        String fieldName = LambdaUtil.getFieldName(WbsTree::getAncestors);
+                        wbsTrees = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+                                .eq(WbsTree::getIsDeleted, 0)
+                                .apply("FIND_IN_SET({0}," + fieldName + ")", wbsTreeTemplate.getId()));
                     }
 
-                    //获取当前项目树下的元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors, WbsTreePrivate::getTreePId)
-                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            /*.eq(WbsTreePrivate::getStatus, 1)*/
-                    );
-                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
 
-                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+                    //2、获取当前节点下的节点信息
+                    if (wbsTreePrivate.getTreePId() == 0) {
+                        wbsTreePrivates = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                                .eq(WbsTreePrivate::getIsDeleted, 0));
                     } else {
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                        //获取列明
+                        wbsTreePrivates = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .eq(WbsTreePrivate::getIsDeleted, 0)
+                                .apply("FIND_IN_SET({0},ancestors_p_id)", wbsTreePrivate.getPId()));
                     }
 
-                    //获取新增的公有元素表addPublicTable
-//                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
-                    Set<Long> privateIdsAndPids = wbsTreePrivatesProjectTables.stream()
+                    if (wbsTreePrivates.isEmpty()) {
+                        throw new ServiceException("无法找到模板对应节点,请检查模板节点");
+                    }
+                    //3、获取需要新增的节点或者表单节点信息 以及他们对应的父级节点信息
+
+
+                    //获取id 和 tree_p_id 组成的集合
+                    Set<Long> ids = wbsTreePrivates.stream()
                             .flatMap(p -> Stream.of(p.getId(), p.getTreePId()))
                             .collect(Collectors.toSet());
 
-                    // 过滤 wbsTreesPublicTables
-                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream()
-                            .filter(f -> !privateIdsAndPids.contains(f.getId()))
+
+                    //3.1筛选出需要新增的节点
+                    List<WbsTree> addNodes = wbsTrees.stream()
+                            .filter(f -> !ids.contains(f.getId()))
                             .collect(Collectors.toList());
-                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                    //  List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
-                    //         wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
-                    //构造
-                    List<Long> ids = addPublicTable.stream().map(WbsTree::getId).collect(Collectors.toList());
-                    if (ids.size() > 0) {
-                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
-                        for (WbsTree tree : resultDataList) {
-                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                            if (dataPrivate != null) {
-                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
-                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                                dataPrivate.setFullName(dataPrivate.getNodeName());
-                                dataPrivate.setInitTableId(tree.getInitTableId().toString());
-                                dataPrivate.setIsAddConceal(0);
-                                dataPrivate.setParentId(wbsTreePrivate.getId());
-                                //TODO
-                                dataPrivate.setTreePId(tree.getId());
-                                //TODO
-                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
-                                //TODO
-                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + dataPrivate.getPId());
+                    //将要新增的项目节点
+                    List<WbsTreePrivate> addPrivateNodes = BeanUtil.copyProperties(addNodes, WbsTreePrivate.class);
 
-                                insertDataPrivateList.add(dataPrivate);//新增
-                            }
-                        }
-                    }
 
-                } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
-                    /*-------------------------------------质检私有引用同步--------------------------------------------*/
-                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
-                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+                    //先给每个新增节点赋唯一id,项目id,父级id
+                    addPrivateNodes.forEach(f -> f.setPKeyId(SnowFlakeUtil.getId()));
 
-                    //获取当前私有引用树的元素表信息
-                    List<WbsTreePrivate> wbsTreePrivateRootTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
-                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
-                                /*.eq(WbsTreePrivate::getStatus, 1)*/
-                        );
-                    } else {
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
-                                /*.eq(WbsTreePrivate::getStatus, 1)*/
-                                .like(WbsTreePrivate::getAncestors, wbsTreePrivateRoot.getId()));
-                    }
-
-                    //获取当前项目选择的节点下的所有元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors, WbsTreePrivate::getPKeyId)
-                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            /*.eq(WbsTreePrivate::getStatus, 1)*/
-                    );
-
-                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-                    } else {
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
-                    }
-
-                    //获取新增的私有元素表addPrivateTable
-                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
-                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
-                    //构造
-                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
-                    if (ids.size() > 0) {
-                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
-                        for (WbsTreePrivate tree : resultDataList) {
-                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                            if (dataPrivate != null) {
-                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
-                                dataPrivate.setWbsType(tree.getWbsType());
-                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                                dataPrivate.setInitTableId(tree.getInitTableId());
-                                dataPrivate.setIsAddConceal(0);
+                    for (WbsTreePrivate addPrivateNode : addPrivateNodes) {
+                        if (addPrivateNode.getParentId() == 0) {
+                            continue;
+                        }
 
-                                //TODO
-                                dataPrivate.setTreePId(dataPrivate.getId());
-                                //TODO
-                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
-                                //TODO
-                                dataPrivate.setWbsType(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+                        //查询出当前模板节点的父节点 去获取对应项目节点  如果父节点为0就跳过
+                        List<WbsTreePrivate> addPrivateParentNodes = wbsTreePrivates.stream().filter(f -> f.getId().equals(addPrivateNode.getParentId())).collect(Collectors.toList());
+                        //如果没有数据  就表示这条数据的父节点也时新增节点 就需要从新增节点集合中找父级节点
+                        if (addPrivateParentNodes.isEmpty()) {
+                            addPrivateParentNodes = addPrivateNodes.stream().filter(f -> f.getId().equals(addPrivateNode.getParentId())).collect(Collectors.toList());
+                        }
+                        //如果现在还找不到当前节点的父节点就表示数据有问题
+                        if (addPrivateParentNodes.isEmpty()) {
+                            //TODO
+                            continue;
+                        }
 
+                        WbsTreePrivate parent = addPrivateParentNodes.get(0);
+                        addPrivateNode.setPId(parent.getPKeyId());
+                        addPrivateNode.setIsAddConceal(0);
+                        addPrivateNode.setProjectId(wbsTreePrivate.getProjectId());
+                        //TODO 后续如果把p_key_id改成了id做 唯一id
+                        addPrivateNode.setTreePId(addPrivateNode.getId());
 
-                                insertDataPrivateList.add(dataPrivate);
-                            }
-                        }
                     }
+                    addData.addAll(addPrivateNodes);
                 }
             }
 
-            if (("2").equals(wbsTreePrivate.getWbsType())) {
-                if (("public").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
-                    /*-------------------------------------试验公有引用同步--------------------------------------------*/
-                    //获取当前节点对应的公有引用树下的元素表
-                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreePrivate.getId()));
-                    List<WbsTree> wbsTreesPublicTables;
-
-                    if (wbsTree.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
-                                        .select(WbsTree::getId, WbsTree::getParentId)
-                                        .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
-                                /*.eq(WbsTree::getStatus, 1)*/
-                        );
-                    } else {
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                                .select(WbsTree::getId, WbsTree::getParentId)
-                                .eq(WbsTree::getType, 2)
-                                /*.eq(WbsTree::getStatus, 1)*/
-                                .like(WbsTree::getAncestors, wbsTree.getId()));
-                    }
-
-                    //获取当前项目树下的元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
-                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            /*.eq(WbsTreePrivate::getStatus, 1)*/
-                    );
-                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
 
-                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-                    } else {
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
-                    }
 
-                    //获取新增的公有元素表addPublicTable
-                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
-                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+            //通过递归的方式去获取祖级路径
 
-                    //构造
-                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
-                    if (ids.size() > 0) {
-                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
-                        for (WbsTree tree : resultDataList) {
-                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                            if (dataPrivate != null) {
-                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
-                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                                dataPrivate.setFullName(dataPrivate.getNodeName());
-                                dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
-                                dataPrivate.setIsAddConceal(0);
-
-                                //TODO
-                                dataPrivate.setTreePId(dataPrivate.getId());
-                                //TODO
-                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
-                                //TODO
-                                dataPrivate.setWbsType(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
-
-
-
-                                insertDataPrivateList.add(dataPrivate);//新增
+            if (addData.isEmpty()) {
+                return null;
+            }else{
+                try {
+                    String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+                    Set<String> urls = new HashSet<>();
+                    for (WbsTreePrivate tree : addData) {
+                        if (org.apache.commons.lang3.StringUtils.isNotBlank(tree.getHtmlUrl())) {
+                            String[] split = tree.getHtmlUrl().split("/");
+                            String htmlUrl = file_path + "privateUrlCopy/" + tree.getPdfUrl() + "/" + split[split.length - 1];
+                            if (!urls.contains(tree.getHtmlUrl())) {
+                                urls.add(tree.getHtmlUrl());
+                                File file_in = ResourceUtil.getFile(tree.getHtmlUrl());
+                                if (!file_in.exists() || file_in.length() == 0) {
+                                    continue;
+                                }
+                                File file_out = ResourceUtil.getFile(htmlUrl);
+                                FileUtil.copy(file_in, file_out);
                             }
+                            tree.setHtmlUrl(htmlUrl);
                         }
                     }
+                } catch (Exception e) {
+                    throw new ServiceException("重置表单路径错误");
+                }
+            }
 
-                } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
-                    /*-------------------------------------试验私有引用同步--------------------------------------------*/
-                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
-                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
 
-                    //获取当前私有引用树的元素表信息
-                    List<WbsTreePrivate> wbsTreePrivateRootTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
-                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
-                                /*.eq(WbsTreePrivate::getStatus, 1)*/
-                        );
-                    } else {
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
-                                /*.eq(WbsTreePrivate::getStatus, 1)*/
-                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
-                    }
 
-                    //获取当前项目选择的节点下的所有元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
-                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            /*.eq(WbsTreePrivate::getStatus, 1)*/
-                    );
 
-                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
-                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
-                        //根节点
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
-                    } else {
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
-                    }
+            //查询出当前项目所有节点
+            List<WbsTreePrivate> addList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .eq(WbsTreePrivate::getIsDeleted, 0)
+                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()));
 
-                    //获取新增的私有元素表addPrivateTable
-                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+            addList.addAll(addData);
+            //组合祖级路径 根据当前选中节点为开始
+            Map<Long, WbsTreePrivate> collect = addList.stream().collect(Collectors.toMap(WbsTreePrivate::getPKeyId, Function.identity()));
 
-                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+            addData.forEach(node -> {
+                String correctAncestors = createAncestorsPId(node, collect);
+                node.setAncestorsPId(correctAncestors);
+            });
 
-                    //构造
-                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
-                    if (ids.size() > 0) {
-                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
-                        for (WbsTreePrivate tree : resultDataList) {
-                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
-                            if (dataPrivate != null) {
-                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
-                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
-                                dataPrivate.setWbsType(tree.getWbsType());
-                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
-                                dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
-                                dataPrivate.setIsAddConceal(0);
 
-                                //TODO
-                                dataPrivate.setTreePId(dataPrivate.getId());
-                                //TODO
-                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
-                                //TODO
-                                dataPrivate.setWbsType(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+            List<List<WbsTreePrivate>> partition = Lists.partition(addData, 1000);
+            for (List<WbsTreePrivate> wbsTreePrivates : partition) {
+                this.insertBatch(wbsTreePrivates, 1000);
+            }
 
+            return addData;
+        }
+        return null;
+    }
 
-                                insertDataPrivateList.add(dataPrivate);
-                            }
-                        }
-                    }
-                }
+
+    @Override
+    public boolean syncNodeTable(String primaryKeyId) {
+        if (StringUtils.isNotEmpty(primaryKeyId)) {
+            //获取当前节点对应节点信息
+            WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, primaryKeyId));
+            if(StringUtils.isEmpty(wbsTreePrivate.getAncestorsPId())){
+                throw new RuntimeException("当前节点祖级路径数据异常,请联系工作人员修复数据");
             }
+            //查询当前选中节点下的子节点是否为表单 如果子节点还有子节点就不允许同步
+            Long count = baseMapper.selectCount(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPId, wbsTreePrivate.getPKeyId()).eq(WbsTreePrivate::getType, 1));
+            if(count > 0){
+                throw new RuntimeException("请选择底层节点");
+            }
+            //获取项目信息
+            ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
+            //结果集
+            List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
+            List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
-            if (("3").equals(wbsTreePrivate.getWbsType())) {
-                if (("public").equals(projectInfo.getReferenceWbsTemplateTypeMeter())) {
-                    /*-------------------------------------计量公有引用同步--------------------------------------------*/
+//            if (("1").equals(wbsTreePrivate.getWbsType())) {
+                if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
+                    /*-------------------------------------质检公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
-                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreePrivate.getId()));
+                    List<WbsTree> wbsTrees = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+                            .select(WbsTree::getAncestors, WbsTree::getWbsId, WbsTree::getId)
+                            .and(wq -> wq.eq(WbsTree::getId, wbsTreePrivate.getId())
+                                    .or()
+                                    .eq(WbsTree::getId, wbsTreePrivate.getTreePId()))
+                    );
                     List<WbsTree> wbsTreesPublicTables;
+                    WbsTree wbsTree = wbsTrees.get(0);
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
                         wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
@@ -1874,12 +1746,13 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 .select(WbsTree::getId, WbsTree::getParentId)
                                 .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
                                 /*.eq(WbsTree::getStatus,1)*/
-                                .like(WbsTree::getAncestors, wbsTree.getId()));
+                                .like(WbsTree::getAncestors, wbsTree.getId())
+                        );
                     }
 
                     //获取当前项目树下的元素表 节点
                     List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestorsPId, WbsTreePrivate::getTreePId)
                                     .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
                                     .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
@@ -1887,23 +1760,30 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
                         //根节点
                         wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
                     } else {
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestorsPId().contains(String.valueOf(wbsTreePrivate.getPKeyId()))).collect(Collectors.toList());
                     }
 
                     //获取新增的公有元素表addPublicTable
-                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+//                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+                    Set<Long> privateIdsAndPids = wbsTreePrivatesProjectTables.stream()
+                            .flatMap(p -> Stream.of(p.getId(), p.getTreePId()))
+                            .collect(Collectors.toSet());
 
+                    // 过滤 wbsTreesPublicTables
+                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream()
+                            .filter(f -> !privateIdsAndPids.contains(f.getId()))
+                            .collect(Collectors.toList());
                     //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
-                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+                    //  List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+                    //         wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+                    List<Long> ids = addPublicTable.stream().map(WbsTree::getId).collect(Collectors.toList());
                     if (ids.size() > 0) {
                         List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
                         for (WbsTree tree : resultDataList) {
@@ -1915,56 +1795,70 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 dataPrivate.setFullName(dataPrivate.getNodeName());
                                 dataPrivate.setInitTableId(tree.getInitTableId().toString());
                                 dataPrivate.setIsAddConceal(0);
-
+                                dataPrivate.setParentId(wbsTreePrivate.getId());
                                 //TODO
-                                dataPrivate.setTreePId(dataPrivate.getId());
+                                dataPrivate.setTreePId(tree.getId());
                                 //TODO
                                 dataPrivate.setPId(wbsTreePrivate.getPKeyId());
                                 //TODO
-                                dataPrivate.setWbsType(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
-
+                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + dataPrivate.getPId());
 
                                 insertDataPrivateList.add(dataPrivate);//新增
                             }
                         }
                     }
 
-                } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeMeter())) {
-                    /*-------------------------------------计量私有引用同步--------------------------------------------*/
+                } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
+                    /*-------------------------------------质检私有引用同步--------------------------------------------*/
                     //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
-                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                            .eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+
+                    //获取到私有模板的当前节点的子节点数据
 
                     //获取当前私有引用树的元素表信息
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
                         //根节点
                         wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                                         .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
-                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                                        .eq(WbsTreePrivate::getType, 2)
                                 /*.eq(WbsTreePrivate::getStatus, 1)*/
                         );
                     } else {
                         wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
                                 .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
+                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
+                                .eq(WbsTreePrivate::getType, 2)
                                 /*.eq(WbsTreePrivate::getStatus, 1)*/
                                 .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
                     }
+                    if(CollectionUtil.isEmpty(wbsTreePrivateRootTables)){
+                        throw new ServiceException("私有模板无法找到此节点");
+                    }
 
                     //获取当前项目选择的节点下的所有元素表 节点
                     List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
-                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
-                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestorsPId, WbsTreePrivate::getPKeyId)
+                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
                     );
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
-                    if (wbsTreePrivate.getAncestors().equals("0")) {
+                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
                         //根节点
                         wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
                     } else {
-                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestors().contains(String.valueOf(wbsTreePrivate.getId()))).collect(Collectors.toList());
+                        try {
+                            wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestorsPId().contains(String.valueOf(wbsTreePrivate.getPKeyId()))).collect(Collectors.toList());
+                        } catch (Exception e) {
+                            throw new ServiceException("祖级路径数据异常,请联系工作人员修复数据");
+                        }
                     }
 
                     //获取新增的私有元素表addPrivateTable
@@ -1974,7 +1868,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
-
                     //构造
                     List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
                     if (ids.size() > 0) {
@@ -1994,7 +1887,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 //TODO
                                 dataPrivate.setPId(wbsTreePrivate.getPKeyId());
                                 //TODO
-                                dataPrivate.setWbsType(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
 
 
                                 insertDataPrivateList.add(dataPrivate);
@@ -2002,7 +1895,323 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         }
                     }
                 }
-            }
+//            }
+
+//            if (("2").equals(wbsTreePrivate.getWbsType())) {
+//                if (("public").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
+//                    /*-------------------------------------试验公有引用同步--------------------------------------------*/
+//                    //获取当前节点对应的公有引用树下的元素表
+//                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreePrivate.getId()));
+//                    List<WbsTree> wbsTreesPublicTables;
+//
+//                    if (wbsTree.getAncestors().equals("0")) {
+//                        //根节点
+//                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+//                                        .select(WbsTree::getId, WbsTree::getParentId)
+//                                        .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+//                                /*.eq(WbsTree::getStatus, 1)*/
+//                        );
+//                    } else {
+//                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, wbsTree.getWbsId())
+//                                .select(WbsTree::getId, WbsTree::getParentId)
+//                                .eq(WbsTree::getType, 2)
+//                                /*.eq(WbsTree::getStatus, 1)*/
+//                                .like(WbsTree::getAncestors, wbsTree.getId()));
+//                    }
+//
+//                    //获取当前项目树下的元素表 节点
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+//                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestorsPId)
+//                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+//                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+//                            /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                    );
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+//
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+//                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
+//                        //根节点
+//                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+//                    } else {
+//                        try {
+//                            wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestorsPId().contains(String.valueOf(wbsTreePrivate.getPKeyId()))).collect(Collectors.toList());
+//                        } catch (Exception e) {
+//                            throw new ServiceException("祖级路径数据异常,请联系工作人员修复数据");
+//                        }
+//                    }
+//
+//                    //获取新增的公有元素表addPublicTable
+//                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+//
+//                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
+//                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+//                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+//
+//                    //构造
+//                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+//                    if (ids.size() > 0) {
+//                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
+//                        for (WbsTree tree : resultDataList) {
+//                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+//                            if (dataPrivate != null) {
+//                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+//                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+//                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+//                                dataPrivate.setFullName(dataPrivate.getNodeName());
+//                                dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
+//                                dataPrivate.setIsAddConceal(0);
+//
+//                                //TODO
+//                                dataPrivate.setTreePId(dataPrivate.getId());
+//                                //TODO
+//                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
+//                                //TODO
+//                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+//
+//
+//                                insertDataPrivateList.add(dataPrivate);//新增
+//                            }
+//                        }
+//                    }
+//
+//                } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
+//                    /*-------------------------------------试验私有引用同步--------------------------------------------*/
+//                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
+//                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+//
+//                    //获取当前私有引用树的元素表信息
+//                    List<WbsTreePrivate> wbsTreePrivateRootTables;
+//                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
+//                        //根节点
+//                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+//                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+//                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+//                                /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                        );
+//                    } else {
+//                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+//                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+//                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+//                                /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
+//                    }
+//                    if(CollectionUtil.isEmpty(wbsTreePrivateRootTables)){
+//                        throw new ServiceException("私有模板无法找到此节点");
+//                    }
+//
+//                    //获取当前项目选择的节点下的所有元素表 节点
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+//                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestorsPId)
+//                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+//                            /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                    );
+//
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+//                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
+//                        //根节点
+//                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+//                    } else {
+//                        try {
+//                            wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestorsPId().contains(String.valueOf(wbsTreePrivate.getPKeyId()))).collect(Collectors.toList());
+//                        } catch (Exception e) {
+//                            throw new ServiceException("祖级路径数据异常,请联系工作人员修复数据");
+//                        }
+//                    }
+//
+//                    //获取新增的私有元素表addPrivateTable
+//                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
+//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+//
+//                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+//                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
+//                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+//
+//                    //构造
+//                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+//                    if (ids.size() > 0) {
+//                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
+//                        for (WbsTreePrivate tree : resultDataList) {
+//                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+//                            if (dataPrivate != null) {
+//                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+//                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+//                                dataPrivate.setWbsType(tree.getWbsType());
+//                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+//                                dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
+//                                dataPrivate.setIsAddConceal(0);
+//
+//                                //TODO
+//                                dataPrivate.setTreePId(dataPrivate.getId());
+//                                //TODO
+//                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
+//                                //TODO
+//                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+//
+//
+//                                insertDataPrivateList.add(dataPrivate);
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+
+//            if (("3").equals(wbsTreePrivate.getWbsType())) {
+//                if (("public").equals(projectInfo.getReferenceWbsTemplateTypeMeter())) {
+//                    /*-------------------------------------计量公有引用同步--------------------------------------------*/
+//                    //获取当前节点对应的公有引用树下的元素表
+//                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreePrivate.getId()));
+//                    List<WbsTree> wbsTreesPublicTables;
+//                    if (wbsTree.getAncestors().equals("0")) {
+//                        //根节点
+//                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+//                                        .select(WbsTree::getId, WbsTree::getParentId)
+//                                        .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+//                                /*.eq(WbsTree::getStatus,1)*/
+//                        );
+//                    } else {
+//                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+//                                .select(WbsTree::getId, WbsTree::getParentId)
+//                                .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+//                                /*.eq(WbsTree::getStatus,1)*/
+//                                .like(WbsTree::getAncestors, wbsTree.getId()));
+//                    }
+//
+//                    //获取当前项目树下的元素表 节点
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+//                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestorsPId)
+//                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+//                                    .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+//                            /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                    );
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+//
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+//                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
+//                        //根节点
+//                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+//                    } else {
+//                        try {
+//                            wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestorsPId().contains(String.valueOf(wbsTreePrivate.getPKeyId()))).collect(Collectors.toList());
+//                        } catch (Exception e) {
+//                            throw new ServiceException("祖级路径数据异常,请联系工作人员修复数据");
+//                        }
+//                    }
+//
+//                    //获取新增的公有元素表addPublicTable
+//                    List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
+//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+//
+//                    //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
+//                    List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
+//                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+//
+//                    //构造
+//                    List<Long> ids = addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList());
+//                    if (ids.size() > 0) {
+//                        List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, ids));
+//                        for (WbsTree tree : resultDataList) {
+//                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+//                            if (dataPrivate != null) {
+//                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+//                                dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
+//                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+//                                dataPrivate.setFullName(dataPrivate.getNodeName());
+//                                dataPrivate.setInitTableId(tree.getInitTableId().toString());
+//                                dataPrivate.setIsAddConceal(0);
+//
+//                                //TODO
+//                                dataPrivate.setTreePId(dataPrivate.getId());
+//                                //TODO
+//                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
+//                                //TODO
+//                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+//
+//
+//                                insertDataPrivateList.add(dataPrivate);//新增
+//                            }
+//                        }
+//                    }
+//
+//                } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeMeter())) {
+//                    /*-------------------------------------计量私有引用同步--------------------------------------------*/
+//                    //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
+//                    WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
+//
+//                    //获取当前私有引用树的元素表信息
+//                    List<WbsTreePrivate> wbsTreePrivateRootTables;
+//                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
+//                        //根节点
+//                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+//                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+//                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+//                                /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                        );
+//                    } else {
+//                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+//                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+//                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+//                                /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                                .like(WbsTreePrivate::getAncestorsPId, wbsTreePrivate.getPId()));
+//                    }
+//
+//                    //获取当前项目选择的节点下的所有元素表 节点
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+//                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestorsPId)
+//                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+//                            /*.eq(WbsTreePrivate::getStatus, 1)*/
+//                    );
+//
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
+//                    List<WbsTreePrivate> wbsTreePrivatesProjectTables;
+//                    if (wbsTreePrivate.getAncestorsPId().equals("0")) {
+//                        //根节点
+//                        wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
+//                    } else {
+//                        try {
+//                            wbsTreePrivatesProjectTables = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(2) && f.getAncestorsPId().contains(String.valueOf(wbsTreePrivate.getPKeyId()))).collect(Collectors.toList());
+//                        } catch (Exception e) {
+//                            throw new ServiceException("祖级路径数据异常,请联系工作人员修复数据");
+//                        }
+//                    }
+//
+//                    //获取新增的私有元素表addPrivateTable
+//                    List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
+//                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
+//
+//                    //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
+//                    List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
+//                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
+//
+//                    //构造
+//                    List<Long> ids = addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+//                    if (ids.size() > 0) {
+//                        List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, ids));
+//                        for (WbsTreePrivate tree : resultDataList) {
+//                            WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+//                            if (dataPrivate != null) {
+//                                dataPrivate.setPKeyId(SnowFlakeUtil.getId());
+//                                dataPrivate.setWbsId(wbsTreePrivate.getWbsId());
+//                                dataPrivate.setWbsType(tree.getWbsType());
+//                                dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
+//                                dataPrivate.setInitTableId(tree.getInitTableId());
+//                                dataPrivate.setIsAddConceal(0);
+//
+//                                //TODO
+//                                dataPrivate.setTreePId(dataPrivate.getId());
+//                                //TODO
+//                                dataPrivate.setPId(wbsTreePrivate.getPKeyId());
+//                                //TODO
+//                                dataPrivate.setAncestorsPId(wbsTreePrivate.getAncestorsPId() + "," + wbsTreePrivate.getPId());
+//
+//
+//                                insertDataPrivateList.add(dataPrivate);
+//                            }
+//                        }
+//                    }
+//                }
+//            }
             //重置html路径
             if (!insertDataPrivateList.isEmpty()) {
                 try {
@@ -3190,7 +3399,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     }
 
 
-
     public List<WbsTreePrivate> findAllContract(WbsTreePrivate wbsTreePrivate) {
         QueryWrapper<WbsTreePrivate> wbsTreeContractQueryWrapper = new QueryWrapper<>();
         wbsTreeContractQueryWrapper.select("p_key_id", "id", "p_id", "wbs_id", "project_id", "parent_id", "ancestors");
@@ -3405,4 +3613,56 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
         return false;
     }
+
+
+    /**
+     * 20250414-lhb-新增
+     * 创建祖级路径
+     * <p>
+     * 该方法用于构建给定节点的祖先路径标识符(PId)字符串
+     * 它通过追溯节点的父节点,直到达到根节点或满足特定条件为止
+     *
+     * @param node    WbsTreeContract类型的节点,表示需要构建路径的起始节点
+     * @param nodeMap 一个映射,其键为节点ID,值为WbsTreeContract类型的节点对象,用于快速查找节点
+     * @return 返回一个字符串,表示构建的祖先路径标识符序列,以逗号分隔
+     */
+    private String createAncestorsPId(WbsTreePrivate node, Map<Long, WbsTreePrivate> nodeMap) {
+        // 初始化路径列表,用于存储祖先节点的ID
+        List<Long> path = new ArrayList<>();
+        // 从给定的节点开始
+        WbsTreePrivate current = node;
+        // 初始化访问集合,用于检测循环引用
+        Set<Long> visited = new HashSet<>();
+
+        while (true) {
+            // 检查当前节点是否为根节点或无效节点
+            if (current == null || current.getPId() == null ||
+                    current.getPId() == 0 || current.getPId().equals(current.getPKeyId())) {
+                break;
+            }
+
+            // 检测循环引用
+            if (visited.contains(current.getPId())) {
+                break;
+            }
+            // 将当前节点的ID添加到已访问集合中
+            visited.add(current.getPKeyId());
+
+            // 从映射中获取当前节点的父节点
+            current = nodeMap.get(current.getPId());
+            // 如果父节点存在,则将其ID添加到路径列表的开头
+            if (current != null) {
+                path.add(0, current.getPKeyId());
+            }
+
+            // 安全限制,防止路径过长导致性能问题
+            if (path.size() > 50) {
+                break;
+            }
+        }
+        // 将根节点ID(0)添加到路径的最前面,表示路径的起点
+        path.add(0, 0L);
+        // 将路径列表转换为字符串并返回
+        return String.join(",", path.stream().map(String::valueOf).toArray(String[]::new));
+    }
 }

+ 6 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -538,16 +538,18 @@ public class FileUtils {
                 if(SystemUtils.isWindows() || SystemUtils.isMacOs()){
                     file_path2 = file_path;
                 }else{
-                    return fileUrl;
+                    return sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path2, "");
                 }
             }else{
                 return fileUrl;
             }
         } else {
-            file_path2 = file_path;
+            file_path = file_path2;
         }
-
-        String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path2, "");
+        String s1 = fileUrl.replaceAll("//", "/").replace("///","/");
+        file_path= file_path.replaceAll("//","/").replaceAll("///","/");
+        String s2= s1.replaceAll(file_path, "");
+        String path = sys_file_net_url + s2;
         return path;
     }