|
@@ -1289,7 +1289,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
|
|
|
private String builtArchiveName_new(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, boolean isCrossNode
|
|
|
- ,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
|
+ ,IArchiveNameService.NodeHierarchy nameInfo,Set<Long> multiVolumeNodes) {
|
|
|
|
|
|
String archiveName = "";
|
|
|
|
|
@@ -1315,16 +1315,57 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
.filter(nodeId -> nodeId != null && !nodeId.isEmpty())
|
|
|
.collect(Collectors.toCollection(LinkedHashSet::new));
|
|
|
|
|
|
+ String timeRange = "";
|
|
|
+
|
|
|
+ boolean extFlag = false;
|
|
|
+ if (node.getExtType()!= null && node.getExtType()== 1) {
|
|
|
+ extFlag = true;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (uniqueNodeIds.size() == 1 && extFlag == false) {
|
|
|
+ try {
|
|
|
+ Long nodeId = Long.parseLong(uniqueNodeIds.iterator().next());
|
|
|
+
|
|
|
+ // 检查该节点是否需要添加时间区间(生成多个案卷)
|
|
|
+ if (multiVolumeNodes != null && multiVolumeNodes.contains(nodeId)) {
|
|
|
+ // 获取所有有效的时间字符串
|
|
|
+ List<String> validTimes = waitArchiveFiles.stream()
|
|
|
+ .map(ArchiveFile::getFileTime)
|
|
|
+ .filter(time -> time != null && !time.trim().isEmpty())
|
|
|
+ .sorted() // 按字符串自然顺序排序
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (!validTimes.isEmpty()) {
|
|
|
+ String minTime = validTimes.get(0);
|
|
|
+ String maxTime = validTimes.get(validTimes.size() - 1);
|
|
|
+
|
|
|
+ // 生成时间区间字符串
|
|
|
+ timeRange = minTime + "~" + maxTime;
|
|
|
+ } else {
|
|
|
+ log.warn("组卷文件缺少有效时间戳:nodeId={}", nodeId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ log.warn("无效的节点ID格式", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 2. 将节点ID从String转换为Long(保持原始顺序)
|
|
|
List<Long> nodeIds = uniqueNodeIds.stream()
|
|
|
.map(this::safeParseLong)
|
|
|
.filter(Objects::nonNull)
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
+ String fullPath = "";
|
|
|
+ if (extFlag == true) {
|
|
|
+ fullPath = archiveNameService.generateFullLevelName(nodeIds, nameInfo);
|
|
|
+ }else {
|
|
|
+ fullPath = node.getNodeName();
|
|
|
+ }
|
|
|
|
|
|
- String fullPath = archiveNameService.generateFullLevelName(nodeIds, nameInfo);
|
|
|
|
|
|
- archiveName+=fullPath;
|
|
|
+ archiveName += timeRange + fullPath;
|
|
|
|
|
|
// if (archiveName.length() > 200) {
|
|
|
// // 从150位置开始查找第一个顿号
|
|
@@ -1500,7 +1541,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
* @param node 规格参数所在节点
|
|
|
* @param pageN
|
|
|
*/
|
|
|
- private void createArchive3_new(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, int pageN,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
|
+ private void createArchive3_new(List<ArchiveFile> waitArchiveFiles, ArchiveTreeContract node, int pageN,IArchiveNameService.NodeHierarchy nameInfo, Set<Long> multiVolumeNodes) {
|
|
|
|
|
|
String archiveStartDateAndEndDate = getArchiveStartDateAndEndDate(waitArchiveFiles);
|
|
|
String[] split = archiveStartDateAndEndDate.split(",");
|
|
@@ -1511,7 +1552,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- String archiveName = builtArchiveName_new(waitArchiveFiles, node, false,nameInfo);//获取案卷题名
|
|
|
+ String archiveName = builtArchiveName_new(waitArchiveFiles, node, false,nameInfo,multiVolumeNodes);//获取案卷题名
|
|
|
//1.创建新案卷
|
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
|
//2.设置文件所属案卷,组卷状态
|
|
@@ -1545,7 +1586,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
* @param waitArchiveFiles
|
|
|
* @param archiveAutoGroupId 分类并卷分组ID
|
|
|
*/
|
|
|
- private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId, Long projectId,IArchiveNameService.NodeHierarchy nameInfo) {
|
|
|
+ private void createArchive2(List<ArchiveFile> waitArchiveFiles, Long archiveAutoGroupId, Long projectId,IArchiveNameService.NodeHierarchy nameInfo,Set<Long> multiVolumeNodes) {
|
|
|
|
|
|
//获取同一分类archiveAutoGroupId下设置的(设置规则时选中的)节点,排好序
|
|
|
// List<ArchiveTreeContract> selectList = archiveTreeContractClient.getStorageNodeByGroupId(projectId, archiveAutoGroupId);
|
|
@@ -1587,7 +1628,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
}
|
|
|
//默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
//获取案卷题名
|
|
|
- String archiveName = builtArchiveName_new(waitArchiveFiles, node, true,nameInfo);//获取案卷题名
|
|
|
+ String archiveName = builtArchiveName_new(waitArchiveFiles, node, true,nameInfo,multiVolumeNodes);//获取案卷题名
|
|
|
|
|
|
//1.创建新案卷
|
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
@@ -1840,6 +1881,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
String completeMsg = "[自动组卷] 单独组卷:" + "-traceId:" + traceId + "节点:" + node.getNodeName() + " 文件数量:" + archiveFiles.size();
|
|
|
iTraceLogService.saveLog(traceId, completeMsg);
|
|
|
|
|
|
+ Set<Long> multiVolumeNodes = precalculateMultiVolumeNodes(archiveFiles, specificationSize);
|
|
|
+
|
|
|
// 步骤4:遍历未归档文件
|
|
|
List<ArchiveFile> waitArchiveFiles = new ArrayList<>(); // 待组卷文件集合
|
|
|
int archivesSize = 0; // 待组卷文件总页数
|
|
@@ -1855,7 +1898,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
// 如果是最后一个文件且有待组卷文件,则组卷
|
|
|
if (archiveFilesSize == archiveFiles.size() && !waitArchiveFiles.isEmpty()) {
|
|
|
- createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo,null);
|
|
|
waitArchiveFiles.clear();
|
|
|
archivesSize = 0;
|
|
|
}
|
|
@@ -1874,7 +1917,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
// 最后一个文件直接组卷
|
|
|
if (archiveFilesSize == archiveFiles.size()) {
|
|
|
- createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo,multiVolumeNodes);
|
|
|
waitArchiveFiles.clear();
|
|
|
archivesSize = 0;
|
|
|
}
|
|
@@ -1883,7 +1926,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
else if (checkStatus == 1) {
|
|
|
waitArchiveFiles.add(file);
|
|
|
archivesSize = tempTotalSize;
|
|
|
- createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo,multiVolumeNodes);
|
|
|
|
|
|
// 重置待组卷集合
|
|
|
waitArchiveFiles.clear();
|
|
@@ -1893,7 +1936,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
else if (checkStatus == -1) {
|
|
|
if (!waitArchiveFiles.isEmpty()) {
|
|
|
// 先将现有集合组卷(不含当前文件)
|
|
|
- createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo,multiVolumeNodes);
|
|
|
|
|
|
// 新建集合存放当前文件
|
|
|
waitArchiveFiles.clear();
|
|
@@ -1902,7 +1945,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
// 最后一个文件直接组卷
|
|
|
if (archiveFilesSize == archiveFiles.size()) {
|
|
|
- createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo,multiVolumeNodes);
|
|
|
waitArchiveFiles.clear();
|
|
|
archivesSize = 0;
|
|
|
}
|
|
@@ -1910,7 +1953,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
// 当前文件单独成卷
|
|
|
waitArchiveFiles.add(file);
|
|
|
archivesSize = filePage;
|
|
|
- createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo);
|
|
|
+ createArchive3_new(waitArchiveFiles, node, archivesSize,nameInfo,multiVolumeNodes);
|
|
|
|
|
|
// 重置集合
|
|
|
waitArchiveFiles.clear();
|
|
@@ -2258,6 +2301,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
int fileIndex = 0;
|
|
|
int totalFiles = archiveFiles.size();
|
|
|
|
|
|
+ Set<Long> multiVolumeNodes = precalculateMultiVolumeNodes(archiveFiles, specificationSize);
|
|
|
+
|
|
|
for (ArchiveFile file : archiveFiles) {
|
|
|
fileIndex++;
|
|
|
// 获取文件页数,处理null值
|
|
@@ -2275,13 +2320,13 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
waitArchiveFiles.add(file);
|
|
|
archivesSize = tempTotalSize;
|
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo,multiVolumeNodes);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 1: // 达到规格
|
|
|
waitArchiveFiles.add(file);
|
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo,multiVolumeNodes);
|
|
|
waitArchiveFiles = new ArrayList<>();
|
|
|
archivesSize = 0;
|
|
|
break;
|
|
@@ -2289,10 +2334,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
case -1: // 超出规格
|
|
|
if (waitArchiveFiles.isEmpty()) {
|
|
|
// 当前文件单独成卷
|
|
|
- createArchive2(Collections.singletonList(file), archiveAutoGroupId, projectId,nameInfo);
|
|
|
+ createArchive2(Collections.singletonList(file), archiveAutoGroupId, projectId,nameInfo,multiVolumeNodes);
|
|
|
} else {
|
|
|
// 先将现有文件组卷
|
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo,multiVolumeNodes);
|
|
|
|
|
|
// 创建新的待组卷集合
|
|
|
waitArchiveFiles = new ArrayList<>();
|
|
@@ -2300,7 +2345,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
archivesSize = filePage;
|
|
|
|
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo,multiVolumeNodes);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -4710,4 +4755,98 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private Set<Long> precalculateMultiVolumeNodes(List<ArchiveFile> files, int specificationSize) {
|
|
|
+ if (files == null || files.isEmpty()) {
|
|
|
+ return Collections.emptySet();
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<Long, List<List<ArchiveFile>>> nodeGroupingMap = new HashMap<>();
|
|
|
+ Set<Long> multiVolumeNodes = new HashSet<>();
|
|
|
+
|
|
|
+ // 待组卷文件集合
|
|
|
+ List<ArchiveFile> waitArchiveFiles = new ArrayList<>();
|
|
|
+ // 待组卷文件总页数
|
|
|
+ int archivesSize = 0;
|
|
|
+ // 文件索引(用于处理最后文件)
|
|
|
+ int fileIndex = 0;
|
|
|
+ int totalFiles = files.size();
|
|
|
+
|
|
|
+ for (ArchiveFile file : files) {
|
|
|
+ fileIndex++;
|
|
|
+ int filePage = file.getFilePage() != null ? file.getFilePage() : 0;
|
|
|
+ int tempTotalSize = archivesSize + filePage;
|
|
|
+ int checkStatus = checkSpecificationSize(specificationSize, tempTotalSize);
|
|
|
+
|
|
|
+ switch (checkStatus) {
|
|
|
+ case 0: // 未到规格
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ archivesSize = tempTotalSize;
|
|
|
+ if (fileIndex == totalFiles) { // 是最后一个文件
|
|
|
+ recordGroup(waitArchiveFiles, nodeGroupingMap);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 1: // 达到规格
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ recordGroup(waitArchiveFiles, nodeGroupingMap);
|
|
|
+ waitArchiveFiles = new ArrayList<>();
|
|
|
+ archivesSize = 0;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case -1: // 超出规格
|
|
|
+ if (!waitArchiveFiles.isEmpty()) {
|
|
|
+ recordGroup(waitArchiveFiles, nodeGroupingMap);
|
|
|
+ waitArchiveFiles = new ArrayList<>();
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ archivesSize = filePage;
|
|
|
+ if (fileIndex == totalFiles) { // 是最后一个文件
|
|
|
+ recordGroup(waitArchiveFiles, nodeGroupingMap);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ waitArchiveFiles.add(file);
|
|
|
+ archivesSize = filePage;
|
|
|
+ recordGroup(waitArchiveFiles, nodeGroupingMap);
|
|
|
+ waitArchiveFiles = new ArrayList<>();
|
|
|
+ archivesSize = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确定哪些节点有多个卷
|
|
|
+ nodeGroupingMap.forEach((nodeId, groups) -> {
|
|
|
+ if (groups.size() > 1) {
|
|
|
+ multiVolumeNodes.add(nodeId);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return multiVolumeNodes;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void recordGroup(List<ArchiveFile> groupFiles, Map<Long, List<List<ArchiveFile>>> nodeGroupingMap) {
|
|
|
+ if (groupFiles == null || groupFiles.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取节点ID(确保单一节点)
|
|
|
+ Set<Long> groupNodeIds = new HashSet<>();
|
|
|
+ for (ArchiveFile file : groupFiles) {
|
|
|
+ try {
|
|
|
+ Long nodeId = Long.parseLong(file.getNodeId());
|
|
|
+ groupNodeIds.add(nodeId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 忽略无效节点ID
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 仅记录单节点分组
|
|
|
+ if (groupNodeIds.size() == 1) {
|
|
|
+ Long nodeId = groupNodeIds.iterator().next();
|
|
|
+ nodeGroupingMap.computeIfAbsent(nodeId, k -> new ArrayList<>())
|
|
|
+ .add(new ArrayList<>(groupFiles));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|