浏览代码

系统级复制tree

cr 3 天之前
父节点
当前提交
33cc4b28d9

+ 10 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/copyNodeVo.java

@@ -0,0 +1,10 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.util.List;
+@Data
+public class copyNodeVo {
+  private   List<String> leftIds;
+  private  List<String>rightIds;
+}

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -580,6 +580,12 @@ public class WbsTreeController extends BladeController {
         }
         System.out.println(updateMap.size());
     }
+    @PostMapping("/copyNode")
+    @ApiOperationSupport(order = 50)
+    @ApiOperation(value = "复制节点")
+    public R copyNode(@RequestBody copyNodeVo vo){
+        return R.status(wbsTreeService.copyNode(vo.getLeftIds(),vo.getRightIds()));
+    }
 
 }
 

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

@@ -102,4 +102,6 @@ public interface WbsTreeMapper extends EasyBaseMapper<WbsTree> {
 
     List<WbsTreePrivate> getTitleRange(@Param("projectId")Long projectId,
                                        @Param("wbsType")Integer wbsType);
+
+    List<WbsTree> selectAllChildNode(@Param("leftIds") List<String> leftIds);
 }

+ 12 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -572,5 +572,17 @@
             and wbs_type = #{wbsType}
         </if>
     </select>
+    <select id="selectAllChildNode" resultType="org.springblade.manager.entity.WbsTree">
+        SELECT DISTINCT *
+        FROM m_wbs_tree
+        WHERE is_deleted = 0
+        <if test="leftIds != null and leftIds.size() > 0">
+            AND (
+            <foreach collection="leftIds" item="item" separator=" OR ">
+                FIND_IN_SET(#{item}, ancestors)
+            </foreach>
+            )
+        </if>
+    </select>
 
 </mapper>

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

@@ -81,4 +81,6 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
     List<WbsTreePrivate> getTitleRange(String projectId,Integer wbsType);
 
     Object getQueryValueByNodeType(WbsTreePrivateQueryVO vo);
+
+    boolean copyNode(List<String> leftIds, List<String> rightIds);
 }

+ 76 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -29,6 +29,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.manager.utils.DiffListUtil;
 import org.springblade.manager.utils.WbsElementUtil;
 import org.springblade.manager.vo.*;
+import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
@@ -598,6 +599,81 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return null;
     }
 
+    @Override
+    public boolean copyNode(List<String> leftIds, List<String> rightIds) {
+        List<WbsTree> leftLists = baseMapper.selectAllChildNode(leftIds);
+        for (String rightId : rightIds) {
+            // 每次循环都创建一个新的集合作为副本
+            List<WbsTree> workingList = leftLists.stream()
+                    .map(node -> {
+                        // 创建每个节点的副本
+                        WbsTree copy = new WbsTree();
+                        BeanUtils.copyProperties(copy, node);
+                        return copy;
+                    })
+                    .collect(Collectors.toList());
+            WbsTree rightWbsTree = baseMapper.selectById(Long.parseLong(rightId));
+
+            // 找到leftLists中所有的根节点(没有在leftLists中作为子节点出现的节点)
+            Set<Long> allPIds = workingList.stream()
+                    .map(WbsTree::getParentId)
+                    .filter(Objects::nonNull)
+                    .collect(Collectors.toSet());
+
+            List<WbsTree> rootNodes = workingList.stream()
+                    .filter(node -> !allPIds.contains(node.getId()))
+                    .collect(Collectors.toList());
+
+            // 为每个根节点重新设置属性,并将其放到rightWbsTreePrivate节点下
+            for (WbsTree rootNode : rootNodes) {
+                // 重新分配节点值
+                reassignNodeValues(workingList, rootNode, rightWbsTree);
+            }
+        }
+        return true;
+    }
+    // 添加一个辅助方法来重新分配节点值
+    private void reassignNodeValues(List<WbsTree> leftLists, WbsTree rootNode, WbsTree rightWbsTree) {
+        // 创建节点映射以便快速查找
+        Map<Long, WbsTree> nodeMap = leftLists.stream()
+                .collect(Collectors.toMap(WbsTree::getId, node -> node));
+
+        // 为根节点生成新的随机ID
+        Long newRootId = SnowFlakeUtil.getId();
+        // 设置根节点属性,使其成为rightWbsTreePrivate的子节点
+        rootNode.setId(newRootId);
+        rootNode.setParentId(rightWbsTree.getId());
+        // ancestors设置为rightWbsTreePrivate的ancestors加上rightWbsTreePrivate的id
+        if (rightWbsTree.getAncestors() != null && !rightWbsTree.getAncestors().isEmpty()) {
+            rootNode.setAncestors(rightWbsTree.getAncestors() + "," + rightWbsTree.getId());
+        } else {
+            rootNode.setAncestors(String.valueOf(rightWbsTree.getId()));
+        }
+        // 更新所有子节点
+        updateChildNodes(nodeMap, rootNode, rootNode.getAncestors());
+    }
+
+    // 递归更新子节点属性
+    private void updateChildNodes(Map<Long, WbsTree> nodeMap, WbsTree parentNode, String parentAncestors) {
+        // 查找当前节点的所有直接子节点(通过pId匹配父节点的pKeyId)
+        List<WbsTree> childNodes = nodeMap.values().stream()
+                .filter(node -> node.getParentId() != null && node.getParentId().equals(parentNode.getId()))
+                .collect(Collectors.toList());
+        // 更新每个子节点的属性
+        for (WbsTree childNode : childNodes) {
+            // 为子节点生成新的随机ID
+            Long newChildId = SnowFlakeUtil.getId();
+            // id设置为新的随机ID
+            childNode.setId(newChildId);
+            // parentId设置为父节点的id
+            childNode.setParentId(parentNode.getId());
+            // ancestors设置为父节点的ancestors加上父节点的id
+            childNode.setAncestors(parentAncestors + "," + parentNode.getId());
+            // 递归更新孙子节点
+            updateChildNodes(nodeMap, childNode, childNode.getAncestors());
+        }
+    }
+
     /**
      * 公有排序
      */