|
@@ -52,6 +52,7 @@ import org.springblade.business.feign.ArchiveFileClient;
|
|
|
import org.springblade.business.feign.MetadataClassificationClient;
|
|
|
import org.springblade.business.feign.TaskClient;
|
|
|
import org.springblade.common.utils.CommonUtil;
|
|
|
+import org.springblade.common.utils.DeepSeekClient;
|
|
|
import org.springblade.common.utils.SnowFlakeUtil;
|
|
|
import org.springblade.core.log.exception.ServiceException;
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
|
@@ -91,11 +92,13 @@ import java.net.URL;
|
|
|
import java.nio.file.Files;
|
|
|
import java.nio.file.Path;
|
|
|
import java.nio.file.Paths;
|
|
|
+import java.rmi.ServerException;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
import java.util.List;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -151,6 +154,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
private final IArchiveNameService archiveNameService;
|
|
|
|
|
|
+ private final IArchiveAiNameService aiNameService;
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public IPage<ArchivesAutoVO> selectArchivesAutoPage(IPage<ArchivesAutoVO> page, ArchivesAutoVO archivesAuto) {
|
|
@@ -383,43 +388,34 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
vo.setSecretLevelValue("1".equals(vo.getSecretLevel()) ? "机密" : ("2".equals(vo.getSecretLevel()) ? "绝密" : "秘密"));
|
|
|
}
|
|
|
List<ArchivesAutoVO.ApprovalFile> approvalFiles = vo.getApprovalFileList();
|
|
|
- ArchivesAutoVO.ApprovalFile front = null;
|
|
|
- ArchivesAutoVO.ApprovalFile cataLog = null;
|
|
|
- ArchivesAutoVO.ApprovalFile spare = null;
|
|
|
- ArchivesAutoVO.ApprovalFile back = null;
|
|
|
+ ArchivesAutoVO.ApprovalFile[] elementFiles = new ArchivesAutoVO.ApprovalFile[4];
|
|
|
+ AtomicInteger pageSize = new AtomicInteger(0);
|
|
|
if (approvalFiles != null && !approvalFiles.isEmpty()) {
|
|
|
- // todo 四要素 使用名称判断
|
|
|
- Map<String, List<ArchivesAutoVO.ApprovalFile>> collect = approvalFiles.stream().collect(Collectors.groupingBy(approvalFile -> {
|
|
|
- if (approvalFile != null &&
|
|
|
- (approvalFile.getFileName().equals("封面") || approvalFile.getFileName().equals("卷内目录") || approvalFile.getFileName().equals("卷内备考表") || approvalFile.getFileName().equals("备考表") || approvalFile.getFileName().equals("背脊"))) {
|
|
|
- if (approvalFile.getFileName().equals("卷内备考表")) {
|
|
|
- return "备考表";
|
|
|
- }
|
|
|
- return approvalFile.getFileName();
|
|
|
+ // 四要素 使用名称判断
|
|
|
+ approvalFiles.removeIf(approvalFile -> {
|
|
|
+ if ("封面".equals(approvalFile.getFileName()) || "封面表".equals(approvalFile.getFileName())) {
|
|
|
+ elementFiles[0] = approvalFile;
|
|
|
+ return true;
|
|
|
+ } else if ("卷内目录".equals(approvalFile.getFileName()) || "卷内目录表".equals(approvalFile.getFileName()) || "目录表".equals(approvalFile.getFileName()) || "目录".equals(approvalFile.getFileName())) {
|
|
|
+ elementFiles[1] = approvalFile;
|
|
|
+ return true;
|
|
|
+ } else if ("备考表".equals(approvalFile.getFileName()) || "卷内备考表".equals(approvalFile.getFileName())) {
|
|
|
+ elementFiles[2] = approvalFile;
|
|
|
+ return true;
|
|
|
+ } else if ("背脊".equals(approvalFile.getFileName()) || "背脊表".equals(approvalFile.getFileName())) {
|
|
|
+ elementFiles[3] = approvalFile;
|
|
|
+ return true;
|
|
|
}
|
|
|
- return "0";
|
|
|
- }, Collectors.toList()));
|
|
|
- List<ArchivesAutoVO.ApprovalFile> approvalFiles1 = collect.get("0");
|
|
|
- if (approvalFiles1 == null) {
|
|
|
- approvalFiles1 = new ArrayList<>();
|
|
|
- }
|
|
|
- vo.setPageNumber(approvalFiles1.size());
|
|
|
- vo.setApprovalFileList(approvalFiles1);
|
|
|
- if (collect.containsKey("封面")) {
|
|
|
- front = collect.get("封面").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
|
|
|
- }
|
|
|
- if (collect.containsKey("卷内目录")) {
|
|
|
- cataLog = collect.get("卷内目录").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
|
|
|
- }
|
|
|
- if (collect.containsKey("备考表")) {
|
|
|
- spare = collect.get("备考表").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
|
|
|
- }
|
|
|
- if (collect.containsKey("背脊")) {
|
|
|
- back = collect.get("背脊").stream().max(Comparator.comparing(ArchivesAutoVO.ApprovalFile::getId)).orElse(null);
|
|
|
- }
|
|
|
+ pageSize.addAndGet(approvalFile.getFilePage() == null ? 1 : approvalFile.getFilePage());
|
|
|
+ return false;
|
|
|
+ });
|
|
|
} else {
|
|
|
vo.setPageNumber(0);
|
|
|
}
|
|
|
+ ArchivesAutoVO.ApprovalFile front = elementFiles[0];
|
|
|
+ ArchivesAutoVO.ApprovalFile cataLog = elementFiles[1];
|
|
|
+ ArchivesAutoVO.ApprovalFile spare = elementFiles[2];
|
|
|
+ ArchivesAutoVO.ApprovalFile back = elementFiles[3];
|
|
|
String outUrl = vo.getOutUrl();
|
|
|
if (StringUtils.isNotBlank(outUrl)) {
|
|
|
// 根据 factorType 字符串生成档案号码字符串链表
|
|
@@ -1107,7 +1103,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
indexMap.put(treeCode, fileNumberSuffix + 1);
|
|
|
}
|
|
|
|
|
|
- archivesAuto.setFileNumber(fileNumberSuffix.toString());//档号
|
|
|
+ // 将数值格式化为3位数字字符串(不足3位前面补0)
|
|
|
+ String formattedNumber = String.format("%03d", fileNumberSuffix);
|
|
|
+ archivesAuto.setFileNumber(formattedNumber); // 设置档号
|
|
|
//archivesAuto.setMicron();//微缩号
|
|
|
archivesAuto.setUnit(unit);//立卷单位
|
|
|
//archivesAuto.setQuantity();//数量/单位
|
|
@@ -1297,7 +1295,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,Integer archiveAutoType) {
|
|
|
|
|
|
String archiveName = "";
|
|
|
|
|
@@ -1308,7 +1306,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
Long contractId = node.getContractId();
|
|
|
if (contractId != null && contractId != -1) {
|
|
|
ContractInfo contract = contractClient.getContractById(contractId);
|
|
|
- contractName = contract.getContractName();
|
|
|
+ contractName = contract.getContractNumber();
|
|
|
}
|
|
|
//获取案卷题名
|
|
|
archiveName = projectName;
|
|
@@ -1323,16 +1321,62 @@ 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,true);
|
|
|
+ }else {
|
|
|
+ //独立组卷,且非工序节点,取节点名曾即可
|
|
|
+ if (archiveAutoType == 3) {
|
|
|
+ fullPath = node.getNodeName();
|
|
|
+ }else {
|
|
|
+ fullPath = archiveNameService.generateFullLevelName(nodeIds, nameInfo,false);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- String fullPath = archiveNameService.generateFullLevelName(nodeIds, nameInfo);
|
|
|
|
|
|
- archiveName+=fullPath;
|
|
|
+ archiveName += timeRange + fullPath;
|
|
|
|
|
|
// if (archiveName.length() > 200) {
|
|
|
// // 从150位置开始查找第一个顿号
|
|
@@ -1440,7 +1484,6 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
//生成文件对应的页码,返回url
|
|
|
archiveAutoPdfService.builtFilePageNo(archivesAuto, waitArchiveFiles);
|
|
|
this.updateById(archivesAuto);
|
|
|
-
|
|
|
return "";
|
|
|
}
|
|
|
|
|
@@ -1467,7 +1510,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
//1.创建新案卷
|
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
|
//2.设置文件所属案卷,组卷状态
|
|
|
- Long archivesAutoId = archivesAuto.getId();
|
|
|
+ //Long archivesAutoId = archivesAuto.getId();
|
|
|
|
|
|
//封面和生成文件页码
|
|
|
archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles, false);
|
|
@@ -1475,11 +1518,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
|
|
|
|
|
|
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
-
|
|
|
- }
|
|
|
+ //设置文件所属案卷,组卷状态,排序
|
|
|
+ Long archivesAutoId = archivesAuto.getId();
|
|
|
+ setArchiveFiles(archivesAutoId,waitArchiveFiles);
|
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
try {
|
|
|
// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
@@ -1491,6 +1532,50 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public void reCreateArchiveAuto(ArchivesAuto archivesAuto, List<ArchiveFile> waitArchiveFiles){
|
|
|
+ archiveAutoPdfService.assignArchiveTableUrl();
|
|
|
+ //生成四要素
|
|
|
+ archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles, true);
|
|
|
+ //生成页码
|
|
|
+ builtFilePageNo(archivesAuto, waitArchiveFiles);
|
|
|
+ archiveFileClient.updateArchiveFile(waitArchiveFiles);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean creatFileNameFormAI(String ids, Long projectId, Long contractId) throws IOException {
|
|
|
+ List<ArchivesAuto> archivesAutoList = this.listByIds(Func.toLongList(ids));
|
|
|
+ List<ArchiveAiName>aiNames=new ArrayList<>();
|
|
|
+ Long taskId=SnowFlakeUtil.getId();
|
|
|
+ List<ArchiveAiName> archiveAiNameList = aiNameService.getBaseMapper().selectList(new LambdaQueryWrapper<>(ArchiveAiName.class).eq(ArchiveAiName::getProjectId, projectId).eq(ArchiveAiName::getContractId, contractId).in(ArchiveAiName::getArchiveAutoId, Func.toLongList(ids)));
|
|
|
+ List<Long> existid=new ArrayList<>();
|
|
|
+ if(!archiveAiNameList.isEmpty()){
|
|
|
+ existid= archiveAiNameList.stream().filter(ai -> ai.getStatus() == 1).map(ai -> ai.getArchiveAutoId()).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ for (ArchivesAuto auto : archivesAutoList) {
|
|
|
+ if(!existid.isEmpty()){
|
|
|
+ if(existid.contains(auto.getId())){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ArchiveAiName aiName = new ArchiveAiName();
|
|
|
+ aiName.setProjectId(projectId);
|
|
|
+ aiName.setContractId(contractId);
|
|
|
+ aiName.setTaskId(taskId);
|
|
|
+ aiName.setArchiveAutoId(auto.getId());
|
|
|
+ aiName.setArchiveName(auto.getName());
|
|
|
+ aiName.setStatus(1);
|
|
|
+ aiNames.add(aiName);
|
|
|
+ }
|
|
|
+ if(aiNames.size()<=0){
|
|
|
+ throw new ServerException("所选节点正在生成中,请勿重复提交");
|
|
|
+ }
|
|
|
+ //异步调用AI接口
|
|
|
+ aiNameService.syncCreatAiName(aiNames);
|
|
|
+ return aiNameService.saveBatch(aiNames);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 单独组卷规则组卷
|
|
|
*
|
|
@@ -1498,7 +1583,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(",");
|
|
@@ -1509,11 +1594,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- String archiveName = builtArchiveName_new(waitArchiveFiles, node, false,nameInfo);//获取案卷题名
|
|
|
+ String archiveName = builtArchiveName_new(waitArchiveFiles, node, false,nameInfo,multiVolumeNodes,3);//获取案卷题名
|
|
|
//1.创建新案卷
|
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
|
//2.设置文件所属案卷,组卷状态
|
|
|
- Long archivesAutoId = archivesAuto.getId();
|
|
|
+ //Long archivesAutoId = archivesAuto.getId();
|
|
|
|
|
|
//封面和生成文件页码
|
|
|
archiveAutoPdfService.buildArchiveFrontPdfs(archivesAuto.getProjectId(), archivesAuto, waitArchiveFiles, false);
|
|
@@ -1521,11 +1606,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
builtFilePageNo(archivesAuto, waitArchiveFiles);//生成文件页码
|
|
|
|
|
|
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
-
|
|
|
- }
|
|
|
+ //设置文件所属案卷,组卷状态,排序
|
|
|
+ Long archivesAutoId = archivesAuto.getId();
|
|
|
+ setArchiveFiles(archivesAutoId,waitArchiveFiles);
|
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
try {
|
|
|
// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
@@ -1545,7 +1628,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 +1670,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
}
|
|
|
//默认组卷存在跨节点组卷 注意案卷归属节点,案卷命名方式
|
|
|
//获取案卷题名
|
|
|
- String archiveName = builtArchiveName_new(waitArchiveFiles, node, true,nameInfo);//获取案卷题名
|
|
|
+ String archiveName = builtArchiveName_new(waitArchiveFiles, node, true,nameInfo,multiVolumeNodes,2);//获取案卷题名
|
|
|
|
|
|
//1.创建新案卷
|
|
|
ArchivesAuto archivesAuto = builtArchives(node, pageN, fileN, startDate, endDate, archiveName);
|
|
@@ -1597,12 +1680,16 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
builtFilePageNo(archivesAuto, waitArchiveFiles);
|
|
|
|
|
|
- //3.设置文件所属案卷,组卷状态
|
|
|
+
|
|
|
+// Long archivesAutoId = archivesAuto.getId();
|
|
|
+// for (ArchiveFile file : waitArchiveFiles) {
|
|
|
+// file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
+// file.setIsArchive(1);
|
|
|
+// }
|
|
|
+ //设置文件所属案卷,组卷状态,排序
|
|
|
Long archivesAutoId = archivesAuto.getId();
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
- }
|
|
|
+ setArchiveFiles(archivesAutoId,waitArchiveFiles);
|
|
|
+
|
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
try {
|
|
|
batchCreateMetadataFiles(waitArchiveFiles);
|
|
@@ -1645,11 +1732,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
builtFilePageNo(archivesAuto, waitArchiveFiles);
|
|
|
|
|
|
//3.设置文件所属案卷,组卷状态
|
|
|
+ //设置文件所属案卷,组卷状态,排序
|
|
|
Long archivesAutoId = archivesAuto.getId();
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
- }
|
|
|
+ setArchiveFiles(archivesAutoId,waitArchiveFiles);
|
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
try {
|
|
|
// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
@@ -1701,11 +1786,9 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
builtFilePageNo(archivesAuto, waitArchiveFiles);
|
|
|
|
|
|
//3.设置文件所属案卷,组卷状态
|
|
|
+ //设置文件所属案卷,组卷状态,排序
|
|
|
Long archivesAutoId = archivesAuto.getId();
|
|
|
- for (ArchiveFile file : waitArchiveFiles) {
|
|
|
- file.setArchiveId(archivesAutoId);//设置文件所属案卷
|
|
|
- file.setIsArchive(1);
|
|
|
- }
|
|
|
+ setArchiveFiles(archivesAutoId,waitArchiveFiles);
|
|
|
archiveFileClient.updateArchiveFileForCreateArchive(waitArchiveFiles);
|
|
|
try {
|
|
|
// for (ArchiveFile saveVo : waitArchiveFiles) {
|
|
@@ -1840,6 +1923,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 +1940,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 +1959,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 +1968,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 +1978,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 +1987,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 +1995,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 +2343,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 +2362,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 +2376,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 +2387,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
archivesSize = filePage;
|
|
|
|
|
|
if (fileIndex == totalFiles) { // 是最后一个文件
|
|
|
- createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo);
|
|
|
+ createArchive2(waitArchiveFiles, archiveAutoGroupId, projectId,nameInfo,multiVolumeNodes);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -2506,7 +2593,8 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
.ne("is_auto_file", 1)
|
|
|
.orderByAsc("tree_sort")
|
|
|
.orderByAsc("auto_file_sort")
|
|
|
- .orderByAsc("file_number");
|
|
|
+ .orderByAsc("file_number")
|
|
|
+ .orderByAsc("create_time");
|
|
|
|
|
|
return this.list(queryWrapper);
|
|
|
}
|
|
@@ -4416,18 +4504,18 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
|
|
|
@Override
|
|
|
@Async
|
|
|
- public void fileNumberFlush(Long projectId, Long contractId, List<String> nodeIds,Integer isArchive) {
|
|
|
+ public void fileNumberFlush(Long projectId, Long contractId, List<String> nodeIds,Integer isArchive,Integer startNumber) {
|
|
|
ArchiveProjectConfig config = archiveProjectConfigService.getByProjectIdOrNew(projectId);
|
|
|
List<ArchivesAutoVO4>list=baseMapper.selectAllArchiveAuto(projectId,contractId,nodeIds,isArchive);
|
|
|
if(list!=null && list.size()>0){
|
|
|
if(config.getDirType()==null||config.getDirType()==0){
|
|
|
- List<ArchivesAuto> archivesAutos = setFileNumberByConfig(config, list);
|
|
|
+ List<ArchivesAuto> archivesAutos = setFileNumberByConfig(config, list,startNumber);
|
|
|
this.updateBatchById(archivesAutos);
|
|
|
}else {
|
|
|
Map<Long, List<ArchivesAutoVO4>> map = list.stream().collect(Collectors.groupingBy(ArchivesAutoVO4::getParentId));
|
|
|
for (Map.Entry<Long, List<ArchivesAutoVO4>> entry : map.entrySet()) {
|
|
|
List<ArchivesAutoVO4> value = entry.getValue();
|
|
|
- List<ArchivesAuto> archivesAutos = setFileNumberByConfig(config, value);
|
|
|
+ List<ArchivesAuto> archivesAutos = setFileNumberByConfig(config, value,startNumber);
|
|
|
this.updateBatchById(archivesAutos);
|
|
|
}
|
|
|
}
|
|
@@ -4448,6 +4536,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
//List<ArchiveFile> archiveFiles = archiveFileClient.getArchiveFileByArchiveID(Long.valueOf(archiveId));
|
|
|
List<ArchiveFile> archiveFiles= jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ArchiveFile.class));
|
|
|
archiveAutoPdfService.buildArchiveFrontPdfs(projectId,auto,archiveFiles,true);
|
|
|
+ auto.setColourStatus(1);
|
|
|
baseMapper.updateById(auto);
|
|
|
}
|
|
|
return true;
|
|
@@ -4531,8 +4620,11 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- public List<ArchivesAuto> setFileNumberByConfig(ArchiveProjectConfig config,List<ArchivesAutoVO4> value){
|
|
|
- int i=1;
|
|
|
+ public List<ArchivesAuto> setFileNumberByConfig(ArchiveProjectConfig config,List<ArchivesAutoVO4> value,Integer startNumber){
|
|
|
+ int i=startNumber;
|
|
|
+ if(config.getIndexType()==1&&startNumber.toString().length()>config.getIndexNum()+1){
|
|
|
+ throw new ServiceException("起始流水号位数不能超过设置的虚数位数");
|
|
|
+ }
|
|
|
List<ArchivesAuto>list=new ArrayList<>();
|
|
|
for (ArchivesAutoVO4 v:value) {
|
|
|
ArchivesAuto auto = new ArchivesAuto();
|
|
@@ -4540,7 +4632,7 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
v.setFileNumber(v.getFileNumberPrefix()+"_"+i);
|
|
|
}else {
|
|
|
String prefix = v.getFileNumberPrefix();
|
|
|
- int index = i; // 编号从 1 开始
|
|
|
+ int index = i; // 编号从 startNumber 开始
|
|
|
// 获取配置中的编号长度(最多多少位)
|
|
|
int numLength = config.getIndexNum();
|
|
|
// 默认最多4位,防止过长或无效值
|
|
@@ -4695,4 +4787,113 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
|
|
|
return R.success("保存成功");
|
|
|
}
|
|
|
|
|
|
+ // 归档文件设置函数
|
|
|
+ public void setArchiveFiles(Long archivesAutoId, List<ArchiveFile> waitArchiveFiles) {
|
|
|
+ if (waitArchiveFiles == null || archivesAutoId == null) {
|
|
|
+ return; // 处理空指针情况
|
|
|
+ }
|
|
|
+
|
|
|
+ int archiveSortCounter = 1; // 从1开始递增的archiveSort计数器
|
|
|
+
|
|
|
+ for (ArchiveFile file : waitArchiveFiles) {
|
|
|
+ file.setArchiveId(archivesAutoId); // 设置文件所属案卷ID
|
|
|
+ file.setIsArchive(1); // 标记文件已归档
|
|
|
+ file.setArchiveSort(archiveSortCounter++); // 设置自增的archiveSort
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ 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));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|