Browse Source

树操作工具类,待扩展

huangtf 2 năm trước cách đây
mục cha
commit
7064d006b0

+ 18 - 0
blade-common/src/main/java/org/springblade/common/utils/INodeEx.java

@@ -0,0 +1,18 @@
+package org.springblade.common.utils;
+
+import java.io.Serializable;
+import java.util.List;
+
+public interface INodeEx<T> extends Serializable {
+
+
+    Long getId();
+
+    Long getParentId();
+
+    List<T> getChildren();
+
+    default Boolean getHasChildren() {
+        return false;
+    }
+}

+ 2 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springblade.common.utils.INodeEx;
 import org.springblade.core.tool.node.INode;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springframework.beans.BeanUtils;
@@ -37,7 +38,7 @@ import java.util.List;
  * @since 2023-02-18
  */
 @Data
-public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
+public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 	private static final long serialVersionUID = 1L;
 
 	/**

+ 2 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.common.utils.INodeEx;
 import org.springblade.core.tool.node.INode;
 import org.springblade.manager.entity.ArchiveTree;
 
@@ -12,7 +13,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 @Data
-public class ArchiveTreeVO2 implements INode<ArchiveTreeVO2> {
+public class ArchiveTreeVO2 implements INodeEx<ArchiveTreeVO2> {
     private static final long serialVersionUID = 1L;
 
     /**

+ 7 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -17,6 +17,7 @@ import org.springblade.manager.feign.ProjectClient;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.utils.ForestNodeMerger;
+import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.*;
 import org.springframework.stereotype.Service;
 
@@ -145,7 +146,7 @@ public class ArTreeContractInitServiceImpl {
         List<ArchiveTreeVO2> childList = new ArrayList<>();
         for (ArchiveTreeVO2 archiveTreeVO2:child) {
             List<ArchiveTreeVO2> tmpList = new ArrayList<>();
-            ForestNodeMerger.getTreeList(archiveTreeVO2,tmpList);
+            ForestNodeMergerEx.getTreeList(archiveTreeVO2,tmpList);
             childList.addAll(tmpList);
         }
 
@@ -168,7 +169,7 @@ public class ArTreeContractInitServiceImpl {
         List<ArchiveTreeVO2> childList = new ArrayList<>();
         for (ArchiveTreeVO2 archiveTreeVO2:child) {
             List<ArchiveTreeVO2> tmpList = new ArrayList<>();
-            ForestNodeMerger.getTreeList(archiveTreeVO2,tmpList);
+            ForestNodeMergerEx.getTreeList(archiveTreeVO2,tmpList);
             childList.addAll(tmpList);
         }
         //newRootId = oldNewMap.get(newRootId);
@@ -239,7 +240,7 @@ public class ArTreeContractInitServiceImpl {
             vo2Map.put(treeContractVO2.getId(),treeContractVO2);
         }
 
-        List<ArchiveTreeContractVO2> trees = ForestNodeMerger.merge(archiveTreeContractVO2List);
+        List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(archiveTreeContractVO2List);
 
         InitAncestors(trees.get(0),"0");
 
@@ -297,7 +298,7 @@ public class ArTreeContractInitServiceImpl {
             archiveTreeContractVO2List.add(treeContractVO2);
         }
 
-        List<ArchiveTreeContractVO2> trees = ForestNodeMerger.merge(archiveTreeContractVO2List);
+        List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(archiveTreeContractVO2List);
 
         if (trees != null && trees.size() > 0) {
            return trees.get(0);
@@ -318,7 +319,7 @@ public class ArTreeContractInitServiceImpl {
 
         List<ArchiveTreeContract> addNodes = new ArrayList<>();
         List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
-        ForestNodeMerger.getTreeList(tree,archiveTreeContractVO2s);
+        ForestNodeMergerEx.getTreeList(tree,archiveTreeContractVO2s);
         Map<Long,ArchiveTreeContractVO2> map = new LinkedHashMap<>();
         for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
             map.put(ar.getId(),ar);
@@ -350,7 +351,7 @@ public class ArTreeContractInitServiceImpl {
 
         //1. 获取子树链表
         List<ArchiveTreeContractVO2> treeContractVO2s = new ArrayList<>();
-        ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
+        ForestNodeMergerEx.getTreeList(subTree,treeContractVO2s);
 
         //2. 获取对应合同的树
         //List<WbsTreeContractVO6> wbsTreeContractVO6s =  contractInfoService.tree6List(wbsId.toString(),projectId.toString(),contractId.toString());

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

@@ -41,6 +41,7 @@ import org.springblade.manager.service.IArchiveTreeService;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.utils.DiffListUtil;
+import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IArchiveTreeContractService;
@@ -173,13 +174,13 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		if (AuthUtil.isAdministrator()) {
 			tenantId = StringPool.EMPTY;
 		}
-		return ForestNodeMerger.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+		return ForestNodeMergerEx.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
 	}
 
 	@Override
 	public List<ArchiveTreeContractVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
 
-		return ForestNodeMerger.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+		return ForestNodeMergerEx.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
 	}
 
 

+ 5 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -21,6 +21,7 @@ import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.service.IWbsTreeService;
 import org.springblade.manager.utils.DiffListUtil;
 import org.springblade.manager.utils.ForestNodeMerger;
+import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.mapper.ArchiveTreeMapper;
 import org.springblade.manager.service.IArchiveTreeService;
@@ -158,7 +159,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         }
 
         List<ArchiveTreeVO2> trees = new ArrayList<>();
-        ForestNodeMerger.getTreeList(sysTrees.get(0),trees);
+        ForestNodeMergerEx.getTreeList(sysTrees.get(0),trees);
 
         List<ArchiveTree> archiveTrees = new ArrayList<>();
         Map<Long,Long> oldNewMap = new LinkedHashMap<>();
@@ -224,7 +225,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
             }
         }
 
-        return ForestNodeMerger.merge(archiveTreeVO2List);
+        return ForestNodeMergerEx.merge(archiveTreeVO2List);
     }
 
 //    @Override
@@ -237,7 +238,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
     @Override
     public List<ArchiveTreeVO2> tree2(String tenantId,Long projectId, Integer disPlayTree, Integer nodeType,String wbsId,boolean bgetExtNodes) {
         List<ArchiveTreeVO2> archiveTreeVOList = baseMapper.tree2(tenantId, projectId,disPlayTree, nodeType);
-        List<ArchiveTreeVO2> treeVO2s = ForestNodeMerger.merge(archiveTreeVOList);
+        List<ArchiveTreeVO2> treeVO2s = ForestNodeMergerEx.merge(archiveTreeVOList);
         //todo 遍历树,找到质检节点,调用getWbsArchiveTree,根据关联层级,拼接上去
         //是否获取扩展的wbs节点
         if (StringUtils.isEmpty(wbsId) && projectId != 0 && bgetExtNodes) {
@@ -421,7 +422,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         }
 
         //设置pid
-        List<ArchiveTreeVO2> archiveTreeVO2s = ForestNodeMerger.merge(archiveTreeList);
+        List<ArchiveTreeVO2> archiveTreeVO2s = ForestNodeMergerEx.merge(archiveTreeList);
         if (archiveTreeVO2s != null && archiveTreeVO2s.size() > 0 ) {
             return archiveTreeVO2s.get(0);
         }

+ 38 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ForestNodeManagerEx.java

@@ -0,0 +1,38 @@
+package org.springblade.manager.utils;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import org.springblade.common.utils.INodeEx;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class ForestNodeManagerEx<T extends INodeEx<T>> {
+
+    private final ImmutableMap<Long, T> nodeMap ;
+    private final Map<Long, Object> parentIdMap = Maps.newHashMap();
+
+    public ForestNodeManagerEx(List<T> nodes) {
+        this.nodeMap = Maps.uniqueIndex(nodes, INodeEx::getId);
+    }
+
+    public INodeEx<T> getTreeNodeAt(Long id) {
+        return this.nodeMap.containsKey(id) ? (INodeEx)this.nodeMap.get(id) : null;
+    }
+
+    public void addParentId(Long parentId) {
+        this.parentIdMap.put(parentId, "");
+    }
+
+    public List<T> getRoot() {
+        List<T> roots = new ArrayList();
+        this.nodeMap.forEach((key, node) -> {
+            if (node.getParentId() == 0L || this.parentIdMap.containsKey(node.getId())) {
+                roots.add(node);
+            }
+
+        });
+        return roots;
+    }
+}

+ 41 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ForestNodeMergerEx.java

@@ -0,0 +1,41 @@
+package org.springblade.manager.utils;
+
+import org.springblade.core.tool.node.INode;
+import org.springblade.common.utils.INodeEx;
+
+import java.util.List;
+
+public class ForestNodeMergerEx {
+    public static <T extends INodeEx<T>> List<T> merge(List<T> items) {
+        ForestNodeManagerEx<T> forestNodeManager = new ForestNodeManagerEx(items);
+        items.forEach((forestNode) -> {
+            if (forestNode.getParentId()!= null && forestNode.getParentId() != 0L) {
+                INodeEx<T> node = forestNodeManager.getTreeNodeAt(forestNode.getParentId());
+                if (node != null) {
+                    node.getChildren().add(forestNode);
+                } else {
+                    forestNodeManager.addParentId(forestNode.getId());
+                }
+            }
+
+        });
+        return forestNodeManager.getRoot();
+    }
+
+    public static <T extends INodeEx<T>> void getTreeList(T tree, List<T> nodes){
+        if (tree == null) {
+            return;
+        }
+
+        nodes.add(tree);
+
+        List<T> childrens = tree.getChildren();
+        if (childrens!= null) {
+            for (T child :childrens) {
+                getTreeList(child,nodes);
+            }
+        }
+    }
+
+
+}