refactor(import): 优化批量导入功能提升性能

- 在多个控制器中引入 BatchImportSupport 工具类
- 实现分块处理机制,每批次处理 500 条记录
- 使用 persistChunkWithFallback 方法替代逐条保存
- 保持原有的数据校验和去重逻辑不变
- 显著提升大量数据导入时的执行效率
- 减少数据库操作次数降低系统负载
This commit is contained in:
2026-01-16 00:55:49 +08:00
parent e0e15cdd45
commit e6736d41ff
30 changed files with 2835 additions and 621 deletions

View File

@@ -0,0 +1,260 @@
package com.gxwebsoft.credit.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* credit 模块 Excel 导入批处理支持:
* - 分批 upsert批内一次查库 + 批量 insert/update
* - 每批独立事务REQUIRES_NEW避免单次导入事务过大拖垮数据库
*/
@Component
public class BatchImportSupport {
private final TransactionTemplate requiresNewTx;
public BatchImportSupport(PlatformTransactionManager transactionManager) {
TransactionTemplate template = new TransactionTemplate(transactionManager);
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
this.requiresNewTx = template;
}
public int runInNewTx(Supplier<Integer> supplier) {
return requiresNewTx.execute(status -> supplier.get());
}
/**
* 批量 upsert优先按 code 匹配code 为空时按 name 匹配。
*/
public <T> int upsertByCodeOrName(IService<T> service,
List<T> items,
SFunction<T, Integer> idColumn,
BiConsumer<T, Integer> idSetter,
SFunction<T, String> codeColumn,
Function<T, String> codeGetter,
SFunction<T, String> nameColumn,
Function<T, String> nameGetter,
Consumer<LambdaQueryWrapper<T>> extraConditions,
int batchSize) {
if (CollectionUtils.isEmpty(items)) {
return 0;
}
List<String> codes = new ArrayList<>();
List<String> names = new ArrayList<>();
for (T item : items) {
if (item == null) {
continue;
}
String code = normalize(codeGetter.apply(item));
if (code != null) {
codes.add(code);
} else {
String name = normalize(nameGetter.apply(item));
if (name != null) {
names.add(name);
}
}
}
Map<String, Integer> idByCode = new HashMap<>();
if (!codes.isEmpty()) {
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
if (extraConditions != null) {
extraConditions.accept(wrapper);
}
wrapper.in(codeColumn, codes);
wrapper.select(idColumn, codeColumn);
for (T dbRow : service.list(wrapper)) {
String code = normalize(codeGetter.apply(dbRow));
Integer id = extractId(dbRow, idColumn);
if (code != null && id != null) {
idByCode.putIfAbsent(code, id);
}
}
}
Map<String, Integer> idByName = new HashMap<>();
if (!names.isEmpty()) {
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
if (extraConditions != null) {
extraConditions.accept(wrapper);
}
wrapper.in(nameColumn, names);
wrapper.select(idColumn, nameColumn);
for (T dbRow : service.list(wrapper)) {
String name = normalize(nameGetter.apply(dbRow));
Integer id = extractId(dbRow, idColumn);
if (name != null && id != null) {
idByName.putIfAbsent(name, id);
}
}
}
List<T> updates = new ArrayList<>();
List<T> inserts = new ArrayList<>();
for (T item : items) {
if (item == null) {
continue;
}
String code = normalize(codeGetter.apply(item));
Integer id = null;
if (code != null) {
id = idByCode.get(code);
} else {
String name = normalize(nameGetter.apply(item));
if (name != null) {
id = idByName.get(name);
}
}
if (id != null) {
idSetter.accept(item, id);
updates.add(item);
} else {
inserts.add(item);
}
}
if (!updates.isEmpty()) {
service.updateBatchById(updates, batchSize);
}
if (!inserts.isEmpty()) {
service.saveBatch(inserts, batchSize);
}
return updates.size() + inserts.size();
}
/**
* 批量 upsert按单字段 key 匹配key 非空)。
*/
public <T> int upsertBySingleKey(IService<T> service,
List<T> items,
SFunction<T, Integer> idColumn,
BiConsumer<T, Integer> idSetter,
SFunction<T, String> keyColumn,
Function<T, String> keyGetter,
Consumer<LambdaQueryWrapper<T>> extraConditions,
int batchSize) {
if (CollectionUtils.isEmpty(items)) {
return 0;
}
List<String> keys = new ArrayList<>(items.size());
for (T item : items) {
if (item == null) {
continue;
}
String key = normalize(keyGetter.apply(item));
if (key != null) {
keys.add(key);
}
}
Map<String, Integer> idByKey = new HashMap<>();
if (!keys.isEmpty()) {
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
if (extraConditions != null) {
extraConditions.accept(wrapper);
}
wrapper.in(keyColumn, keys);
wrapper.select(idColumn, keyColumn);
for (T dbRow : service.list(wrapper)) {
String key = normalize(keyGetter.apply(dbRow));
Integer id = extractId(dbRow, idColumn);
if (key != null && id != null) {
idByKey.putIfAbsent(key, id);
}
}
}
List<T> updates = new ArrayList<>();
List<T> inserts = new ArrayList<>();
for (T item : items) {
if (item == null) {
continue;
}
String key = normalize(keyGetter.apply(item));
Integer id = key != null ? idByKey.get(key) : null;
if (id != null) {
idSetter.accept(item, id);
updates.add(item);
} else {
inserts.add(item);
}
}
if (!updates.isEmpty()) {
service.updateBatchById(updates, batchSize);
}
if (!inserts.isEmpty()) {
service.saveBatch(inserts, batchSize);
}
return updates.size() + inserts.size();
}
/**
* 批量失败时降级逐行,尽量保留“第 N 行”错误定位。
*/
public <T> int persistChunkWithFallback(List<T> items,
List<Integer> excelRowNumbers,
Supplier<Integer> batchPersist,
BiFunction<T, Integer, Boolean> rowPersist,
List<String> errorMessages) {
if (CollectionUtils.isEmpty(items)) {
return 0;
}
try {
return runInNewTx(batchPersist);
} catch (Exception batchException) {
int successCount = 0;
for (int i = 0; i < items.size(); i++) {
T item = items.get(i);
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
try {
int delta = runInNewTx(() -> rowPersist.apply(item, excelRowNumber) ? 1 : 0);
successCount += delta;
} catch (Exception e) {
if (errorMessages != null) {
if (excelRowNumber > 0) {
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
} else {
errorMessages.add(e.getMessage());
}
}
}
}
return successCount;
}
}
private static String normalize(String value) {
if (value == null) {
return null;
}
String trimmed = value.trim();
return trimmed.isEmpty() ? null : trimmed;
}
private static <T> Integer extractId(T entity, SFunction<T, Integer> idColumn) {
// SFunction 是 getter method ref直接调用即可
return idColumn.apply(entity);
}
}

View File

@@ -38,6 +38,9 @@ public class CreditAdministrativeLicenseController extends BaseController {
@Resource @Resource
private CreditAdministrativeLicenseService creditAdministrativeLicenseService; private CreditAdministrativeLicenseService creditAdministrativeLicenseService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询行政许可") @Operation(summary = "分页查询行政许可")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditAdministrativeLicense>> page(CreditAdministrativeLicenseParam param) { public ApiResult<PageResult<CreditAdministrativeLicense>> page(CreditAdministrativeLicenseParam param) {
@@ -159,6 +162,11 @@ public class CreditAdministrativeLicenseController extends BaseController {
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号"); Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号");
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称"); Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditAdministrativeLicense> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditAdministrativeLicenseImportParam param = list.get(i); CreditAdministrativeLicenseImportParam param = list.get(i);
try { try {
@@ -199,31 +207,56 @@ public class CreditAdministrativeLicenseController extends BaseController {
continue; continue;
} }
boolean saved = creditAdministrativeLicenseService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertByCodeOrName(
creditAdministrativeLicenseService,
chunkItems,
CreditAdministrativeLicense::getId,
CreditAdministrativeLicense::setId,
CreditAdministrativeLicense::getCode,
CreditAdministrativeLicense::getCode,
CreditAdministrativeLicense::getName,
CreditAdministrativeLicense::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditAdministrativeLicenseService.save(rowItem);
if (!saved) { if (!saved) {
CreditAdministrativeLicense existing = null; CreditAdministrativeLicense existing = null;
if (!ImportHelper.isBlank(item.getCode())) { if (!ImportHelper.isBlank(rowItem.getCode())) {
existing = creditAdministrativeLicenseService.lambdaQuery() existing = creditAdministrativeLicenseService.lambdaQuery()
.eq(CreditAdministrativeLicense::getCode, item.getCode()) .eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
.one(); .one();
} }
if (existing == null) { if (existing == null) {
existing = creditAdministrativeLicenseService.lambdaQuery() existing = creditAdministrativeLicenseService.lambdaQuery()
.eq(CreditAdministrativeLicense::getName, item.getName()) .eq(CreditAdministrativeLicense::getName, rowItem.getName())
.one(); .one();
} }
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditAdministrativeLicenseService.updateById(item)) { if (creditAdministrativeLicenseService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -231,6 +264,53 @@ public class CreditAdministrativeLicenseController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertByCodeOrName(
creditAdministrativeLicenseService,
chunkItems,
CreditAdministrativeLicense::getId,
CreditAdministrativeLicense::setId,
CreditAdministrativeLicense::getCode,
CreditAdministrativeLicense::getCode,
CreditAdministrativeLicense::getName,
CreditAdministrativeLicense::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditAdministrativeLicenseService.save(rowItem);
if (!saved) {
CreditAdministrativeLicense existing = null;
if (!ImportHelper.isBlank(rowItem.getCode())) {
existing = creditAdministrativeLicenseService.lambdaQuery()
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
.one();
}
if (existing == null) {
existing = creditAdministrativeLicenseService.lambdaQuery()
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
.one();
}
if (existing != null) {
rowItem.setId(existing.getId());
if (creditAdministrativeLicenseService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditBankruptcyController extends BaseController {
@Resource @Resource
private CreditBankruptcyService creditBankruptcyService; private CreditBankruptcyService creditBankruptcyService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询破产重整") @Operation(summary = "分页查询破产重整")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditBankruptcy>> page(CreditBankruptcyParam param) { public ApiResult<PageResult<CreditBankruptcy>> page(CreditBankruptcyParam param) {
@@ -158,6 +161,11 @@ public class CreditBankruptcyController extends BaseController {
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号"); Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditBankruptcy> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditBankruptcyImportParam param = list.get(i); CreditBankruptcyImportParam param = list.get(i);
try { try {
@@ -194,23 +202,46 @@ public class CreditBankruptcyController extends BaseController {
continue; continue;
} }
boolean saved = creditBankruptcyService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditBankruptcyService,
chunkItems,
CreditBankruptcy::getId,
CreditBankruptcy::setId,
CreditBankruptcy::getCode,
CreditBankruptcy::getCode,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditBankruptcyService.save(rowItem);
if (!saved) { if (!saved) {
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery() CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
.eq(CreditBankruptcy::getCode, item.getCode()) .eq(CreditBankruptcy::getCode, rowItem.getCode())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditBankruptcyService.updateById(item)) { if (creditBankruptcyService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -218,6 +249,43 @@ public class CreditBankruptcyController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditBankruptcyService,
chunkItems,
CreditBankruptcy::getId,
CreditBankruptcy::setId,
CreditBankruptcy::getCode,
CreditBankruptcy::getCode,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditBankruptcyService.save(rowItem);
if (!saved) {
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
.eq(CreditBankruptcy::getCode, rowItem.getCode())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditBankruptcyService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditBranchController extends BaseController {
@Resource @Resource
private CreditBranchService creditBranchService; private CreditBranchService creditBranchService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询分支机构") @Operation(summary = "分页查询分支机构")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditBranch>> page(CreditBranchParam param) { public ApiResult<PageResult<CreditBranch>> page(CreditBranchParam param) {
@@ -158,6 +161,11 @@ public class CreditBranchController extends BaseController {
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "分支机构名称"); Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "分支机构名称");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditBranch> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditBranchImportParam param = list.get(i); CreditBranchImportParam param = list.get(i);
try { try {
@@ -194,23 +202,46 @@ public class CreditBranchController extends BaseController {
continue; continue;
} }
boolean saved = creditBranchService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditBranchService,
chunkItems,
CreditBranch::getId,
CreditBranch::setId,
CreditBranch::getName,
CreditBranch::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditBranchService.save(rowItem);
if (!saved) { if (!saved) {
CreditBranch existing = creditBranchService.lambdaQuery() CreditBranch existing = creditBranchService.lambdaQuery()
.eq(CreditBranch::getName, item.getName()) .eq(CreditBranch::getName, rowItem.getName())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditBranchService.updateById(item)) { if (creditBranchService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -218,6 +249,43 @@ public class CreditBranchController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditBranchService,
chunkItems,
CreditBranch::getId,
CreditBranch::setId,
CreditBranch::getName,
CreditBranch::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditBranchService.save(rowItem);
if (!saved) {
CreditBranch existing = creditBranchService.lambdaQuery()
.eq(CreditBranch::getName, rowItem.getName())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditBranchService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditBreachOfTrustController extends BaseController {
@Resource @Resource
private CreditBreachOfTrustService creditBreachOfTrustService; private CreditBreachOfTrustService creditBreachOfTrustService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询失信被执行人") @Operation(summary = "分页查询失信被执行人")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditBreachOfTrust>> page(CreditBreachOfTrustParam param) { public ApiResult<PageResult<CreditBreachOfTrust>> page(CreditBreachOfTrustParam param) {
@@ -151,6 +154,11 @@ public class CreditBreachOfTrustController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditBreachOfTrust> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -181,23 +189,46 @@ public class CreditBreachOfTrustController extends BaseController {
continue; continue;
} }
boolean saved = creditBreachOfTrustService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditBreachOfTrustService,
chunkItems,
CreditBreachOfTrust::getId,
CreditBreachOfTrust::setId,
CreditBreachOfTrust::getCaseNumber,
CreditBreachOfTrust::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditBreachOfTrustService.save(rowItem);
if (!saved) { if (!saved) {
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery() CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
.eq(CreditBreachOfTrust::getCaseNumber, item.getCaseNumber()) .eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditBreachOfTrustService.updateById(item)) { if (creditBreachOfTrustService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -205,6 +236,43 @@ public class CreditBreachOfTrustController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditBreachOfTrustService,
chunkItems,
CreditBreachOfTrust::getId,
CreditBreachOfTrust::setId,
CreditBreachOfTrust::getCaseNumber,
CreditBreachOfTrust::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditBreachOfTrustService.save(rowItem);
if (!saved) {
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditBreachOfTrustService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditCaseFilingController extends BaseController {
@Resource @Resource
private CreditCaseFilingService creditCaseFilingService; private CreditCaseFilingService creditCaseFilingService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询司法大数据") @Operation(summary = "分页查询司法大数据")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditCaseFiling>> page(CreditCaseFilingParam param) { public ApiResult<PageResult<CreditCaseFiling>> page(CreditCaseFilingParam param) {
@@ -155,6 +158,11 @@ public class CreditCaseFilingController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditCaseFiling> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditCaseFilingController extends BaseController {
continue; continue;
} }
boolean saved = creditCaseFilingService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCaseFilingService,
chunkItems,
CreditCaseFiling::getId,
CreditCaseFiling::setId,
CreditCaseFiling::getCaseNumber,
CreditCaseFiling::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCaseFilingService.save(rowItem);
if (!saved) { if (!saved) {
CreditCaseFiling existing = creditCaseFilingService.lambdaQuery() CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
.eq(CreditCaseFiling::getCaseNumber, item.getCaseNumber()) .eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditCaseFilingService.updateById(item)) { if (creditCaseFilingService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditCaseFilingController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCaseFilingService,
chunkItems,
CreditCaseFiling::getId,
CreditCaseFiling::setId,
CreditCaseFiling::getCaseNumber,
CreditCaseFiling::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCaseFilingService.save(rowItem);
if (!saved) {
CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
.eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditCaseFilingService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -42,6 +42,9 @@ public class CreditCompanyController extends BaseController {
@Resource @Resource
private CreditCompanyService creditCompanyService; private CreditCompanyService creditCompanyService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询企业") @Operation(summary = "分页查询企业")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditCompany>> page(CreditCompanyParam param) { public ApiResult<PageResult<CreditCompany>> page(CreditCompanyParam param) {
@@ -164,6 +167,11 @@ public class CreditCompanyController extends BaseController {
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "原文件导入名称"); Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "原文件导入名称");
Map<String, String> urlByMatchName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "系统匹配企业名称"); Map<String, String> urlByMatchName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "系统匹配企业名称");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditCompany> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditCompanyImportParam param = list.get(i); CreditCompanyImportParam param = list.get(i);
try { try {
@@ -206,21 +214,43 @@ public class CreditCompanyController extends BaseController {
// continue; // continue;
// } // }
boolean saved = creditCompanyService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCompanyService,
chunkItems,
CreditCompany::getId,
CreditCompany::setId,
CreditCompany::getMatchName,
CreditCompany::getMatchName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCompanyService.save(rowItem);
if (!saved) { if (!saved) {
CreditCompany existing = creditCompanyService.getByMatchName(item.getName()); CreditCompany existing = creditCompanyService.getByMatchName(rowItem.getMatchName());
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditCompanyService.updateById(item)) { if (creditCompanyService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -228,6 +258,40 @@ public class CreditCompanyController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCompanyService,
chunkItems,
CreditCompany::getId,
CreditCompany::setId,
CreditCompany::getMatchName,
CreditCompany::getMatchName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCompanyService.save(rowItem);
if (!saved) {
CreditCompany existing = creditCompanyService.getByMatchName(rowItem.getMatchName());
if (existing != null) {
rowItem.setId(existing.getId());
if (creditCompanyService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditCompetitorController extends BaseController {
@Resource @Resource
private CreditCompetitorService creditCompetitorService; private CreditCompetitorService creditCompetitorService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询竞争对手") @Operation(summary = "分页查询竞争对手")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditCompetitor>> page(CreditCompetitorParam param) { public ApiResult<PageResult<CreditCompetitor>> page(CreditCompetitorParam param) {
@@ -156,6 +159,11 @@ public class CreditCompetitorController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditCompetitor> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditCompetitorImportParam param = list.get(i); CreditCompetitorImportParam param = list.get(i);
try { try {
@@ -186,23 +194,46 @@ public class CreditCompetitorController extends BaseController {
continue; continue;
} }
boolean saved = creditCompetitorService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCompetitorService,
chunkItems,
CreditCompetitor::getId,
CreditCompetitor::setId,
CreditCompetitor::getCompanyName,
CreditCompetitor::getCompanyName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCompetitorService.save(rowItem);
if (!saved) { if (!saved) {
CreditCompetitor existing = creditCompetitorService.lambdaQuery() CreditCompetitor existing = creditCompetitorService.lambdaQuery()
.eq(CreditCompetitor::getCompanyName, item.getCompanyName()) .eq(CreditCompetitor::getCompanyName, rowItem.getCompanyName())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditCompetitorService.updateById(item)) { if (creditCompetitorService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -210,6 +241,43 @@ public class CreditCompetitorController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCompetitorService,
chunkItems,
CreditCompetitor::getId,
CreditCompetitor::setId,
CreditCompetitor::getCompanyName,
CreditCompetitor::getCompanyName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCompetitorService.save(rowItem);
if (!saved) {
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
.eq(CreditCompetitor::getCompanyName, rowItem.getCompanyName())
.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;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditCourtAnnouncementController extends BaseController {
@Resource @Resource
private CreditCourtAnnouncementService creditCourtAnnouncementService; private CreditCourtAnnouncementService creditCourtAnnouncementService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询法院公告司法大数据") @Operation(summary = "分页查询法院公告司法大数据")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditCourtAnnouncement>> page(CreditCourtAnnouncementParam param) { public ApiResult<PageResult<CreditCourtAnnouncement>> page(CreditCourtAnnouncementParam param) {
@@ -155,6 +158,11 @@ public class CreditCourtAnnouncementController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditCourtAnnouncement> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditCourtAnnouncementController extends BaseController {
continue; continue;
} }
boolean saved = creditCourtAnnouncementService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCourtAnnouncementService,
chunkItems,
CreditCourtAnnouncement::getId,
CreditCourtAnnouncement::setId,
CreditCourtAnnouncement::getCaseNumber,
CreditCourtAnnouncement::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCourtAnnouncementService.save(rowItem);
if (!saved) { if (!saved) {
CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery() CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
.eq(CreditCourtAnnouncement::getCaseNumber, item.getCaseNumber()) .eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditCourtAnnouncementService.updateById(item)) { if (creditCourtAnnouncementService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditCourtAnnouncementController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCourtAnnouncementService,
chunkItems,
CreditCourtAnnouncement::getId,
CreditCourtAnnouncement::setId,
CreditCourtAnnouncement::getCaseNumber,
CreditCourtAnnouncement::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCourtAnnouncementService.save(rowItem);
if (!saved) {
CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
.eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditCourtAnnouncementService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditCourtSessionController extends BaseController {
@Resource @Resource
private CreditCourtSessionService creditCourtSessionService; private CreditCourtSessionService creditCourtSessionService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询开庭公告司法大数据") @Operation(summary = "分页查询开庭公告司法大数据")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditCourtSession>> page(CreditCourtSessionParam param) { public ApiResult<PageResult<CreditCourtSession>> page(CreditCourtSessionParam param) {
@@ -155,6 +158,11 @@ public class CreditCourtSessionController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditCourtSession> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditCourtSessionController extends BaseController {
continue; continue;
} }
boolean saved = creditCourtSessionService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCourtSessionService,
chunkItems,
CreditCourtSession::getId,
CreditCourtSession::setId,
CreditCourtSession::getCaseNumber,
CreditCourtSession::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCourtSessionService.save(rowItem);
if (!saved) { if (!saved) {
CreditCourtSession existing = creditCourtSessionService.lambdaQuery() CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
.eq(CreditCourtSession::getCaseNumber, item.getCaseNumber()) .eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditCourtSessionService.updateById(item)) { if (creditCourtSessionService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditCourtSessionController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditCourtSessionService,
chunkItems,
CreditCourtSession::getId,
CreditCourtSession::setId,
CreditCourtSession::getCaseNumber,
CreditCourtSession::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditCourtSessionService.save(rowItem);
if (!saved) {
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditCourtSessionService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditCustomerController extends BaseController {
@Resource @Resource
private CreditCustomerService creditCustomerService; private CreditCustomerService creditCustomerService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询客户") @Operation(summary = "分页查询客户")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditCustomer>> page(CreditCustomerParam param) { public ApiResult<PageResult<CreditCustomer>> page(CreditCustomerParam param) {
@@ -152,6 +155,11 @@ public class CreditCustomerController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditCustomer> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditCustomerImportParam param = list.get(i); CreditCustomerImportParam param = list.get(i);
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
@@ -182,58 +190,239 @@ public class CreditCustomerController extends BaseController {
continue; continue;
} }
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> {
// 批内一次查库,避免逐行查/写导致数据库压力过大
List<String> names = new ArrayList<>(chunkItems.size());
for (CreditCustomer it : chunkItems) {
if (it != null && !ImportHelper.isBlank(it.getName())) {
names.add(it.getName().trim());
}
}
List<CreditCustomer> existingList = names.isEmpty()
? new ArrayList<>()
: creditCustomerService.lambdaQuery()
.in(CreditCustomer::getName, names)
.list();
java.util.Map<String, CreditCustomer> existingByName = new java.util.HashMap<>();
for (CreditCustomer existing : existingList) {
if (existing != null && !ImportHelper.isBlank(existing.getName())) {
existingByName.putIfAbsent(existing.getName().trim(), existing);
}
}
java.util.Map<String, CreditCustomer> latestByName = new java.util.HashMap<>();
int acceptedRows = 0;
for (int idx = 0; idx < chunkItems.size(); idx++) {
CreditCustomer it = chunkItems.get(idx);
int rowNo = (idx < chunkRowNumbers.size()) ? chunkRowNumbers.get(idx) : -1;
if (it == null || ImportHelper.isBlank(it.getName())) {
continue;
}
String name = it.getName().trim();
CreditCustomer existing = existingByName.get(name);
if (existing != null) {
Integer existingTenantId = existing.getTenantId();
if (it.getTenantId() != null
&& existingTenantId != null
&& !it.getTenantId().equals(existingTenantId)) {
errorMessages.add("" + rowNo + "行:客户名称已存在且归属其他租户,无法导入");
continue;
}
it.setId(existing.getId());
if (existingTenantId != null) {
it.setTenantId(existingTenantId);
}
}
// 同名多行:保留最后一行的值(等价于“先插入/更新,再被后续行更新”)
latestByName.put(name, it);
acceptedRows++;
}
List<CreditCustomer> updates = new ArrayList<>();
List<CreditCustomer> inserts = new ArrayList<>();
for (CreditCustomer it : latestByName.values()) {
if (it.getId() != null) {
updates.add(it);
} else {
inserts.add(it);
}
}
if (!updates.isEmpty()) {
creditCustomerService.updateBatchById(updates, mpBatchSize);
}
if (!inserts.isEmpty()) {
creditCustomerService.saveBatch(inserts, mpBatchSize);
}
return acceptedRows;
},
(rowItem, rowNumber) -> {
CreditCustomer existing = creditCustomerService.lambdaQuery() CreditCustomer existing = creditCustomerService.lambdaQuery()
.eq(CreditCustomer::getName, item.getName()) .eq(CreditCustomer::getName, rowItem.getName())
.one(); .one();
if (existing != null) { if (existing != null) {
Integer existingTenantId = existing.getTenantId(); Integer existingTenantId = existing.getTenantId();
if (item.getTenantId() != null if (rowItem.getTenantId() != null
&& existingTenantId != null && existingTenantId != null
&& !item.getTenantId().equals(existingTenantId)) { && !rowItem.getTenantId().equals(existingTenantId)) {
errorMessages.add("" + excelRowNumber + "行:客户名称已存在且归属其他租户,无法导入"); errorMessages.add("" + rowNumber + "行:客户名称已存在且归属其他租户,无法导入");
continue; return false;
} }
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (existingTenantId != null) { if (existingTenantId != null) {
item.setTenantId(existingTenantId); rowItem.setTenantId(existingTenantId);
} }
if (creditCustomerService.updateById(item)) { return creditCustomerService.updateById(rowItem);
successCount++;
continue;
} }
} else {
try { try {
if (creditCustomerService.save(item)) { return creditCustomerService.save(rowItem);
successCount++;
continue;
}
} catch (DataIntegrityViolationException e) { } catch (DataIntegrityViolationException e) {
if (!isDuplicateCustomerName(e)) { if (!isDuplicateCustomerName(e)) {
throw e; throw e;
} }
CreditCustomer dbExisting = creditCustomerService.lambdaQuery() CreditCustomer dbExisting = creditCustomerService.lambdaQuery()
.eq(CreditCustomer::getName, item.getName()) .eq(CreditCustomer::getName, rowItem.getName())
.one(); .one();
if (dbExisting != null) { if (dbExisting != null) {
Integer existingTenantId = dbExisting.getTenantId(); Integer existingTenantId = dbExisting.getTenantId();
item.setId(dbExisting.getId()); rowItem.setId(dbExisting.getId());
if (existingTenantId != null) { if (existingTenantId != null) {
item.setTenantId(existingTenantId); rowItem.setTenantId(existingTenantId);
} }
if (creditCustomerService.updateById(item)) { return creditCustomerService.updateById(rowItem);
successCount++;
continue;
} }
} }
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
}
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> {
List<String> names = new ArrayList<>(chunkItems.size());
for (CreditCustomer it : chunkItems) {
if (it != null && !ImportHelper.isBlank(it.getName())) {
names.add(it.getName().trim());
}
}
List<CreditCustomer> existingList = names.isEmpty()
? new ArrayList<>()
: creditCustomerService.lambdaQuery()
.in(CreditCustomer::getName, names)
.list();
java.util.Map<String, CreditCustomer> existingByName = new java.util.HashMap<>();
for (CreditCustomer existing : existingList) {
if (existing != null && !ImportHelper.isBlank(existing.getName())) {
existingByName.putIfAbsent(existing.getName().trim(), existing);
}
}
java.util.Map<String, CreditCustomer> latestByName = new java.util.HashMap<>();
int acceptedRows = 0;
for (int idx = 0; idx < chunkItems.size(); idx++) {
CreditCustomer it = chunkItems.get(idx);
int rowNo = (idx < chunkRowNumbers.size()) ? chunkRowNumbers.get(idx) : -1;
if (it == null || ImportHelper.isBlank(it.getName())) {
continue;
}
String name = it.getName().trim();
CreditCustomer existing = existingByName.get(name);
if (existing != null) {
Integer existingTenantId = existing.getTenantId();
if (it.getTenantId() != null
&& existingTenantId != null
&& !it.getTenantId().equals(existingTenantId)) {
errorMessages.add("" + rowNo + "行:客户名称已存在且归属其他租户,无法导入");
continue;
}
it.setId(existing.getId());
if (existingTenantId != null) {
it.setTenantId(existingTenantId);
}
}
latestByName.put(name, it);
acceptedRows++;
}
List<CreditCustomer> updates = new ArrayList<>();
List<CreditCustomer> inserts = new ArrayList<>();
for (CreditCustomer it : latestByName.values()) {
if (it.getId() != null) {
updates.add(it);
} else {
inserts.add(it);
}
}
if (!updates.isEmpty()) {
creditCustomerService.updateBatchById(updates, mpBatchSize);
}
if (!inserts.isEmpty()) {
creditCustomerService.saveBatch(inserts, mpBatchSize);
}
return acceptedRows;
},
(rowItem, rowNumber) -> {
CreditCustomer existing = creditCustomerService.lambdaQuery()
.eq(CreditCustomer::getName, rowItem.getName())
.one();
if (existing != null) {
Integer existingTenantId = existing.getTenantId();
if (rowItem.getTenantId() != null
&& existingTenantId != null
&& !rowItem.getTenantId().equals(existingTenantId)) {
errorMessages.add("" + rowNumber + "行:客户名称已存在且归属其他租户,无法导入");
return false;
}
rowItem.setId(existing.getId());
if (existingTenantId != null) {
rowItem.setTenantId(existingTenantId);
}
return creditCustomerService.updateById(rowItem);
}
try {
return creditCustomerService.save(rowItem);
} catch (DataIntegrityViolationException e) {
if (!isDuplicateCustomerName(e)) {
throw e;
}
CreditCustomer dbExisting = creditCustomerService.lambdaQuery()
.eq(CreditCustomer::getName, rowItem.getName())
.one();
if (dbExisting != null) {
Integer existingTenantId = dbExisting.getTenantId();
rowItem.setId(dbExisting.getId());
if (existingTenantId != null) {
rowItem.setTenantId(existingTenantId);
}
return creditCustomerService.updateById(rowItem);
}
}
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditDeliveryNoticeController extends BaseController {
@Resource @Resource
private CreditDeliveryNoticeService creditDeliveryNoticeService; private CreditDeliveryNoticeService creditDeliveryNoticeService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询送达公告司法大数据") @Operation(summary = "分页查询送达公告司法大数据")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditDeliveryNotice>> page(CreditDeliveryNoticeParam param) { public ApiResult<PageResult<CreditDeliveryNotice>> page(CreditDeliveryNoticeParam param) {
@@ -155,6 +158,11 @@ public class CreditDeliveryNoticeController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditDeliveryNotice> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditDeliveryNoticeController extends BaseController {
continue; continue;
} }
boolean saved = creditDeliveryNoticeService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditDeliveryNoticeService,
chunkItems,
CreditDeliveryNotice::getId,
CreditDeliveryNotice::setId,
CreditDeliveryNotice::getCaseNumber,
CreditDeliveryNotice::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditDeliveryNoticeService.save(rowItem);
if (!saved) { if (!saved) {
CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery() CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
.eq(CreditDeliveryNotice::getCaseNumber, item.getCaseNumber()) .eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditDeliveryNoticeService.updateById(item)) { if (creditDeliveryNoticeService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditDeliveryNoticeController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditDeliveryNoticeService,
chunkItems,
CreditDeliveryNotice::getId,
CreditDeliveryNotice::setId,
CreditDeliveryNotice::getCaseNumber,
CreditDeliveryNotice::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditDeliveryNoticeService.save(rowItem);
if (!saved) {
CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
.eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditDeliveryNoticeService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditExternalController extends BaseController {
@Resource @Resource
private CreditExternalService creditExternalService; private CreditExternalService creditExternalService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询对外投资") @Operation(summary = "分页查询对外投资")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditExternal>> page(CreditExternalParam param) { public ApiResult<PageResult<CreditExternal>> page(CreditExternalParam param) {
@@ -156,6 +159,11 @@ public class CreditExternalController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditExternal> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditExternalImportParam param = list.get(i); CreditExternalImportParam param = list.get(i);
try { try {
@@ -186,23 +194,46 @@ public class CreditExternalController extends BaseController {
continue; continue;
} }
boolean saved = creditExternalService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditExternalService,
chunkItems,
CreditExternal::getId,
CreditExternal::setId,
CreditExternal::getName,
CreditExternal::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditExternalService.save(rowItem);
if (!saved) { if (!saved) {
CreditExternal existing = creditExternalService.lambdaQuery() CreditExternal existing = creditExternalService.lambdaQuery()
.eq(CreditExternal::getName, item.getName()) .eq(CreditExternal::getName, rowItem.getName())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditExternalService.updateById(item)) { if (creditExternalService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -210,6 +241,43 @@ public class CreditExternalController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditExternalService,
chunkItems,
CreditExternal::getId,
CreditExternal::setId,
CreditExternal::getName,
CreditExternal::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditExternalService.save(rowItem);
if (!saved) {
CreditExternal existing = creditExternalService.lambdaQuery()
.eq(CreditExternal::getName, rowItem.getName())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditExternalService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditFinalVersionController extends BaseController {
@Resource @Resource
private CreditFinalVersionService creditFinalVersionService; private CreditFinalVersionService creditFinalVersionService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询终本案件") @Operation(summary = "分页查询终本案件")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditFinalVersion>> page(CreditFinalVersionParam param) { public ApiResult<PageResult<CreditFinalVersion>> page(CreditFinalVersionParam param) {
@@ -155,6 +158,11 @@ public class CreditFinalVersionController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditFinalVersion> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditFinalVersionController extends BaseController {
continue; continue;
} }
boolean saved = creditFinalVersionService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditFinalVersionService,
chunkItems,
CreditFinalVersion::getId,
CreditFinalVersion::setId,
CreditFinalVersion::getCaseNumber,
CreditFinalVersion::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditFinalVersionService.save(rowItem);
if (!saved) { if (!saved) {
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery() CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
.eq(CreditFinalVersion::getCaseNumber, item.getCaseNumber()) .eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditFinalVersionService.updateById(item)) { if (creditFinalVersionService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditFinalVersionController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditFinalVersionService,
chunkItems,
CreditFinalVersion::getId,
CreditFinalVersion::setId,
CreditFinalVersion::getCaseNumber,
CreditFinalVersion::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditFinalVersionService.save(rowItem);
if (!saved) {
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditFinalVersionService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditGqdjController extends BaseController {
@Resource @Resource
private CreditGqdjService creditGqdjService; private CreditGqdjService creditGqdjService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询股权冻结") @Operation(summary = "分页查询股权冻结")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditGqdj>> page(CreditGqdjParam param) { public ApiResult<PageResult<CreditGqdj>> page(CreditGqdjParam param) {
@@ -155,6 +158,11 @@ public class CreditGqdjController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditGqdj> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditGqdjController extends BaseController {
continue; continue;
} }
boolean saved = creditGqdjService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditGqdjService,
chunkItems,
CreditGqdj::getId,
CreditGqdj::setId,
CreditGqdj::getCaseNumber,
CreditGqdj::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditGqdjService.save(rowItem);
if (!saved) { if (!saved) {
CreditGqdj existing = creditGqdjService.lambdaQuery() CreditGqdj existing = creditGqdjService.lambdaQuery()
.eq(CreditGqdj::getCaseNumber, item.getCaseNumber()) .eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditGqdjService.updateById(item)) { if (creditGqdjService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditGqdjController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditGqdjService,
chunkItems,
CreditGqdj::getId,
CreditGqdj::setId,
CreditGqdj::getCaseNumber,
CreditGqdj::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditGqdjService.save(rowItem);
if (!saved) {
CreditGqdj existing = creditGqdjService.lambdaQuery()
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditGqdjService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditHistoricalLegalPersonController extends BaseController {
@Resource @Resource
private CreditHistoricalLegalPersonService creditHistoricalLegalPersonService; private CreditHistoricalLegalPersonService creditHistoricalLegalPersonService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询历史法定代表人") @Operation(summary = "分页查询历史法定代表人")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditHistoricalLegalPerson>> page(CreditHistoricalLegalPersonParam param) { public ApiResult<PageResult<CreditHistoricalLegalPerson>> page(CreditHistoricalLegalPersonParam param) {
@@ -158,6 +161,11 @@ public class CreditHistoricalLegalPersonController extends BaseController {
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "名称"); Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "名称");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditHistoricalLegalPerson> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditHistoricalLegalPersonImportParam param = list.get(i); CreditHistoricalLegalPersonImportParam param = list.get(i);
try { try {
@@ -194,24 +202,94 @@ public class CreditHistoricalLegalPersonController extends BaseController {
continue; continue;
} }
boolean saved = creditHistoricalLegalPersonService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> {
// 批内一次查库:按 name in (...) 拉取,再按 registerDate 做内存匹配
List<String> names = new ArrayList<>(chunkItems.size());
for (CreditHistoricalLegalPerson it : chunkItems) {
if (it != null && !ImportHelper.isBlank(it.getName())) {
names.add(it.getName().trim());
}
}
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
? new ArrayList<>()
: creditHistoricalLegalPersonService.lambdaQuery()
.in(CreditHistoricalLegalPerson::getName, names)
.list();
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
for (CreditHistoricalLegalPerson existing : existingList) {
if (existing == null || ImportHelper.isBlank(existing.getName())) {
continue;
}
String n = existing.getName().trim();
byName.putIfAbsent(n, existing);
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
if (d != null) {
byNameDate.putIfAbsent(n + "|" + d, existing);
}
}
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
for (CreditHistoricalLegalPerson it : chunkItems) {
if (it == null || ImportHelper.isBlank(it.getName())) {
continue;
}
String n = it.getName().trim();
CreditHistoricalLegalPerson existing;
if (!ImportHelper.isBlank(it.getRegisterDate())) {
String d = it.getRegisterDate().trim();
existing = byNameDate.get(n + "|" + d);
} else {
existing = byName.get(n);
}
if (existing != null) {
it.setId(existing.getId());
updates.add(it);
} else {
inserts.add(it);
}
}
if (!updates.isEmpty()) {
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
}
if (!inserts.isEmpty()) {
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
}
return updates.size() + inserts.size();
},
(rowItem, rowNumber) -> {
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
if (!saved) { if (!saved) {
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery() CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
.eq(CreditHistoricalLegalPerson::getName, item.getName()) .eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
.eq(!ImportHelper.isBlank(item.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, item.getRegisterDate()) .eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditHistoricalLegalPersonService.updateById(item)) { if (creditHistoricalLegalPersonService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -219,6 +297,90 @@ public class CreditHistoricalLegalPersonController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> {
List<String> names = new ArrayList<>(chunkItems.size());
for (CreditHistoricalLegalPerson it : chunkItems) {
if (it != null && !ImportHelper.isBlank(it.getName())) {
names.add(it.getName().trim());
}
}
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
? new ArrayList<>()
: creditHistoricalLegalPersonService.lambdaQuery()
.in(CreditHistoricalLegalPerson::getName, names)
.list();
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
for (CreditHistoricalLegalPerson existing : existingList) {
if (existing == null || ImportHelper.isBlank(existing.getName())) {
continue;
}
String n = existing.getName().trim();
byName.putIfAbsent(n, existing);
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
if (d != null) {
byNameDate.putIfAbsent(n + "|" + d, existing);
}
}
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
for (CreditHistoricalLegalPerson it : chunkItems) {
if (it == null || ImportHelper.isBlank(it.getName())) {
continue;
}
String n = it.getName().trim();
CreditHistoricalLegalPerson existing;
if (!ImportHelper.isBlank(it.getRegisterDate())) {
String d = it.getRegisterDate().trim();
existing = byNameDate.get(n + "|" + d);
} else {
existing = byName.get(n);
}
if (existing != null) {
it.setId(existing.getId());
updates.add(it);
} else {
inserts.add(it);
}
}
if (!updates.isEmpty()) {
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
}
if (!inserts.isEmpty()) {
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
}
return updates.size() + inserts.size();
},
(rowItem, rowNumber) -> {
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
if (!saved) {
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
.eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
.eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditHistoricalLegalPersonService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -47,6 +47,9 @@ public class CreditJudgmentDebtorController extends BaseController {
@Resource @Resource
private CreditJudgmentDebtorService creditJudgmentDebtorService; private CreditJudgmentDebtorService creditJudgmentDebtorService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询被执行人") @Operation(summary = "分页查询被执行人")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditJudgmentDebtor>> page(CreditJudgmentDebtorParam param) { public ApiResult<PageResult<CreditJudgmentDebtor>> page(CreditJudgmentDebtorParam param) {
@@ -280,6 +283,10 @@ public class CreditJudgmentDebtorController extends BaseController {
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人"); Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "" + fileLabel + ""; String prefix = ImportHelper.isBlank(fileLabel) ? "" : "" + fileLabel + "";
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditJudgmentDebtor> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudgmentDebtorImportParam param = list.get(i); CreditJudgmentDebtorImportParam param = list.get(i);
try { try {
@@ -322,6 +329,51 @@ public class CreditJudgmentDebtorController extends BaseController {
continue; continue;
} }
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
chunkItems.clear();
chunkRowNumbers.clear();
}
} catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add(prefix + "" + excelRowNumber + "行:" + e.getMessage());
e.printStackTrace();
}
}
if (!chunkItems.isEmpty()) {
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
}
return new ImportOutcome(true, successCount, errorMessages);
}
private int persistImportChunk(List<CreditJudgmentDebtor> items,
List<Integer> excelRowNumbers,
String prefix,
int mpBatchSize,
List<String> errorMessages) {
if (CollectionUtils.isEmpty(items)) {
return 0;
}
try {
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
creditJudgmentDebtorService,
items,
CreditJudgmentDebtor::getId,
CreditJudgmentDebtor::setId,
CreditJudgmentDebtor::getCaseNumber,
CreditJudgmentDebtor::getCaseNumber,
null,
mpBatchSize
));
} catch (Exception batchException) {
int successCount = 0;
for (int i = 0; i < items.size(); i++) {
CreditJudgmentDebtor item = items.get(i);
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
try {
int delta = batchImportSupport.runInNewTx(() -> {
boolean saved = creditJudgmentDebtorService.save(item); boolean saved = creditJudgmentDebtorService.save(item);
if (!saved) { if (!saved) {
CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery() CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
@@ -330,22 +382,25 @@ public class CreditJudgmentDebtorController extends BaseController {
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); item.setId(existing.getId());
if (creditJudgmentDebtorService.updateById(item)) { if (creditJudgmentDebtorService.updateById(item)) {
successCount++; return 1;
continue;
} }
} }
} else { } else {
successCount++; return 1;
continue;
} }
return 0;
});
if (delta > 0) {
successCount += delta;
} else {
errorMessages.add(prefix + "" + excelRowNumber + "行:保存失败"); errorMessages.add(prefix + "" + excelRowNumber + "行:保存失败");
}
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add(prefix + "" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add(prefix + "" + excelRowNumber + "行:" + e.getMessage());
e.printStackTrace();
} }
} }
return new ImportOutcome(true, successCount, errorMessages); return successCount;
}
} }
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception { private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {

View File

@@ -47,6 +47,9 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
@Resource @Resource
private CreditJudgmentDebtorHistoryService creditJudgmentDebtorHistoryService; private CreditJudgmentDebtorHistoryService creditJudgmentDebtorHistoryService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询被执行人") @Operation(summary = "分页查询被执行人")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditJudgmentDebtorHistory>> page(CreditJudgmentDebtorHistoryParam param) { public ApiResult<PageResult<CreditJudgmentDebtorHistory>> page(CreditJudgmentDebtorHistoryParam param) {
@@ -275,6 +278,10 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人"); Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "" + fileLabel + ""; String prefix = ImportHelper.isBlank(fileLabel) ? "" : "" + fileLabel + "";
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditJudgmentDebtorHistory> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudgmentDebtorHistoryImportParam param = list.get(i); CreditJudgmentDebtorHistoryImportParam param = list.get(i);
try { try {
@@ -321,6 +328,51 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
continue; continue;
} }
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
chunkItems.clear();
chunkRowNumbers.clear();
}
} catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add(prefix + "" + excelRowNumber + "行:" + e.getMessage());
e.printStackTrace();
}
}
if (!chunkItems.isEmpty()) {
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
}
return new ImportOutcome(true, successCount, errorMessages);
}
private int persistImportChunk(List<CreditJudgmentDebtorHistory> items,
List<Integer> excelRowNumbers,
String prefix,
int mpBatchSize,
List<String> errorMessages) {
if (CollectionUtils.isEmpty(items)) {
return 0;
}
try {
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
creditJudgmentDebtorHistoryService,
items,
CreditJudgmentDebtorHistory::getId,
CreditJudgmentDebtorHistory::setId,
CreditJudgmentDebtorHistory::getCaseNumber,
CreditJudgmentDebtorHistory::getCaseNumber,
null,
mpBatchSize
));
} catch (Exception batchException) {
int successCount = 0;
for (int i = 0; i < items.size(); i++) {
CreditJudgmentDebtorHistory item = items.get(i);
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
try {
int delta = batchImportSupport.runInNewTx(() -> {
boolean saved = creditJudgmentDebtorHistoryService.save(item); boolean saved = creditJudgmentDebtorHistoryService.save(item);
if (!saved) { if (!saved) {
CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery() CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery()
@@ -329,22 +381,25 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); item.setId(existing.getId());
if (creditJudgmentDebtorHistoryService.updateById(item)) { if (creditJudgmentDebtorHistoryService.updateById(item)) {
successCount++; return 1;
continue;
} }
} }
} else { } else {
successCount++; return 1;
continue;
} }
return 0;
});
if (delta > 0) {
successCount += delta;
} else {
errorMessages.add(prefix + "" + excelRowNumber + "行:保存失败"); errorMessages.add(prefix + "" + excelRowNumber + "行:保存失败");
}
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add(prefix + "" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add(prefix + "" + excelRowNumber + "行:" + e.getMessage());
e.printStackTrace();
} }
} }
return new ImportOutcome(true, successCount, errorMessages); return successCount;
}
} }
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception { private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {

View File

@@ -37,6 +37,9 @@ public class CreditJudicialDocumentController extends BaseController {
@Resource @Resource
private CreditJudicialDocumentService creditJudicialDocumentService; private CreditJudicialDocumentService creditJudicialDocumentService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询裁判文书司法大数据") @Operation(summary = "分页查询裁判文书司法大数据")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditJudicialDocument>> page(CreditJudicialDocumentParam param) { public ApiResult<PageResult<CreditJudicialDocument>> page(CreditJudicialDocumentParam param) {
@@ -155,6 +158,11 @@ public class CreditJudicialDocumentController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditJudicialDocument> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditJudicialDocumentController extends BaseController {
continue; continue;
} }
boolean saved = creditJudicialDocumentService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditJudicialDocumentService,
chunkItems,
CreditJudicialDocument::getId,
CreditJudicialDocument::setId,
CreditJudicialDocument::getCaseNumber,
CreditJudicialDocument::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditJudicialDocumentService.save(rowItem);
if (!saved) { if (!saved) {
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery() CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
.eq(CreditJudicialDocument::getCaseNumber, item.getCaseNumber()) .eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditJudicialDocumentService.updateById(item)) { if (creditJudicialDocumentService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditJudicialDocumentController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditJudicialDocumentService,
chunkItems,
CreditJudicialDocument::getId,
CreditJudicialDocument::setId,
CreditJudicialDocument::getCaseNumber,
CreditJudicialDocument::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditJudicialDocumentService.save(rowItem);
if (!saved) {
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditJudicialDocumentService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -41,6 +41,9 @@ public class CreditJudiciaryController extends BaseController {
@Resource @Resource
private CreditJudiciaryService creditJudiciaryService; private CreditJudiciaryService creditJudiciaryService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询司法案件") @Operation(summary = "分页查询司法案件")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditJudiciary>> page(CreditJudiciaryParam param) { public ApiResult<PageResult<CreditJudiciary>> page(CreditJudiciaryParam param) {
@@ -161,6 +164,11 @@ public class CreditJudiciaryController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditJudiciary> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudiciaryImportParam param = list.get(i); CreditJudiciaryImportParam param = list.get(i);
try { try {
@@ -199,21 +207,43 @@ public class CreditJudiciaryController extends BaseController {
continue; continue;
} }
boolean saved = creditJudiciaryService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditJudiciaryService,
chunkItems,
CreditJudiciary::getId,
CreditJudiciary::setId,
CreditJudiciary::getName,
CreditJudiciary::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditJudiciaryService.save(rowItem);
if (!saved) { if (!saved) {
CreditJudiciary existing = creditJudiciaryService.getByName(item.getName()); CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditJudiciaryService.updateById(item)) { if (creditJudiciaryService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -221,6 +251,40 @@ public class CreditJudiciaryController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditJudiciaryService,
chunkItems,
CreditJudiciary::getId,
CreditJudiciary::setId,
CreditJudiciary::getName,
CreditJudiciary::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditJudiciaryService.save(rowItem);
if (!saved) {
CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
if (existing != null) {
rowItem.setId(existing.getId());
if (creditJudiciaryService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditMediationController extends BaseController {
@Resource @Resource
private CreditMediationService creditMediationService; private CreditMediationService creditMediationService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询诉前调解司法大数据") @Operation(summary = "分页查询诉前调解司法大数据")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditMediation>> page(CreditMediationParam param) { public ApiResult<PageResult<CreditMediation>> page(CreditMediationParam param) {
@@ -155,6 +158,11 @@ public class CreditMediationController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditMediation> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditMediationController extends BaseController {
continue; continue;
} }
boolean saved = creditMediationService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditMediationService,
chunkItems,
CreditMediation::getId,
CreditMediation::setId,
CreditMediation::getCaseNumber,
CreditMediation::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditMediationService.save(rowItem);
if (!saved) { if (!saved) {
CreditMediation existing = creditMediationService.lambdaQuery() CreditMediation existing = creditMediationService.lambdaQuery()
.eq(CreditMediation::getCaseNumber, item.getCaseNumber()) .eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditMediationService.updateById(item)) { if (creditMediationService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditMediationController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditMediationService,
chunkItems,
CreditMediation::getId,
CreditMediation::setId,
CreditMediation::getCaseNumber,
CreditMediation::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditMediationService.save(rowItem);
if (!saved) {
CreditMediation existing = creditMediationService.lambdaQuery()
.eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditMediationService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditNearbyCompanyController extends BaseController {
@Resource @Resource
private CreditNearbyCompanyService creditNearbyCompanyService; private CreditNearbyCompanyService creditNearbyCompanyService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询附近企业") @Operation(summary = "分页查询附近企业")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditNearbyCompany>> page(CreditNearbyCompanyParam param) { public ApiResult<PageResult<CreditNearbyCompany>> page(CreditNearbyCompanyParam param) {
@@ -250,18 +253,35 @@ public class CreditNearbyCompanyController extends BaseController {
Integer tenantId, Integer tenantId,
int mpBatchSize, int mpBatchSize,
List<String> errorMessages) { List<String> errorMessages) {
if (CollectionUtils.isEmpty(items)) { return batchImportSupport.persistChunkWithFallback(
return 0; items,
excelRowNumbers,
() -> batchImportSupport.upsertByCodeOrName(
creditNearbyCompanyService,
items,
CreditNearbyCompany::getId,
CreditNearbyCompany::setId,
CreditNearbyCompany::getCode,
CreditNearbyCompany::getCode,
CreditNearbyCompany::getName,
CreditNearbyCompany::getName,
wrapper -> {
if (companyId != null) {
wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
} }
try { if (parentId != null) {
return creditNearbyCompanyService.importUpsertChunk(items, companyId, parentId, type, tenantId, mpBatchSize); wrapper.eq(CreditNearbyCompany::getParentId, parentId);
} catch (Exception batchException) { }
// 批量失败时降级为逐行处理,尽量输出可定位的错误信息 if (type != null) {
int successCount = 0; wrapper.eq(CreditNearbyCompany::getType, type);
for (int i = 0; i < items.size(); i++) { }
CreditNearbyCompany item = items.get(i); if (tenantId != null) {
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1; wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
try { }
},
mpBatchSize
),
(item, excelRowNumber) -> {
boolean saved = creditNearbyCompanyService.save(item); boolean saved = creditNearbyCompanyService.save(item);
if (!saved) { if (!saved) {
CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery() CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery()
@@ -275,29 +295,18 @@ public class CreditNearbyCompanyController extends BaseController {
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); item.setId(existing.getId());
if (creditNearbyCompanyService.updateById(item)) { if (creditNearbyCompanyService.updateById(item)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue;
}
if (excelRowNumber > 0) {
errorMessages.add("" + excelRowNumber + "行:保存失败");
} else {
errorMessages.add("保存失败");
}
} catch (Exception e) {
if (excelRowNumber > 0) {
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
} else {
errorMessages.add(e.getMessage());
}
}
}
return successCount;
} }
String prefix = excelRowNumber > 0 ? ("" + excelRowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
} }
/** /**

View File

@@ -38,6 +38,9 @@ public class CreditPatentController extends BaseController {
@Resource @Resource
private CreditPatentService creditPatentService; private CreditPatentService creditPatentService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询专利") @Operation(summary = "分页查询专利")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditPatent>> page(CreditPatentParam param) { public ApiResult<PageResult<CreditPatent>> page(CreditPatentParam param) {
@@ -159,6 +162,11 @@ public class CreditPatentController extends BaseController {
Map<String, String> urlByRegisterNo = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "申请号"); Map<String, String> urlByRegisterNo = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "申请号");
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "发明名称"); Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "发明名称");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditPatent> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditPatentImportParam param = list.get(i); CreditPatentImportParam param = list.get(i);
try { try {
@@ -199,23 +207,46 @@ public class CreditPatentController extends BaseController {
continue; continue;
} }
boolean saved = creditPatentService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditPatentService,
chunkItems,
CreditPatent::getId,
CreditPatent::setId,
CreditPatent::getRegisterNo,
CreditPatent::getRegisterNo,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditPatentService.save(rowItem);
if (!saved) { if (!saved) {
CreditPatent existing = creditPatentService.lambdaQuery() CreditPatent existing = creditPatentService.lambdaQuery()
.eq(CreditPatent::getRegisterNo, item.getRegisterNo()) .eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditPatentService.updateById(item)) { if (creditPatentService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -223,6 +254,43 @@ public class CreditPatentController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditPatentService,
chunkItems,
CreditPatent::getId,
CreditPatent::setId,
CreditPatent::getRegisterNo,
CreditPatent::getRegisterNo,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditPatentService.save(rowItem);
if (!saved) {
CreditPatent existing = creditPatentService.lambdaQuery()
.eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditPatentService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditRiskRelationController extends BaseController {
@Resource @Resource
private CreditRiskRelationService creditRiskRelationService; private CreditRiskRelationService creditRiskRelationService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询风险关系表") @Operation(summary = "分页查询风险关系表")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditRiskRelation>> page(CreditRiskRelationParam param) { public ApiResult<PageResult<CreditRiskRelation>> page(CreditRiskRelationParam param) {
@@ -156,6 +159,11 @@ public class CreditRiskRelationController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditRiskRelation> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditRiskRelationImportParam param = list.get(i); CreditRiskRelationImportParam param = list.get(i);
try { try {
@@ -186,23 +194,46 @@ public class CreditRiskRelationController extends BaseController {
continue; continue;
} }
boolean saved = creditRiskRelationService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditRiskRelationService,
chunkItems,
CreditRiskRelation::getId,
CreditRiskRelation::setId,
CreditRiskRelation::getMainBodyName,
CreditRiskRelation::getMainBodyName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditRiskRelationService.save(rowItem);
if (!saved) { if (!saved) {
CreditRiskRelation existing = creditRiskRelationService.lambdaQuery() CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
.eq(CreditRiskRelation::getMainBodyName, item.getMainBodyName()) .eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditRiskRelationService.updateById(item)) { if (creditRiskRelationService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -210,6 +241,43 @@ public class CreditRiskRelationController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditRiskRelationService,
chunkItems,
CreditRiskRelation::getId,
CreditRiskRelation::setId,
CreditRiskRelation::getMainBodyName,
CreditRiskRelation::getMainBodyName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditRiskRelationService.save(rowItem);
if (!saved) {
CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
.eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditRiskRelationService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -37,6 +37,9 @@ public class CreditSupplierController extends BaseController {
@Resource @Resource
private CreditSupplierService creditSupplierService; private CreditSupplierService creditSupplierService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询供应商") @Operation(summary = "分页查询供应商")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditSupplier>> page(CreditSupplierParam param) { public ApiResult<PageResult<CreditSupplier>> page(CreditSupplierParam param) {
@@ -156,6 +159,11 @@ public class CreditSupplierController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditSupplier> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditSupplierImportParam param = list.get(i); CreditSupplierImportParam param = list.get(i);
try { try {
@@ -186,23 +194,46 @@ public class CreditSupplierController extends BaseController {
continue; continue;
} }
boolean saved = creditSupplierService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditSupplierService,
chunkItems,
CreditSupplier::getId,
CreditSupplier::setId,
CreditSupplier::getSupplier,
CreditSupplier::getSupplier,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditSupplierService.save(rowItem);
if (!saved) { if (!saved) {
CreditSupplier existing = creditSupplierService.lambdaQuery() CreditSupplier existing = creditSupplierService.lambdaQuery()
.eq(CreditSupplier::getSupplier, item.getSupplier()) .eq(CreditSupplier::getSupplier, rowItem.getSupplier())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditSupplierService.updateById(item)) { if (creditSupplierService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -210,6 +241,43 @@ public class CreditSupplierController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditSupplierService,
chunkItems,
CreditSupplier::getId,
CreditSupplier::setId,
CreditSupplier::getSupplier,
CreditSupplier::getSupplier,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditSupplierService.save(rowItem);
if (!saved) {
CreditSupplier existing = creditSupplierService.lambdaQuery()
.eq(CreditSupplier::getSupplier, rowItem.getSupplier())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditSupplierService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -38,6 +38,9 @@ public class CreditSuspectedRelationshipController extends BaseController {
@Resource @Resource
private CreditSuspectedRelationshipService creditSuspectedRelationshipService; private CreditSuspectedRelationshipService creditSuspectedRelationshipService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询疑似关系") @Operation(summary = "分页查询疑似关系")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditSuspectedRelationship>> page(CreditSuspectedRelationshipParam param) { public ApiResult<PageResult<CreditSuspectedRelationship>> page(CreditSuspectedRelationshipParam param) {
@@ -158,6 +161,11 @@ public class CreditSuspectedRelationshipController extends BaseController {
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "企业名称"); Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "企业名称");
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditSuspectedRelationship> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditSuspectedRelationshipImportParam param = list.get(i); CreditSuspectedRelationshipImportParam param = list.get(i);
try { try {
@@ -198,25 +206,107 @@ public class CreditSuspectedRelationshipController extends BaseController {
continue; continue;
} }
boolean saved = creditSuspectedRelationshipService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> {
List<String> names = new ArrayList<>(chunkItems.size());
List<String> relatedParties = new ArrayList<>(chunkItems.size());
for (CreditSuspectedRelationship it : chunkItems) {
if (it == null) {
continue;
}
if (!ImportHelper.isBlank(it.getName())) {
names.add(it.getName().trim());
}
if (!ImportHelper.isBlank(it.getRelatedParty())) {
relatedParties.add(it.getRelatedParty().trim());
}
}
List<CreditSuspectedRelationship> existingList = (names.isEmpty() || relatedParties.isEmpty())
? new ArrayList<>()
: creditSuspectedRelationshipService.lambdaQuery()
.in(CreditSuspectedRelationship::getName, names)
.in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
.list();
java.util.Map<String, CreditSuspectedRelationship> byNameRelated = new java.util.HashMap<>();
java.util.Map<String, CreditSuspectedRelationship> byNameRelatedType = new java.util.HashMap<>();
for (CreditSuspectedRelationship existing : existingList) {
if (existing == null
|| ImportHelper.isBlank(existing.getName())
|| ImportHelper.isBlank(existing.getRelatedParty())) {
continue;
}
String n = existing.getName().trim();
String r = existing.getRelatedParty().trim();
byNameRelated.putIfAbsent(n + "|" + r, existing);
if (!ImportHelper.isBlank(existing.getType())) {
byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
}
}
List<CreditSuspectedRelationship> updates = new ArrayList<>();
List<CreditSuspectedRelationship> inserts = new ArrayList<>();
for (CreditSuspectedRelationship it : chunkItems) {
if (it == null
|| ImportHelper.isBlank(it.getName())
|| ImportHelper.isBlank(it.getRelatedParty())) {
continue;
}
String n = it.getName().trim();
String r = it.getRelatedParty().trim();
CreditSuspectedRelationship existing;
if (!ImportHelper.isBlank(it.getType())) {
existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
} else {
existing = byNameRelated.get(n + "|" + r);
}
if (existing != null) {
it.setId(existing.getId());
updates.add(it);
} else {
inserts.add(it);
}
}
if (!updates.isEmpty()) {
creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
}
if (!inserts.isEmpty()) {
creditSuspectedRelationshipService.saveBatch(inserts, mpBatchSize);
}
return updates.size() + inserts.size();
},
(rowItem, rowNumber) -> {
boolean saved = creditSuspectedRelationshipService.save(rowItem);
if (!saved) { if (!saved) {
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery() CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
.eq(CreditSuspectedRelationship::getName, item.getName()) .eq(CreditSuspectedRelationship::getName, rowItem.getName())
.eq(CreditSuspectedRelationship::getRelatedParty, item.getRelatedParty()) .eq(CreditSuspectedRelationship::getRelatedParty, rowItem.getRelatedParty())
.eq(!ImportHelper.isBlank(item.getType()), CreditSuspectedRelationship::getType, item.getType()) .eq(!ImportHelper.isBlank(rowItem.getType()), CreditSuspectedRelationship::getType, rowItem.getType())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditSuspectedRelationshipService.updateById(item)) { if (creditSuspectedRelationshipService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -224,6 +314,104 @@ public class CreditSuspectedRelationshipController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> {
List<String> names = new ArrayList<>(chunkItems.size());
List<String> relatedParties = new ArrayList<>(chunkItems.size());
for (CreditSuspectedRelationship it : chunkItems) {
if (it == null) {
continue;
}
if (!ImportHelper.isBlank(it.getName())) {
names.add(it.getName().trim());
}
if (!ImportHelper.isBlank(it.getRelatedParty())) {
relatedParties.add(it.getRelatedParty().trim());
}
}
List<CreditSuspectedRelationship> existingList = (names.isEmpty() || relatedParties.isEmpty())
? new ArrayList<>()
: creditSuspectedRelationshipService.lambdaQuery()
.in(CreditSuspectedRelationship::getName, names)
.in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
.list();
java.util.Map<String, CreditSuspectedRelationship> byNameRelated = new java.util.HashMap<>();
java.util.Map<String, CreditSuspectedRelationship> byNameRelatedType = new java.util.HashMap<>();
for (CreditSuspectedRelationship existing : existingList) {
if (existing == null
|| ImportHelper.isBlank(existing.getName())
|| ImportHelper.isBlank(existing.getRelatedParty())) {
continue;
}
String n = existing.getName().trim();
String r = existing.getRelatedParty().trim();
byNameRelated.putIfAbsent(n + "|" + r, existing);
if (!ImportHelper.isBlank(existing.getType())) {
byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
}
}
List<CreditSuspectedRelationship> updates = new ArrayList<>();
List<CreditSuspectedRelationship> inserts = new ArrayList<>();
for (CreditSuspectedRelationship it : chunkItems) {
if (it == null
|| ImportHelper.isBlank(it.getName())
|| ImportHelper.isBlank(it.getRelatedParty())) {
continue;
}
String n = it.getName().trim();
String r = it.getRelatedParty().trim();
CreditSuspectedRelationship existing;
if (!ImportHelper.isBlank(it.getType())) {
existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
} else {
existing = byNameRelated.get(n + "|" + r);
}
if (existing != null) {
it.setId(existing.getId());
updates.add(it);
} else {
inserts.add(it);
}
}
if (!updates.isEmpty()) {
creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
}
if (!inserts.isEmpty()) {
creditSuspectedRelationshipService.saveBatch(inserts, mpBatchSize);
}
return updates.size() + inserts.size();
},
(rowItem, rowNumber) -> {
boolean saved = creditSuspectedRelationshipService.save(rowItem);
if (!saved) {
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
.eq(CreditSuspectedRelationship::getName, rowItem.getName())
.eq(CreditSuspectedRelationship::getRelatedParty, rowItem.getRelatedParty())
.eq(!ImportHelper.isBlank(rowItem.getType()), CreditSuspectedRelationship::getType, rowItem.getType())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditSuspectedRelationshipService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -54,6 +54,9 @@ public class CreditUserController extends BaseController {
@Resource @Resource
private CreditUserService creditUserService; private CreditUserService creditUserService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询招投标信息表") @Operation(summary = "分页查询招投标信息表")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditUser>> page(CreditUserParam param) { public ApiResult<PageResult<CreditUser>> page(CreditUserParam param) {
@@ -177,6 +180,11 @@ public class CreditUserController extends BaseController {
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
Map<Integer, String> urlMap = readNameHyperlinks(file, sheetIndex, usedTitleRows, usedHeadRows); Map<Integer, String> urlMap = readNameHyperlinks(file, sheetIndex, usedTitleRows, usedHeadRows);
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditUser> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditUserImportParam param = list.get(i); CreditUserImportParam param = list.get(i);
try { try {
@@ -216,14 +224,42 @@ public class CreditUserController extends BaseController {
continue; continue;
} }
if (creditUserService.save(item)) { chunkItems.add(item);
successCount++; chunkRowNumbers.add(excelRowNumber);
} else { if (chunkItems.size() >= chunkSize) {
CreditUser update = creditUserService.getByName(item.getName()); successCount += batchImportSupport.persistChunkWithFallback(
if (creditUserService.updateById(update)) { chunkItems,
errorMessages.add("" + excelRowNumber + "行:更新成功"); chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditUserService,
chunkItems,
CreditUser::getId,
CreditUser::setId,
CreditUser::getName,
CreditUser::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditUserService.save(rowItem);
if (!saved) {
CreditUser existing = creditUserService.getByName(rowItem.getName());
if (existing != null) {
rowItem.setId(existing.getId());
if (creditUserService.updateById(rowItem)) {
return true;
} }
errorMessages.add("" + excelRowNumber + "行:保存失败"); }
} else {
return true;
}
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
@@ -232,10 +268,44 @@ public class CreditUserController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditUserService,
chunkItems,
CreditUser::getId,
CreditUser::setId,
CreditUser::getName,
CreditUser::getName,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditUserService.save(rowItem);
if (!saved) {
CreditUser existing = creditUserService.getByName(rowItem.getName());
if (existing != null) {
rowItem.setId(existing.getId());
if (creditUserService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
errorMessages.add("" + rowNumber + "行:保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {
return success("导入完成,成功" + successCount + "条,更新" + errorMessages.size() + "", errorMessages); return success("导入完成,成功" + successCount + "条,失败" + errorMessages.size() + "", errorMessages);
} }
} catch (Exception e) { } catch (Exception e) {

View File

@@ -37,6 +37,9 @@ public class CreditXgxfController extends BaseController {
@Resource @Resource
private CreditXgxfService creditXgxfService; private CreditXgxfService creditXgxfService;
@Resource
private BatchImportSupport batchImportSupport;
@Operation(summary = "分页查询限制高消费") @Operation(summary = "分页查询限制高消费")
@GetMapping("/page") @GetMapping("/page")
public ApiResult<PageResult<CreditXgxf>> page(CreditXgxfParam param) { public ApiResult<PageResult<CreditXgxf>> page(CreditXgxfParam param) {
@@ -155,6 +158,11 @@ public class CreditXgxfController extends BaseController {
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
final int chunkSize = 500;
final int mpBatchSize = 500;
List<CreditXgxf> chunkItems = new ArrayList<>(chunkSize);
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
CreditJudicialImportParam param = list.get(i); CreditJudicialImportParam param = list.get(i);
try { try {
@@ -185,23 +193,46 @@ public class CreditXgxfController extends BaseController {
continue; continue;
} }
boolean saved = creditXgxfService.save(item); chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditXgxfService,
chunkItems,
CreditXgxf::getId,
CreditXgxf::setId,
CreditXgxf::getCaseNumber,
CreditXgxf::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditXgxfService.save(rowItem);
if (!saved) { if (!saved) {
CreditXgxf existing = creditXgxfService.lambdaQuery() CreditXgxf existing = creditXgxfService.lambdaQuery()
.eq(CreditXgxf::getCaseNumber, item.getCaseNumber()) .eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
.one(); .one();
if (existing != null) { if (existing != null) {
item.setId(existing.getId()); rowItem.setId(existing.getId());
if (creditXgxfService.updateById(item)) { if (creditXgxfService.updateById(rowItem)) {
successCount++; return true;
continue;
} }
} }
} else { } else {
successCount++; return true;
continue; }
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
chunkItems.clear();
chunkRowNumbers.clear();
} }
errorMessages.add("" + excelRowNumber + "行:保存失败");
} catch (Exception e) { } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("" + excelRowNumber + "行:" + e.getMessage()); errorMessages.add("" + excelRowNumber + "行:" + e.getMessage());
@@ -209,6 +240,43 @@ public class CreditXgxfController extends BaseController {
} }
} }
if (!chunkItems.isEmpty()) {
successCount += batchImportSupport.persistChunkWithFallback(
chunkItems,
chunkRowNumbers,
() -> batchImportSupport.upsertBySingleKey(
creditXgxfService,
chunkItems,
CreditXgxf::getId,
CreditXgxf::setId,
CreditXgxf::getCaseNumber,
CreditXgxf::getCaseNumber,
null,
mpBatchSize
),
(rowItem, rowNumber) -> {
boolean saved = creditXgxfService.save(rowItem);
if (!saved) {
CreditXgxf existing = creditXgxfService.lambdaQuery()
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
.one();
if (existing != null) {
rowItem.setId(existing.getId());
if (creditXgxfService.updateById(rowItem)) {
return true;
}
}
} else {
return true;
}
String prefix = rowNumber > 0 ? ("" + rowNumber + "行:") : "";
errorMessages.add(prefix + "保存失败");
return false;
},
errorMessages
);
}
if (errorMessages.isEmpty()) { if (errorMessages.isEmpty()) {
return success("成功导入" + successCount + "条数据", null); return success("成功导入" + successCount + "条数据", null);
} else { } else {

View File

@@ -39,24 +39,4 @@ public interface CreditNearbyCompanyService extends IService<CreditNearbyCompany
*/ */
CreditNearbyCompany getByIdRel(Integer id); CreditNearbyCompany getByIdRel(Integer id);
/**
* 导入用按给定维度companyId/parentId/type/tenantId批量 upsert避免逐行写库导致数据库压力过大。
* <p>
* 规则:优先按 code 匹配code 为空时按 name 匹配。
*
* @param items 待写入数据(需保证 name/code 已做基础清洗/默认值填充)
* @param companyId 企业ID可空
* @param parentId 上级ID可空
* @param type 类型(可空)
* @param tenantId 租户ID可空
* @param batchSize MyBatis-Plus 批处理大小
* @return 本次写入成功的条数(插入 + 更新)
*/
int importUpsertChunk(List<CreditNearbyCompany> items,
Integer companyId,
Integer parentId,
Integer type,
Integer tenantId,
int batchSize);
} }

View File

@@ -1,6 +1,5 @@
package com.gxwebsoft.credit.service.impl; package com.gxwebsoft.credit.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gxwebsoft.common.core.web.PageParam; import com.gxwebsoft.common.core.web.PageParam;
import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.core.web.PageResult;
@@ -9,13 +8,8 @@ import com.gxwebsoft.credit.mapper.CreditNearbyCompanyMapper;
import com.gxwebsoft.credit.param.CreditNearbyCompanyParam; import com.gxwebsoft.credit.param.CreditNearbyCompanyParam;
import com.gxwebsoft.credit.service.CreditNearbyCompanyService; import com.gxwebsoft.credit.service.CreditNearbyCompanyService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 附近企业Service实现 * 附近企业Service实现
@@ -50,116 +44,4 @@ public class CreditNearbyCompanyServiceImpl extends ServiceImpl<CreditNearbyComp
return param.getOne(baseMapper.selectListRel(param)); return param.getOne(baseMapper.selectListRel(param));
} }
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public int importUpsertChunk(List<CreditNearbyCompany> items,
Integer companyId,
Integer parentId,
Integer type,
Integer tenantId,
int batchSize) {
if (items == null || items.isEmpty()) {
return 0;
}
List<CreditNearbyCompany> updates = new ArrayList<>();
List<CreditNearbyCompany> inserts = new ArrayList<>();
List<String> codes = new ArrayList<>();
List<String> names = new ArrayList<>();
for (CreditNearbyCompany item : items) {
if (item == null) {
continue;
}
if (item.getCode() != null) {
item.setCode(item.getCode().trim());
}
if (item.getName() != null) {
item.setName(item.getName().trim());
}
if (item.getCode() != null && !item.getCode().isEmpty()) {
codes.add(item.getCode());
} else if (item.getName() != null && !item.getName().isEmpty()) {
names.add(item.getName());
}
}
Map<String, CreditNearbyCompany> existingByCode = new HashMap<>();
Map<String, CreditNearbyCompany> existingByName = new HashMap<>();
if (!codes.isEmpty()) {
LambdaQueryWrapper<CreditNearbyCompany> wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId);
wrapper.in(CreditNearbyCompany::getCode, codes);
wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getCode);
List<CreditNearbyCompany> existingList = list(wrapper);
for (CreditNearbyCompany existing : existingList) {
if (existing.getCode() != null) {
existingByCode.putIfAbsent(existing.getCode().trim(), existing);
}
}
}
if (!names.isEmpty()) {
LambdaQueryWrapper<CreditNearbyCompany> wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId);
wrapper.in(CreditNearbyCompany::getName, names);
wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getName);
List<CreditNearbyCompany> existingList = list(wrapper);
for (CreditNearbyCompany existing : existingList) {
if (existing.getName() != null) {
existingByName.putIfAbsent(existing.getName().trim(), existing);
}
}
}
for (CreditNearbyCompany item : items) {
if (item == null) {
continue;
}
CreditNearbyCompany existing = null;
if (item.getCode() != null && !item.getCode().isEmpty()) {
existing = existingByCode.get(item.getCode());
} else if (item.getName() != null && !item.getName().isEmpty()) {
existing = existingByName.get(item.getName());
}
if (existing != null) {
item.setId(existing.getId());
updates.add(item);
} else {
inserts.add(item);
}
}
if (!updates.isEmpty()) {
// 直接按主键批量更新,避免 saveOrUpdateBatch 产生额外的存在性查询
updateBatchById(updates, batchSize);
}
if (!inserts.isEmpty()) {
saveBatch(inserts, batchSize);
}
return updates.size() + inserts.size();
}
private LambdaQueryWrapper<CreditNearbyCompany> buildImportKeyWrapper(Integer companyId,
Integer parentId,
Integer type,
Integer tenantId) {
LambdaQueryWrapper<CreditNearbyCompany> wrapper = new LambdaQueryWrapper<>();
if (companyId != null) {
wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
}
if (parentId != null) {
wrapper.eq(CreditNearbyCompany::getParentId, parentId);
}
if (type != null) {
wrapper.eq(CreditNearbyCompany::getType, type);
}
if (tenantId != null) {
wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
}
return wrapper;
}
} }