|
@@ -25,6 +25,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.itextpdf.text.*;
|
|
import com.itextpdf.text.*;
|
|
@@ -150,6 +151,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
private final CommonFileClient commonFileClient;
|
|
private final CommonFileClient commonFileClient;
|
|
|
|
|
|
|
|
+ private final IArchiveNameService archiveNameService;
|
|
|
|
+
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
|
|
public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
|
|
@@ -471,51 +474,51 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- List<ArchivesAutoVO.ApprovalFile> files = vo.getApprovalFileList();;
|
|
|
|
- if (files != null) {
|
|
|
|
- String tempId = null;
|
|
|
|
- if (!files.isEmpty()) {
|
|
|
|
- tempId = files.get(0).getId();
|
|
|
|
|
|
+ }
|
|
|
|
+ List<ArchivesAutoVO.ApprovalFile> files = vo.getApprovalFileList();;
|
|
|
|
+ if (files != null) {
|
|
|
|
+ String tempId = null;
|
|
|
|
+ if (!files.isEmpty()) {
|
|
|
|
+ tempId = files.get(0).getId();
|
|
|
|
+ }
|
|
|
|
+ if (front != null && front.getFileUrl() != null) {
|
|
|
|
+ if (front.getId() == null && tempId != null) {
|
|
|
|
+ front.setId(tempId + "_1");
|
|
}
|
|
}
|
|
- if (front != null && front.getFileUrl() != null) {
|
|
|
|
- if (front.getId() == null && tempId != null) {
|
|
|
|
- front.setId(tempId + "_1");
|
|
|
|
- }
|
|
|
|
- if (front.getId() != null) {
|
|
|
|
- front.setPdfFileUrl(front.getFileUrl());
|
|
|
|
- files.add(0,front);
|
|
|
|
- }
|
|
|
|
|
|
+ if (front.getId() != null) {
|
|
|
|
+ front.setPdfFileUrl(front.getFileUrl());
|
|
|
|
+ files.add(0,front);
|
|
}
|
|
}
|
|
- if (cataLog != null && cataLog.getFileUrl() != null) {
|
|
|
|
- if (cataLog.getId() == null && tempId != null) {
|
|
|
|
- cataLog.setId(tempId + "_2");
|
|
|
|
- }
|
|
|
|
- if (cataLog.getId() != null) {
|
|
|
|
- cataLog.setPdfFileUrl(cataLog.getFileUrl());
|
|
|
|
- if (front != null && front.getFileUrl() != null) {
|
|
|
|
- files.add(1,cataLog);
|
|
|
|
- } else {
|
|
|
|
- files.add(0,cataLog);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ if (cataLog != null && cataLog.getFileUrl() != null) {
|
|
|
|
+ if (cataLog.getId() == null && tempId != null) {
|
|
|
|
+ cataLog.setId(tempId + "_2");
|
|
}
|
|
}
|
|
- if (spare != null && spare.getFileUrl() != null) {
|
|
|
|
- if (spare.getId() == null && tempId != null) {
|
|
|
|
- spare.setId(tempId + "_3");
|
|
|
|
- }
|
|
|
|
- if (spare.getId() != null) {
|
|
|
|
- spare.setPdfFileUrl(spare.getFileUrl());
|
|
|
|
- files.add(spare);
|
|
|
|
|
|
+ if (cataLog.getId() != null) {
|
|
|
|
+ cataLog.setPdfFileUrl(cataLog.getFileUrl());
|
|
|
|
+ if (front != null && front.getFileUrl() != null) {
|
|
|
|
+ files.add(1,cataLog);
|
|
|
|
+ } else {
|
|
|
|
+ files.add(0,cataLog);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (back != null && back.getFileUrl() != null) {
|
|
|
|
- if (back.getId() == null && tempId != null) {
|
|
|
|
- back.setId(tempId + "_4");
|
|
|
|
- }
|
|
|
|
- if (back.getId() != null) {
|
|
|
|
- back.setPdfFileUrl(back.getFileUrl());
|
|
|
|
- files.add(back);
|
|
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+ if (spare != null && spare.getFileUrl() != null) {
|
|
|
|
+ if (spare.getId() == null && tempId != null) {
|
|
|
|
+ spare.setId(tempId + "_3");
|
|
|
|
+ }
|
|
|
|
+ if (spare.getId() != null) {
|
|
|
|
+ spare.setPdfFileUrl(spare.getFileUrl());
|
|
|
|
+ files.add(spare);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (back != null && back.getFileUrl() != null) {
|
|
|
|
+ if (back.getId() == null && tempId != null) {
|
|
|
|
+ back.setId(tempId + "_4");
|
|
|
|
+ }
|
|
|
|
+ if (back.getId() != null) {
|
|
|
|
+ back.setPdfFileUrl(back.getFileUrl());
|
|
|
|
+ files.add(back);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1290,6 +1293,83 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ private String builtArchiveName_new(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, boolean isCrossNode
|
|
|
|
+ ,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
|
|
+
|
|
|
|
+ String archiveName = "";
|
|
|
|
+
|
|
|
|
+ Long projectId = node.getProjectId();
|
|
|
|
+ ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
|
|
|
|
+ String projectName = projectInfo.getProjectName();
|
|
|
|
+ String contractName = "";
|
|
|
|
+ Long contractId = node.getContractId();
|
|
|
|
+ if (contractId != null && contractId != -1) {
|
|
|
|
+ ContractInfo contract = contractClient.getContractById(contractId);
|
|
|
|
+ contractName = contract.getContractName();
|
|
|
|
+ }
|
|
|
|
+ //获取案卷题名
|
|
|
|
+ archiveName = projectName;
|
|
|
|
+ if (StringUtils.isNotEmpty(contractName)) {
|
|
|
|
+ archiveName = archiveName + contractName;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //--正常节点
|
|
|
|
+ Set<String> uniqueNodeIds = waitArchiveFiles.stream()
|
|
|
|
+ .map(ArchiveFile::getNodeId)
|
|
|
|
+ .filter(nodeId -> nodeId != null && !nodeId.isEmpty())
|
|
|
|
+ .collect(Collectors.toCollection(LinkedHashSet::new));
|
|
|
|
+
|
|
|
|
+ // 2. 将节点ID从String转换为Long(保持原始顺序)
|
|
|
|
+ List<Long> nodeIds = uniqueNodeIds.stream()
|
|
|
|
+ .map(this::safeParseLong)
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ String fullPath = archiveNameService.generateFullLevelName(nodeIds, nameInfo);
|
|
|
|
+
|
|
|
|
+ archiveName+=fullPath;
|
|
|
|
+
|
|
|
|
+// if (archiveName.length() > 200) {
|
|
|
|
+// // 从150位置开始查找第一个顿号
|
|
|
|
+// int index = archiveName.indexOf('、', 200);
|
|
|
|
+// if (index != -1) {
|
|
|
|
+// // 找到顿号,截取到顿号位置(去掉顿号)并拼接“等文件”
|
|
|
|
+// archiveName = archiveName.substring(0, index) + "等文件";
|
|
|
|
+// } else {
|
|
|
|
+// // 没有找到顿号,直接截取150个字符并拼接“等文件”
|
|
|
|
+// archiveName = archiveName.substring(0, 200) + "等文件";
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+
|
|
|
|
+ if (archiveName.length() > 1100) {
|
|
|
|
+ // 直接截取前1100个字符
|
|
|
|
+ archiveName = archiveName.substring(0, 1100);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //TODO wbs节点
|
|
|
|
+ //不存在跨节点 项目名称+案卷题名规则(在后台归档目录树设置的)+后缀
|
|
|
|
+ //存在跨节点 获取当前所有节点的父级节点题名规则+所有同层级跨节点并卷的节点名称拼接+后缀
|
|
|
|
+ String archiveNameSuffix = node.getArchiveNameSuffix();
|
|
|
|
+ if (archiveNameSuffix == null || archiveNameSuffix.equals("null")) {
|
|
|
|
+ archiveNameSuffix = "";
|
|
|
|
+ }
|
|
|
|
+ return archiveName + archiveNameSuffix;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 安全解析Long的方法(处理格式异常)
|
|
|
|
+ private Long safeParseLong(String value) {
|
|
|
|
+ try {
|
|
|
|
+ return Long.parseLong(value);
|
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
|
+ log.warn("无法转换的节点ID格式: {}", value);
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, boolean isCrossNode) {
|
|
private String builtArchiveName(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, boolean isCrossNode) {
|
|
|
|
|
|
String archiveName = "";
|
|
String archiveName = "";
|
|
@@ -1400,29 +1480,94 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
try {
|
|
try {
|
|
- for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
- metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
- }
|
|
|
|
|
|
+// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
+// metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
+// }
|
|
|
|
+ batchCreateMetadataFiles(waitArchiveFiles);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 单独组卷规则组卷
|
|
|
|
+ *
|
|
|
|
+ * @param waitArchiveFiles
|
|
|
|
+ * @param node 规格参数所在节点
|
|
|
|
+ * @param pageN
|
|
|
|
+ */
|
|
|
|
+ private void createArchive3_new(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, int pageN,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
|
|
+
|
|
|
|
+ String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
|
+ String[] split = archiveStartDateAndEndDate.split(",");
|
|
|
|
+ String startDate = split.length >= 1 ? split[0] : "";
|
|
|
|
+ String endDate = split.length >= 2 ? split[1] : "";
|
|
|
|
+ int fileN = waitArchiveFiles.size();
|
|
|
|
+ if (fileN == 0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ String archiveName = builtArchiveName_new(waitArchiveFiles, node, false,nameInfo);//获取案卷题名
|
|
|
|
+ //1.创建新案卷
|
|
|
|
+ ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
|
|
+ //2.设置文件所属案卷,组卷状态
|
|
|
|
+ Long archivesAutoId = archivesAuto.getId();
|
|
|
|
+
|
|
|
|
+ //封面和生成文件页码
|
|
|
|
+ archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles, false);
|
|
|
|
+
|
|
|
|
+ builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ for (ArchiveFile file : waitArchiveFiles) {
|
|
|
|
+ file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
|
+ file.setIsArchive(1);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
|
+ try {
|
|
|
|
+// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
+// metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
+// }
|
|
|
|
+ batchCreateMetadataFiles(waitArchiveFiles);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 分类并卷组卷
|
|
* 分类并卷组卷
|
|
*
|
|
*
|
|
* @param waitArchiveFiles
|
|
* @param waitArchiveFiles
|
|
* @param archiveAutoGroupId 分类并卷分组ID
|
|
* @param archiveAutoGroupId 分类并卷分组ID
|
|
*/
|
|
*/
|
|
- private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId, Long projectId) {
|
|
|
|
|
|
+ private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId, Long projectId,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
|
|
|
|
//获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
|
|
//获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
|
|
- List<ArchiveTreeContract> selectList = archiveTreeContractClient.getStorageNodeByGroupId(projectId, archiveAutoGroupId);
|
|
|
|
- //分类并卷节点默认采用同类型下第一个存储节点为归属节点
|
|
|
|
- if (selectList== null || selectList.size() == 0) {
|
|
|
|
|
|
+// List<ArchiveTreeContract> selectList = archiveTreeContractClient.getStorageNodeByGroupId(projectId, archiveAutoGroupId);
|
|
|
|
+// //分类并卷节点默认采用同类型下第一个存储节点为归属节点
|
|
|
|
+// if (selectList== null || selectList.size() == 0) {
|
|
|
|
+// return;
|
|
|
|
+// }
|
|
|
|
+
|
|
|
|
+ if (waitArchiveFiles==null || waitArchiveFiles.size()== 0) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- ArchiveTreeContract node = selectList.get(0);
|
|
|
|
|
|
+
|
|
|
|
+ String strfirstNodeId = waitArchiveFiles.get(0).getNodeId();
|
|
|
|
+
|
|
|
|
+ ArchiveTreeContract node = null;
|
|
|
|
+ if (StringUtils.isNotEmpty(strfirstNodeId)) {
|
|
|
|
+ Long firstNodeId = Long.parseLong(strfirstNodeId);
|
|
|
|
+ ArchiveTreeContract firstNode = archiveTreeContractClient.getArchiveTreeContractById(firstNodeId);
|
|
|
|
+ if (firstNode!= null) {
|
|
|
|
+ node = firstNode;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
//获取案卷文件起止时间
|
|
//获取案卷文件起止时间
|
|
String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
String[] split = archiveStartDateAndEndDate.split(",");
|
|
String[] split = archiveStartDateAndEndDate.split(",");
|
|
@@ -1440,7 +1585,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
//默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
//默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
//获取案卷题名
|
|
//获取案卷题名
|
|
- String archiveName = builtArchiveName(waitArchiveFiles, node, true);//获取案卷题名
|
|
|
|
|
|
+ String archiveName = builtArchiveName_new(waitArchiveFiles, node, true,nameInfo);//获取案卷题名
|
|
|
|
|
|
//1.创建新案卷
|
|
//1.创建新案卷
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
@@ -1458,9 +1603,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
try {
|
|
try {
|
|
- for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
- metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
- }
|
|
|
|
|
|
+ batchCreateMetadataFiles(waitArchiveFiles);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
@@ -1507,9 +1650,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
try {
|
|
try {
|
|
- for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
- metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
- }
|
|
|
|
|
|
+// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
+// metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
+// }
|
|
|
|
+ batchCreateMetadataFiles(waitArchiveFiles);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
@@ -1562,9 +1706,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
try {
|
|
try {
|
|
- for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
- metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
- }
|
|
|
|
|
|
+// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
|
|
+// metadataClassificationClient.createMetadataFile(saveVo.getId(), 0);
|
|
|
|
+// }
|
|
|
|
+ batchCreateMetadataFiles(waitArchiveFiles);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
@@ -1669,6 +1814,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
private void archiveAutoMethod3(List<ArchiveTreeContract> list, Map<String, List<ArchiveFile>> boxMap,
|
|
private void archiveAutoMethod3(List<ArchiveTreeContract> list, Map<String, List<ArchiveFile>> boxMap,
|
|
Map<Long, String> boxFileMap, Long traceId) {
|
|
Map<Long, String> boxFileMap, Long traceId) {
|
|
|
|
+
|
|
|
|
+ // 4. 构建节点层级关系
|
|
|
|
+ IArchiveNameService.NodeHierarchy nameInfo =
|
|
|
|
+ archiveNameService.buildNodeHierarchy(list);
|
|
// 步骤1:遍历节点集合
|
|
// 步骤1:遍历节点集合
|
|
for (ArchiveTreeContract node : list) {
|
|
for (ArchiveTreeContract node : list) {
|
|
// 步骤2:获取当前节点的案卷规格
|
|
// 步骤2:获取当前节点的案卷规格
|
|
@@ -1704,7 +1853,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
// 如果是最后一个文件且有待组卷文件,则组卷
|
|
// 如果是最后一个文件且有待组卷文件,则组卷
|
|
if (archiveFilesSize == archiveFiles.size() && !waitArchiveFiles.isEmpty()) {
|
|
if (archiveFilesSize == archiveFiles.size() && !waitArchiveFiles.isEmpty()) {
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
waitArchiveFiles.clear();
|
|
waitArchiveFiles.clear();
|
|
archivesSize = 0;
|
|
archivesSize = 0;
|
|
}
|
|
}
|
|
@@ -1723,7 +1872,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
// 最后一个文件直接组卷
|
|
// 最后一个文件直接组卷
|
|
if (archiveFilesSize == archiveFiles.size()) {
|
|
if (archiveFilesSize == archiveFiles.size()) {
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
waitArchiveFiles.clear();
|
|
waitArchiveFiles.clear();
|
|
archivesSize = 0;
|
|
archivesSize = 0;
|
|
}
|
|
}
|
|
@@ -1732,7 +1881,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
else if (checkStatus == 1) {
|
|
else if (checkStatus == 1) {
|
|
waitArchiveFiles.add(file);
|
|
waitArchiveFiles.add(file);
|
|
archivesSize = tempTotalSize;
|
|
archivesSize = tempTotalSize;
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
|
|
|
// 重置待组卷集合
|
|
// 重置待组卷集合
|
|
waitArchiveFiles.clear();
|
|
waitArchiveFiles.clear();
|
|
@@ -1742,7 +1891,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
else if (checkStatus == -1) {
|
|
else if (checkStatus == -1) {
|
|
if (!waitArchiveFiles.isEmpty()) {
|
|
if (!waitArchiveFiles.isEmpty()) {
|
|
// 先将现有集合组卷(不含当前文件)
|
|
// 先将现有集合组卷(不含当前文件)
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
|
|
|
// 新建集合存放当前文件
|
|
// 新建集合存放当前文件
|
|
waitArchiveFiles.clear();
|
|
waitArchiveFiles.clear();
|
|
@@ -1751,7 +1900,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
// 最后一个文件直接组卷
|
|
// 最后一个文件直接组卷
|
|
if (archiveFilesSize == archiveFiles.size()) {
|
|
if (archiveFilesSize == archiveFiles.size()) {
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
waitArchiveFiles.clear();
|
|
waitArchiveFiles.clear();
|
|
archivesSize = 0;
|
|
archivesSize = 0;
|
|
}
|
|
}
|
|
@@ -1759,7 +1908,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
// 当前文件单独成卷
|
|
// 当前文件单独成卷
|
|
waitArchiveFiles.add(file);
|
|
waitArchiveFiles.add(file);
|
|
archivesSize = filePage;
|
|
archivesSize = filePage;
|
|
- createArchive3(waitArchiveFiles, node, archivesSize);
|
|
|
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
|
|
|
// 重置集合
|
|
// 重置集合
|
|
waitArchiveFiles.clear();
|
|
waitArchiveFiles.clear();
|
|
@@ -1873,15 +2022,19 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
//一个archiveAutoGroupId组成一个案卷 案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
|
|
//一个archiveAutoGroupId组成一个案卷 案卷归属同个key的归档树节点select=1的第一个groupId2NodeIdMap
|
|
//createArchive2(archiveFiles, archiveAutoGroupId, projectId);
|
|
//createArchive2(archiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
- archiveAutoMethodGroup(archiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ archiveAutoMethodGroup(archiveFiles, archiveAutoGroupId, projectId,null);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
private void archiveAutoMethod2_new(List<ArchiveTreeContract> list, List<ArchiveTreeContract> topList, Long projectId,
|
|
private void archiveAutoMethod2_new(List<ArchiveTreeContract> list, List<ArchiveTreeContract> topList, Long projectId,
|
|
Map<String, List<ArchiveFile>> boxMap, Map<Long, String> boxFileMap, Long traceId) {
|
|
Map<String, List<ArchiveFile>> boxMap, Map<Long, String> boxFileMap, Long traceId) {
|
|
|
|
|
|
|
|
+ // 构建TOP节点ID集合(提前计算提高效率)
|
|
|
|
+ Set<Long> topIdSet = topList.stream()
|
|
|
|
+ .map(ArchiveTreeContract::getId)
|
|
|
|
+ .collect(Collectors.toSet());
|
|
|
|
+
|
|
// 分类并卷集合<groupId, List<文件>>
|
|
// 分类并卷集合<groupId, List<文件>>
|
|
Map<Long, List<ArchiveFile>> archiveMap = new LinkedHashMap<>();
|
|
Map<Long, List<ArchiveFile>> archiveMap = new LinkedHashMap<>();
|
|
// 记录同个分组id对应的第一个节点ID(案卷归属节点)
|
|
// 记录同个分组id对应的第一个节点ID(案卷归属节点)
|
|
@@ -1892,6 +2045,114 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
// 当前顶层节点对应的分组ID
|
|
// 当前顶层节点对应的分组ID
|
|
Long currArchiveAutoGroupId = null;
|
|
Long currArchiveAutoGroupId = null;
|
|
|
|
|
|
|
|
+ // 4. 构建节点层级关系
|
|
|
|
+ IArchiveNameService.NodeHierarchy nameInfo =
|
|
|
|
+ archiveNameService.buildNodeHierarchy(list);
|
|
|
|
+
|
|
|
|
+ // 步骤1:遍历节点集合
|
|
|
|
+ for (ArchiveTreeContract node : list) {
|
|
|
|
+ // 初始化当前节点的分组ID和顶层节点ID
|
|
|
|
+ Long archiveAutoGroupId = node.getArchiveAutoGroupId();
|
|
|
|
+ Long nodeTopId = 0L;
|
|
|
|
+
|
|
|
|
+ String ancestors = node.getAncestors();
|
|
|
|
+ if (ancestors != null && !ancestors.trim().isEmpty()) {
|
|
|
|
+ // 分割祖先字符串并转换为Long列表
|
|
|
|
+ List<Long> ancestorIds = Arrays.stream(ancestors.split(","))
|
|
|
|
+ .map(String::trim)
|
|
|
|
+ .filter(s -> !s.isEmpty())
|
|
|
|
+ .map(s -> {
|
|
|
|
+ try {
|
|
|
|
+ return Long.parseLong(s);
|
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ // 从上到下遍历:根节点(开始) → 最近祖先(末尾)
|
|
|
|
+ // 查找最后一个匹配的TOP节点(离当前节点最近的)
|
|
|
|
+ for (int i = ancestorIds.size() - 1; i >= 0; i--) {
|
|
|
|
+ Long ancestorId = ancestorIds.get(i);
|
|
|
|
+ if (topIdSet.contains(ancestorId)) {
|
|
|
|
+ nodeTopId = ancestorId;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // =========== 关键修改结束 ===========
|
|
|
|
+
|
|
|
|
+ // 步骤3:确定当前节点的分组ID
|
|
|
|
+ if (curTopId != null && curTopId.equals(nodeTopId) && nodeTopId != 0) {
|
|
|
|
+ // 如果属于同一个非零顶层节点,使用之前的分组ID
|
|
|
|
+ archiveAutoGroupId = currArchiveAutoGroupId;
|
|
|
|
+ } else {
|
|
|
|
+ // 新顶层节点或没有顶层节点,更新当前分组信息
|
|
|
|
+ curTopId = nodeTopId;
|
|
|
|
+ currArchiveAutoGroupId = archiveAutoGroupId;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 步骤4:查询节点下的未归档文件(保持原逻辑)
|
|
|
|
+ List<ArchiveFile> archiveFiles = archiveFileClient.getListByNodeID(node.getId().toString());
|
|
|
|
+
|
|
|
|
+ if (archiveFiles != null && !archiveFiles.isEmpty()) {
|
|
|
|
+ // 记录日志(每个节点只记录一次)
|
|
|
|
+ String completeMsg = "[自动组卷] 分类组卷:" + "-traceId:" + traceId + "节点:" + node.getNodeName() + " 文件数量:" + archiveFiles.size();
|
|
|
|
+ iTraceLogService.saveLog(traceId, completeMsg);
|
|
|
|
+
|
|
|
|
+ // 步骤5:遍历未归档文件
|
|
|
|
+ for (ArchiveFile file : archiveFiles) {
|
|
|
|
+ // 步骤6:判断文件是否存在分盒设置
|
|
|
|
+ if (file.getBoxNumber() != null && file.getBoxNumber() != -1) {
|
|
|
|
+ // 添加到分盒文件集合
|
|
|
|
+ addBoxMap(file, boxMap, boxFileMap);
|
|
|
|
+ } else {
|
|
|
|
+ // 分类并卷流程
|
|
|
|
+ // 步骤7:将文件按照<groupId,List<文件>>放入集合
|
|
|
|
+ //改用top分组了
|
|
|
|
+ archiveAutoGroupId = curTopId;
|
|
|
|
+ if (archiveMap.containsKey(archiveAutoGroupId)) {
|
|
|
|
+ List<ArchiveFile> groupList = archiveMap.get(archiveAutoGroupId);
|
|
|
|
+ groupList.add(file);
|
|
|
|
+ } else {
|
|
|
|
+ List<ArchiveFile> groupList = new ArrayList<>();
|
|
|
|
+ groupList.add(file);
|
|
|
|
+ archiveMap.put(archiveAutoGroupId, groupList);
|
|
|
|
+ groupId2NodeIdMap.put(archiveAutoGroupId, node.getId());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 步骤8:按集合创建案卷(保持原逻辑)
|
|
|
|
+ for (Map.Entry<Long, List<ArchiveFile>> entry : archiveMap.entrySet()) {
|
|
|
|
+ Long archiveAutoGroupId = entry.getKey();
|
|
|
|
+ List<ArchiveFile> archiveFiles = entry.getValue();
|
|
|
|
+
|
|
|
|
+ // 同一个分组ID下的文件分组组卷
|
|
|
|
+ archiveAutoMethodGroup(archiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void archiveAutoMethod2_new1(List<ArchiveTreeContract> list, List<ArchiveTreeContract> topList, Long projectId,
|
|
|
|
+ Map<String, List<ArchiveFile>> boxMap, Map<Long, String> boxFileMap, Long traceId) {
|
|
|
|
+
|
|
|
|
+ // 分类并卷集合<groupId, List<文件>>
|
|
|
|
+ Map<Long, List<ArchiveFile>> archiveMap = new LinkedHashMap<>();
|
|
|
|
+ // 记录同个分组id对应的第一个节点ID(案卷归属节点)
|
|
|
|
+ Map<Long, Long> groupId2NodeIdMap = new HashMap<>();
|
|
|
|
+
|
|
|
|
+ // 当前处理的顶层节点ID
|
|
|
|
+ Long curTopId = null;
|
|
|
|
+ // 当前顶层节点对应的分组ID
|
|
|
|
+ Long currArchiveAutoGroupId = null;
|
|
|
|
+
|
|
|
|
+ // 4. 构建节点层级关系
|
|
|
|
+ IArchiveNameService.NodeHierarchy nameInfo =
|
|
|
|
+ archiveNameService.buildNodeHierarchy(list);
|
|
|
|
+
|
|
// 步骤1:遍历节点集合
|
|
// 步骤1:遍历节点集合
|
|
for (ArchiveTreeContract node : list) {
|
|
for (ArchiveTreeContract node : list) {
|
|
// 初始化当前节点的分组ID和顶层节点ID
|
|
// 初始化当前节点的分组ID和顶层节点ID
|
|
@@ -1956,11 +2217,15 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
List<ArchiveFile> archiveFiles = entry.getValue();
|
|
List<ArchiveFile> archiveFiles = entry.getValue();
|
|
|
|
|
|
// 同一个分组ID下的文件分组组卷
|
|
// 同一个分组ID下的文件分组组卷
|
|
- archiveAutoMethodGroup(archiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ archiveAutoMethodGroup(archiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private void archiveAutoMethodGroup(List<ArchiveFile> archiveFiles, Long archiveAutoGroupId, Long projectId) {
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ private void archiveAutoMethodGroup(List<ArchiveFile> archiveFiles, Long archiveAutoGroupId, Long projectId,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
if (archiveFiles.size()==0) {
|
|
if (archiveFiles.size()==0) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -2008,13 +2273,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
waitArchiveFiles.add(file);
|
|
waitArchiveFiles.add(file);
|
|
archivesSize = tempTotalSize;
|
|
archivesSize = tempTotalSize;
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
|
|
case 1: // 达到规格
|
|
case 1: // 达到规格
|
|
waitArchiveFiles.add(file);
|
|
waitArchiveFiles.add(file);
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
waitArchiveFiles = new ArrayList<>();
|
|
waitArchiveFiles = new ArrayList<>();
|
|
archivesSize = 0;
|
|
archivesSize = 0;
|
|
break;
|
|
break;
|
|
@@ -2022,10 +2287,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
case -1: // 超出规格
|
|
case -1: // 超出规格
|
|
if (waitArchiveFiles.isEmpty()) {
|
|
if (waitArchiveFiles.isEmpty()) {
|
|
// 当前文件单独成卷
|
|
// 当前文件单独成卷
|
|
- createArchive2(Collections.singletonList(file), archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ createArchive2(Collections.singletonList(file), archiveAutoGroupId, projectId,nameInfo);
|
|
} else {
|
|
} else {
|
|
// 先将现有文件组卷
|
|
// 先将现有文件组卷
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
|
|
|
// 创建新的待组卷集合
|
|
// 创建新的待组卷集合
|
|
waitArchiveFiles = new ArrayList<>();
|
|
waitArchiveFiles = new ArrayList<>();
|
|
@@ -2033,7 +2298,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
archivesSize = filePage;
|
|
archivesSize = filePage;
|
|
|
|
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId);
|
|
|
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -2922,7 +3187,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
- public void test() {
|
|
|
|
|
|
+ public void test666() {
|
|
Long projectId = 0L;
|
|
Long projectId = 0L;
|
|
List<ArchiveTreeContract> archiveTreeContracts = archiveTreeContractClient.getListByProjectId(projectId);
|
|
List<ArchiveTreeContract> archiveTreeContracts = archiveTreeContractClient.getListByProjectId(projectId);
|
|
|
|
|