|
@@ -1,16 +1,20 @@
|
|
|
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.ArchiveFileVo;
|
|
|
import org.springblade.archive.trans.ArchiveReq;
|
|
|
import org.springblade.business.entity.ArchiveFile;
|
|
|
import org.springblade.business.feign.ArchiveFileClient;
|
|
|
+import org.springblade.common.utils.SnowFlakeUtil;
|
|
|
+import org.springblade.manager.entity.ArchiveTreeContract;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
@@ -19,12 +23,14 @@ public class ExternalDataArchiveFileService {
|
|
|
|
|
|
private ArchiveFileClient archiveFileClient;
|
|
|
|
|
|
+ private ArchivesAutoMapper autoMapper;
|
|
|
|
|
|
- public void handleArchiveFiles(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
|
|
|
|
|
|
+ public void handleArchiveFiles(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo){
|
|
|
+ syncData(projectId, req, externalDataInfo);
|
|
|
}
|
|
|
|
|
|
- public void syncData(ExternalDataInfo externalDataInfo) {
|
|
|
+ public void syncData(Long projectId, ArchiveReq req, ExternalDataInfo externalDataInfo) {
|
|
|
// 创建 ExternalDataInfo 对象
|
|
|
//新增的文件
|
|
|
List<ArchiveFile> addFiles = new ArrayList<>();
|
|
@@ -33,11 +39,17 @@ public class ExternalDataArchiveFileService {
|
|
|
List<ArchiveFile> upFiles = new ArrayList<>();
|
|
|
|
|
|
//外部文件
|
|
|
- List<ArchiveFile> externalFiles = getExternalFils(externalDataInfo.getProjectName(),externalDataInfo);
|
|
|
+ List<ArchiveFile> externalFiles = listConvert(req.getNodeId(), req.getFiles(), externalDataInfo);
|
|
|
|
|
|
- //本地的文件
|
|
|
- List<ArchiveFile> localFiles = getLocalFils(externalDataInfo.getProjectName());
|
|
|
+ List<String> outIds = Optional.ofNullable(externalFiles)
|
|
|
+ .orElseGet(Collections::emptyList)
|
|
|
+ .stream()
|
|
|
+ .map(ArchiveFile::getOutId) // 假设 getOutId() 返回 String
|
|
|
+ .filter(Objects::nonNull) // 可选:过滤 null 值
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
|
+ //本地的文件
|
|
|
+ List<ArchiveFile> localFiles = getLocalFils(projectId,outIds);
|
|
|
//比较获取
|
|
|
getAddAndUpdateFiles(externalDataInfo,externalFiles, localFiles, addFiles, upFiles);
|
|
|
|
|
@@ -45,283 +57,140 @@ public class ExternalDataArchiveFileService {
|
|
|
addAndUpdateFiles(addFiles,upFiles);
|
|
|
}
|
|
|
|
|
|
+ public List<ArchiveFile> listConvert(String nodeId, List<ArchiveFileVo> archiveFileVos, ExternalDataInfo externalDataInfo) {
|
|
|
|
|
|
+ List<ArchiveFile> archiveFiles = new ArrayList<>();
|
|
|
+ Map<String, Long> archiveFileOutIdMapping = new LinkedHashMap<>();
|
|
|
|
|
|
- private void getAddAndUpdateFiles(ExternalDataInfo externalDataInfo,List<ArchiveFile> externalFiles, List<ArchiveFile> localFiles,
|
|
|
- List<ArchiveFile> addFiles, List<ArchiveFile> upFiles) {
|
|
|
- // 将外部文件转换为 Map,键为 ID,值为 ArchiveFile
|
|
|
- Map<Long, ArchiveFile> externalFileMap =
|
|
|
- externalFiles.stream()
|
|
|
- .collect(Collectors.toMap(ArchiveFile::getId, file -> file));
|
|
|
-
|
|
|
- // 遍历本地文件,找出新增和更新的文件
|
|
|
- for (ArchiveFile localFile : localFiles) {
|
|
|
- ArchiveFile externalFile = externalFileMap.get(localFile.getId());
|
|
|
- if (externalFile == null) {
|
|
|
- // 外部文件中没有此 ID,认为是新增文件
|
|
|
- addFiles.add(localFile);
|
|
|
- } else {
|
|
|
- // 外部文件中有此 ID,比较更新时间
|
|
|
- if (!externalFile.getFtime().equals(localFile.getFtime())) {
|
|
|
- // 更新时间不同,认为是更新文件
|
|
|
- localFile.setFileUrl(externalFile.getFileUrl());
|
|
|
- localFile.setEVisaFile(externalFile.getEVisaFile());
|
|
|
- localFile.setPdfPageUrl(externalFile.getPdfPageUrl());
|
|
|
- localFile.setFilePage(externalFile.getFilePage());
|
|
|
- localFile.setFileSize(externalFile.getFileSize());
|
|
|
- upFiles.add(localFile);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 将外部文件中没有在本地文件中的,认为是新增文件
|
|
|
- for (ArchiveFile externalFile : externalFiles) {
|
|
|
- boolean isExistInLocal = localFiles.stream().anyMatch(localFile -> localFile.getId().equals(externalFile.getId()));
|
|
|
- if (!isExistInLocal) {
|
|
|
- addFiles.add(externalFile);
|
|
|
- }
|
|
|
- }
|
|
|
+ //内外映射
|
|
|
+ Map<String, Long> archiveTreeOutIdMapping = externalDataInfo.getArchiveTreeNodeIdMapping();
|
|
|
+ Map<String, Long> archiveAutoOutIdMapping = externalDataInfo.getArchiveIdMapping();
|
|
|
|
|
|
+ Long rootId = externalDataInfo.getPid();
|
|
|
+ ArchiveTreeContract rootNode = externalDataInfo.getParent();
|
|
|
|
|
|
- //刷新
|
|
|
- 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));
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
- // Process ArchiveId
|
|
|
- if (addFile.getArchiveId() != null && externalDataInfo.getArchiveIdMappingMapping() != null) {
|
|
|
- Long archiveId = externalDataInfo.getArchiveIdMappingMapping().get(addFile.getArchiveId());
|
|
|
- if (archiveId != null) {
|
|
|
- addFile.setArchiveId(archiveId);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ // 1. 生成所有节点的唯一新ID并建立映射
|
|
|
+ for (ArchiveFileVo archiveFileVo : archiveFileVos) {
|
|
|
+ archiveFileOutIdMapping.put(archiveFileVo.getId(), SnowFlakeUtil.getId());
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- }
|
|
|
+ // 2. 遍历所有节点,构建ArchiveTreeContract对象
|
|
|
+ for (ArchiveFileVo archiveFileVo : archiveFileVos) {
|
|
|
|
|
|
|
|
|
- private List<ArchiveFile> getExternalFils(String projectName, ExternalDataInfo externalDataInfo) {
|
|
|
- // 这里模拟获取外部文件的逻辑,具体实现根据 externalDataInfo 来获取
|
|
|
+ ArchiveFile archiveFile = new ArchiveFile();
|
|
|
|
|
|
- List<ArchiveFile> externalFils = new ArrayList<>();
|
|
|
+ // 拷贝属性
|
|
|
+ archiveFile.fromExternal(archiveFileVo);
|
|
|
|
|
|
+ // 设置新ID(从映射表中获取)
|
|
|
+ Long newNodeId = archiveFileOutIdMapping.get(archiveFileVo.getId());
|
|
|
+ archiveFile.setId(newNodeId);
|
|
|
+ archiveFile.setOutId(archiveFileVo.getId());
|
|
|
|
|
|
- return externalFils;
|
|
|
- }
|
|
|
+ //组卷ID
|
|
|
+ Long archiveId = archiveAutoOutIdMapping.get(archiveFileVo.getArchiveId());
|
|
|
+ archiveFile.setArchiveId(archiveId);
|
|
|
|
|
|
- // 获取本地文件
|
|
|
- private List<ArchiveFile> getLocalFils(String projectName) {
|
|
|
+ //nodeId nodeSUB
|
|
|
+ Long fileNodeId = archiveTreeOutIdMapping.get(archiveFileVo.getNodeId());
|
|
|
+ archiveFile.setNodeId(fileNodeId.toString());
|
|
|
|
|
|
- List<ArchiveFile> localFils = new ArrayList<>();
|
|
|
- // 这里模拟获取本地文件的逻辑,具体实现根据项目名称来获取
|
|
|
- return localFils;
|
|
|
- }
|
|
|
+ Long fileNodeExtId = archiveTreeOutIdMapping.get(archiveFileVo.getNodeIdSub());
|
|
|
+ if (fileNodeExtId!= null ) {
|
|
|
+ archiveFile.setNodeExtId(fileNodeExtId);
|
|
|
+ }
|
|
|
|
|
|
+ archiveFile.setProjectId(rootNode.getProjectId().toString());
|
|
|
+ archiveFile.setContractId(rootNode.getContractId().toString());
|
|
|
|
|
|
- public void addAndUpdateFiles(List<ArchiveFile> addFiles, List<ArchiveFile> upFiles) {
|
|
|
- if (addFiles != null && !addFiles.isEmpty()) {
|
|
|
- archiveFileClient.addArchiveFile(addFiles);
|
|
|
+ // 将构建好的对象加入结果列表
|
|
|
+ archiveFiles.add(archiveFile);
|
|
|
}
|
|
|
+ externalDataInfo.setFileIdMapping(archiveFileOutIdMapping);
|
|
|
|
|
|
- if (upFiles != null && !upFiles.isEmpty()) {
|
|
|
- archiveFileClient.updateArchiveFile(upFiles);
|
|
|
- }
|
|
|
+ return archiveFiles;
|
|
|
}
|
|
|
|
|
|
- public ArchiveFile createArchiveFileFromMap(Map<String, Object> fileDataMap) {
|
|
|
- ArchiveFile archiveFile = new ArchiveFile();
|
|
|
-
|
|
|
- // 项目ID
|
|
|
- if (fileDataMap.containsKey("projectId")) {
|
|
|
- archiveFile.setProjectId((String) fileDataMap.get("projectId"));
|
|
|
- }
|
|
|
-
|
|
|
- // 合同段ID
|
|
|
- if (fileDataMap.containsKey("contractId")) {
|
|
|
- archiveFile.setContractId((String) fileDataMap.get("contractId"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件绑定的节点ID
|
|
|
- if (fileDataMap.containsKey("nodeId")) {
|
|
|
- archiveFile.setNodeId((String) fileDataMap.get("nodeId"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件编号
|
|
|
- if (fileDataMap.containsKey("fileNumber")) {
|
|
|
- archiveFile.setFileNumber((String) fileDataMap.get("fileNumber"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件名称
|
|
|
- if (fileDataMap.containsKey("fileName")) {
|
|
|
- archiveFile.setFileName((String) fileDataMap.get("fileName"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件时间
|
|
|
- if (fileDataMap.containsKey("fileTime")) {
|
|
|
- archiveFile.setFileTime((String) fileDataMap.get("fileTime"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件路径
|
|
|
- if (fileDataMap.containsKey("fileUrl")) {
|
|
|
- archiveFile.setFileUrl((String) fileDataMap.get("fileUrl"));
|
|
|
- }
|
|
|
-
|
|
|
- // PDF文件路径
|
|
|
- if (fileDataMap.containsKey("pdfFileUrl")) {
|
|
|
- archiveFile.setPdfFileUrl((String) fileDataMap.get("pdfFileUrl"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件页数
|
|
|
- if (fileDataMap.containsKey("filePage")) {
|
|
|
- archiveFile.setFilePage((Integer) fileDataMap.get("filePage"));
|
|
|
- }
|
|
|
-
|
|
|
- // 责任者
|
|
|
- if (fileDataMap.containsKey("dutyUser")) {
|
|
|
- archiveFile.setDutyUser((String) fileDataMap.get("dutyUser"));
|
|
|
- }
|
|
|
-
|
|
|
- // 图表来源
|
|
|
- if (fileDataMap.containsKey("sheetSource")) {
|
|
|
- archiveFile.setSheetSource((String) fileDataMap.get("sheetSource"));
|
|
|
- }
|
|
|
-
|
|
|
- // 图号
|
|
|
- if (fileDataMap.containsKey("drawingNo")) {
|
|
|
- archiveFile.setDrawingNo((String) fileDataMap.get("drawingNo"));
|
|
|
- }
|
|
|
-
|
|
|
- // 引用变更令编号
|
|
|
- if (fileDataMap.containsKey("citeChangeNumber")) {
|
|
|
- archiveFile.setCiteChangeNumber((String) fileDataMap.get("citeChangeNumber"));
|
|
|
- }
|
|
|
-
|
|
|
- // 电签pdf文件
|
|
|
- if (fileDataMap.containsKey("eVisaFile")) {
|
|
|
- archiveFile.setEVisaFile((String) fileDataMap.get("eVisaFile"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件归属的扩展节点ID
|
|
|
- if (fileDataMap.containsKey("nodeExtId")) {
|
|
|
- archiveFile.setNodeExtId((Long) fileDataMap.get("nodeExtId"));
|
|
|
- }
|
|
|
-
|
|
|
- // 文件类型
|
|
|
- if (fileDataMap.containsKey("fileType")) {
|
|
|
- archiveFile.setFileType((Long) fileDataMap.get("fileType"));
|
|
|
- }
|
|
|
-
|
|
|
- // 归属案卷ID
|
|
|
- if (fileDataMap.containsKey("archiveId")) {
|
|
|
- archiveFile.setArchiveId((Long) fileDataMap.get("archiveId"));
|
|
|
- }
|
|
|
-
|
|
|
- // 原始归属案卷ID(用于拆卷)
|
|
|
- if (fileDataMap.containsKey("originId")) {
|
|
|
- archiveFile.setOriginId((Long) fileDataMap.get("originId"));
|
|
|
- }
|
|
|
-
|
|
|
- // 拍摄时间
|
|
|
- if (fileDataMap.containsKey("filmingTime")) {
|
|
|
- archiveFile.setFilmingTime((LocalDateTime) fileDataMap.get("filmingTime"));
|
|
|
- }
|
|
|
|
|
|
- // 实际拍摄时间
|
|
|
- if (fileDataMap.containsKey("filmingorTime")) {
|
|
|
- archiveFile.setFilmingorTime((LocalDateTime) fileDataMap.get("filmingorTime"));
|
|
|
- }
|
|
|
|
|
|
- // 媒体分类
|
|
|
- if (fileDataMap.containsKey("tagId")) {
|
|
|
- archiveFile.setTagId((String) fileDataMap.get("tagId"));
|
|
|
- }
|
|
|
+ private void getAddAndUpdateFiles(
|
|
|
+ ExternalDataInfo externalDataInfo,
|
|
|
+ List<ArchiveFile> externalFiles,
|
|
|
+ List<ArchiveFile> localFiles,
|
|
|
+ List<ArchiveFile> addFiles,
|
|
|
+ List<ArchiveFile> upFiles) {
|
|
|
|
|
|
- // 相片号
|
|
|
- if (fileDataMap.containsKey("picCode")) {
|
|
|
- archiveFile.setPicCode((String) fileDataMap.get("picCode"));
|
|
|
- }
|
|
|
+ // 1. 提取本地文件的 outId 集合(用于快速判断外部文件是否已存在)
|
|
|
+ Set<String> localOutIdSet = localFiles.stream()
|
|
|
+ .map(ArchiveFile::getOutId) // 假设 ArchiveFile 有 outId 字段
|
|
|
+ .filter(outId -> outId != null && !outId.isEmpty())
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
|
|
- // 参见号
|
|
|
- if (fileDataMap.containsKey("referCode")) {
|
|
|
- archiveFile.setReferCode((String) fileDataMap.get("referCode"));
|
|
|
- }
|
|
|
+ // 2. 将本地文件转为 Map<outId, ArchiveFile> 以便快速查找
|
|
|
+ Map<String, ArchiveFile> localFileMap = localFiles.stream()
|
|
|
+ .filter(file -> file.getOutId() != null && !file.getOutId().isEmpty())
|
|
|
+ .collect(Collectors.toMap(ArchiveFile::getOutId, file -> file));
|
|
|
|
|
|
- // 底片号
|
|
|
- if (fileDataMap.containsKey("filmCode")) {
|
|
|
- archiveFile.setFilmCode((String) fileDataMap.get("filmCode"));
|
|
|
- }
|
|
|
+ // 3. 遍历外部文件,判断新增或更新
|
|
|
+ for (ArchiveFile externalFile : externalFiles) {
|
|
|
+ String externalOutId = externalFile.getOutId();
|
|
|
|
|
|
- // 图片宽
|
|
|
- if (fileDataMap.containsKey("width")) {
|
|
|
- archiveFile.setWidth((Integer) fileDataMap.get("width"));
|
|
|
- }
|
|
|
+ // 跳过空 outId(根据业务需求调整)
|
|
|
+ if (externalOutId == null || externalOutId.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
- // 图片高
|
|
|
- if (fileDataMap.containsKey("height")) {
|
|
|
- archiveFile.setHeight((Integer) fileDataMap.get("height"));
|
|
|
+ // 判断外部 outId 是否存在于本地
|
|
|
+ if (!localOutIdSet.contains(externalOutId)) {
|
|
|
+ addFiles.add(externalFile); // 新增外部文件
|
|
|
+ } else {
|
|
|
+ // 存在则查找本地对应文件,判断是否需要更新
|
|
|
+ ArchiveFile localFile = localFileMap.get(externalOutId);
|
|
|
+ if (localFile != null && needUpdate(externalFile, localFile)) {
|
|
|
+ updateLocalFile(localFile, externalFile); // 更新字段
|
|
|
+ upFiles.add(localFile);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- // 同步时间
|
|
|
- if (fileDataMap.containsKey("ftime")) {
|
|
|
- archiveFile.setFtime((LocalDateTime) fileDataMap.get("ftime"));
|
|
|
- }
|
|
|
+ // 辅助方法:判断是否需要更新
|
|
|
+ private boolean needUpdate(ArchiveFile external, ArchiveFile local) {
|
|
|
+ // 示例:检查关键字段是否变化
|
|
|
+ return !Objects.equals(external.getFileUrl(), local.getFileUrl())
|
|
|
+ || !Objects.equals(external.getPdfPageUrl(), local.getPdfPageUrl())
|
|
|
+ || !Objects.equals(external.getFileSize(), local.getFileSize());
|
|
|
+ }
|
|
|
|
|
|
- // 更新时间
|
|
|
- if (fileDataMap.containsKey("utime")) {
|
|
|
- archiveFile.setUtime((LocalDateTime) fileDataMap.get("utime"));
|
|
|
- }
|
|
|
+ // 辅助方法:更新本地文件字段
|
|
|
+ private void updateLocalFile(ArchiveFile local, ArchiveFile external) {
|
|
|
+ local.setFileUrl(external.getFileUrl());
|
|
|
+ local.setEVisaFile(external.getEVisaFile());
|
|
|
+ local.setPdfPageUrl(external.getPdfPageUrl());
|
|
|
+ local.setFilePage(external.getFilePage());
|
|
|
+ local.setFileSize(external.getFileSize());
|
|
|
+ }
|
|
|
|
|
|
- // 排序
|
|
|
- if (fileDataMap.containsKey("sort")) {
|
|
|
- archiveFile.setSort((Integer) fileDataMap.get("sort"));
|
|
|
- }
|
|
|
|
|
|
- // 是否已组卷(0未组卷,1已组卷)
|
|
|
- if (fileDataMap.containsKey("isArchive")) {
|
|
|
- archiveFile.setIsArchive((Integer) fileDataMap.get("isArchive"));
|
|
|
- }
|
|
|
|
|
|
- // 页号
|
|
|
- if (fileDataMap.containsKey("pageNum")) {
|
|
|
- archiveFile.setPageNum((String) fileDataMap.get("pageNum"));
|
|
|
- }
|
|
|
+ // 获取本地文件
|
|
|
+ private List<ArchiveFile> getLocalFils(Long projectId, List<String> outIds) {
|
|
|
+ List<ArchiveFile> localContracts = autoMapper.getOutArchiveFilesByOutIds(projectId,outIds);
|
|
|
|
|
|
- // 文件大小
|
|
|
- if (fileDataMap.containsKey("fileSize")) {
|
|
|
- archiveFile.setFileSize((Long) fileDataMap.get("fileSize"));
|
|
|
- }
|
|
|
+ return localContracts;
|
|
|
+ }
|
|
|
|
|
|
- // 数据源类型(1原生,2数字化)
|
|
|
- if (fileDataMap.containsKey("sourceType")) {
|
|
|
- archiveFile.setSourceType((Integer) fileDataMap.get("sourceType"));
|
|
|
- }
|
|
|
|
|
|
- // 打了页码的pdf文件路径
|
|
|
- if (fileDataMap.containsKey("pdfPageUrl")) {
|
|
|
- archiveFile.setPdfPageUrl((String) fileDataMap.get("pdfPageUrl"));
|
|
|
+ public void addAndUpdateFiles(List<ArchiveFile> addFiles, List<ArchiveFile> upFiles) {
|
|
|
+ if (addFiles != null && !addFiles.isEmpty()) {
|
|
|
+ archiveFileClient.addArchiveFileEx(addFiles);
|
|
|
}
|
|
|
|
|
|
- // 类型(1施工,2监理)
|
|
|
- if (fileDataMap.containsKey("classify")) {
|
|
|
- archiveFile.setClassify((Integer) fileDataMap.get("classify"));
|
|
|
+ if (upFiles != null && !upFiles.isEmpty()) {
|
|
|
+ archiveFileClient.updateArchiveFileEx(upFiles);
|
|
|
}
|
|
|
-
|
|
|
- return archiveFile;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|