Bladeren bron

同步归档树节点类型

laibulaizheli 3 weken geleden
bovenliggende
commit
cf7918e006

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

@@ -406,6 +406,18 @@ public class ArchiveTreeContract extends BaseEntity {
         this.associationType = 1;
         this.setExtType(1);
 
+
+        if (archiveTree.getExtNodeType() != null) {
+            Integer externalExtNodeType = archiveTree.getExtNodeType();
+            if (externalExtNodeType == 1) {
+                this.extNodeType = 1; // 如果为1,则this同名属性也取1
+            } else if (externalExtNodeType == 2) {
+                this.extNodeType = 2; // 如果为2,则this同名属性取2
+            } else if (externalExtNodeType == 3) {
+                this.extNodeType = 4; // 如果为3,则同名属性取值为4
+            }
+        }
+
 //        this.majorDataType = archiveTree.getMajorDataType();
 //        this.displayHierarchy = archiveTree.getDisplayHierarchy();
         this.isStorageNode = archiveTree.getIsStorage();

+ 48 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/external/impl/ExternalDataArchiveTreeService.java

@@ -220,6 +220,7 @@ public class ExternalDataArchiveTreeService {
         }
     }
 
+
     private void getAddAndUpdateContracts(
             ExternalDataInfo externalDataInfo,
             List<ArchiveTreeContract> externalContracts,
@@ -227,6 +228,53 @@ public class ExternalDataArchiveTreeService {
             List<ArchiveTreeContract> addContracts,
             List<ArchiveTreeContract> upContracts) {
 
+        // 1. 创建本地合同的 Map:key 为 outId,value 为合同对象
+        Map<String, ArchiveTreeContract> localContractMap = new HashMap<>();
+        for (ArchiveTreeContract localContract : localContracts) {
+            String outId = localContract.getOutId();
+            if (outId != null && !outId.isEmpty()) {
+                localContractMap.put(outId, localContract);
+            }
+        }
+
+        // 2. 遍历外部合同,判断新增或更新
+        for (ArchiveTreeContract externalContract : externalContracts) {
+            String externalOutId = externalContract.getOutId();
+
+            // 处理空 outId(根据业务需求决定是否跳过或新增)
+            if (externalOutId == null || externalOutId.isEmpty()) {
+                // addContracts.add(externalContract); // 如果需要处理空 outId 则取消注释
+                continue;
+            }
+
+            // 通过 Map 查找对应的本地合同
+            ArchiveTreeContract localContract = localContractMap.get(externalOutId);
+
+            if (localContract == null) {
+                // 本地不存在该合同,需要新增
+                addContracts.add(externalContract);
+            } else {
+                // 新增的判断逻辑:如果 localContract 的 extNodeType 为 null 或 -1,
+                // 且 externalContract 的 extNodeType 不为 null,则添加到更新列表
+                Integer localExtNodeType = localContract.getExtNodeType();
+                Integer externalExtNodeType = externalContract.getExtNodeType();
+
+                if ((localExtNodeType == null || localExtNodeType == -1)
+                        && externalExtNodeType != null) {
+                    localContract.setExtNodeType(externalExtNodeType);
+                    upContracts.add(localContract);
+                }
+                // 这里可以添加其他更新条件的判断,例如时间戳比较
+            }
+        }
+    }
+    private void getAddAndUpdateContracts1(
+            ExternalDataInfo externalDataInfo,
+            List<ArchiveTreeContract> externalContracts,
+            List<ArchiveTreeContract> localContracts,
+            List<ArchiveTreeContract> addContracts,
+            List<ArchiveTreeContract> upContracts) {
+
         // 1. 提取本地合同的 outId 集合(用于快速判断外部合同是否已存在)
         Set<String> localOutIdSet = localContracts.stream()
                 .map(ArchiveTreeContract::getOutId)  // 直接使用本地合同的 outId 字段

+ 2 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -153,6 +153,7 @@
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
         <result column="ext_key_id" property="extKeyId"/>
         <result column="out_id" property="outId"/>
+        <result column="ext_node_type" property="extNodeType"/>
     </resultMap>
 
     <!-- 通用查询映射结果 -->
@@ -1566,7 +1567,7 @@
         where is_deleted = 0
     </select>
     <select id="getOutNodesByOutIds" resultMap="archiveTreeContractResultMap">
-        select id,node_name,parent_id,out_id
+        select id,node_name,parent_id,out_id,ext_node_type
         from m_archive_tree_contract
         where project_id = #{projectId} and is_deleted = 0 and
         out_id in

+ 49 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ArchiveTreeContractImpl.java

@@ -1,5 +1,7 @@
 package org.springblade.manager.feign;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.archive.dto.JiLinQueryDto;
@@ -13,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
@@ -166,10 +170,54 @@ public class ArchiveTreeContractImpl implements ArchiveTreeContractClient {
         return archiveTreeContractMapper.getOutNodesByOutIds(projectId,outIds);
     }
 
+//    @Override
+//    public void updateArchiveTreeContract(List<ArchiveTreeContract> archiveTreeContracts) {
+//        archiveTreeContractService.updateBatchById(archiveTreeContracts);
+//    }
+
     @Override
     public void updateArchiveTreeContract(List<ArchiveTreeContract> archiveTreeContracts) {
-        archiveTreeContractService.updateBatchById(archiveTreeContracts);
+        // 1. 提取传入合同列表中的所有ID(过滤空值)
+        List<Long> ids = archiveTreeContracts.stream()
+                .map(ArchiveTreeContract::getId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (ids.isEmpty()) {
+            return;
+        }
+
+        // 2. 根据ID批量查询现有记录
+        LambdaQueryWrapper<ArchiveTreeContract> wrapper = Wrappers.lambdaQuery();
+        wrapper.in(ArchiveTreeContract::getId, ids);
+        List<ArchiveTreeContract> existContracts = archiveTreeContractService.list(wrapper);
+
+        // 3. 将传入合同列表转换为Map<ID, 合同对象>便于查找
+        Map<Long, ArchiveTreeContract> externalContractMap = archiveTreeContracts.stream()
+                .collect(Collectors.toMap(
+                        ArchiveTreeContract::getId,
+                        Function.identity(),
+                        (existing, replacement) -> existing // 处理重复ID,保留第一个
+                ));
+
+        // 4. 准备更新列表 - 只更新ext_node_type字段
+        List<ArchiveTreeContract> updateList = new ArrayList<>();
+
+        for (ArchiveTreeContract local : existContracts) {
+            ArchiveTreeContract external = externalContractMap.get(local.getId());
+            if (external != null) {
+                // 只更新ext_node_type字段
+                local.setExtNodeType(external.getExtNodeType());
+                updateList.add(local);
+            }
+        }
+
+        // 5. 批量更新(建议分批处理,如每500条一次)
+        if (!updateList.isEmpty()) {
+            archiveTreeContractService.updateBatchById(updateList);
+        }
     }
+
     @Override
     public void addArchiveTreeContract(@RequestBody List<ArchiveTreeContract> archiveTreeContracts, @RequestParam Long rootId){
 //        archiveTreeContractService.saveBatch(archiveTreeContracts);