feat(import): 实现批量导入去重机制并简化导入逻辑

- 在 BatchImportSupport 中新增 persistInsertOnlyChunk 方法处理仅插入模式的批量保存
- 新增 isDuplicateKey 方法用于检测数据库唯一索引冲突
- 修改行政许可、破产重整、失信被执行人等控制器的导入逻辑,使用新方法替换原有的 upsert 逻辑
- 移除 LinkedHashMap 的去重预处理,改为直接使用数据库唯一索引约束处理重复数据
- 更新导入规则描述,明确使用数据库唯一索引而非覆盖更新逻辑
- 移除 LocalDate 和 LinkedHashMap 等不再使用的导入包
This commit is contained in:
2026-02-11 18:52:06 +08:00
parent 0610f2c894
commit bd3202830c
25 changed files with 650 additions and 2681 deletions

View File

@@ -262,38 +262,13 @@ public class CreditCompetitorController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
successCount += batchImportSupport.persistInsertOnlyChunk(
creditCompetitorService,
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCompetitorService,
chunkItems,
CreditCompetitor::getId,
CreditCompetitor::setId,
CreditCompetitor::getName,
CreditCompetitor::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCompetitorService.save(rowItem);
if (!saved) {
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
.eq(CreditCompetitor::getName, rowItem.getName())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditCompetitorService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
mpBatchSize,
CreditCompetitor::getName,
"",
errorMessages
);
chunkItems.clear();
@@ -307,38 +282,13 @@ public class CreditCompetitorController extends BaseController {
}
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
successCount += batchImportSupport.persistInsertOnlyChunk(
creditCompetitorService,
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCompetitorService,
chunkItems,
CreditCompetitor::getId,
CreditCompetitor::setId,
CreditCompetitor::getName,
CreditCompetitor::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCompetitorService.save(rowItem);
if (!saved) {
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
.eq(CreditCompetitor::getName, rowItem.getName())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditCompetitorService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
mpBatchSize,
CreditCompetitor::getName,
"",
errorMessages
);
}