|
@@ -0,0 +1,273 @@
|
|
|
|
+package org.springblade.manager.service.impl;
|
|
|
|
+
|
|
|
|
+import com.mixsmart.utils.StringUtils;
|
|
|
|
+import io.swagger.annotations.ApiModelProperty;
|
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
|
+import org.springblade.common.utils.SnowFlakeUtil;
|
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
|
+import org.springblade.core.tool.utils.Func;
|
|
|
|
+import org.springblade.manager.entity.ArchiveTree;
|
|
|
|
+import org.springblade.manager.entity.ArchiveTreeContract;
|
|
|
|
+import org.springblade.manager.entity.ContractInfo;
|
|
|
|
+import org.springblade.manager.entity.WbsTree;
|
|
|
|
+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.vo.*;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+
|
|
|
|
+import java.util.*;
|
|
|
|
+
|
|
|
|
+@Service
|
|
|
|
+@AllArgsConstructor
|
|
|
|
+public class ArTreeContractInitServiceImpl {
|
|
|
|
+ private final IWbsTreeService wbsTreeService;
|
|
|
|
+
|
|
|
|
+ private final IContractInfoService contractInfoService;
|
|
|
|
+
|
|
|
|
+ private final ProjectClient projectClient;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 按照层次获取公共归档树
|
|
|
|
+ * @param parentId
|
|
|
|
+ * @param wbsId
|
|
|
|
+ * @param tenantId
|
|
|
|
+ * @param type
|
|
|
|
+ * @param level 层次,1,单位工程,2
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public List<ArchiveTree> getWbsArchiveTree(Long parentId, String wbsId, String tenantId, String type,Long level)
|
|
|
|
+ {
|
|
|
|
+ List<ArchiveTree> archiveTreeList = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ List<WbsTreeVO2> wbsTreeVO2s = wbsTreeService.tree(wbsId, tenantId, type);
|
|
|
|
+
|
|
|
|
+ //遍历构建
|
|
|
|
+ for (WbsTreeVO2 wbsTreeVO2:wbsTreeVO2s) {
|
|
|
|
+ //只展示指定层级之上的
|
|
|
|
+ if (wbsTreeVO2.getNodeType() > level){
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ArchiveTree archiveTree = new ArchiveTree();
|
|
|
|
+ archiveTree.setId(SnowFlakeUtil.getId());
|
|
|
|
+ archiveTree.setParentId(parentId);
|
|
|
|
+ archiveTree.setNodeName(wbsTreeVO2.getTitle());
|
|
|
|
+ archiveTree.setExtId(wbsTreeVO2.getId());
|
|
|
|
+ archiveTree.setDisplayHierarchy(level.toString());
|
|
|
|
+ archiveTreeList.add(archiveTree);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置pid
|
|
|
|
+
|
|
|
|
+ return archiveTreeList;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void copyTree(String tenantId, Long projectId, String projectName, ArchiveTreeVO2 tree, List<ArchiveTreeContract> archiveTreeContracts,
|
|
|
|
+ List<ContractInfo> contracts){
|
|
|
|
+
|
|
|
|
+ //合同段信息表
|
|
|
|
+ Map<Long,ContractInfo> contractMap = new LinkedHashMap<>();
|
|
|
|
+ //新旧ID对照表
|
|
|
|
+ Map<Long,Long> oldNewMap = new LinkedHashMap<>();
|
|
|
|
+
|
|
|
|
+ boolean bHasCon = false;
|
|
|
|
+ boolean bHasSup = false;
|
|
|
|
+ for (ContractInfo contractInfo: contracts) {
|
|
|
|
+ contractMap.put(contractInfo.getId(),contractInfo);
|
|
|
|
+ if (contractInfo.getContractType() == 1) {
|
|
|
|
+ bHasCon = true;
|
|
|
|
+ }
|
|
|
|
+ if (contractInfo.getContractType() == 2) {
|
|
|
|
+ bHasSup = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ArchiveTreeContract archiveTreeContract = new ArchiveTreeContract(tree);
|
|
|
|
+ archiveTreeContract.setNodeName(projectName);
|
|
|
|
+ archiveTreeContract.setProjectId(projectId);
|
|
|
|
+ archiveTreeContract.setId(SnowFlakeUtil.getId());
|
|
|
|
+ archiveTreeContract.setParentId(0L);
|
|
|
|
+ oldNewMap.put(tree.getId(),archiveTreeContract.getId());
|
|
|
|
+ archiveTreeContracts.add(archiveTreeContract);
|
|
|
|
+
|
|
|
|
+ //拷贝第一层
|
|
|
|
+ copyChild(tenantId,projectId,null,archiveTreeContract.getId(),tree.getChildren(),archiveTreeContracts,oldNewMap);
|
|
|
|
+
|
|
|
|
+ //拷贝
|
|
|
|
+ for (ArchiveTreeVO2 child: tree.getChildren()) {
|
|
|
|
+ if (child.getTitle().indexOf("施工") >= 0 && bHasCon) {
|
|
|
|
+ for (ContractInfo contractInfo:contracts) {
|
|
|
|
+ if (contractInfo.getContractType() == 1) {
|
|
|
|
+ copyContractTree(tenantId,projectId,contractInfo,oldNewMap.get(child.getId()),child.getChildren(),archiveTreeContracts,oldNewMap);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ else if (child.getTitle().indexOf("监理") >= 0 && bHasSup) {
|
|
|
|
+ for (ContractInfo contractInfo:contracts) {
|
|
|
|
+ if (contractInfo.getContractType() == 2) {
|
|
|
|
+ copyContractTree(tenantId,projectId,contractInfo,oldNewMap.get(child.getId()),child.getChildren(),archiveTreeContracts,oldNewMap);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }else {
|
|
|
|
+ copyNormalTree(tenantId,projectId,null,oldNewMap.get(child.getId()),child.getChildren(),archiveTreeContracts,oldNewMap);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //设置祖先id
|
|
|
|
+ InitAncestors(archiveTreeContracts);
|
|
|
|
+
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ public void copyContractTree(String tenantId, Long projectId, ContractInfo contractInfo ,Long newRootId,
|
|
|
|
+ List<ArchiveTreeVO2> child,List<ArchiveTreeContract> archiveTreeContracts,Map<Long,Long> oldNewMap){
|
|
|
|
+ ArchiveTreeContract contractNode = new ArchiveTreeContract();
|
|
|
|
+ contractNode.setNodeName(contractInfo.getContractName());
|
|
|
|
+ contractNode.setId(SnowFlakeUtil.getId());
|
|
|
|
+ //TODO
|
|
|
|
+ contractNode.setExtType(2);
|
|
|
|
+ contractNode.setNodeType(0);
|
|
|
|
+ contractNode.setIsUploadFileDisplayConfigurationTree(1);
|
|
|
|
+ contractNode.setParentId(newRootId);
|
|
|
|
+ contractNode.setProjectId(projectId);
|
|
|
|
+ contractNode.setContractId(contractInfo.getId());
|
|
|
|
+ archiveTreeContracts.add(contractNode);
|
|
|
|
+
|
|
|
|
+ if (child == null || child.size() == 0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<ArchiveTreeVO2> childList = new ArrayList<>();
|
|
|
|
+ for (ArchiveTreeVO2 archiveTreeVO2:child) {
|
|
|
|
+ List<ArchiveTreeVO2> tmpList = new ArrayList<>();
|
|
|
|
+ ForestNodeMerger.getTreeList(archiveTreeVO2,tmpList);
|
|
|
|
+ childList.addAll(tmpList);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ copyChild(tenantId,projectId,contractInfo.getId(),contractNode.getId(),childList,archiveTreeContracts,null);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void copyNormalTree(String tenantId, Long projectId, Long contractId, Long newRootId, List<ArchiveTreeVO2> child,
|
|
|
|
+ List<ArchiveTreeContract> archiveTreeContracts, Map<Long,Long> oldNewMap){
|
|
|
|
+
|
|
|
|
+ List<ArchiveTreeVO2> childList = new ArrayList<>();
|
|
|
|
+ for (ArchiveTreeVO2 archiveTreeVO2:child) {
|
|
|
|
+ List<ArchiveTreeVO2> tmpList = new ArrayList<>();
|
|
|
|
+ ForestNodeMerger.getTreeList(archiveTreeVO2,tmpList);
|
|
|
|
+ childList.addAll(tmpList);
|
|
|
|
+ }
|
|
|
|
+ //newRootId = oldNewMap.get(newRootId);
|
|
|
|
+ copyChild(tenantId,projectId,contractId,newRootId,childList,archiveTreeContracts,oldNewMap);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ *
|
|
|
|
+ * @param tenantId
|
|
|
|
+ * @param projectId
|
|
|
|
+ * @param contractId
|
|
|
|
+ * @param newRootId
|
|
|
|
+ * @param child
|
|
|
|
+ * @param archiveTreeContracts
|
|
|
|
+ * @param oldNewMap
|
|
|
|
+ */
|
|
|
|
+ public void copyChild(String tenantId, Long projectId, Long contractId, Long newRootId, List<ArchiveTreeVO2> child,
|
|
|
|
+ List<ArchiveTreeContract> archiveTreeContracts, Map<Long,Long> oldNewMap){
|
|
|
|
+
|
|
|
|
+ if (oldNewMap == null ) {
|
|
|
|
+ oldNewMap = new LinkedHashMap<>();
|
|
|
|
+ }
|
|
|
|
+ if (child == null ) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ for (ArchiveTreeVO2 archiveTree :child) {
|
|
|
|
+ oldNewMap.put(archiveTree.getId(), SnowFlakeUtil.getId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for (ArchiveTreeVO2 archiveTreeVO :child) {
|
|
|
|
+
|
|
|
|
+ ArchiveTreeContract archiveTreeContract = new ArchiveTreeContract(archiveTreeVO);
|
|
|
|
+ archiveTreeContract.setId(oldNewMap.get(archiveTreeVO.getId()));
|
|
|
|
+ Long pid = oldNewMap.get(archiveTreeVO.getParentId());
|
|
|
|
+ if (pid == null ) {
|
|
|
|
+ pid = newRootId;
|
|
|
|
+ }
|
|
|
|
+ archiveTreeContract.setParentId(pid);
|
|
|
|
+ archiveTreeContract.setCreateUser(AuthUtil.getUserId());
|
|
|
|
+ archiveTreeContract.setProjectId(projectId);
|
|
|
|
+
|
|
|
|
+ if (contractId != null ) {
|
|
|
|
+ archiveTreeContract.setContractId(contractId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ archiveTreeContracts.add(archiveTreeContract);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void InitAncestors(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());
|
|
|
|
+ archiveTreeContractVO2List.add(treeContractVO2);
|
|
|
|
+ vo2Map.put(treeContractVO2.getId(),treeContractVO2);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<ArchiveTreeContractVO2> trees = ForestNodeMerger.merge(archiveTreeContractVO2List);
|
|
|
|
+
|
|
|
|
+ InitAncestors(trees.get(0),"0");
|
|
|
|
+
|
|
|
|
+ for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
|
|
|
|
+ ArchiveTreeContractVO2 tmp = vo2Map.get(archiveTreeContract.getId());
|
|
|
|
+ if (tmp != null ) {
|
|
|
|
+ archiveTreeContract.setAncestors(tmp.getAncestors());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void InitAncestors(ArchiveTreeContractVO2 tree, String ancestors) {
|
|
|
|
+ String localAncestors = ancestors + "," + tree.getId();
|
|
|
|
+ tree.setAncestors(ancestors);
|
|
|
|
+
|
|
|
|
+ List<ArchiveTreeContractVO2> childrens = tree.getChildren();
|
|
|
|
+ if (childrens!= null) {
|
|
|
|
+ for (ArchiveTreeContractVO2 child :childrens) {
|
|
|
|
+ InitAncestors(child,localAncestors);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public List<ArchiveTreeContract> getTreeContractFromWbs(String tenantId, Long projectId, Long wbsId, Long contractId,Long level,ArchiveTreeContractVO2 subTree){
|
|
|
|
+ List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ //1. 获取子树链表
|
|
|
|
+ List<ArchiveTreeContractVO2> treeContractVO2s = new ArrayList<>();
|
|
|
|
+ ForestNodeMerger.getTreeList(subTree,treeContractVO2s);
|
|
|
|
+
|
|
|
|
+ //2. 获取对应合同的树
|
|
|
|
+ List<WbsTreeContractVO6> wbsTreeContractVO6s = contractInfoService.tree6List(wbsId.toString(),projectId.toString(),contractId.toString());
|
|
|
|
+ Iterator<WbsTreeContractVO6> iterator = wbsTreeContractVO6s.iterator();
|
|
|
|
+ while (iterator.hasNext()) {
|
|
|
|
+ WbsTreeContractVO6 treeContractVO6 = iterator.next();
|
|
|
|
+ if (treeContractVO6.getNodeType() > level) {
|
|
|
|
+ iterator.remove();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return archiveTreeContracts;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|