فهرست منبع

WBS系统复制

cr 4 روز پیش
والد
کامیت
341af7c4c5

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

@@ -132,6 +132,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean submit(WbsTreePrivate wbsTreePrivate) {
+        wbsTreePrivate.setUpdateTime(new Date());
+        wbsTreePrivate.setUpdateUser(AuthUtil.getUserId());
         //修改
         if (wbsTreePrivate.getPKeyId() != null) {
             Long pKeyId = wbsTreePrivate.getPKeyId();
@@ -256,6 +258,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
         return true;
     }
+    @Override
+    public boolean removeTableByPKeyIdCondition(String pKeyId, String wbsId, String projectId) {
+        baseMapper.removeTableByPKeyIdCondition(pKeyId, wbsId, projectId);
+        List<WbsTreeContract> wbsTreeContractsTable = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().select(WbsTreeContract::getPKeyId).eq(WbsTreeContract::getProjectId, projectId)
+                .eq(WbsTreeContract::getIsTypePrivatePid, pKeyId).eq(WbsTreeContract::getWbsId, wbsId).eq(WbsTreeContract::getType, 2).eq(WbsTreeContract::getStatus, 1));
+        List<Long> ids = wbsTreeContractsTable.stream().map(WbsTreeContract::getPKeyId).collect(Collectors.toList());
+        if (!ids.isEmpty()) {
+            wbsTreeContractMapper.updateDeletedByIds(ids);
+        }
+        return true;
+    }
 
     @Override
     public List<WbsTreePrivateVO> lazyTree(String wbsId, String wbsType, Long parentId, String projectId, Integer type) {
@@ -3218,6 +3231,133 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return baseMapper.getContractAllLogWbsNodeIds(contractId);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean copyNode(List<String> leftIds, List<String> rightIds) {
+        List<WbsTreePrivate> leftLists = baseMapper.selectAllChildNode(leftIds);
+        for (String rightId : rightIds) {
+            // 每次循环都创建一个新的集合作为副本
+            List<WbsTreePrivate> workingList = leftLists.stream()
+                    .map(node -> {
+                        // 创建每个节点的副本
+                        WbsTreePrivate copy = new WbsTreePrivate();
+                        BeanUtils.copyProperties(copy, node);
+                        return copy;
+                    })
+                    .collect(Collectors.toList());
+            WbsTreePrivate rightWbsTreePrivate = baseMapper.getByPKeyId(Long.parseLong(rightId));
+            Integer rightNodeType = rightWbsTreePrivate.getNodeType();
+            if (rightNodeType == 1) {
+                rightNodeType=1;
+            }else if(rightNodeType==18){
+                rightNodeType=2;
+            }else {
+                rightNodeType=rightNodeType++;
+            }
+            for (WbsTreePrivate leftList : leftLists) {
+                Integer leftType=leftList.getNodeType();
+                if(leftType==1){
+                    leftType=1;
+                }else if(leftType==18){
+                    leftType=2;
+                }else {
+                    leftType=leftType++;
+                }
+                if(leftType<=rightNodeType){
+                    throw new ServiceException(leftList.getNodeName()+"不能复制到"+rightWbsTreePrivate.getNodeName()+",原因节点类型不能复制");
+                }
+            }
+            // 找到leftLists中所有的根节点(没有在leftLists中作为子节点出现的节点)
+            Set<Long> allPIds = workingList.stream()
+                    .map(WbsTreePrivate::getPId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            List<WbsTreePrivate> rootNodes = workingList.stream()
+                    .filter(node -> !allPIds.contains(node.getPKeyId()))
+                    .collect(Collectors.toList());
+
+            // 为每个根节点重新设置属性,并将其放到rightWbsTreePrivate节点下
+            for (WbsTreePrivate rootNode : rootNodes) {
+                // 重新分配节点值
+                reassignNodeValues(workingList, rootNode, rightWbsTreePrivate);
+            }
+            this.insertBatch(workingList,500);
+        }
+        return true;
+    }
+    // 添加一个辅助方法来重新分配节点值
+    private void reassignNodeValues(List<WbsTreePrivate> leftLists, WbsTreePrivate rootNode, WbsTreePrivate rightWbsTreePrivate) {
+        // 创建节点映射以便快速查找
+        Map<Long, WbsTreePrivate> nodeMap = leftLists.stream()
+                .collect(Collectors.toMap(WbsTreePrivate::getPKeyId, node -> node));
+
+        // 为根节点生成新的随机ID
+        Long newRootId = SnowFlakeUtil.getId();
+        Long newRootPKeyId = SnowFlakeUtil.getId();
+
+        // 设置根节点属性,使其成为rightWbsTreePrivate的子节点
+        rootNode.setId(newRootId);
+        rootNode.setPKeyId(newRootPKeyId);
+        rootNode.setParentId(rightWbsTreePrivate.getId());
+        rootNode.setPId(rightWbsTreePrivate.getPKeyId());
+
+        // ancestors设置为rightWbsTreePrivate的ancestors加上rightWbsTreePrivate的id
+        if (rightWbsTreePrivate.getAncestors() != null && !rightWbsTreePrivate.getAncestors().isEmpty()) {
+            rootNode.setAncestors(rightWbsTreePrivate.getAncestors() + "," + rightWbsTreePrivate.getId());
+        } else {
+            rootNode.setAncestors(String.valueOf(rightWbsTreePrivate.getId()));
+        }
+
+        // ancestors_p_id设置为rightWbsTreePrivate的ancestors_p_id加上rightWbsTreePrivate的pKeyId
+        if (rightWbsTreePrivate.getAncestorsPId() != null && !rightWbsTreePrivate.getAncestorsPId().isEmpty()) {
+            rootNode.setAncestorsPId(rightWbsTreePrivate.getAncestorsPId() + "," + rightWbsTreePrivate.getPKeyId());
+        } else {
+            rootNode.setAncestorsPId(String.valueOf(rightWbsTreePrivate.getPKeyId()));
+        }
+
+        // 更新所有子节点
+        updateChildNodes(nodeMap, rootNode, rootNode.getAncestors(), rootNode.getAncestorsPId(), newRootPKeyId);
+    }
+
+    // 递归更新子节点属性
+    private void updateChildNodes(Map<Long, WbsTreePrivate> nodeMap, WbsTreePrivate parentNode, String parentAncestors, String parentAncestorsPId, Long parentPKeyId) {
+        // 查找当前节点的所有直接子节点(通过pId匹配父节点的pKeyId)
+        List<WbsTreePrivate> childNodes = nodeMap.values().stream()
+                .filter(node -> node.getPId() != null && node.getPId().equals(parentNode.getPKeyId()))
+                .collect(Collectors.toList());
+
+        // 更新每个子节点的属性
+        for (WbsTreePrivate childNode : childNodes) {
+            // 为子节点生成新的随机ID
+            Long newChildId = SnowFlakeUtil.getId();
+            Long newChildPKeyId = SnowFlakeUtil.getId();
+
+            // id设置为新的随机ID
+            childNode.setId(newChildId);
+
+            // pKeyId设置为新的随机ID
+            childNode.setPKeyId(newChildPKeyId);
+
+            // parentId设置为父节点的id
+            childNode.setParentId(parentNode.getId());
+
+            // pId设置为父节点的pKeyId
+            childNode.setPId(parentPKeyId);
+
+            // ancestors设置为父节点的ancestors加上父节点的id
+            childNode.setAncestors(parentAncestors + "," + parentNode.getId());
+
+            // ancestors_p_id设置为父节点的ancestors_p_id加上父节点的pKeyId
+            childNode.setAncestorsPId(parentAncestorsPId + "," + parentPKeyId);
+
+            // 递归更新孙子节点
+            updateChildNodes(nodeMap, childNode, childNode.getAncestors(), childNode.getAncestorsPId(), newChildPKeyId);
+        }
+    }
+
+
+
     public void diGuiWbs(int i) {
         QueryWrapper<WbsTreePrivate> wbsTreePrivateQueryWrapper = new QueryWrapper<>();
         wbsTreePrivateQueryWrapper.select("p_key_id", "id", "p_id", "wbs_id", "project_id", "parent_id", "ancestors");

+ 23 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -620,7 +620,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
             // 获取目标父节点信息
             WbsTree wbsTree = baseMapper.selectById(rightId);
-
+               Integer rightNodeType=wbsTree.getNodeType();
+            if (rightNodeType == 1) {
+                rightNodeType=1;
+            }else if(rightNodeType==18){
+                rightNodeType=2;
+            }else {
+                rightNodeType=rightNodeType++;
+            }
+            Set<Integer> typeSet = leftLists.stream().filter(o -> o.getType()==1).map(o -> o.getNodeType()).collect(Collectors.toSet());
+            for (Integer type : typeSet) {
+                Integer leftType;
+                if(type==1){
+                    leftType=1;
+                }else if(type==18){
+                    leftType=2;
+                }else {
+                    leftType=type+1;
+                }
+                if(leftType<=rightNodeType){
+                    WbsTree leftList = leftLists.stream().filter(f -> f.getNodeType().equals(type)).findFirst().get();
+                    throw new ServiceException("【"+leftList.getNodeName()+"】不能复制到【"+wbsTree.getNodeName()+"】,原因:节点类型不能复制");
+                }
+            }
             // 第三要求:重新构建整个树的id、parentId和ancestors
             rebuildTreeStructure(leftLists, rootNodes, rightId, wbsTree);