huangtf 2 år sedan
förälder
incheckning
f0ab6c8981

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

@@ -37,4 +37,6 @@ public interface INodeEx<T> extends Serializable {
     default Boolean getHasChildren() {
         return false;
     }
+
+    default void clearChildren() {}
 }

+ 18 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTree.java

@@ -201,4 +201,22 @@ public class ArchiveTree extends BaseEntity {
             e.printStackTrace();
         }
     }
+
+    public void sync(ArchiveTreeVO2 archiveTree) {
+        if (archiveTree == null) {
+            return;
+        }
+        this.nodeType = archiveTree.getNodeType();
+        this.postType = archiveTree.getPostType();
+        this.associationType = archiveTree.getAssociationType();
+        this.majorDataType = archiveTree.getMajorDataType();
+        this.displayHierarchy = archiveTree.getDisplayHierarchy();
+        this.isStorageNode = archiveTree.getIsStorageNode();
+        this.isBuiltDrawing = archiveTree.getIsBuiltDrawing();
+        this.isInterfaceNode = archiveTree.getIsInterfaceNode();
+        this.projectType = archiveTree.getProjectType();
+        this.storageType = archiveTree.getStorageType();
+        this.expDataType = archiveTree.getExpDataType();
+        this.archiveAutoType = archiveTree.getArchiveAutoType();
+    }
 }

+ 19 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java

@@ -232,6 +232,25 @@ public class ArchiveTreeContract extends BaseEntity {
 		}
 	}
 
+	public void sync(ArchiveTree archiveTree) {
+		if (archiveTree == null) {
+			return;
+		}
+		this.nodeType = archiveTree.getNodeType();
+		this.postType = archiveTree.getPostType();
+		this.associationType = archiveTree.getAssociationType();
+		this.majorDataType = archiveTree.getMajorDataType();
+		this.displayHierarchy = archiveTree.getDisplayHierarchy();
+		this.isStorageNode = archiveTree.getIsStorageNode();
+		this.isBuiltDrawing = archiveTree.getIsBuiltDrawing();
+		this.isInterfaceNode = archiveTree.getIsInterfaceNode();
+		this.projectType = archiveTree.getProjectType();
+		this.storageType = archiveTree.getStorageType();
+		this.expDataType = archiveTree.getExpDataType();
+		this.archiveAutoType = archiveTree.getArchiveAutoType();
+	}
+
+
 	public boolean isContractRoot(){
 		if (this.getExtType() != null && this.getExtType() == 2
 				&& StringUtils.isNotEmpty(this.getTreeCode())){

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -97,6 +97,13 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 		return this.children;
 	}
 
+	@Override
+	public void clearChildren() {
+		if (children!= null ) {
+			children.clear();
+		}
+	}
+
 	/**
 	 * 内业资料类型(用于显示控制)
 	 */

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeVO2.java

@@ -65,6 +65,12 @@ public class ArchiveTreeVO2 implements INodeEx<ArchiveTreeVO2> {
         }
         return this.children;
     }
+    @Override
+    public void clearChildren() {
+        if (children!= null ) {
+            children.clear();
+        }
+    }
 
     /**
      * 内业资料类型(用于显示控制)

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java

@@ -16,6 +16,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.ArchiveTreeContractAutoRuleMapDTO;
 import org.springblade.manager.dto.ArchiveTreeDTO;
 import org.springblade.manager.dto.ArchiveTreeSortDTO;
+import org.springblade.manager.service.IArchiveTreeContractService;
 import org.springblade.manager.vo.ArchiveTreeVO2;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -37,6 +38,8 @@ public class ArchiveTreeController extends BladeController {
 
     private final IArchiveTreeService archiveTreeService;
 
+    private final IArchiveTreeContractService archiveTreeContractService;
+
     /**
      * 初始化归档树根节点
      */
@@ -89,6 +92,10 @@ public class ArchiveTreeController extends BladeController {
     @ApiOperation(value = "修改", notes = "传入ArchiveTree")
     public R update(@Valid @RequestBody ArchiveTree archiveTree) {
         archiveTree.setFullName(archiveTree.getNodeName());
+        if (archiveTree.getProjectId() != null && archiveTree.getProjectId() > 0) {
+            archiveTreeContractService.UpdateByArchiveTree(archiveTree);
+        }
+
         return R.status(archiveTreeService.updateById(archiveTree));
     }
 

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

@@ -67,6 +67,7 @@
     <resultMap id="treeNodeResultMap6" type="org.springblade.manager.vo.WbsTreeContractVO6">
         <id column="id" property="id"/>
         <result column="parentId" property="parentId"/>
+        <result column="primaryKeyId" property="pKeyId"/>
         <result column="title" property="title"/>
         <result column="value" property="value"/>
         <result column="key" property="key"/>
@@ -439,6 +440,7 @@
 
     <select id="tree6" resultMap="treeNodeResultMap6">
         SELECT
+        d.p_key_id AS "primaryKeyId",
         d.id,
         d.parent_id AS "parentId",
         IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java

@@ -67,7 +67,7 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 	List<ArchiveTreeContractVO2> tree2(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId, Long contractId);
 
-
+	List<ArchiveTreeContractVO2> tree2Root(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId);
 
 	List<ArchiveTreeContract> selectByParentIdOrId(String id);
 
@@ -79,7 +79,7 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 	boolean submitDisplayConfigTree(String ids);
 
-	public boolean syncProjectTree(ArchiveTreeContract dstNode);
-
+	boolean syncProjectTree(ArchiveTreeContract dstNode);
 
+	boolean UpdateByArchiveTree(ArchiveTree archiveTree);
 }

+ 40 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -185,6 +185,11 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return ForestNodeMergerEx.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
 	}
 
+	@Override
+	public List<ArchiveTreeContractVO2> tree2Root(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
+
+		return ForestNodeMergerEx.mergeOnlyRoot(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
+	}
 
 
 	@Override
@@ -352,15 +357,13 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			return false;
 		}
 
-		// 0,业主树同步, 1,根节点同步,  2. 建设单位或者施工单位同步添加合同段 3.  合同段内部同步
-
-
 		List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(),
 				null, null,null,false);
-		List<ArchiveTreeContractVO2> dstTrees = this.tree2(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
+		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
 		List<ArchiveTreeContract> saveList = new ArrayList<>();
 		ArchiveTreeContractVO2 dstTree = dstTrees.get(0);
-		if (dstTree == null ) {
+		ArchiveTreeVO2 srcTree = srcTrees.get(0);
+		if (dstTree == null || srcTree == null) {
 			return false;
 		}
 
@@ -382,7 +385,6 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 
 			for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
 				//施工和监理
-
 				ar.setValue(1L);
 				if (ar.getTreeCode()!= null && (
 						ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
@@ -413,16 +415,21 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 						deleteTreeChildren(ar);
 					}
 
-
 					for(Map.Entry<Long,ContractInfo> entry : contractMap.entrySet()){
 						ContractInfo contractInfo = entry.getValue();
 
 						if (contractInfo.getStatus() == 0) {
 							if (ar.getTreeCode().equals("C") && contractInfo.getContractType() == 1) {
 								//复制施工
+								List<ArchiveTreeContract> tmpSaveList =
+										archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
+								saveList.addAll(tmpSaveList);
 							}
 							if (ar.getTreeCode().equals("S") && contractInfo.getContractType() == 2) {
 								//复制监理
+								List<ArchiveTreeContract> tmpSaveList =
+										archiveTreeContractSync.getContractSaveList(srcTree,ar,contractInfo,dstNode);
+								saveList.addAll(tmpSaveList);
 							}
 						}
 					}
@@ -447,10 +454,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 								srcTrees.get(0),dstNode.getId(),ar);
 						saveList.addAll(tmpSaveList);
 					}
-
-
 				}else {
-
 					for (ArchiveTreeContractVO2 contractNode : ar.getChildren()){
 						if (dstNode.getParentId() == 0 || dstScopeTree.getId() == contractNode.getId()) {
 
@@ -459,11 +463,15 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 							saveList.addAll(tmpSaveList);
 						}
 					}
-
 				}
 			}
 		}
 
+		//更新排序
+		archiveTreeContractSync.InitTreeSort(dstTree,saveList);
+
+		//todo 同步wbs等扩展节点
+
 		this.saveBatch(saveList);
 		return true;
 	}
@@ -481,6 +489,27 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return this.deleteLogic(ids);
 	}
 
+	/**
+	 * 同步修改
+	 * @param archiveTree
+	 * @return
+	 */
+	public boolean UpdateByArchiveTree(ArchiveTree archiveTree){
+
+		List<ArchiveTreeContract> archiveTreeContracts =  baseMapper.selectList(Wrappers.<ArchiveTreeContract>query().lambda()
+				.eq(ArchiveTreeContract::getFromId, archiveTree.getId())
+				.eq(ArchiveTreeContract::getProjectId, archiveTree.getProjectId())
+				.eq(ArchiveTreeContract::getIsDeleted, 0)
+		);
+
+		for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+			archiveTreeContract.sync(archiveTree);
+		}
+
+		this.saveOrUpdateBatch(archiveTreeContracts);
+		return true;
+	}
+
 
 
 

+ 72 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -4,18 +4,31 @@ import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.manager.entity.ArchiveTree;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
 import org.springblade.manager.vo.ArchiveTreeVO2;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 @AllArgsConstructor
 public class ArchiveTreeContractSyncImpl {
 
+    private final ArTreeContractInitServiceImpl arTreeContractInitService;
+
+    /**
+     * 普通同步
+     * @param srcNodeId
+     * @param srcTrees
+     * @param dstNodeId
+     * @param dstTrees
+     * @return
+     */
     public List<ArchiveTreeContract> getNormalSaveList(Long srcNodeId,ArchiveTreeVO2 srcTrees,Long dstNodeId,ArchiveTreeContractVO2 dstTrees){
         List<ArchiveTreeContract> saveList = new ArrayList<>();
         ArchiveTreeVO2 srcTree = ForestNodeMergerEx.getSubTree(srcTrees,srcNodeId);
@@ -33,4 +46,63 @@ public class ArchiveTreeContractSyncImpl {
 
         return saveList;
     }
+
+    /**
+     * 复制合同段
+     * @param srcTree
+     * @param dstTree
+     * @param contractInfo
+     * @param dstNode
+     * @return
+     */
+    public List<ArchiveTreeContract> getContractSaveList(ArchiveTreeVO2 srcTree,
+                                                         ArchiveTreeContractVO2 dstTree, ContractInfo contractInfo,ArchiveTreeContract dstNode){
+        List<ArchiveTreeContract> saveList = new ArrayList<>();
+        Long srcNodeId = dstTree.getFromId();
+        Long newNodeId = dstTree.getId();
+        ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNodeId);
+
+
+        arTreeContractInitService.copyContractTree(dstNode.getTenantId(),dstNode.getProjectId()
+        ,contractInfo,newNodeId,subTree.getChildren(),saveList,null);
+
+        return saveList;
+    }
+
+    /**
+     * 刷新祖先节点和排序
+     * @param dstTree
+     * @param addList
+     */
+    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList)
+    {
+        List<ArchiveTreeContractVO2> contractVO2List = new ArrayList<>();
+        ForestNodeMergerEx.getTreeList(dstTree,contractVO2List);
+
+        Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
+        for (ArchiveTreeContract archiveTreeContract:addList) {
+            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
+            treeContractVO2.setId(archiveTreeContract.getId());
+            treeContractVO2.setParentId(archiveTreeContract.getParentId());
+            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+            treeContractVO2.setSort(archiveTreeContract.getSort());
+            contractVO2List.add(treeContractVO2);
+            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
+        }
+
+        List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(contractVO2List);
+
+        ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
+
+        ForestNodeMergerEx.InitTreeSort(trees.get(0), "");
+
+        for (ArchiveTreeContract archiveTreeContract:addList) {
+            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
+            if (tmp != null ) {
+                archiveTreeContract.setAncestors(tmp.getAncestors());
+                archiveTreeContract.setTreeSort(tmp.getTreeSort());
+
+            }
+        }
+    }
 }

+ 78 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeServiceImpl.java

@@ -798,11 +798,89 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
         }
 
         //刷新treeCode
+        InitAncestors(dstTree,saveList);
 
         //相同的属性刷新?
+        updateDstArchiveTrees(srcTree,dstTree);
 
         this.saveBatch(saveList);
 
         return true;
     }
+
+
+    public void InitAncestors(ArchiveTreeVO2  dstTree,List<ArchiveTree> addList)
+    {
+        List<ArchiveTreeVO2> archiveTreeVO2s = new ArrayList<>();
+        ForestNodeMergerEx.getTreeList(dstTree,archiveTreeVO2s);
+
+        Map<Long,ArchiveTreeVO2> vo2Map = new LinkedHashMap<>();
+        for (ArchiveTree archiveTree:addList) {
+            ArchiveTreeVO2 archiveTreeVO2 = new ArchiveTreeVO2();
+            archiveTreeVO2.setId(archiveTree.getId());
+            archiveTreeVO2.setParentId(archiveTree.getParentId());
+            archiveTreeVO2.setTitle(archiveTree.getNodeName());
+            archiveTreeVO2.setSort(archiveTree.getSort());
+            archiveTreeVO2s.add(archiveTreeVO2);
+            vo2Map.put(archiveTreeVO2.getId(),archiveTreeVO2);
+        }
+
+
+        List<ArchiveTreeVO2> trees = ForestNodeMergerEx.merge(archiveTreeVO2s);
+
+        ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
+
+        for (ArchiveTree archiveTree:addList) {
+            ArchiveTreeVO2 tmp = vo2Map.get(archiveTree.getId());
+            if (tmp != null ) {
+                archiveTree.setAncestors(tmp.getAncestors());
+            }
+        }
+    }
+
+    public void updateDstArchiveTrees(ArchiveTreeVO2 srcTree,ArchiveTreeVO2  dstTree){
+
+        List<ArchiveTreeVO2> srcList = new ArrayList<>();
+
+        List<ArchiveTreeVO2> dstList = new ArrayList<>();
+        Map<Long,ArchiveTreeVO2> srcDstMap = new LinkedHashMap<>();
+        Map<Long,ArchiveTreeVO2> srcMap = new LinkedHashMap<>();
+        List<Long> matchIds = new ArrayList<>();
+
+
+        ForestNodeMergerEx.getTreeList(srcTree,srcList);
+        ForestNodeMergerEx.getTreeList(dstTree,dstList);
+
+
+        //from  - dst 映射
+        for (ArchiveTreeVO2 dst :dstList) {
+            if (dst.getFromId() != null ) {
+                srcDstMap.put(dst.getFromId(),dst);
+            }
+        }
+
+        for (ArchiveTreeVO2 src :srcList) {
+            //匹配的节点
+
+            ArchiveTreeVO2 dst = srcDstMap.get(src.getId());
+            if (dst != null) {
+                matchIds.add(dst.getId());
+                srcMap.put(src.getId(),src);
+            }
+        }
+
+
+        List<ArchiveTree> archiveTreeList = archiveTreeMapper.selectBatchIds(matchIds);
+        if (archiveTreeList == null ) {
+            return;
+        }
+        for (ArchiveTree oldAr: archiveTreeList) {
+            ArchiveTreeVO2 src = srcMap.get(oldAr.getFromId());
+            if (src != null ) {
+                oldAr.sync(src);
+            }
+        }
+
+        this.saveOrUpdateBatch(archiveTreeList);
+    }
 }

+ 39 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ForestNodeMergerEx.java

@@ -14,6 +14,11 @@ import java.util.stream.Collectors;
 
 public class ForestNodeMergerEx {
     public static <T extends INodeEx<T>> List<T> merge(List<T> items) {
+
+        for (T item: items) {
+            item.clearChildren();
+        }
+
         ForestNodeManagerEx<T> forestNodeManager = new ForestNodeManagerEx(items);
         items.forEach((forestNode) -> {
             if (forestNode.getParentId()!= null && forestNode.getParentId() != 0L) {
@@ -26,9 +31,38 @@ public class ForestNodeMergerEx {
             }
 
         });
+
         return forestNodeManager.getRoot();
     }
 
+    public static <T extends INodeEx<T>> List<T> mergeOnlyRoot(List<T> items) {
+
+        for (T item: items) {
+            item.clearChildren();
+        }
+
+        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());
+                }
+            }
+
+        });
+        List<T> roots = forestNodeManager.getRoot();;
+        List<T> newRoots = new ArrayList();
+        for (T root : roots) {
+            if (root.getParentId() == 0L) {
+                newRoots.add(root);
+            }
+        }
+        return newRoots;
+    }
+
     public static <T extends INodeEx<T>> void getTreeList(T tree, List<T> nodes){
         if (tree == null) {
             return;
@@ -94,12 +128,12 @@ public class ForestNodeMergerEx {
 
 
 
-    public static <T extends INodeEx<T>,E extends INodeEx<E>> void syncTreeList(T srcTree, E dstTree, List<E> outList){
+    public static <T extends INodeEx<T>,E extends INodeEx<E>>  void syncTreeList(T srcTree, E dstTree, List<E> outList){
         List<T> srcList = new ArrayList<>();
         List<T> srcAddList = new ArrayList<>();
         List<E> dstList = new ArrayList<>();
         Map<Long,Long> srcDstMap = new LinkedHashMap<>();
-        Map<Long,E> srcTMap = new LinkedHashMap<>();
+        //Map<Long,E> srcTMap = new LinkedHashMap<>();
 
 
         getTreeList(srcTree,srcList);
@@ -114,7 +148,7 @@ public class ForestNodeMergerEx {
         for (E dst :dstList) {
             if (dst.getFromId() != null ) {
                 srcDstMap.put(dst.getFromId(),dst.getId());
-                srcTMap.put(dst.getFromId(),dst);
+                //srcTMap.put(dst.getFromId(),dst);
             }
         }
 
@@ -164,7 +198,7 @@ public class ForestNodeMergerEx {
         return a;
     }
 
-    public  <T extends INodeEx<T>> void InitAncestors(T tree, String ancestors) {
+    public  static <T extends INodeEx<T>> void InitAncestors(T tree, String ancestors) {
         String localAncestors = ancestors + "," + tree.getId();
         tree.setAncestors(ancestors);
 
@@ -176,7 +210,7 @@ public class ForestNodeMergerEx {
         }
     }
 
-    public <T extends INodeEx<T>> void InitTreeSort(T tree, String treeSort) {
+    public static <T extends INodeEx<T>> void InitTreeSort(T tree, String treeSort) {
 
         Integer localSort = 100;
         if (tree.getSort() != null ) {