|  | @@ -43,6 +43,8 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private final ArchiveAutoRuleWbsMapper archiveAutoRuleWbsMapper;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    private final ArchiveAutoRuleSyncImpl archiveAutoRuleSync;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public boolean initArchiveTree(Long projectId) {
 | 
	
		
			
				|  |  |          if (projectId != null && projectId != 0) {
 | 
	
	
		
			
				|  | @@ -136,6 +138,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //todo 同步立卷规则
 | 
	
		
			
				|  |  | +        InitAncestors(archiveTrees);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          this.saveBatch(archiveTrees);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -785,6 +788,16 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      if(archiveAutoType!=null){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +                        if (StringUtils.isEmpty(wbsId) && projectId!= null && projectId != 0) {
 | 
	
		
			
				|  |  | +                            ProjectInfo projectInfo = projectInfoService.getOne(projectId);
 | 
	
		
			
				|  |  | +                            if (projectInfo!= null) {
 | 
	
		
			
				|  |  | +                                Long lWbsId = projectInfo.getReferenceWbsTemplateId();
 | 
	
		
			
				|  |  | +                                if (lWbsId != null) {
 | 
	
		
			
				|  |  | +                                    wbsId = projectInfo.getReferenceWbsTemplateId().toString();
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                          //获取wbs关联树
 | 
	
		
			
				|  |  |                          ArchiveTreeVO2 archiveTreeVO2 = getWbsArchiveTree(AuthUtil.getTenantId(),projectId,wbsNode2ArchiveTreeNodeId,wbsId,"1",Long.parseLong(archiveTree.getDisplayHierarchy()));
 | 
	
		
			
				|  |  |                          List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
 | 
	
	
		
			
				|  | @@ -912,7 +925,11 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |          return map;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 系统同步到项目级
 | 
	
		
			
				|  |  | +     * @param dstNode
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |      public boolean syncProjectTree(ArchiveTree dstNode) {
 | 
	
		
			
				|  |  |          if (dstNode.getFromId() == null || dstNode.getProjectId() == 0) {
 | 
	
		
			
				|  |  |              return false;
 | 
	
	
		
			
				|  | @@ -933,6 +950,7 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |          ForestNodeMergerEx.syncTreeList(srcTree ,dstTree,addDst);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          List<ArchiveTree> saveList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        List<ArchiveTree> upList = new ArrayList<>();
 | 
	
		
			
				|  |  |          for (ArchiveTreeVO2 addD : addDst) {
 | 
	
		
			
				|  |  |              ArchiveTree archiveTree = new ArchiveTree(addD);
 | 
	
		
			
				|  |  |              archiveTree.setCreateUser(AuthUtil.getUserId());
 | 
	
	
		
			
				|  | @@ -941,55 +959,56 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |              saveList.add(archiveTree);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        modifyBySrcTree(srcTree,dstTree);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          //刷新treeCode
 | 
	
		
			
				|  |  | -        InitAncestors(dstTree,saveList);
 | 
	
		
			
				|  |  | +        InitAncestors(dstTree,saveList,upList);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //相同的属性刷新?
 | 
	
		
			
				|  |  | -        updateDstArchiveTrees(srcTree,dstTree);
 | 
	
		
			
				|  |  | +        //updateDstArchiveTrees(srcTree,dstTree);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          this.saveBatch(saveList);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +        this.updateBatchById(upList);
 | 
	
		
			
				|  |  |          return true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void InitAncestors(ArchiveTreeVO2  dstTree,List<ArchiveTree> addList)
 | 
	
		
			
				|  |  | +    public void InitAncestors(ArchiveTreeVO2  dstTree,List<ArchiveTree> addList,List<ArchiveTree> upList)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -        List<ArchiveTreeVO2> archiveTreeVO2s = new ArrayList<>();
 | 
	
		
			
				|  |  | -        ForestNodeMergerEx.getTreeList(dstTree,archiveTreeVO2s);
 | 
	
		
			
				|  |  | +        Map<Long,ArchiveTreeVO2> vo2Map = new LinkedHashMap<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //将新增节点合并到树里
 | 
	
		
			
				|  |  | +        ArchiveTreeVO2 tree = mergerToTree(dstTree,addList,vo2Map);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        ForestNodeMergerEx.InitAncestors(tree,"0");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //更新自动组卷节点
 | 
	
		
			
				|  |  | +        archiveAutoRuleSync.syncArchiveTreeList(vo2Map);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
 | 
	
		
			
				|  |  | +        this.handleAddAndUpList(vo2Map,addList,upList);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void InitAncestors(List<ArchiveTree> archiveTrees) {
 | 
	
		
			
				|  |  | +        List<ArchiveTreeVO2> archiveTreeVO2List = new ArrayList<>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          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());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            archiveTreeVO2.setArchiveAutoNodeId(archiveTree.getArchiveAutoNodeId());
 | 
	
		
			
				|  |  | -            archiveTreeVO2.setArchiveAutoType(archiveTree.getArchiveAutoType());
 | 
	
		
			
				|  |  | -            archiveTreeVO2.setArchiveAutoGroupId(archiveTree.getArchiveAutoGroupId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            archiveTreeVO2s.add(archiveTreeVO2);
 | 
	
		
			
				|  |  | -            vo2Map.put(archiveTreeVO2.getId(),archiveTreeVO2);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        getMap(archiveTreeVO2List,archiveTrees,vo2Map);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        List<ArchiveTreeVO2> trees = ForestNodeMergerEx.merge(archiveTreeVO2List);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        List<ArchiveTreeVO2> trees = ForestNodeMergerEx.merge(archiveTreeVO2s);
 | 
	
		
			
				|  |  | +        //重复
 | 
	
		
			
				|  |  | +        //ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        ForestNodeMergerEx.InitAncestors(trees.get(0),"0");
 | 
	
		
			
				|  |  | +        archiveAutoRuleSync.syncArchiveTreeList(vo2Map);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        for (ArchiveTree archiveTree:addList) {
 | 
	
		
			
				|  |  | -            ArchiveTreeVO2 tmp = vo2Map.get(archiveTree.getId());
 | 
	
		
			
				|  |  | -            if (tmp != null ) {
 | 
	
		
			
				|  |  | -                archiveTree.setAncestors(tmp.getAncestors());
 | 
	
		
			
				|  |  | -                archiveTree.setArchiveAutoNodeId(tmp.getArchiveAutoNodeId());
 | 
	
		
			
				|  |  | -                archiveTree.setArchiveAutoGroupId(tmp.getArchiveAutoGroupId());
 | 
	
		
			
				|  |  | -                archiveTree.setArchiveAutoType(tmp.getArchiveAutoType());
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        List<ArchiveTree> upList = new ArrayList<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        handleAddAndUpList(vo2Map,archiveTrees,upList);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      public void updateDstArchiveTrees(ArchiveTreeVO2 srcTree,ArchiveTreeVO2  dstTree){
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          List<ArchiveTreeVO2> srcList = new ArrayList<>();
 | 
	
	
		
			
				|  | @@ -1035,4 +1054,128 @@ public class ArchiveTreeServiceImpl extends BaseServiceImpl<ArchiveTreeMapper, A
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          this.saveOrUpdateBatch(archiveTreeList);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     *  根据vo的排序和自动组卷信息,刷新新增节点,根据修改标识生成更新节点
 | 
	
		
			
				|  |  | +     * @param vo2Map
 | 
	
		
			
				|  |  | +     * @param addList
 | 
	
		
			
				|  |  | +     * @param upList
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    void handleAddAndUpList(Map<Long,ArchiveTreeVO2> vo2Map,List<ArchiveTree> addList,List<ArchiveTree> upList) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //刷新新增节点
 | 
	
		
			
				|  |  | +        for (ArchiveTree archiveTree:addList) {
 | 
	
		
			
				|  |  | +            ArchiveTreeVO2 tmp = vo2Map.get(archiveTree.getId());
 | 
	
		
			
				|  |  | +            if (tmp != null ) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                archiveTree.setAncestors(tmp.getAncestors());
 | 
	
		
			
				|  |  | +                archiveTree.setArchiveAutoNodeId(tmp.getArchiveAutoNodeId());
 | 
	
		
			
				|  |  | +                archiveTree.setArchiveAutoType(tmp.getArchiveAutoType());
 | 
	
		
			
				|  |  | +                archiveTree.setArchiveAutoGroupId(tmp.getArchiveAutoGroupId());
 | 
	
		
			
				|  |  | +                archiveTree.setArchiveAutoGroupSelect(tmp.getArchiveAutoGroupSelect());
 | 
	
		
			
				|  |  | +                //新增里有,就去update了,避免重复
 | 
	
		
			
				|  |  | +                tmp.setFlag(0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //获取本次所有的修改节点
 | 
	
		
			
				|  |  | +        List<Long> ids = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (Map.Entry<Long, ArchiveTreeVO2> entry : vo2Map.entrySet()) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            ArchiveTreeVO2 archiveTreeVO2 = entry.getValue();
 | 
	
		
			
				|  |  | +            if (archiveTreeVO2.getFlag() == 1) {
 | 
	
		
			
				|  |  | +                ids.add(archiveTreeVO2.getId());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (ids.size() == 0) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        List<ArchiveTree> archiveTrees =  baseMapper.selectBatchIds(ids);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //刷新属性
 | 
	
		
			
				|  |  | +        for (ArchiveTree archiveTree : archiveTrees) {
 | 
	
		
			
				|  |  | +            ArchiveTreeVO2 archiveTreeVO2 = vo2Map.get(archiveTree.getId());
 | 
	
		
			
				|  |  | +            if (archiveTreeVO2!= null) {
 | 
	
		
			
				|  |  | +                archiveTree.sync(archiveTreeVO2);
 | 
	
		
			
				|  |  | +                upList.add(archiveTree);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param vos
 | 
	
		
			
				|  |  | +     * @param addList
 | 
	
		
			
				|  |  | +     * @param vo2Map
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void getMap(List<ArchiveTreeVO2> vos,List<ArchiveTree> addList,Map<Long,ArchiveTreeVO2> vo2Map){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (ArchiveTreeVO2 ar:vos) {
 | 
	
		
			
				|  |  | +            vo2Map.put(ar.getId(),ar);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (ArchiveTree archiveTree:addList) {
 | 
	
		
			
				|  |  | +            ArchiveTreeVO2 treeContractVO2 = new ArchiveTreeVO2();
 | 
	
		
			
				|  |  | +            treeContractVO2.setId(archiveTree.getId());
 | 
	
		
			
				|  |  | +            treeContractVO2.setParentId(archiveTree.getParentId());
 | 
	
		
			
				|  |  | +            treeContractVO2.setTitle(archiveTree.getNodeName());
 | 
	
		
			
				|  |  | +            treeContractVO2.setSort(archiveTree.getSort());
 | 
	
		
			
				|  |  | +            treeContractVO2.setFromId(archiveTree.getFromId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            treeContractVO2.setArchiveAutoNodeId(archiveTree.getArchiveAutoNodeId());
 | 
	
		
			
				|  |  | +            treeContractVO2.setArchiveAutoType(archiveTree.getArchiveAutoType());
 | 
	
		
			
				|  |  | +            treeContractVO2.setArchiveAutoGroupId(archiveTree.getArchiveAutoGroupId());
 | 
	
		
			
				|  |  | +            treeContractVO2.setArchiveAutoGroupSelect(archiveTree.getArchiveAutoGroupSelect());
 | 
	
		
			
				|  |  | +            vos.add(treeContractVO2);
 | 
	
		
			
				|  |  | +            vo2Map.put(treeContractVO2.getId(),treeContractVO2);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 往 dstTree 里合并入新增节点
 | 
	
		
			
				|  |  | +     * @param dstTree 目标节点
 | 
	
		
			
				|  |  | +     * @param addList 新的世数
 | 
	
		
			
				|  |  | +     * @param vo2Map
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public ArchiveTreeVO2  mergerToTree(ArchiveTreeVO2  dstTree,List<ArchiveTree> addList,Map<Long,ArchiveTreeVO2> vo2Map) {
 | 
	
		
			
				|  |  | +        List<ArchiveTreeVO2> contractVO2List = new ArrayList<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        ForestNodeMergerEx.getTreeList(dstTree, contractVO2List);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //获取所有节点的id -> ArchiveTreeContractVO2 的map
 | 
	
		
			
				|  |  | +        this.getMap(contractVO2List,addList,vo2Map);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ArchiveTreeVO2> trees = ForestNodeMergerEx.merge(contractVO2List);
 | 
	
		
			
				|  |  | +        return trees.get(0);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public boolean modifyBySrcTree(ArchiveTreeVO2 srcTree,ArchiveTreeVO2 dstTree){
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        List<ArchiveTreeVO2> archiveTreeSrcList = new ArrayList<>();
 | 
	
		
			
				|  |  | +        List<ArchiveTreeVO2> archiveTreeVO2s = new ArrayList<>();
 | 
	
		
			
				|  |  | +        //取出指定范围
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //取出链表
 | 
	
		
			
				|  |  | +        ForestNodeMergerEx.getTreeList(srcTree,archiveTreeSrcList);
 | 
	
		
			
				|  |  | +        ForestNodeMergerEx.getTreeList(dstTree,archiveTreeVO2s);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Map<Long, ArchiveTreeVO2> map = new LinkedHashMap<>();
 | 
	
		
			
				|  |  | +        for (ArchiveTreeVO2 ar : archiveTreeSrcList) {
 | 
	
		
			
				|  |  | +            map.put(ar.getId(),ar);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        for (ArchiveTreeVO2 ar : archiveTreeVO2s) {
 | 
	
		
			
				|  |  | +            ArchiveTreeVO2 archiveTreeVO2 = map.get(ar.getFromId());
 | 
	
		
			
				|  |  | +            if (archiveTreeVO2!= null) {
 | 
	
		
			
				|  |  | +                ar.sync(archiveTreeVO2);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |