对第二步修改重复文件名报错的尝试
This commit is contained in:
parent
0f54983b30
commit
67a35cc661
|
|
@ -8,7 +8,10 @@ import top.r3944realms.docchecktoolrefactored.util.LoggerMarker;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class LogicalAddressFileGenerator implements AddressFileGenerator {
|
public class LogicalAddressFileGenerator implements AddressFileGenerator {
|
||||||
private ProgressCallback callback;
|
private ProgressCallback callback;
|
||||||
|
|
@ -61,36 +64,66 @@ public class LogicalAddressFileGenerator implements AddressFileGenerator {
|
||||||
}
|
}
|
||||||
safeOnPhaseProgress(Phase.GENERATE_LOGICAL, 3, 3); // 3/3
|
safeOnPhaseProgress(Phase.GENERATE_LOGICAL, 3, 3); // 3/3
|
||||||
safeOnPhaseCompleted(Phase.GENERATE_LOGICAL);
|
safeOnPhaseCompleted(Phase.GENERATE_LOGICAL);
|
||||||
|
safeOnPhaseCompleted(Phase.GENERATE_LOGICAL);
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
// 直接重新抛出自定义的重复档号异常,不让它被日志吞掉
|
||||||
|
if (e.getMessage() != null && e.getMessage().startsWith("存在重复档号:")) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
log.info(LoggerMarker.RELEASE_MARKER, "生成逻辑地址文件时出错: {}", e.getMessage());
|
||||||
|
throw e;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.info(LoggerMarker.RELEASE_MARKER, "生成逻辑地址文件时出错: {}", e.getMessage());
|
log.info(LoggerMarker.RELEASE_MARKER, "生成逻辑地址文件时出错: {}", e.getMessage());
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 生成页面级逻辑地址文件
|
* 生成页面级逻辑地址文件
|
||||||
*/
|
*/
|
||||||
private void generatePageLevelFile(PrintWriter writer, List<Record> records, ProgressCallback callback) {
|
private void generatePageLevelFile(PrintWriter writer, List<Record> records, ProgressCallback callback) {
|
||||||
// 写入CSV头部
|
Set<String> seenCodes = new HashSet<>();
|
||||||
writer.println("逻辑文件名,逻辑地址");
|
Set<String> duplicateCodes = new HashSet<>();
|
||||||
int totalRecords = records.stream().mapToInt(r -> r.page).sum();
|
// 收集所有重复的档号
|
||||||
int current = 0;
|
|
||||||
|
|
||||||
// 处理每条记录
|
|
||||||
for (Record record : records) {
|
for (Record record : records) {
|
||||||
String archiveCode = record.archiveCode;
|
String archiveCode = record.archiveCode;
|
||||||
int page = record.page;
|
if (!seenCodes.add(archiveCode)) {
|
||||||
|
duplicateCodes.add(archiveCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 为每页生成一行数据
|
// 如果存在重复档号,记录日志并抛出异常
|
||||||
for (int i = 1; i <= page; i++) {
|
if (!duplicateCodes.isEmpty()) {
|
||||||
// 生成逻辑文件名
|
StringBuilder errorMsg = new StringBuilder("存在重复档号:\n");
|
||||||
String logicalFileName = String.format("%s-%04d", archiveCode, i);
|
for (String code : duplicateCodes) {
|
||||||
|
errorMsg.append(code).append("\n");
|
||||||
|
}
|
||||||
|
log.info(LoggerMarker.RELEASE_MARKER, "{}", errorMsg.toString());
|
||||||
|
throw new RuntimeException(errorMsg.toString());
|
||||||
|
}else {
|
||||||
|
// 写入CSV头部
|
||||||
|
writer.println("逻辑文件名,逻辑地址");
|
||||||
|
int totalRecords = records.stream().mapToInt(r -> r.page).sum();
|
||||||
|
int current = 0;
|
||||||
|
|
||||||
// 生成逻辑地址
|
// 处理每条记录
|
||||||
String logicalAddress = generatePageLevelLogicalAddress(archiveCode, i);
|
for (Record record : records) {
|
||||||
|
String archiveCode = record.archiveCode;
|
||||||
|
|
||||||
// 写入CSV行
|
int page = record.page;
|
||||||
writer.printf("%s,%s%n", logicalFileName, logicalAddress);
|
|
||||||
current++;
|
// 为每页生成一行数据
|
||||||
safeOnPhaseProgress(Phase.GENERATE_LOGICAL, current, totalRecords);
|
for (int i = 1; i <= page; i++) {
|
||||||
|
// 生成逻辑文件名
|
||||||
|
String logicalFileName = String.format("%s-%04d", archiveCode, i);
|
||||||
|
|
||||||
|
// 生成逻辑地址
|
||||||
|
String logicalAddress = generatePageLevelLogicalAddress(archiveCode, i);
|
||||||
|
|
||||||
|
// 写入CSV行
|
||||||
|
writer.printf("%s,%s%n", logicalFileName, logicalAddress);
|
||||||
|
current++;
|
||||||
|
safeOnPhaseProgress(Phase.GENERATE_LOGICAL, current, totalRecords);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -189,9 +189,18 @@ public class PathCheckPaneController implements Initializable {
|
||||||
task.setOnFailed(e -> {
|
task.setOnFailed(e -> {
|
||||||
progressBar.closeProgress();
|
progressBar.closeProgress();
|
||||||
Throwable exception = task.getException();
|
Throwable exception = task.getException();
|
||||||
currentTask.progressProperty().removeListener(progressChangeListener);
|
|
||||||
currentTask.messageProperty().removeListener(messageChangeListener);
|
// 移除监听器时使用 task 而不是 currentTask
|
||||||
result2TA.setText("检测过程中发生错误: " + exception.getMessage());
|
task.progressProperty().removeListener(progressChangeListener);
|
||||||
|
task.messageProperty().removeListener(messageChangeListener);
|
||||||
|
|
||||||
|
// 检查是否是重复档号的特殊信息
|
||||||
|
if (exception.getMessage() != null && exception.getMessage().startsWith("存在重复档号:")) {
|
||||||
|
result2TA.setText(exception.getMessage());
|
||||||
|
} else {
|
||||||
|
result2TA.setText("检测过程中发生错误: " + exception.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
addResultErrorStyle();
|
addResultErrorStyle();
|
||||||
DialogUtil.showDetailedErrorDialog("错误", "检测过程中发生错误: ", exception.getMessage());
|
DialogUtil.showDetailedErrorDialog("错误", "检测过程中发生错误: ", exception.getMessage());
|
||||||
generateLogicalAddress2B.setDisable(false);
|
generateLogicalAddress2B.setDisable(false);
|
||||||
|
|
@ -219,6 +228,7 @@ public class PathCheckPaneController implements Initializable {
|
||||||
* @param actionEvent the action event
|
* @param actionEvent the action event
|
||||||
*/
|
*/
|
||||||
@FXML void onGeneratePA(ActionEvent actionEvent) {
|
@FXML void onGeneratePA(ActionEvent actionEvent) {
|
||||||
|
|
||||||
generatePhysicalAddress2B.setDisable(true);
|
generatePhysicalAddress2B.setDisable(true);
|
||||||
removeResultStyle();
|
removeResultStyle();
|
||||||
String folderPath = loadJPGFolder2TF.getText();
|
String folderPath = loadJPGFolder2TF.getText();
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,12 @@ public class AddressFileGenerationTask extends Task<String> {
|
||||||
try {
|
try {
|
||||||
generator.generateAddressFile(sourcePath, outputFile, folderType);
|
generator.generateAddressFile(sourcePath, outputFile, folderType);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
// 不包装已经格式化好的重复档号异常
|
||||||
|
if (e instanceof RuntimeException &&
|
||||||
|
e.getMessage() != null &&
|
||||||
|
e.getMessage().startsWith("存在重复档号:")) {
|
||||||
|
throw e; // 直接抛出,保留原始消息
|
||||||
|
}
|
||||||
throw new RuntimeException("地址文件生成失败", e);
|
throw new RuntimeException("地址文件生成失败", e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user