huangtf hai 5 meses
pai
achega
63669abc38
Modificáronse 22 ficheiros con 685 adicións e 124 borrados
  1. 50 0
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java
  2. 15 4
      blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/trans/ArchiveReq.java
  3. 22 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ArchiveTreeContract.java
  4. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java
  5. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java
  6. 13 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveMeasurementController.java
  7. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  8. 70 10
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/bean/ExternalDataInfo.java
  9. 112 46
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveAutoService.java
  10. 38 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveBuildService.java
  11. 22 14
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveFileService.java
  12. 150 41
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveTreeService.java
  13. 47 6
      blade-service/blade-archive/src/main/java/org/springblade/archive/external/utils/TransUtil.java
  14. 4 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  15. 74 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  16. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  17. 15 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java
  18. 8 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java
  19. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.java
  20. 14 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  21. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java
  22. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java

+ 50 - 0
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/entity/ArchivesAuto.java

@@ -20,12 +20,16 @@ import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
+import org.springblade.archive.trans.ArchiveAutoVo;
+import org.springblade.archive.trans.ArchiveTreeVo;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.springframework.beans.BeanUtils;
 
 /**
  * 实体类
@@ -186,4 +190,50 @@ public class ArchivesAuto extends BaseEntity {
     }
 
     private String outId;
+
+
+    public void fromExternal(ArchiveAutoVo autoVo) {
+        if (autoVo == null) {
+            return;
+        }
+
+        // 1. 使用工具类拷贝同名且类型兼容的属性
+        BeanUtils.copyProperties(autoVo, this);
+
+        // 2. 手动处理类型不兼容的字段
+        // Date -> LocalDateTime 转换
+        if (autoVo.getStartDate() != null) {
+            this.setStartDate(autoVo.getStartDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDateTime());
+        }
+        if (autoVo.getEndDate() != null) {
+            this.setEndDate(autoVo.getEndDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDateTime());
+        }
+        if (autoVo.getReviewDate() != null) {
+            this.setReviewDate(autoVo.getReviewDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDateTime());
+        }
+        if (autoVo.getRollDate() != null) {
+            this.setRollDate(autoVo.getRollDate().toInstant()
+                    .atZone(ZoneId.systemDefault())
+                    .toLocalDateTime());
+        }
+
+        // 3. 处理 ArchivesAuto 特有字段(尝试从 Vo 找相近字段)
+        // filingUnit 可能对应 Vo 的 unit 字段
+        this.setFilingUnit(autoVo.getUnit());
+        // fileSize 可能对应 Vo 的 size 字段(Integer → Long)
+        if (autoVo.getSize() != null) {
+            this.setFileSize(autoVo.getSize().longValue());
+        }
+
+        // 4. 设置默认值(根据业务需求)
+        this.setIsAutoFile(0);
+        this.setIsArchive(1);
+        this.setIsDeleted(0);
+    }
 }

+ 15 - 4
blade-service-api/blade-archive-api/src/main/java/org/springblade/archive/trans/ArchiveReq.java

@@ -4,13 +4,16 @@ import java.util.ArrayList;
 import java.util.List;
 
 public class ArchiveReq {
+    String projectName ="平塘至天峨高速公路";
+
     String id;
 
     /*类型枚举:
-    0 推送归档树;
-    1 推送归档树
-    2 推送案卷
-    3 推送文件
+    0 推送开始;
+    1 推送归档树;
+    2 推送归档树结束
+    3 推送案卷
+    4 推送文件
      */
     Integer type;
 
@@ -90,4 +93,12 @@ public class ArchiveReq {
     public void setMetas(List<ArchiveMetaVo> metas) {
         this.metas = metas;
     }
+
+    public String getProjectName() {
+        return projectName;
+    }
+
+    public void setProjectName(String projectName) {
+        this.projectName = projectName;
+    }
 }

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

@@ -26,6 +26,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang.StringUtils;
+import org.springblade.archive.trans.ArchiveTreeVo;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -381,4 +382,25 @@ public class ArchiveTreeContract extends BaseEntity {
         }
         return false;
     }
+
+
+    public void fromExternal(ArchiveTreeVo archiveTree) {
+        if (archiveTree == null) {
+            return;
+        }
+
+        this.nodeName = archiveTree.getName();
+        this.fullName = archiveTree.getName();
+        this.nodeType = 1;
+
+        //质检资料
+        this.associationType = 1;
+//        this.majorDataType = archiveTree.getMajorDataType();
+//        this.displayHierarchy = archiveTree.getDisplayHierarchy();
+        this.isStorageNode = archiveTree.getIsStorage();
+        this.isBuiltDrawing = archiveTree.getIsAsBuiltDrawing();
+        this.setIsDeleted(0);
+
+    }
+
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ArchiveTreeContractClient.java

@@ -63,4 +63,10 @@ public interface ArchiveTreeContractClient {
 
     @PostMapping(API_PREFIX+"/getArchiveTreeContractDto")
     List<ArchiveTreeContractDTO> getArchiveTreeContractDto(@RequestBody List<JiLinQueryDto>dtos, @RequestParam Long projectId);
+
+    @PostMapping(API_PREFIX+"/getOutNodes")
+    public List<ArchiveTreeContract> getOutNodes(@RequestParam Long projectId);
+
+    @PostMapping(API_PREFIX+"/getOutNodesByOutIds")
+    public List<ArchiveTreeContract> getOutNodesByOutIds(@RequestParam Long projectId,@RequestParam List<String> outIds);
 }

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/ProjectClient.java

@@ -40,4 +40,7 @@ public interface ProjectClient {
     @GetMapping(API_PREFIX + "/getList")
     List<ProjectInfo> getList();
 
+    @GetMapping(API_PREFIX + "/getIdByName")
+    Long getIdByName(@RequestParam String key);
+
 }

+ 13 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveMeasurementController.java

@@ -11,6 +11,7 @@ import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.springblade.archive.external.impl.ExternalDataArchiveBuildService;
 import org.springblade.archive.service.IArchiveAutoPdfService;
 import org.springblade.archive.trans.ArchiveReq;
 import org.springblade.business.entity.ArchiveFile;
@@ -19,6 +20,7 @@ import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.tool.api.ResultCode;
 import org.springblade.manager.entity.ArchiveTreeContract;
 import org.springblade.manager.feign.ArchiveTreeContractClient;
+import org.springblade.manager.feign.ProjectClient;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.IOSSClient;
 import org.springblade.resource.feign.NewIOSSClient;
@@ -55,6 +57,10 @@ public class ArchiveMeasurementController {
     private ArchiveFileClient archiveFileClient;
     private final CommonFileClient commonFileClient;
 
+    private final ProjectClient projectClient;
+
+    private final ExternalDataArchiveBuildService externalDataArchiveBuildService;
+
     @PostMapping("/upFile")
     @ApiOperation(value = "上传文件", notes = "上传文件")
     public R upFile(@RequestParam String projectName,
@@ -257,7 +263,14 @@ public class ArchiveMeasurementController {
             @RequestBody ArchiveReq request) {
 
         // 业务逻辑保持不变
+        if (request == null ) {
+            return ResponseEntity.ok("Request processed fail");
+        }
+
+        Long projectId = projectClient.getIdByName(request.getProjectName());
         System.out.println();
+
+        externalDataArchiveBuildService.handle(projectId,request);
         return ResponseEntity.ok("Request processed successfully");
     }
 

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -100,6 +100,8 @@ public class ArchivesAutoController extends BladeController {
 	private final ArchiveTreeContractClient archiveTreeContractClient;
 	private ContractClient contractClient;
 
+	private final ProjectClient projectClient;
+
 	@Autowired
 	private ExecutorService executorService;
 	@Autowired
@@ -135,6 +137,8 @@ public class ArchivesAutoController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入archivesAuto")
 	public R<IPage<ArchivesAutoVO>> page(ArchivesAutoVO queryVo, Query query) {
 //		IPage<ArchivesAutoVO> pages = archivesAutoService.selectArchivesAutoPage(Condition.getPage(query), archivesAuto);
+		Long projectId = projectClient.getIdByName("平塘至天峨高速公路");
+
 		if(queryVo.getNodeIds() == null || queryVo.getNodeIds().equals("")){
 			return  R.data(null);
 		}

+ 70 - 10
blade-service/blade-archive/src/main/java/org/springblade/archive/external/bean/ExternalDataInfo.java

@@ -1,5 +1,11 @@
 package org.springblade.archive.external.bean;
 
+import org.springblade.archive.trans.ArchiveTreeVo;
+import org.springblade.manager.entity.ArchiveTreeContract;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 public class ExternalDataInfo {
@@ -11,13 +17,38 @@ public class ExternalDataInfo {
     private Long projectId;
 
     // 外内归档树节点ID映射
-    private Map<String, String> archiveTreeNodeIdMapping;
+    private Map<String, Long> archiveTreeNodeIdMapping = new HashMap<>();;
 
     // 外内案卷节点ID映射
-    private Map<String, Long> archiveIdMapping;
+    private Map<String, Long> archiveIdMapping = new HashMap<>();
 
     // 外内文件节点ID映射
-    private Map<String, Long> fileIdMapping;
+    private Map<String, Long> fileIdMapping = new HashMap<>();;
+
+    private List<ArchiveTreeVo> archives = new ArrayList<>();
+
+
+    //父节点
+    private Long pid;
+    private ArchiveTreeContract parent;
+
+
+    public void Init() {
+        archiveTreeNodeIdMapping.clear();
+        archiveIdMapping.clear();
+        fileIdMapping.clear();
+        archives.clear();
+    }
+
+    /**
+     * 追加归档树数据到列表
+     * @param newArchives 新增的归档树数据列表
+     */
+    public void addArchives(List<ArchiveTreeVo> newArchives) {
+        if (newArchives != null && !newArchives.isEmpty()) {
+            archives.addAll(newArchives);
+        }
+    }
 
 
     // Getter 和 Setter 方法
@@ -37,28 +68,57 @@ public class ExternalDataInfo {
         this.projectId = projectId;
     }
 
-    public Map<String, String> getArchiveTreeNodeIdMapping() {
+    public Map<String, Long> getArchiveTreeNodeIdMapping() {
         return archiveTreeNodeIdMapping;
     }
 
-    public void setArchiveTreeNodeIdMapping(Map<String, String> archiveTreeNodeIdMapping) {
+
+
+    public Map<String, Long> getArchiveIdMappingMapping() {
+        return archiveIdMapping;
+    }
+
+    public void setArchiveTreeNodeIdMapping(Map<String, Long> archiveTreeNodeIdMapping) {
         this.archiveTreeNodeIdMapping = archiveTreeNodeIdMapping;
     }
 
-    public Map<String, Long> getArchiveIdMappingMapping() {
+    public Map<String, Long> getArchiveIdMapping() {
         return archiveIdMapping;
     }
 
-    public void setArchiveIdMapping(Map<String, Long> caseNodeIdMapping) {
-        this.archiveIdMapping = caseNodeIdMapping;
+    public void setArchiveIdMapping(Map<String, Long> archiveIdMapping) {
+        this.archiveIdMapping = archiveIdMapping;
     }
 
     public Map<String, Long> getFileIdMapping() {
         return fileIdMapping;
     }
 
-    public void setFileNodeIdMapping(Map<String, Long> fileNodeIdMapping) {
-        this.fileIdMapping = fileNodeIdMapping;
+    public void setFileIdMapping(Map<String, Long> fileIdMapping) {
+        this.fileIdMapping = fileIdMapping;
+    }
+
+    public List<ArchiveTreeVo> getArchives() {
+        return archives;
     }
 
+    public void setArchives(List<ArchiveTreeVo> archives) {
+        this.archives = archives;
+    }
+
+    public ArchiveTreeContract getParent() {
+        return parent;
+    }
+
+    public void setParent(ArchiveTreeContract parent) {
+        this.parent = parent;
+    }
+
+    public Long getPid() {
+        return pid;
+    }
+
+    public void setPid(Long pid) {
+        this.pid = pid;
+    }
 }

+ 112 - 46
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveAutoService.java

@@ -1,21 +1,79 @@
 package org.springblade.archive.external.impl;
 
+import lombok.AllArgsConstructor;
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.external.bean.ExternalDataInfo;
+import org.springblade.archive.mapper.ArchivesAutoMapper;
+import org.springblade.archive.trans.ArchiveAutoVo;
+import org.springblade.archive.trans.ArchiveReq;
+import org.springblade.archive.trans.ArchiveTreeVo;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.stream.Collectors;
 
 @Service
+@AllArgsConstructor
 public class ExternalDataArchiveAutoService {
 
+    private ArchivesAutoMapper autoMapper;
 
-    public void syncData(ExternalDataInfo externalDataInfo) {
+    public void handleArchiveAutos(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
+        syncData(projectId, req, externalDataInfo);
+    }
+
+
+    public List<ArchivesAuto> listConvert(String nodeId, List<ArchiveAutoVo> archiveAutoVos, ExternalDataInfo externalDataInfo) {
+
+        List<ArchivesAuto> archivesAutos = new ArrayList<>();
+        Map<String, Long> archiveAutoOutIdMapping = new LinkedHashMap<>();
+
+        Map<String, Long> archiveTreeOutIdMapping = externalDataInfo.getArchiveTreeNodeIdMapping();
+        Long rootId = externalDataInfo.getPid();
+        ArchiveTreeContract rootNode = externalDataInfo.getParent();
+
+        // 1. 生成所有节点的唯一新ID并建立映射
+        for (ArchiveAutoVo archiveAutoVo : archiveAutoVos) {
+            archiveAutoOutIdMapping.put(archiveAutoVo.getId(), SnowFlakeUtil.getId());
+        }
+
+        // 2. 遍历所有节点,构建ArchiveTreeContract对象
+        for (ArchiveAutoVo autoVo : archiveAutoVos) {
+
+
+            ArchivesAuto archivesAuto = new ArchivesAuto();
+
+            // 拷贝rootNode的属性到当前节点(如名称、类型等元数据)
+
+            // 设置新ID(从映射表中获取)
+            Long newNodeId = archiveAutoOutIdMapping.get(autoVo.getId());
+            archivesAuto.setId(newNodeId);
+            archivesAuto.setOutId(autoVo.getId());
+
+            Long archiveNodeId = archiveTreeOutIdMapping.get(autoVo.getNodeId());
+            archivesAuto.setNodeId(archiveNodeId);
+
+            //核心转化
+            archivesAuto.fromExternal(autoVo);
+            archivesAuto.setProjectId(rootNode.getProjectId());
+            archivesAuto.setContractId(rootNode.getContractId());
+            // 设置父ID逻辑:
+
+
+            // 将构建好的对象加入结果列表
+            archivesAutos.add(archivesAuto);
+        }
+        externalDataInfo.setArchiveIdMapping(archiveAutoOutIdMapping);
+
+        return archivesAutos;
+    }
+
+    public void syncData(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo) {
         // 新增的案卷列表
         List<ArchivesAuto> addArchives = new ArrayList<>();
 
@@ -23,14 +81,18 @@ public class ExternalDataArchiveAutoService {
         List<ArchivesAuto> upArchives = new ArrayList<>();
 
         // 获取外部系统案卷数据
-        List<ArchivesAuto> externalArchives = getExternalArchives(
-                externalDataInfo.getProjectName(),
-                externalDataInfo
-        );
+        List<ArchivesAuto> externalArchives = listConvert(req.getNodeId(), req.getAutos(),externalDataInfo);
+
+        List<String> outIds = Optional.ofNullable(externalArchives)
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .map(ArchivesAuto::getOutId) // 假设 getOutId() 返回 String
+                .filter(Objects::nonNull) // 可选:过滤 null 值
+                .collect(Collectors.toList());
 
         // 获取本地存储的案卷数据
         List<ArchivesAuto> localArchives = getLocalArchives(
-                externalDataInfo.getProjectName()
+                projectId,outIds
         );
 
         // 比对差异获取需新增/更新的案卷
@@ -55,20 +117,19 @@ public class ExternalDataArchiveAutoService {
         List<ArchivesAuto> localArchives = new ArrayList<>();
         // 模拟实现:根据项目名称查询数据库获取本地案卷
         // 示例伪代码:localArchives = archivesMapper.selectByProject(projectName);
+
         return localArchives;
     }
 
-    /**
-     * 获取外部系统案卷数据(需实现)
-     * @param projectName 项目名称
-     * @param externalData 外部数据参数
-     * @return 外部系统案卷列表
-     */
-    private List<ArchivesAuto> getExternalArchives(String projectName, ExternalDataInfo externalData) {
-        // 待实现:调用外部系统接口获取案卷数据
-        return new ArrayList<>();
+
+    private List<ArchivesAuto> getLocalArchives(Long projectId, List<String> outIds) {
+
+        List<ArchivesAuto> localArchives = autoMapper.getOutArchiveAutosByOutIds(projectId,outIds);
+        //List<ArchiveTreeContract> localContracts = archiveTreeContractClient.getOutNodesByOutIds(projectId,outIds);
+        return localArchives;
     }
 
+
     /**
      * 执行新增/更新持久化操作(需实现)
      * @param addArchives 新增案卷集合
@@ -86,43 +147,48 @@ public class ExternalDataArchiveAutoService {
             List<ArchivesAuto> addArchives,
             List<ArchivesAuto> upArchives) {
 
-        // 将外部案卷转换为 Map,键为 ID,值为 ArchivesAuto
-        Map<Long, ArchivesAuto> externalArchivesMap = externalArchives.stream()
-                .collect(Collectors.toMap(ArchivesAuto::getId, archive -> archive));
+        // 1. 提取本地案卷的 outId 集合(用于快速判断外部案卷是否已存在)
+        Set<String> localOutIdSet = localArchives.stream()
+                .map(ArchivesAuto::getOutId)
+                .filter(outId -> outId != null && !outId.isEmpty())
+                .collect(Collectors.toSet());
 
-        // 遍历本地案卷,找出新增和更新的案卷
-        for (ArchivesAuto localArchive : localArchives) {
-            ArchivesAuto externalArchive = externalArchivesMap.get(localArchive.getId());
-            if (externalArchive == null) {
-                // 外部系统没有此案卷,认为是新增案卷
-                addArchives.add(localArchive);
-            } else {
-                // 外部系统有此案卷,比较更新时间
-                if (!externalArchive.getOutUrl().equals(localArchive.getOutUrl())) {
-                    // 更新时间不同,认为是更新案卷
+        // 2. 将本地案卷转为 Map<outId, ArchivesAuto> 以便快速查找
+        Map<String, ArchivesAuto> localArchiveMap = localArchives.stream()
+                .filter(archive -> archive.getOutId() != null && !archive.getOutId().isEmpty())
+                .collect(Collectors.toMap(ArchivesAuto::getOutId, archive -> archive));
 
+        // 3. 遍历外部案卷,判断新增或更新
+        for (ArchivesAuto externalArchive : externalArchives) {
+            String externalOutId = externalArchive.getOutId();
+
+            // 跳过空 outId(根据业务需求调整)
+            if (externalOutId == null || externalOutId.isEmpty()) {
+                continue;
+            }
+
+            // 判断外部 outId 是否存在于本地
+            if (!localOutIdSet.contains(externalOutId)) {
+                addArchives.add(externalArchive);  // 新增
+            } else {
+                // 存在则查找本地对应案卷,判断是否需要更新
+                ArchivesAuto localArchive = localArchiveMap.get(externalOutId);
+                if (localArchive != null && needUpdate(externalArchive, localArchive)) {
+                    // 合并更新字段(示例:更新 outUrl)
                     localArchive.setOutUrl(externalArchive.getOutUrl());
                     upArchives.add(localArchive);
                 }
             }
         }
+    }
 
-        // 将外部案卷中没有在本地案卷中的,认为是新增案卷
-
-
-        // 处理新增案卷的 NodeId, NodeExtId 和 ArchiveId 映射
-        if (addArchives != null && !addArchives.isEmpty()) {
-            for (ArchivesAuto addArchive : addArchives) {
-                // 处理 NodeId 映射
-                if (addArchive.getNodeId() != null && externalDataInfo.getArchiveTreeNodeIdMapping() != null) {
-                    String nodeId = externalDataInfo.getArchiveTreeNodeIdMapping().get(addArchive.getNodeId());
-                    if (nodeId != null) {
-                        addArchive.setNodeId(Long.parseLong(nodeId));
-                    }
-                }
+    // 辅助方法:仅根据关键字段判断是否需要更新
+    private boolean needUpdate(ArchivesAuto external, ArchivesAuto local) {
+        // 示例:检查 outUrl 是否不同
+        return !Objects.equals(external.getOutUrl(), local.getOutUrl());
 
-            }
-        }
+        // 如果需要检查更多字段,可以追加条件,例如:
+        // || !Objects.equals(external.getFileNumber(), local.getFileNumber())
     }
 
 

+ 38 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveBuildService.java

@@ -1,10 +1,14 @@
 package org.springblade.archive.external.impl;
 
+import lombok.AllArgsConstructor;
 import org.springblade.archive.external.bean.ExternalDataInfo;
+import org.springblade.archive.external.utils.TransUtil;
+import org.springblade.archive.trans.ArchiveReq;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Service
+@AllArgsConstructor
 public class ExternalDataArchiveBuildService {
 
     @Autowired
@@ -15,6 +19,38 @@ public class ExternalDataArchiveBuildService {
     private  ExternalDataArchiveTreeService externalTreeService;
 
 
+    /**
+     *
+     * @param projectId
+     * @param req
+     */
+    public  void handle(Long projectId, ArchiveReq req){
+        if (req == null || req.getType() == null) {
+            throw new IllegalArgumentException("请求参数不能为空");
+        }
+
+        ExternalDataInfo externalDataInfo = externalTreeService.getDataByIds(req.getNodeId(),req.getRemoteId());
+
+        switch (req.getType()) {
+            case 0:
+                externalTreeService.handleArchiveTreesBegin(projectId,req,externalDataInfo);
+                break;
+            case 1:
+                externalTreeService.handleArchiveTrees(projectId,req,externalDataInfo);
+                break;
+            case 2:  // 类型0和1统一处理归档树
+                externalTreeService.handleArchiveTreesFinish(projectId,req,externalDataInfo);
+                break;
+            case 3:
+                externalDataArchiveAutoService.handleArchiveAutos(projectId,req,externalDataInfo);
+                break;
+            case 4:
+                externalDataArchiveFileService.handleArchiveFiles(projectId,req,externalDataInfo);
+                break;
+            default:
+                throw new UnsupportedOperationException("不支持的归档类型: " + req.getType());
+        }
+    }
 
 
     public  ExternalDataInfo syncExternalData(String projectName) {
@@ -23,8 +59,8 @@ public class ExternalDataArchiveBuildService {
         externalDataInfo.setProjectName(projectName);
 
         // 调用同步函数,传入 ExternalDataInfo 对象
-        externalTreeService.syncData(externalDataInfo);
-        externalDataArchiveAutoService.syncData(externalDataInfo);
+        //externalTreeService.syncData(externalDataInfo);
+        //externalDataArchiveAutoService.syncData(externalDataInfo);
         externalDataArchiveFileService.syncData(externalDataInfo);
 
         // 返回同步后的 ExternalDataInfo 对象

+ 22 - 14
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveFileService.java

@@ -1,6 +1,8 @@
 package org.springblade.archive.external.impl;
 
+import lombok.AllArgsConstructor;
 import org.springblade.archive.external.bean.ExternalDataInfo;
+import org.springblade.archive.trans.ArchiveReq;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.feign.ArchiveFileClient;
 import org.springframework.stereotype.Service;
@@ -12,10 +14,16 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service
+@AllArgsConstructor
 public class ExternalDataArchiveFileService {
 
     private ArchiveFileClient archiveFileClient;
 
+
+    public void handleArchiveFiles(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
+
+    }
+
     public void syncData(ExternalDataInfo externalDataInfo) {
         // 创建 ExternalDataInfo 对象
         //新增的文件
@@ -78,20 +86,20 @@ public class ExternalDataArchiveFileService {
         //刷新
         if (addFiles != null && !addFiles.isEmpty()) {
             for (ArchiveFile addFile :addFiles) {
-                if (addFile.getNodeId()!= null && externalDataInfo.getArchiveTreeNodeIdMapping()!= null) {
-                    String nodeId = externalDataInfo.getArchiveTreeNodeIdMapping().get(addFile.getNodeId());
-                    if (nodeId!=null) {
-                        addFile.setNodeId(nodeId);
-                    }
-                }
-
-                // Process NodeExtId
-                if (addFile.getNodeExtId() != null && externalDataInfo.getArchiveTreeNodeIdMapping() != null) {
-                    String nodeExtId = externalDataInfo.getArchiveTreeNodeIdMapping().get(addFile.getNodeExtId());
-                    if (nodeExtId != null) {
-                        addFile.setNodeExtId(Long.parseLong(nodeExtId));
-                    }
-                }
+//                if (addFile.getNodeId()!= null && externalDataInfo.getArchiveTreeNodeIdMapping()!= null) {
+//                    String nodeId = externalDataInfo.getArchiveTreeNodeIdMapping().get(addFile.getNodeId());
+//                    if (nodeId!=null) {
+//                        addFile.setNodeId(nodeId);
+//                    }
+//                }
+//
+//                // Process NodeExtId
+//                if (addFile.getNodeExtId() != null && externalDataInfo.getArchiveTreeNodeIdMapping() != null) {
+//                    String nodeExtId = externalDataInfo.getArchiveTreeNodeIdMapping().get(addFile.getNodeExtId());
+//                    if (nodeExtId != null) {
+//                        addFile.setNodeExtId(Long.parseLong(nodeExtId));
+//                    }
+//                }
 
                 // Process ArchiveId
                 if (addFile.getArchiveId() != null && externalDataInfo.getArchiveIdMappingMapping() != null) {

+ 150 - 41
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveTreeService.java

@@ -1,19 +1,112 @@
 package org.springblade.archive.external.impl;
 
+import lombok.AllArgsConstructor;
 import org.springblade.archive.external.bean.ExternalDataInfo;
+import org.springblade.archive.external.utils.TransUtil;
+import org.springblade.archive.mapper.ArchivesAutoMapper;
+import org.springblade.archive.trans.ArchiveReq;
+import org.springblade.archive.trans.ArchiveTreeVo;
 import org.springblade.business.entity.ArchiveFile;
+import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springblade.manager.feign.ArchiveTreeContractClient;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
+
 @Service
+@AllArgsConstructor
 public class ExternalDataArchiveTreeService {
+    private final ArchiveTreeContractClient archiveTreeContractClient;
+    private ArchivesAutoMapper autoMapper;
+
+    public  ExternalDataInfo getDataByIds(String nodeId, String remoteId){
+        ExternalDataInfo externalDataInfo = TransUtil.getDataByIds(nodeId, remoteId);
+
+        if (externalDataInfo.getParent() == null) {
+            ArchiveTreeContract archiveTreeContract = archiveTreeContractClient.getArchiveTreeContractById(externalDataInfo.getPid());
+            externalDataInfo.setParent(archiveTreeContract);
+        }
+        return externalDataInfo;
+    }
+
+    public void handleArchiveTreesBegin(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
+        //初始化
+        externalDataInfo.Init();
+    }
+
+    public void handleArchiveTrees(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
+        List<ArchiveTreeVo> archiveTreeVos  = req.getTrees();
+        List<ArchiveTreeVo> ArchiveTreeContract  = req.getTrees();
+        externalDataInfo.addArchives(req.getTrees());
+    }
+
+    public void handleArchiveTreesFinish(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
+        syncData(projectId,req,externalDataInfo);
+    }
+
+    public List<ArchiveTreeContract> listConvert(String nodeId,List<ArchiveTreeVo> archiveTreeVos, ExternalDataInfo externalDataInfo) {
+
+        List<ArchiveTreeContract> archiveTreeContracts = new ArrayList<>();
+        Map<String, Long> archiveTreeNodeIdMapping = new LinkedHashMap<>();
+        Long rootId = externalDataInfo.getPid();
+        ArchiveTreeContract rootNode = externalDataInfo.getParent();
+
+        // 1. 生成所有节点的唯一新ID并建立映射
+        for (ArchiveTreeVo advertTreeVo : archiveTreeVos) {
+            //根节点也映射
+            if (advertTreeVo.getId().equals(nodeId)) {
+                archiveTreeNodeIdMapping.put(nodeId, rootId);
+            }
+            archiveTreeNodeIdMapping.put(advertTreeVo.getId(), SnowFlakeUtil.getId());
+        }
+
+        // 2. 遍历所有节点,构建ArchiveTreeContract对象
+        for (ArchiveTreeVo advertTreeVo : archiveTreeVos) {
+
+            //根节点不需要新政
+            if (advertTreeVo.getId().equals(nodeId)) {
+                continue;
+            }
+
+            ArchiveTreeContract treeContract = new ArchiveTreeContract();
+
+            // 拷贝rootNode的属性到当前节点(如名称、类型等元数据)
+            if (rootNode != null) {
+                BeanUtils.copyProperties(rootNode, treeContract); // 使用Spring BeanUtils
+            }
 
-    public void syncData(ExternalDataInfo externalDataInfo) {
+            // 设置新ID(从映射表中获取)
+            Long newNodeId = archiveTreeNodeIdMapping.get(advertTreeVo.getId());
+            treeContract.setId(newNodeId);
+            treeContract.setOutId(advertTreeVo.getId());
+
+            //核心转化
+            treeContract.fromExternal(advertTreeVo);
+
+            // 设置父ID逻辑:
+            String originalParentId = advertTreeVo.getPid();
+            Long parentId = archiveTreeNodeIdMapping.get(originalParentId); // 查找映射表
+            if (parentId == null) {
+                parentId = rootId; // 映射不存在则指向根ID
+            }
+            treeContract.setParentId(parentId);
+
+            // 将构建好的对象加入结果列表
+            archiveTreeContracts.add(treeContract);
+        }
+
+        //保存
+        externalDataInfo.setArchiveTreeNodeIdMapping(archiveTreeNodeIdMapping);
+
+        return archiveTreeContracts;
+    }
+
+
+    public void syncData(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo) {
         // 新增的合同列表
         List<ArchiveTreeContract> addContracts = new ArrayList<>();
 
@@ -21,15 +114,17 @@ public class ExternalDataArchiveTreeService {
         List<ArchiveTreeContract> upContracts = new ArrayList<>();
 
         // 获取外部系统合同数据
-        List<ArchiveTreeContract> externalContracts = getExternalContracts(
-                externalDataInfo.getProjectName(),
-                externalDataInfo
-        );
+        List<ArchiveTreeContract> externalContracts = listConvert(req.getNodeId(), externalDataInfo.getArchives(),externalDataInfo);
+
+        List<String> outIds = Optional.ofNullable(externalContracts)
+                .orElseGet(Collections::emptyList)
+                .stream()
+                .map(ArchiveTreeContract::getOutId) // 假设 getOutId() 返回 String
+                .filter(Objects::nonNull) // 可选:过滤 null 值
+                .collect(Collectors.toList());
 
         // 获取本地存储的合同数据
-        List<ArchiveTreeContract> localContracts = getLocalContracts(
-                externalDataInfo.getProjectName()
-        );
+        List<ArchiveTreeContract> localContracts = getLocalContracts(projectId,outIds);
 
         // 比对差异获取需新增/更新的合同
         getAddAndUpdateContracts(
@@ -45,28 +140,28 @@ public class ExternalDataArchiveTreeService {
     }
 
     /**
-     * 获取本地合同数据
-     * @param projectName 项目名称
-     * @return 本地合同列表
+     *
+     * @param projectId
+     * @return
      */
-    private List<ArchiveTreeContract> getLocalContracts(String projectName) {
-        List<ArchiveTreeContract> localContracts = new ArrayList<>();
-        // 模拟实现:根据项目名称查询数据库获取本地合同
-        // 示例伪代码:localContracts = contractMapper.selectByProject(projectName);
+    private List<ArchiveTreeContract> getLocalContracts(Long projectId) {
+        List<ArchiveTreeContract> localContracts = archiveTreeContractClient.getOutNodes(projectId);
         return localContracts;
     }
 
     /**
-     * 获取外部系统合同数据(需实现)
-     * @param projectName 项目名称
-     * @param externalData 外部数据参数
-     * @return 外部系统合同列表
+     *
+     * @param projectId
+     * @return
      */
-    private List<ArchiveTreeContract> getExternalContracts(String projectName, ExternalDataInfo externalData) {
-        // 待实现:调用外部系统接口获取合同数据
-        return new ArrayList<>();
+    private List<ArchiveTreeContract> getLocalContracts(Long projectId, List<String> outIds) {
+
+        List<ArchiveTreeContract> localContracts = autoMapper.getOutNodesByOutIds(projectId,outIds);
+        //List<ArchiveTreeContract> localContracts = archiveTreeContractClient.getOutNodesByOutIds(projectId,outIds);
+        return localContracts;
     }
 
+
     /**
      * 执行新增/更新持久化操作(需实现)
      * @param addContracts 新增合同集合
@@ -83,26 +178,40 @@ public class ExternalDataArchiveTreeService {
             List<ArchiveTreeContract> addContracts,
             List<ArchiveTreeContract> upContracts) {
 
-        // 将外部合同转换为 Map,键为 ID,值为 ArchiveTreeContract
-        Map<Long, ArchiveTreeContract> externalContractsMap = externalContracts.stream()
-                .collect(Collectors.toMap(ArchiveTreeContract::getId, contract -> contract));
+        // 1. 提取本地合同的 outId 集合(用于快速判断外部合同是否已存在)
+        Set<String> localOutIdSet = localContracts.stream()
+                .map(ArchiveTreeContract::getOutId)  // 直接使用本地合同的 outId 字段
+                .filter(outId -> outId != null && !outId.isEmpty()) // 过滤空值
+                .collect(Collectors.toSet());
+
+        // 2. 遍历外部合同,判断新增或更新
+        for (ArchiveTreeContract externalContract : externalContracts) {
+            String externalOutId = externalContract.getOutId();
 
-        // 遍历本地合同,找出新增和更新的合同
-        for (ArchiveTreeContract localContract : localContracts) {
-            ArchiveTreeContract externalContract = externalContractsMap.get(localContract.getId());
-            if (externalContract == null) {
-                // 外部系统没有此合同,认为是新增合同
-                addContracts.add(localContract);
+            // 处理空 outId(根据业务需求决定是否跳过或新增)
+            if (externalOutId == null || externalOutId.isEmpty()) {
+                // addContracts.add(externalContract); // 如果需要处理空 outId 则取消注释
+                continue;
+            }
+
+            // 判断外部 outId 是否存在于本地
+            if (!localOutIdSet.contains(externalOutId)) {
+                addContracts.add(externalContract); // 不存在则新增
             } else {
-                // 外部系统有此合同,比较更新时间
-//                if (!externalContract.getOutUrl().equals(localContract.getOutUrl())) {
-//                    // 更新时间不同,认为是更新合同
-//                    localContract.setOutUrl(externalContract.getOutUrl());
-//                    upContracts.add(localContract);
-//                }
+                // 存在则查找对应本地合同,判断是否需要更新
+//                localContracts.stream()
+//                        .filter(localContract -> externalOutId.equals(localContract.getOutId()))
+//                        .findFirst()
+//                        .ifPresent(localContract -> {
+//                            // 示例:根据时间戳判断是否需要更新
+//                            if (externalContract.getUpdateTime().after(localContract.getUpdateTime())) {
+//                                upContracts.add(externalContract);
+//                            }
+//                        });
             }
         }
+    }
+
 
 
-    }
 }

+ 47 - 6
blade-service/blade-archive/src/main/java/org/springblade/archive/external/utils/TransUtil.java

@@ -9,13 +9,54 @@ import java.util.concurrent.ConcurrentMap;
 
 public class TransUtil {
 
-    private final ConcurrentMap<Long, ExternalDataInfo> dataMap = new ConcurrentHashMap<>();
-
-    public static final Map<String, Long> fileTypeToTableMap = new LinkedHashMap<>();
-
-    static {
-        fileTypeToTableMap.put("", 6666L);
+    private static final ConcurrentMap<Long, ExternalDataInfo> dataMap = new ConcurrentHashMap<>();
+
+    public static final Map<String, Long> EXTERNAL_TO_INTERNAL_NODE_ID_MAP = new LinkedHashMap<String, Long>() {{
+        // 初始化默认映射关系(可按需添加)
+
+        //机电标 施工工序
+        put("8a0aa647278548fa9edba59b78c4", 1892759789419626529L);
+    }};
+
+    public static ExternalDataInfo getDataByExternalId(String externalId) {
+        // 1. 获取内部nodeId
+        Long internalNodeId = EXTERNAL_TO_INTERNAL_NODE_ID_MAP.get(externalId);
+        if (internalNodeId == null) {
+            return null;
+        }
+
+        // 2. 原子化操作:获取或创建数据,并在创建时设置pid
+        return dataMap.computeIfAbsent(internalNodeId, k -> {
+            ExternalDataInfo info = new ExternalDataInfo();
+            info.setPid(internalNodeId); // 设置pid字段
+            return info;
+        });
     }
 
+    /**
+     * 双ID优先获取数据
+     * @param nodeId   外部节点ID
+     * @param remoteId 远程ID(需为Long的字符串形式)
+     * @return ExternalDataInfo 或 null
+     */
+    public static ExternalDataInfo getDataByIds(String nodeId, String remoteId) {
+        // 优先处理 remoteId 非空的情况
+        if (remoteId != null && !remoteId.isEmpty()) {
+            try {
+                long internalId = Long.parseLong(remoteId);
+
+                return dataMap.computeIfAbsent(internalId, k -> {
+                    ExternalDataInfo info = new ExternalDataInfo();
+                    info.setPid(internalId); // 设置pid字段
+                    return info;
+                });
+            } catch (NumberFormatException e) {
+                throw new IllegalArgumentException("无效的remoteId格式: " + remoteId, e);
+            }
+        }
+
+        // remoteId 为空时,通过外部ID获取
+        return getDataByExternalId(nodeId);
+    }
 
 }

+ 4 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -206,4 +206,8 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	List<CabinetVO> getUnitAllCabinet(@Param("projectId") Long projectId,@Param("nodeId") Long nodeId);
 
     List<JiLinArchiveAutoDto> getArchiveAutoDtoList(@Param("projId") Long projId, @Param("dtos") List<JiLinQueryDto>dtos);
+
+	List<ArchiveTreeContract> getOutNodesByOutIds(@Param("projectId")Long projectId,@Param("ids") List<String> outIds);
+
+	List<ArchivesAuto> getOutArchiveAutosByOutIds(@Param("projectId")Long projectId,@Param("ids") List<String> outIds);
 }

+ 74 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -103,6 +103,57 @@
                 </collection>
     </resultMap>
 
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="archiveTreeContractResultMap" type="org.springblade.manager.entity.ArchiveTreeContract">
+        <result column="id" property="id"/>
+        <result column="create_time" property="createTime"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="is_upload_file_display_configuration_tree" property="isUploadFileDisplayConfigurationTree"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="ancestors" property="ancestors"/>
+        <result column="node_name" property="nodeName"/>
+        <result column="full_name" property="fullName"/>
+        <result column="node_type" property="nodeType"/>
+        <result column="post_type" property="postType"/>
+        <result column="association_type" property="associationType"/>
+        <result column="major_data_type" property="majorDataType"/>
+        <result column="display_hierarchy" property="displayHierarchy"/>
+        <result column="is_storage_node" property="isStorageNode"/>
+        <result column="is_built_drawing" property="isBuiltDrawing"/>
+        <result column="is_interface_node" property="isInterfaceNode"/>
+        <result column="interface_type" property="interfaceType"/>
+        <result column="sort" property="sort"/>
+        <result column="tree_sort" property="treeSort"/>
+        <result column="remark" property="remark"/>
+        <result column="project_type" property="projectType"/>
+        <result column="storage_type" property="storageType"/>
+        <result column="ext_type" property="extType"/>
+        <result column="ext_id" property="extId"/>
+        <result column="exp_data_type" property="expDataType"/>
+        <result column="from_id" property="fromId"/>
+        <result column="archive_auto_type" property="archiveAutoType"/>
+        <result column="archive_auto_node_id" property="archiveAutoNodeId"/>
+        <result column="archive_auto_group_select" property="archiveAutoGroupSelect"/>
+        <result column="archive_auto_group_id" property="archiveAutoGroupId"/>
+        <result column="tree_code" property="treeCode"/>
+        <result column="file_number_prefix" property="fileNumberPrefix"/>
+        <result column="storage_time" property="storageTime"/>
+        <result column="rollor" property="rollor"/>
+        <result column="reviewer" property="reviewer"/>
+        <result column="specification" property="specification"/>
+        <result column="archive_name_suffix" property="archiveNameSuffix"/>
+        <result column="ext_key_id" property="extKeyId"/>
+        <result column="out_id" property="outId"/>
+    </resultMap>
+
     <select id="approvalFile" resultType="org.springblade.archive.vo.ArchivesAutoVO$ApprovalFile">
         <if test="archiveId!=null">
             select * from u_archive_file where archive_id = #{archiveId} and is_element = 0
@@ -1214,6 +1265,29 @@
             #{item.cqContractId}
         </foreach>
     </select>
+    <select id="getOutNodesByOutIds" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select id,node_name,parent_id,out_id
+        from m_archive_tree_contract
+        where project_id = #{projectId} and is_deleted = 0 and
+        out_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
+    <select id="getOutArchiveAutosByOutIds" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select *
+        from u_archives_auto
+        where project_id = #{projectId}
+          and is_auto_file!=1
+          and is_deleted=0
+          and is_lock!=1
+        and
+        out_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 
 
 </mapper>

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -21,7 +21,7 @@ import org.springblade.core.tool.support.Kv;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
-import org.springblade.manager.dto.NameRuleDto;
+
 import org.springblade.manager.dto.WbsTreePrivateDTO2;
 import org.springblade.manager.dto.WbsTreePrivateDTO3;
 import org.springblade.manager.entity.*;

+ 15 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.feign;
 
 import lombok.AllArgsConstructor;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.JiLinQueryDto;
 import org.springblade.manager.dto.ArchiveTreeContractDTO;
 import org.springblade.manager.entity.ArchiveTreeContract;
@@ -140,5 +141,19 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
         return archiveTreeContractService.getArchiveTreeContractDto(dtos,projectId);
     }
 
+    @Override
+    public List<ArchiveTreeContract> getOutNodes(Long projectId)
+    {
+        return archiveTreeContractMapper.getOutNodes(projectId);
+    }
+
+    @Override
+    public List<ArchiveTreeContract> getOutNodesByOutIds(Long projectId,List<String> outIds)
+    {
+        return archiveTreeContractMapper.getOutNodesByOutIds(projectId,outIds);
+    }
+
+
+
 
 }

+ 8 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ProjectClientImpl.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.manager.entity.ProjectInfo;
 import org.springblade.manager.service.IProjectInfoService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
@@ -40,4 +42,10 @@ public class ProjectClientImpl implements ProjectClient {
         List<ProjectInfo> list = projectInfoService.list();
         return list;
     }
+
+
+    @Override
+    public Long getIdByName(@RequestParam String key){
+       return projectInfoService.getProjectIdbyName(key);
+    }
 }

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

@@ -174,4 +174,8 @@ public interface ArchiveTreeContractMapper extends BaseMapper<ArchiveTreeContrac
     List<TrialClassificationConfiguration> getAllThreeTestNode();
 
     List<TrialDetectionData> getAllTrialTestRecord(@Param("contractId") Long contractId);
+
+    List<ArchiveTreeContract> getOutNodes(@Param("projectId")Long projectId);
+
+    List<ArchiveTreeContract> getOutNodesByOutIds(@Param("projectId")Long projectId,@Param("ids") List<String> outIds);
 }

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

@@ -49,6 +49,7 @@
         <result column="specification" property="specification"/>
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
         <result column="ext_key_id" property="extKeyId"/>
+        <result column="out_id" property="outId"/>
     </resultMap>
     <delete id="removeImageNodeChild">
         delete from m_archive_tree_contract
@@ -804,4 +805,17 @@
         from m_trial_detection_data
         where contract_id = #{contractId} and is_deleted = 0
     </select>
+    <select id="getOutNodes" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select id,node_name,parent_id,out_id from m_archive_tree_contract
+        WHERE project_id = #{projectId} and is_deleted = 0 and out_id is not null
+    </select>
+    <select id="getOutNodesByOutIds" resultType="org.springblade.manager.entity.ArchiveTreeContract">
+        select id,node_name,parent_id,out_id
+        from m_archive_tree_contract
+        where project_id = #{projectId} and is_deleted = 0 and
+         out_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
 </mapper>

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IProjectInfoService.java

@@ -25,4 +25,6 @@ public interface IProjectInfoService extends BaseService<ProjectInfo> {
 
     Long getContractIdbyName(String projectName,String contractName);
 
+    Long getProjectIdbyName(String projectName);
+
 }

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ProjectInfoServiceImpl.java

@@ -143,5 +143,16 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, P
         return contractInfos.get(0).getId();
 
     }
+    @Override
+    public Long getProjectIdbyName(String projectName){
+        List<ProjectInfo> projectInfos = baseMapper.selectList(Wrappers.<ProjectInfo>query().lambda()
+                .eq(ProjectInfo::getIsDeleted, 0)
+                .and(wrapper -> wrapper.eq(ProjectInfo::getProjectName, projectName).or().eq(ProjectInfo::getProjectAlias, projectName))
+        );
+        if (projectInfos == null || projectInfos.size() == 0) {
+            return null;
+        }
+        return projectInfos.get(0).getId();
+    }
 
 }