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