Просмотр исходного кода

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

“zhifk” 2 лет назад
Родитель
Сommit
380d841b93

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

@@ -218,5 +218,8 @@ public class ArchiveTree extends BaseEntity {
         this.storageType = archiveTree.getStorageType();
         this.expDataType = archiveTree.getExpDataType();
         this.archiveAutoType = archiveTree.getArchiveAutoType();
+        this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+        this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+        this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
     }
 }

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

@@ -262,6 +262,10 @@ public class ArchiveTreeContract extends BaseEntity {
 		this.storageType = archiveTree.getStorageType();
 		this.expDataType = archiveTree.getExpDataType();
 		this.archiveAutoType = archiveTree.getArchiveAutoType();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsUploadFileDisplayConfigurationTree();
 	}
 
 	public void sync(ArchiveTreeVO2 archiveTree) {
@@ -280,6 +284,33 @@ public class ArchiveTreeContract extends BaseEntity {
 		this.storageType = archiveTree.getStorageType();
 		this.expDataType = archiveTree.getExpDataType();
 		this.archiveAutoType = archiveTree.getArchiveAutoType();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
+	}
+
+	public void sync(ArchiveTreeContractVO2 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();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
 	}
 
 

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

@@ -31,6 +31,7 @@ import org.springframework.beans.BeansException;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 视图实体类
@@ -146,6 +147,11 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 
 	private String postType;
 
+	/**
+	 * 节点类型
+	 */
+	private Integer nodeType;
+
 	/**
 	 * 工程类型
 	 */
@@ -199,6 +205,12 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 
 	private Long fromId;
 
+	@ApiModelProperty(value = "是否为接口节点 '0'否 '1'是")
+	private Integer isInterfaceNode;
+
+	//flag 为1 则为修改。
+	private Integer flag = 0;
+
 	public String toString() {
 		return "TreeNode(parentId=" + this.getParentId()
 				+ ",ancestors" + this.getAncestors()
@@ -245,4 +257,47 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
 		return false;
 	}
 
+	public boolean isMatch(ArchiveTreeVO2 b){
+		return Objects.equals(this.nodeType, b.getNodeType()) &&
+				Objects.equals(this.postType, b.getPostType()) &&
+				Objects.equals(this.associationType, b.getAssociationType()) &&
+				Objects.equals(this.majorDataType, b.getMajorDataType()) &&
+				Objects.equals(this.displayHierarchy, b.getDisplayHierarchy()) &&
+				this.isStorageNode == b.getIsStorageNode() &&
+				this.isBuiltDrawing == b.getIsBuiltDrawing() &&
+				Objects.equals(this.projectType, b.getProjectType()) &&
+				Objects.equals(this.storageType, b.getStorageType()) &&
+				Objects.equals(this.expDataType, b.getExpDataType()) &&
+				Objects.equals(this.archiveAutoType, b.getArchiveAutoType()) &&
+				Objects.equals(this.archiveAutoNodeId, b.getArchiveAutoNodeId()) &&
+				Objects.equals(this.archiveAutoGroupId, b.getArchiveAutoGroupId()) &&
+				Objects.equals(this.archiveAutoGroupSelect, b.getArchiveAutoGroupSelect()) &&
+				this.isDisplayTree == b.getIsDisplayTree();
+	}
+
+	public void sync(ArchiveTreeVO2 archiveTree) {
+		if (isMatch(archiveTree)) {
+			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();
+		this.archiveAutoNodeId = archiveTree.getArchiveAutoNodeId();
+		this.archiveAutoGroupId = archiveTree.getArchiveAutoGroupId();
+		this.archiveAutoGroupSelect = archiveTree.getArchiveAutoGroupSelect();
+		this.isUploadFileDisplayConfigurationTree = archiveTree.getIsDisplayTree();
+		this.isDisplayTree = archiveTree.getIsDisplayTree();
+		this.flag = 1;
+	}
+
 }

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

@@ -195,4 +195,7 @@ public class ArchiveTreeVO2 implements INodeEx<ArchiveTreeVO2> {
 
     private Long wbsNode2ArchiveTreeNodeId;  //wbs节点关联归档树节点ID
 
+    //修改标识 1为修改
+    private Integer flag = 0;
+
 }

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -88,6 +88,7 @@
         <result column="isStorageNode" property="isStorageNode"/>
         <result column="isBuiltDrawing" property="isBuiltDrawing"/>
         <result column="association_type" property="associationType"/>
+        <result column="nodeType" property="nodeType"/>
         <result column="postType" property="postType"/>
         <result column="project_type" property="projectType"/>
         <result column="storage_type" property="storageType"/>

+ 97 - 22
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.service.impl;
 
 import com.alibaba.druid.sql.dialect.blink.parser.BlinkCreateTableParser;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.mixsmart.utils.StringUtils;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -11,6 +12,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.ProjectClient;
+import org.springblade.manager.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IContractInfoService;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.service.IWbsTreeService;
@@ -35,6 +37,10 @@ public class ArTreeContractInitServiceImpl {
 
     private final IProjectInfoService projectInfoService;
 
+    private final ArchiveTreeContractMapper archiveTreeContractMapper;
+
+    private final ArchiveAutoRuleSyncImpl archiveAutoRuleSync;
+
     /**
      *
      * @param tenantId
@@ -227,23 +233,11 @@ public class ArTreeContractInitServiceImpl {
      *
      * @param archiveTreeContracts
      */
-    public void InitAncestorsAndTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
+    public void InitTreeSort(List<ArchiveTreeContract> archiveTreeContracts) {
         List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
-        Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
-        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
-            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
-            treeContractVO2.setId(archiveTreeContract.getId());
-            treeContractVO2.setParentId(archiveTreeContract.getParentId());
-            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
-            treeContractVO2.setSort(archiveTreeContract.getSort());
 
-            treeContractVO2.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
-            treeContractVO2.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
-            treeContractVO2.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
-
-            archiveTreeContractVO2List.add(treeContractVO2);
-            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
-        }
+        Map<Long,ArchiveTreeContractVO2> vo2Map = new LinkedHashMap<>();
+        getMap(archiveTreeContractVO2List,archiveTreeContracts,vo2Map);
 
         List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(archiveTreeContractVO2List);
 
@@ -251,14 +245,11 @@ public class ArTreeContractInitServiceImpl {
 
         InitTreeSort(trees.get(0), "");
 
-        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
-            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
-            if (tmp != null ) {
-                archiveTreeContract.setAncestors(tmp.getAncestors());
-                archiveTreeContract.setTreeSort(tmp.getTreeSort());
+        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map);
 
-            }
-        }
+        List<ArchiveTreeContract> upList = new ArrayList<>();
+
+        handleAddAndUpList(vo2Map,archiveTreeContracts,upList);
     }
 
     /**
@@ -489,6 +480,11 @@ public class ArTreeContractInitServiceImpl {
         return archiveTreeContracts;
     }
 
+    /**
+     * 同步wbs节点默认案卷
+     * @param archiveTreeContracts
+     * @param contracts
+     */
     void syncArchiveAutoList(List<ArchiveTreeContract> archiveTreeContracts,List<ContractInfo> contracts) {
         List<ArchivesAuto> archivesAutos = new ArrayList<>();
 
@@ -574,4 +570,83 @@ public class ArTreeContractInitServiceImpl {
         return unit;
     }
 
+    /**
+     *  根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
+     * @param vo2Map
+     * @param addList
+     * @param upList
+     */
+    void handleAddAndUpList(Map<Long,ArchiveTreeContractVO2> vo2Map,List<ArchiveTreeContract> addList,List<ArchiveTreeContract> upList) {
+
+        //刷新新增节点
+        for (ArchiveTreeContract archiveTreeContract:addList) {
+            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
+            if (tmp != null ) {
+
+                archiveTreeContract.setAncestors(tmp.getAncestors());
+                archiveTreeContract.setTreeSort(tmp.getTreeSort());
+                archiveTreeContract.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
+                archiveTreeContract.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+                archiveTreeContract.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
+                archiveTreeContract.setArchiveAutoGroupSelect(archiveTreeContract.getArchiveAutoGroupSelect());
+                //新增里有,就去update了,避免重复
+                tmp.setFlag(0);
+
+            }
+        }
+
+        //获取本次所有的修改节点
+        List<Long> ids = new ArrayList<>();
+        for (Map.Entry<Long, ArchiveTreeContractVO2> entry : vo2Map.entrySet()) {
+
+            ArchiveTreeContractVO2 archiveTreeContractVO2 = entry.getValue();
+            if (archiveTreeContractVO2.getFlag() == 1) {
+                ids.add(archiveTreeContractVO2.getId());
+            }
+        }
+
+        if (ids.size() == 0) {
+            return;
+        }
+        List<ArchiveTreeContract> archiveTreeContracts =  archiveTreeContractMapper.selectBatchIds(ids);
+
+        //刷新属性
+        for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+            ArchiveTreeContractVO2 archiveTreeVO2 = vo2Map.get(archiveTreeContract.getId());
+            if (archiveTreeVO2!= null) {
+                archiveTreeContract.sync(archiveTreeVO2);
+                upList.add(archiveTreeContract);
+            }
+
+        }
+    }
+
+    /**
+     * 已有vo的链表和新增链表,获取映射整个映射
+     * @param vos
+     * @param addList
+     * @return
+     */
+    public void getMap(List<ArchiveTreeContractVO2> vos,List<ArchiveTreeContract> addList,Map<Long,ArchiveTreeContractVO2> vo2Map){
+
+        for (ArchiveTreeContractVO2 ar:vos) {
+            vo2Map.put(ar.getId(),ar);
+        }
+
+        for (ArchiveTreeContract archiveTreeContract:addList) {
+            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
+            treeContractVO2.setId(archiveTreeContract.getId());
+            treeContractVO2.setParentId(archiveTreeContract.getParentId());
+            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+            treeContractVO2.setSort(archiveTreeContract.getSort());
+
+            treeContractVO2.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
+            treeContractVO2.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+            treeContractVO2.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
+            treeContractVO2.setArchiveAutoGroupSelect(archiveTreeContract.getArchiveAutoGroupSelect());
+            vos.add(treeContractVO2);
+            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
+        }
+    }
+
 }

+ 23 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveAutoRuleSyncImpl.java

@@ -22,24 +22,36 @@ public class ArchiveAutoRuleSyncImpl {
 
     }
 
-    public void syncArchiveTreeList(List<ArchiveTreeVO2> archiveTreeVO2s){
+    public void syncArchiveTreeList(Map<Long,ArchiveTreeVO2> vo2Map){
 
         List<ArchiveTreeVO2> normalList = new ArrayList<>();
         List<ArchiveTreeVO2> wbsList = new ArrayList<>();
 
-        ForestNodeMergerEx.setPropertyfromId(archiveTreeVO2s,syncPropertyMap);
-        //todo group
+        for (ArchiveTreeVO2 archiveTreeVO2: vo2Map.values()) {
+            normalList.add(archiveTreeVO2);
+        }
+
+
+        ForestNodeMergerEx.setPropertyfromId(normalList,syncPropertyMap);
+
+
+        for (ArchiveTreeVO2 archiveTreeVO2 : vo2Map.values()) {
+            if (archiveTreeVO2.getArchiveAutoNodeId() != null) {
+                archiveTreeVO2.setFlag(1);
+            }
+        }
+        //todo group type
 
     }
 
-    public void syncArchiveTreeContractList(List<ArchiveTreeContractVO2> archiveTreeContractVO2s){
+    public void syncArchiveTreeContractList(Map<Long,ArchiveTreeContractVO2> vo2Map){
 
         List<ArchiveTreeContractVO2> normalList = new ArrayList<>();
         List<ArchiveTreeContractVO2> wbsList = new ArrayList<>();
         List<ArchiveTreeContractVO2> allWbsList = new ArrayList<>();
         Map<Long,Long> wbsIdMap = new HashMap<>();
 
-        for (ArchiveTreeContractVO2 archiveTreeContractVO2: archiveTreeContractVO2s) {
+        for (ArchiveTreeContractVO2 archiveTreeContractVO2: vo2Map.values()) {
             if (archiveTreeContractVO2.getExtType()!= null && archiveTreeContractVO2.getExtType() == 1) {
                 wbsList.add(archiveTreeContractVO2);
             }else {
@@ -82,13 +94,13 @@ public class ArchiveAutoRuleSyncImpl {
             }
         }
 
-
-
-        //todo group
-        for (ArchiveTreeContractVO2 archiveTreeContractVO2 : archiveTreeContractVO2s) {
-            if (archiveTreeContractVO2.getArchiveAutoGroupId() != null) {
-
+        //设置修改标识
+        for (ArchiveTreeContractVO2 archiveTreeContractVO2 : vo2Map.values()) {
+            if (archiveTreeContractVO2.getArchiveAutoNodeId() != null) {
+                archiveTreeContractVO2.setFlag(1);
             }
         }
+        //todo group type
+
     }
 }

+ 243 - 116
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -147,7 +147,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		archiveTreeContracts.addAll(addNodes);
 
 		//初始化祖先节点和排序
-		arTreeContractInitService.InitAncestorsAndTreeSort(archiveTreeContracts);
+		arTreeContractInitService.InitTreeSort(archiveTreeContracts);
 		//todo 同步质检资料动态节点,处理文件提名
 
 		//todo 同步立卷规则
@@ -384,6 +384,7 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			return false;
 		}
 
+		//如果在合同段节点上点同步,它的fromId是没有的,需要取它的上级节点施工或者监理总节点来同步
 		ArchiveTree srcNode = null;
 		if (dstNode.isContractRoot() && dstNode.getFromId() == null ) {
 			ArchiveTreeContract parentNode = this.getById(dstNode.getParentId());
@@ -398,165 +399,223 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			return false;
 		}
 
+		//取出
 		List<ArchiveTreeVO2> srcTrees = archiveTreeService.tree2(AuthUtil.getTenantId(), dstNode.getProjectId(),
 				null, null,null,false);
+		ArchiveTreeVO2 srcTree = srcTrees.get(0);
+		if (srcTree == null) {
+			return false;
+		}
+		//先更新所有节点属性
+//		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
+//		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
+
+
 		List<ArchiveTreeContractVO2> dstTrees = this.tree2Root(AuthUtil.getTenantId(),null,null,dstNode.getProjectId(),null);
 		List<ArchiveTreeContract> saveList = new ArrayList<>();
+		List<ArchiveTreeContract> upList = new ArrayList<>();
+		List<ArchiveTreeContract> saveContractList = new ArrayList<>();
 		ArchiveTreeContractVO2 dstTree = dstTrees.get(0);
-		ArchiveTreeVO2 srcTree = srcTrees.get(0);
-		if (dstTree == null || srcTree == null) {
+		if (dstTree == null ) {
 			return false;
 		}
 
 		List<ContractInfo> contractInfos = contractInfoService.selectContractInfoPageByPid(dstNode.getProjectId().toString());
-		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
-
-		ProjectInfo projectInfo = projectInfoService.getOne(dstNode.getProjectId());
-		Long wbsId = projectInfo.getReferenceWbsTemplateId();
-
 
 		boolean bHasContract = true;
 		if (contractInfos == null || contractInfos.size() == 0) {
 			bHasContract = false;
 		}
 
-		//预处理
+		//看看有没有合同段要复制
 		if (bHasContract) {
+			AddNewContract(contractInfos,srcTree,dstTree,dstNode,saveList);
+		}
 
-			for (ContractInfo contractInfo: contractInfos) {
-				contractInfo.setStatus(0);
-				contractMap.put(contractInfo.getId(),contractInfo);
-			}
+		//如果有新的合同段,合并新增代码到
+		if (saveList.size() > 0) {
+			archiveTreeContractSync.mergerToTree(dstTree,saveList,null);
+		}
 
-			dstTree.setValue(1L);
-			for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
-				//施工和监理
-				ar.setValue(1L);
-				if (ar.getTreeCode()!= null && (
-						ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
+		//没有合同段直接同步
+		if (!bHasContract) {
+			saveList = getNormalSaveList(srcNode.getId(),
+					srcTrees.get(0),dstNode.getId(),dstTrees.get(0));
+		}else {
 
-					if (ar.getChildren() == null ) {
-						continue;
-					}
+			//同步业主,监理各个合同段,施工各个合同段
+			syncAllContracts(srcTree,dstTree,srcNode,dstNode,saveContractList);
+		}
 
-					//处理合同节点
-					int contractNum = 0;
-					for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
-						if (contractNode.isContractRoot()){
-							//需要删除
-							contractNum++;
+		//更新排序,把排序,自动组卷这种变化,刷新到新增节点和修改节点上
+		archiveTreeContractSync.InitTreeSort(dstTree,saveContractList,upList);
 
-							contractNode.setValue(1L);
+		saveList.addAll(saveContractList);
+		//同步生成案卷
+		arTreeContractInitService.syncArchiveAutoList(saveList,contractInfos);
 
-							//设置哪个合同已经设置了。
-							ContractInfo c = contractMap.get(Long.parseLong(contractNode.getTreeCode()));
-							if (c!= null) {
-								c.setStatus(1);
-							}
-						}
-					}
+		this.saveBatch(saveList);
+		this.updateBatchById(upList);
+		return true;
+	}
 
-					if (contractNum == 0) {
-						//删除树的子节点
-						deleteTreeChildren(ar);
-					}
+	/**
+	 *
+	 * @param srcNodeId
+	 * @param srcTree
+	 * @param dstNodeId
+	 * @param dstTree
+	 * @return
+	 */
+	public List<ArchiveTreeContract> getNormalSaveList(Long srcNodeId,ArchiveTreeVO2 srcTree,Long dstNodeId,ArchiveTreeContractVO2 dstTree){
 
-					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);
-							}
-						}
-					}
+		List<ArchiveTreeContract> saveList = archiveTreeContractSync.getNormalSaveList(srcNodeId,srcTree,dstNodeId,dstTree);
 
-				}
-			}
+		//设置修改标识
+		ModifyBySrcTree(srcNodeId,srcTree,dstNodeId,dstTree);
+
+		return saveList;
+	}
+
+	/**
+	 * 新增合同段时,要复制一份合同段的分支出来
+	 * @param contractInfos
+	 * @param srcTree
+	 * @param dstTree
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void AddNewContract(List<ContractInfo> contractInfos,ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,
+						   ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+		Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
+
+		for (ContractInfo contractInfo: contractInfos) {
+			contractInfo.setStatus(0);
+			contractMap.put(contractInfo.getId(),contractInfo);
 		}
 
+		dstTree.setValue(1L);
+		for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
+			//施工和监理
+			ar.setValue(1L);
+			if (ar.getTreeCode()!= null && (
+					ar.getTreeCode().equals("C") || ar.getTreeCode().equals("S"))) {
 
-		if (!bHasContract) {
-			saveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
-					srcTrees.get(0),dstNode.getId(),dstTrees.get(0));
-		}else {
+				if (ar.getChildren() == null ) {
+					continue;
+				}
 
-			ArchiveTreeContractVO2 dstScopeTree = ForestNodeMergerEx.getSubTreeByValue(dstTree,dstNode.getId(),1L);
-			for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
-				if (StringUtils.isEmpty(ar.getTreeCode())) {
-					//同步
-					if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(ar.getId()) ) {
-						//同步
-						List<ArchiveTreeContract> tmpSaveList = null;
-						if (dstNode.getParentId() == 0) {
-							ArchiveTreeVO2 tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
-							if (tmpSubTree == null) {
-								continue;
-							}
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(tmpSubTree.getId(),
-									tmpSubTree,ar.getId(),ar);
-						}else {
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
-									srcTree,dstNode.getId(),ar);
-						}
+				//处理合同节点
+				int contractNum = 0;
+				for (ArchiveTreeContractVO2 contractNode : ar.getChildren()) {
+					if (contractNode.isContractRoot()){
+						//需要删除
+						contractNum++;
 
+						contractNode.setValue(1L);
 
-						saveList.addAll(tmpSaveList);
+						//设置哪个合同已经设置了。
+						ContractInfo c = contractMap.get(Long.parseLong(contractNode.getTreeCode()));
+						if (c!= null) {
+							c.setStatus(1);
+						}
 					}
-				}else {
-					for (ArchiveTreeContractVO2 contractNode : ar.getChildren()){
-
-						List<ArchiveTreeContract> tmpSaveList = null;
-						if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getId())
-								|| dstScopeTree.getId().equals(contractNode.getParentId())) {
-
-							ArchiveTreeVO2 tmpSubTree = srcTree;
-							Long dstNodeId = dstNode.getId();
-							if (dstNode.getParentId() == 0 ||  dstScopeTree.getId().equals(contractNode.getParentId()) ) {
-								tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
-								dstNodeId = contractNode.getId();
-							}
-							if (tmpSubTree == null) {
-								continue;
-							}
-							tmpSaveList = archiveTreeContractSync.getNormalSaveList(srcNode.getId(),
-									tmpSubTree,dstNodeId,contractNode);
-							saveList.addAll(tmpSaveList);
-
-							//todo 同步wbs等扩展节点
+				}
 
-							List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
-									contractNode,dstNode.getProjectId());
-							saveList.addAll(extSaveList);
+				if (contractNum == 0) {
+					//删除树的子节点
+					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);
 						}
 					}
 				}
+
 			}
 		}
+	}
 
-		//不是新增的,更新属性
-		ArchiveTreeVO2 subTree = ForestNodeMergerEx.getSubTree(srcTree,srcNode.getId());
-		UpdateByArchiveTree(dstNode.getProjectId(),subTree);
+	/**
+	 * 同步业主,监理各合同段,施工合同段,新增的普通节点,同步wbs节点
+	 * @param srcTree
+	 * @param dstTree
+	 * @param srcNode
+	 * @param dstNode
+	 * @param saveList
+	 */
+	void syncAllContracts(ArchiveTreeVO2 srcTree,ArchiveTreeContractVO2 dstTree,ArchiveTree srcNode,
+						  ArchiveTreeContract dstNode,List<ArchiveTreeContract> saveList){
+
+		//获取范围看是在业主,监理各合同段,施工合同段,
+		ArchiveTreeContractVO2 dstScopeTree = ForestNodeMergerEx.getSubTreeByValue(dstTree,dstNode.getId(),1L);
+		for (ArchiveTreeContractVO2 ar: dstTree.getChildren()) {
+			if (StringUtils.isEmpty(ar.getTreeCode())) {
+				//同步
+				if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(ar.getId()) ) {
+					//同步
+					List<ArchiveTreeContract> tmpSaveList = null;
+					if (dstNode.getParentId() == 0) {
+						ArchiveTreeVO2 tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
+						if (tmpSubTree == null) {
+							continue;
+						}
+						tmpSaveList = getNormalSaveList(tmpSubTree.getId(),
+								tmpSubTree,ar.getId(),ar);
+					}else {
+						tmpSaveList = getNormalSaveList(srcNode.getId(),
+								srcTree,dstNode.getId(),ar);
+					}
+
+					saveList.addAll(tmpSaveList);
+				}
+			}else {
+				for (ArchiveTreeContractVO2 contractNode : ar.getChildren()){
+
+					List<ArchiveTreeContract> tmpSaveList = null;
+					if (dstNode.getParentId() == 0 || dstScopeTree.getId().equals(contractNode.getId())
+							|| dstScopeTree.getId().equals(contractNode.getParentId())) {
+
+						ArchiveTreeVO2 tmpSubTree = srcTree;
+						Long dstNodeId = dstNode.getId();
+						if (dstNode.getParentId() == 0 ||  dstScopeTree.getId().equals(contractNode.getParentId()) ) {
+							tmpSubTree = ForestNodeMergerEx.getSubTree(srcTree,ar.getFromId());
+							dstNodeId = contractNode.getId();
+						}
+						if (tmpSubTree == null) {
+							continue;
+						}
 
-		//更新排序
-		archiveTreeContractSync.InitTreeSort(dstTree,saveList);
+						//getNormalSaveList 接口除了同步新增节点,还会同步已有节点的属性。
+						//因为关联工序的位置是固定的,先不考虑新增一个关联工序节点,且一次同步完成情况
+						tmpSaveList = getNormalSaveList(srcNode.getId(),
+								tmpSubTree,dstNodeId,contractNode);
+						saveList.addAll(tmpSaveList);
 
-		//同步生成案卷
-		arTreeContractInitService.syncArchiveAutoList(saveList,contractInfos);
+						//获取工序节点
+						List<ArchiveTreeContract> extSaveList = archiveTreeContractSync.getExtSaveList(dstNodeId,
+								contractNode,dstNode.getProjectId());
+						saveList.addAll(extSaveList);
 
-		this.saveBatch(saveList);
-		return true;
+
+					}
+				}
+			}
+		}
 	}
 
 	/**
@@ -657,6 +716,74 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 		return true;
 	}
 
+	/**
+	 *
+	 * @param srcTree
+	 * @param dstTree
+	 * @return
+	 */
+	public boolean ModifyBySrcTree(Long srcNodeId,ArchiveTreeVO2 srcTrees,Long dstNodeId,ArchiveTreeContractVO2 dstTrees){
+
+		List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
+		List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
+		//取出指定范围
+		ArchiveTreeVO2 srcTree = ForestNodeMergerEx.getSubTree(srcTrees,srcNodeId);
+		ArchiveTreeContractVO2 dstTree = ForestNodeMergerEx.getSubTree(dstTrees,dstNodeId);
+
+		//取出链表
+		ForestNodeMergerEx.getTreeList(srcTree,archiveTreeVO2List);
+		ForestNodeMergerEx.getTreeList(dstTree,archiveTreeContractVO2s);
+
+		Map<Long, ArchiveTreeVO2> map = new LinkedHashMap<>();
+		for (ArchiveTreeVO2 ar : archiveTreeVO2List) {
+			map.put(ar.getId(),ar);
+		}
+
+		for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
+			ArchiveTreeVO2 archiveTreeVO2 = map.get(ar.getFromId());
+			if (archiveTreeVO2!= null) {
+				ar.sync(archiveTreeVO2);
+			}
+		}
+		return true;
+	}
+
+	/**
+	 *
+	 * @param dstTree
+	 * @return
+	 */
+	public boolean UpdateByArchiveTreeContractVO2(ArchiveTreeContractVO2 dstTree){
+
+		List<Long> ids = new ArrayList<>();
+		List<ArchiveTreeContractVO2> archiveTreeContractVO2s = new ArrayList<>();
+
+		ForestNodeMergerEx.getTreeList(dstTree,archiveTreeContractVO2s);
+		Map<Long, ArchiveTreeContractVO2> map = new LinkedHashMap<>();
+
+
+		for (ArchiveTreeContractVO2 ar : archiveTreeContractVO2s) {
+			if (ar.getFlag() == 1) {
+				ids.add(ar.getId());
+				map.put(ar.getId(),ar);
+			}
+		}
+
+		List<ArchiveTreeContract> archiveTreeContracts =  baseMapper.selectBatchIds(ids);
+
+		List<ArchiveTreeContract> upList = new ArrayList<>();
+		for (ArchiveTreeContract archiveTreeContract : archiveTreeContracts) {
+			ArchiveTreeContractVO2 treeContractVO2 = map.get(archiveTreeContract.getId());
+			if (treeContractVO2!= null) {
+				archiveTreeContract.sync(treeContractVO2);
+				upList.add(archiveTreeContract);
+			}
+
+		}
+		this.saveOrUpdateBatch(upList);
+		return true;
+	}
+
 	/**
 	 * 递归设置
 	 * @param archiveTreeContracts

+ 54 - 28
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractSyncImpl.java

@@ -5,6 +5,7 @@ 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.mapper.ArchiveTreeContractMapper;
 import org.springblade.manager.service.IProjectInfoService;
 import org.springblade.manager.utils.ForestNodeMergerEx;
 import org.springblade.manager.vo.ArchiveTreeContractVO2;
@@ -24,6 +25,10 @@ public class ArchiveTreeContractSyncImpl {
 
     private final IProjectInfoService projectInfoService;
 
+    private final ArchiveTreeContractMapper archiveTreeContractMapper;
+
+    private final ArchiveAutoRuleSyncImpl archiveAutoRuleSync;
+
     /**
      * 普通同步
      * @param srcNodeId
@@ -72,47 +77,68 @@ public class ArchiveTreeContractSyncImpl {
         return saveList;
     }
 
+    /**
+     * 往 dstTree 里合并入新增节点
+     * @param dstTree 目标节点
+     * @param addList 新的世数
+     * @param vo2Map
+     * @return
+     */
+    public ArchiveTreeContractVO2  mergerToTree(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList,Map<Long,ArchiveTreeContractVO2> vo2Map) {
+        List<ArchiveTreeContractVO2> contractVO2List = new ArrayList<>();
+
+        ForestNodeMergerEx.getTreeList(dstTree, contractVO2List);
+
+        //获取所有节点的id -> ArchiveTreeContractVO2 的map
+        arTreeContractInitService.getMap(contractVO2List,addList,vo2Map);
+
+//        for (ArchiveTreeContract archiveTreeContract : addList) {
+//            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2();
+//            treeContractVO2.setId(archiveTreeContract.getId());
+//            treeContractVO2.setParentId(archiveTreeContract.getParentId());
+//            treeContractVO2.setTitle(archiveTreeContract.getNodeName());
+//            treeContractVO2.setSort(archiveTreeContract.getSort());
+//            treeContractVO2.setArchiveAutoNodeId(archiveTreeContract.getArchiveAutoNodeId());
+//            treeContractVO2.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+//            treeContractVO2.setArchiveAutoGroupId(archiveTreeContract.getArchiveAutoGroupId());
+//            treeContractVO2.setArchiveAutoGroupSelect(archiveTreeContract.getArchiveAutoGroupSelect());
+//            contractVO2List.add(treeContractVO2);
+//            if (vo2Map!= null) {
+//                vo2Map.put(treeContractVO2.getId(),treeContractVO2);
+//            }
+//        }
+
+        List<ArchiveTreeContractVO2> trees = ForestNodeMergerEx.merge(contractVO2List);
+        return trees.get(0);
+    }
+
+
     /**
      * 刷新祖先节点和排序
      * @param dstTree
      * @param addList
      */
-    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList)
+    public void InitTreeSort(ArchiveTreeContractVO2  dstTree,List<ArchiveTreeContract> addList,List<ArchiveTreeContract> upList)
     {
-        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);
+        //将新增节点合并到树里
+        ArchiveTreeContractVO2 tree = mergerToTree(dstTree,addList,vo2Map);
 
-        ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
+        //排序
+        ForestNodeMergerEx.InitAncestors(tree,"0");
 
-        ForestNodeMergerEx.InitTreeSort(trees.get(0), "");
+        ForestNodeMergerEx.InitTreeSort(tree, "");
 
-        for (ArchiveTreeContract archiveTreeContract:addList) {
-            ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
-            if (tmp != null ) {
-                archiveTreeContract.setAncestors(tmp.getAncestors());
-                archiveTreeContract.setTreeSort(tmp.getTreeSort());
-                archiveTreeContract.setAncestors(tmp.getAncestors());
-                archiveTreeContract.setArchiveAutoNodeId(tmp.getArchiveAutoNodeId());
-                archiveTreeContract.setArchiveAutoGroupId(tmp.getArchiveAutoGroupId());
-                archiveTreeContract.setArchiveAutoType(tmp.getArchiveAutoType());
+        //更新自动组卷节点
+        archiveAutoRuleSync.syncArchiveTreeContractList(vo2Map);
+
+        //根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
+        arTreeContractInitService.handleAddAndUpList(vo2Map,addList,upList);
 
-            }
-        }
     }
 
+
     /**
      * 普通同步
      * @param dstNodeId
@@ -125,7 +151,7 @@ public class ArchiveTreeContractSyncImpl {
 
         List<ArchiveTreeContract> saveList = new ArrayList<>();
         //todo 等测试OK再打开
-        saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
+        //saveList =arTreeContractInitService.getContractExtNodes(AuthUtil.getTenantId(),projectId,dstTree);
 
         return saveList;
     }