laibulaizheli 2 هفته پیش
والد
کامیت
4b1cf24232

+ 28 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -592,7 +592,33 @@ public class ArchivesAutoController extends BladeController {
 	 * @return
 	 */
 	@PostMapping("/archiveAutoMethod")
-	public R archiveAutoMethod(Long projectId,Long contractId,Long nodeId) {
+	public R archiveAutoMethod(Long projectId, Long contractId, Long nodeId,
+							   @RequestParam(required = false) String childNodeIds) {
+		List<Long> childNodes = null;
+		if (StringUtils.isNotBlank(childNodeIds)) {
+			childNodes = Arrays.stream(childNodeIds.split(","))
+					.map(String::trim)
+					.filter(s -> !s.isEmpty())
+					.map(Long::valueOf)
+					.collect(Collectors.toList());
+		}
+		return archiveAutoMethod(projectId, contractId, nodeId, childNodes);
+	}
+
+	/**
+	 * 自动组卷入口(带childNodes参数)
+	 * projectId 为当前项目
+	 * contractId 为客户端当前选定的合同段
+	 * nodeId 为左侧树选定的节点id
+	 * childNodes 为指定的子节点列表,用于过滤
+	 * @param projectId
+	 * @param contractId
+	 * @param nodeId
+	 * @param childNodes
+	 * @return
+	 */
+	@PostMapping("/archiveAutoMethodWithChildNodes")
+	public R archiveAutoMethod(Long projectId,Long contractId,Long nodeId, @RequestParam(required = false) List<Long> childNodes) {
 		try{
 			//先验证当前项目是否在自动组卷中,组卷中直接返回
 			//ProjectInfo projectInfo = projectClient.getById(String.valueOf(projectId));
@@ -610,7 +636,7 @@ public class ArchivesAutoController extends BladeController {
 			//设置自动组卷中
 			contractClient.updateIsArchivesAutoById(contractId,1);
 
-			archivesAutoService.archiveAutoMethodThread(projectId,contractId,nodeId,traceId);
+			archivesAutoService.archiveAutoMethodThread(projectId,contractId,nodeId,traceId, childNodes);
 			return R.data("开始自动组卷中,请耐心等待");
 		}catch (Exception e){
 			e.printStackTrace();

+ 8 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -76,8 +76,14 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 
 	void archiveAutoMethod(Long project,Long contractId,Long nodeId,Long traceId);
 
+	void archiveAutoMethod(Long project,Long contractId,Long nodeId,Long traceId,List<Long> childNodes);
+
+	void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId, Long traceId, List<Long> childNodes);
+
 	void splitArchvies(Long project,Long contractId,Long nodeId);
 
+	void splitArchvies(Long project,Long contractId,Long nodeId,List<Long> childNodes);
+
 	public String getMergeArchivesFile(Long archiveId);
 
 	//拆卷
@@ -90,6 +96,8 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
 	//刷新某个项目的档号
 	void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId,boolean bforce, Long traceId);
 
+	void refreshFileNumberNoSlipt(Long projectId,Long contractId,Long nodeId,boolean bforce, Long traceId,List<Long> childNodes);
+
 	void test666();
 
     List<DictBiz> getCarrierTypeByDict();

+ 9 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveNameServiceImpl.java

@@ -283,7 +283,11 @@ public class ArchiveNameServiceImpl implements IArchiveNameService {
                                 }
                             }
 
-                            if (allGroupsFullyCovered && useCovering) {
+                            // 检查祖父节点是否为单位工程,如果是则跳过此处理
+                            boolean isUnitProject = grandParentNode.getExtNodeType() != null && 
+                                                  grandParentNode.getExtNodeType() == 1;
+                            
+                            if (allGroupsFullyCovered && useCovering && !isUnitProject) {
                                 nameParts.add(getLevelName(hierarchy, grandParentId));
                                 canUseGrandParentName = true;
                             }
@@ -316,8 +320,11 @@ public class ArchiveNameServiceImpl implements IArchiveNameService {
                 List<ArchiveTreeContract> allChildren = hierarchy.getChildren(groupId);
                 int childrenCount = (allChildren != null) ? allChildren.size() : 0;
 
+                boolean isUnitProject = parent.getExtNodeType() != null &&
+                        parent.getExtNodeType() == 1;
+
                 // 检查是否全覆盖所有子节点
-                if (childrenCount > 0 && groupNodes.size() == childrenCount ) {
+                if (childrenCount > 0 && groupNodes.size() == childrenCount && !isUnitProject) {
                     // 只有组内第一个父节点使用完整层级名称
                     String parentName = firstParentInGroup ?
                             getLevelName(hierarchy, groupId) :

+ 159 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -771,7 +771,69 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	@Override
 	public void splitArchvies(Long projectId, Long contractId, Long nodeId) {
+		splitArchvies(projectId, contractId, nodeId, null);
+	}
+
+	public void splitArchvies(Long projectId, Long contractId, Long nodeId, List<Long> childNodes) {
 		List<String> removeFiles = new ArrayList<>();
+		
+		// 如果 childNodes 不为空,使用 childNodes 进行拆卷
+		if (childNodes != null && !childNodes.isEmpty()) {
+			log.info("[自动组卷-拆卷]{}", "对指定childNodes进行拆卷,childNodes: " + childNodes);
+			
+			// 从 childNodes 分别获取节点信息并合并处理
+			for (Long childNodeId : childNodes) {
+				ArchiveTreeContract childNode = archiveTreeContractClient.getArchiveTreeContractById(childNodeId);
+				if (childNode != null) {
+					// 如果指定了 contractId,检查节点是否属于该合同段
+					if (contractId != null && !contractId.equals(childNode.getContractId())) {
+						continue; // 跳过不属于指定合同段的节点
+					}
+					
+					String ancestors = childNode.getAncestors() + "," + childNodeId;
+					String strChildNodeId = childNodeId.toString();
+					
+					// 清除案卷封面等pdf
+					List<String> archivesOutUrlList = baseMapper.getArchivesOutUrlListByNode(projectId, ancestors, strChildNodeId);
+					if (archivesOutUrlList != null && archivesOutUrlList.size() > 0) {
+						for (String outUrl : archivesOutUrlList) {
+							String[] splits = outUrl.split(",");
+							for (String url : splits) {
+								if (StringUtils.isNotEmpty(url) && StringUtils.isNotEmpty(url.trim())) {
+									removeFiles.add(FileUtils.getAliYunSubUrl(url));
+								}
+							}
+						}
+						// 删除四要素文件记录
+						baseMapper.deleteIsElementFileByNode(projectId, ancestors, strChildNodeId);
+					}
+					
+					// 清除文件页面pdf
+					List<String> filePageUrlList = baseMapper.getFilePageUrlListByNode(projectId, ancestors, strChildNodeId);
+					if (filePageUrlList != null && filePageUrlList.size() > 0) {
+						for (String url : filePageUrlList) {
+							if (StringUtils.isNotEmpty(url) && StringUtils.isNotEmpty(url.trim())) {
+								removeFiles.add(FileUtils.getAliYunSubUrl(url));
+							}
+						}
+					}
+					
+					// 执行拆卷操作
+					baseMapper.splitArchviesByNode(projectId, ancestors, strChildNodeId);
+				}
+			}
+			
+			// 异步删除文件
+			if (!removeFiles.isEmpty()) {
+				executorService.execute(() -> {
+					log.info("[自动组卷-拆卷]{}", "删除旧封面,页码文件开始" + removeFiles);
+					iossClient.removeFiles(removeFiles);
+					log.info("[自动组卷-拆卷]{}", "删除旧封面,页码文件结束" + removeFiles);
+				});
+			}
+			return;
+		}
+		
 		//没合同段的默认整个项目
 		if (contractId == null) {
 			log.info("[自动组卷-拆卷]{}", "对全项目未锁定案卷拆卷");
@@ -901,6 +963,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	@Override
 	public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId, Long traceId) {
+		archiveAutoMethod(projectId, contractId, nodeId, traceId, null);
+	}
+
+	public void archiveAutoMethod(Long projectId, Long contractId, Long nodeId, Long traceId, List<Long> childNodes) {
 		//步骤一:把档号集合初始化
 		indexMap = new HashMap<>();
 		//步list = {ArrayList@18238}  size = 19骤二:查询归档树节点。存在未归档文件的节点。
@@ -919,6 +985,40 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		//按合同段过滤
 		List<ArchiveTreeContract> authlist = authFilter(list, contractId, nodeId);
 
+		// 新增:处理 childNodes 参数
+		if (childNodes != null && !childNodes.isEmpty()) {
+			// 创建合并列表(包含原始 authlist)
+			List<ArchiveTreeContract> mergedAuthlist = new ArrayList<>();
+
+			// 遍历每个子节点ID,应用过滤并合并结果
+			for (Long childNodeId : childNodes) {
+				List<ArchiveTreeContract> childAuthlist = authFilter(list, contractId, childNodeId);
+				mergedAuthlist.addAll(childAuthlist);
+			}
+
+			// 去重处理(根据节点ID)
+			authlist = mergedAuthlist;
+		}
+		
+		// 如果 childNodes 不为空,进行祖先节点过滤
+//		if (childNodes != null && !childNodes.isEmpty()) {
+//			authlist = authlist.stream()
+//				.filter(node -> {
+//					// 检查节点的祖先是否包含 childNodes 中的任一元素
+//					if (StringUtils.isNotEmpty(node.getAncestors())) {
+//						String[] ancestors = node.getAncestors().split(",");
+//						for (String ancestor : ancestors) {
+//							if (StringUtils.isNotEmpty(ancestor.trim()) && childNodes.contains(Long.valueOf(ancestor.trim()))) {
+//								return true;
+//							}
+//						}
+//					}
+//					// 检查节点本身是否在 childNodes 中
+//					return childNodes.contains(node.getId());
+//				})
+//				.collect(Collectors.toList());
+//		}
+
 		//步骤三:遍历归档树节点整理出 默认规则节点,分类并卷节点,单独组卷节点 三个集合。
 		List<ArchiveTreeContract> list0 = new ArrayList<>();
 		List<ArchiveTreeContract> list1 = new ArrayList<>();
@@ -963,6 +1063,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		archiveAutoMethodBox(boxMap, traceId);//分盒组卷
 	}
 
+
+
 	private void addBoxMap(ArchiveFile file, Map<String, List<ArchiveFile>> boxMap, Map<Long, String> boxFileMap) {
 		String boxName = file.getBoxName();
 		if (boxFileMap.containsKey(file.getId())) {
@@ -2618,6 +2720,10 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 * @param nodeId
 	 */
 	public void refreshFileNumberNoSlipt(Long projectId, Long contractId, Long nodeId, boolean bforce, Long traceId) {
+		refreshFileNumberNoSlipt(projectId, contractId, nodeId, bforce, traceId, null);
+	}
+
+	public void refreshFileNumberNoSlipt(Long projectId, Long contractId, Long nodeId, boolean bforce, Long traceId, List<Long> childNodes) {
 		List<ArchiveTreeContract> list = archiveTreeContractClient.getListByProjectId(projectId);
 		if (nodeId != null) {
 			ArchiveTreeContract node = archiveTreeContractClient.getArchiveTreeContractById(nodeId);
@@ -2629,7 +2735,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		Integer indexType = 0;
 		ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(projectId);
 
-		this.refreshFileNumberNoSlipt(list, contractId, nodeId, bforce, config.getIndexType(), config.getDirType(), config.getIndexNum(), traceId);
+		this.refreshFileNumberNoSlipt(list, contractId, nodeId, bforce, config.getIndexType(), config.getDirType(), config.getIndexNum(), traceId, childNodes);
 	}
 
 	/**
@@ -2639,6 +2745,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 	 */
 	public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId,
 										 boolean bforce, Integer indexType, Integer dirType, Integer indexNum, Long traceId) {
+		refreshFileNumberNoSlipt(archiveTreeContracts, contractId, nodeId, bforce, indexType, dirType, indexNum, traceId, null);
+	}
+
+	public void refreshFileNumberNoSlipt(List<ArchiveTreeContract> archiveTreeContracts, Long contractId, Long nodeId,
+										 boolean bforce, Integer indexType, Integer dirType, Integer indexNum, Long traceId, List<Long> childNodes) {
 
 		List<ArchiveTreeContractVO2> subTreeList = new ArrayList<>();
 		List<List<ArchiveTreeContract>> subGroupedList = new ArrayList<>();
@@ -2659,6 +2770,26 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 			//根据 authFilter函数过滤
 			subList = authFilterNum(subList, contractId, nodeId);
+			
+			// 如果 childNodes 不为空,进行祖先节点过滤
+			if (childNodes != null && !childNodes.isEmpty()) {
+				subList = subList.stream()
+					.filter(node -> {
+						// 检查节点的祖先是否包含 childNodes 中的任一元素
+						if (StringUtils.isNotEmpty(node.getAncestors())) {
+							String[] ancestors = node.getAncestors().split(",");
+							for (String ancestor : ancestors) {
+								if (StringUtils.isNotEmpty(ancestor.trim()) && childNodes.contains(Long.valueOf(ancestor.trim()))) {
+									return true;
+								}
+							}
+						}
+						// 检查节点本身是否在 childNodes 中
+						return childNodes.contains(node.getId());
+					})
+					.collect(Collectors.toList());
+			}
+			
 			List<Long> ids = subList.stream()
 					.map(ArchiveTreeContract::getId)
 					.collect(Collectors.toList());
@@ -3284,10 +3415,17 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 
 	@Override
 	public void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId, Long traceId) {
+		archiveAutoMethodThread(projectId, contractId, nodeId, traceId, null);
+	}
+
+	public void archiveAutoMethodThread(Long projectId, Long contractId, Long nodeId, Long traceId, List<Long> childNodes) {
 		executorService.execute(() -> {
 			try {
 				// 将项目未锁定案卷拆卷
 				String startSplitMsg = "[自动组卷] 开始对未锁定案卷拆卷。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				if (childNodes != null && !childNodes.isEmpty()) {
+					startSplitMsg += "-childNodes:" + childNodes;
+				}
 				//log.info(startSplitMsg);
 				iTraceLogService.saveLog(traceId, startSplitMsg);
 
@@ -3296,31 +3434,49 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 				//     return;
 				// }
 
-				splitArchvies(projectId, contractId, nodeId);
+				splitArchvies(projectId, contractId, nodeId, childNodes);
 				// 设置完成度10%
 				contractClient.updateIsArchivesAutoById(contractId, 10);
 
 				// 项目自动组卷入口
 				String startAutoArchiveMsg = "[自动组卷] 开始自动组卷。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				if (childNodes != null && !childNodes.isEmpty()) {
+					startAutoArchiveMsg += "-childNodes:" + childNodes;
+				}
 				//log.info(startAutoArchiveMsg);
 				iTraceLogService.saveLog(traceId, startAutoArchiveMsg);
 
 				archiveAutoPdfService.assignArchiveTableUrl();
 
-				archiveAutoMethod(projectId, contractId, nodeId, traceId);
+				if (childNodes != null && !childNodes.isEmpty()) {
+					archiveAutoMethod(projectId, contractId, nodeId, traceId, childNodes);
+				} else {
+					archiveAutoMethod(projectId, contractId, nodeId, traceId);
+				}
 				// 设置完成度80%
 				contractClient.updateIsArchivesAutoById(contractId, 80);
 
 				// 刷新项目档号
 				String startRefreshMsg = "[自动组卷] 开始刷新组卷档号。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				if (childNodes != null && !childNodes.isEmpty()) {
+					startRefreshMsg += "-childNodes:" + childNodes;
+				}
 				//log.info(startRefreshMsg);
 				iTraceLogService.saveLog(traceId, startRefreshMsg);
 
 				refreshFileNumberNoSlipt(projectId, contractId, nodeId, true, traceId);
+//				if (childNodes != null && !childNodes.isEmpty()) {
+//					refreshFileNumberNoSlipt(projectId, contractId, nodeId, true, traceId, childNodes);
+//				} else {
+//					refreshFileNumberNoSlipt(projectId, contractId, nodeId, true, traceId);
+//				}
 
 				// 设置自动组卷结束
 				contractClient.updateIsArchivesAutoById(contractId, 0);
 				String completeMsg = "[自动组卷] 自动组卷完成。projectId:" + projectId + "-contractId:" + contractId + "-nodeId:" + nodeId + "-traceId:" + traceId;
+				if (childNodes != null && !childNodes.isEmpty()) {
+					completeMsg += "-childNodes:" + childNodes;
+				}
 				//log.info(completeMsg);
 				iTraceLogService.saveLog(traceId, completeMsg);