Browse Source

组卷提名加时间

laibulaizheli 1 month ago
parent
commit
76dc7f4bec

+ 157 - 18
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -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));
+		}
+	}
+
 }