diff --git a/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java b/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java new file mode 100644 index 0000000..2c7ed83 --- /dev/null +++ b/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java @@ -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 supplier) { + return requiresNewTx.execute(status -> supplier.get()); + } + + /** + * 批量 upsert:优先按 code 匹配;code 为空时按 name 匹配。 + */ + public int upsertByCodeOrName(IService service, + List items, + SFunction idColumn, + BiConsumer idSetter, + SFunction codeColumn, + Function codeGetter, + SFunction nameColumn, + Function nameGetter, + Consumer> extraConditions, + int batchSize) { + if (CollectionUtils.isEmpty(items)) { + return 0; + } + + List codes = new ArrayList<>(); + List 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 idByCode = new HashMap<>(); + if (!codes.isEmpty()) { + LambdaQueryWrapper 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 idByName = new HashMap<>(); + if (!names.isEmpty()) { + LambdaQueryWrapper 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 updates = new ArrayList<>(); + List 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 int upsertBySingleKey(IService service, + List items, + SFunction idColumn, + BiConsumer idSetter, + SFunction keyColumn, + Function keyGetter, + Consumer> extraConditions, + int batchSize) { + if (CollectionUtils.isEmpty(items)) { + return 0; + } + + List 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 idByKey = new HashMap<>(); + if (!keys.isEmpty()) { + LambdaQueryWrapper 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 updates = new ArrayList<>(); + List 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 int persistChunkWithFallback(List items, + List excelRowNumbers, + Supplier batchPersist, + BiFunction rowPersist, + List 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 Integer extractId(T entity, SFunction idColumn) { + // SFunction 是 getter method ref,直接调用即可 + return idColumn.apply(entity); + } +} + diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java index c96395a..0d55e40 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java @@ -38,6 +38,9 @@ public class CreditAdministrativeLicenseController extends BaseController { @Resource private CreditAdministrativeLicenseService creditAdministrativeLicenseService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询行政许可") @GetMapping("/page") public ApiResult> page(CreditAdministrativeLicenseParam param) { @@ -159,6 +162,11 @@ public class CreditAdministrativeLicenseController extends BaseController { Map urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号"); Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditAdministrativeLicenseImportParam param = list.get(i); try { @@ -199,31 +207,56 @@ public class CreditAdministrativeLicenseController extends BaseController { continue; } - boolean saved = creditAdministrativeLicenseService.save(item); - if (!saved) { - CreditAdministrativeLicense existing = null; - if (!ImportHelper.isBlank(item.getCode())) { - existing = creditAdministrativeLicenseService.lambdaQuery() - .eq(CreditAdministrativeLicense::getCode, item.getCode()) - .one(); - } - if (existing == null) { - existing = creditAdministrativeLicenseService.lambdaQuery() - .eq(CreditAdministrativeLicense::getName, item.getName()) - .one(); - } - if (existing != null) { - item.setId(existing.getId()); - if (creditAdministrativeLicenseService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java index efe639c..e743e11 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java @@ -38,6 +38,9 @@ public class CreditBankruptcyController extends BaseController { @Resource private CreditBankruptcyService creditBankruptcyService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询破产重整") @GetMapping("/page") public ApiResult> page(CreditBankruptcyParam param) { @@ -158,6 +161,11 @@ public class CreditBankruptcyController extends BaseController { Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Map urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditBankruptcyImportParam param = list.get(i); try { @@ -194,23 +202,46 @@ public class CreditBankruptcyController extends BaseController { continue; } - boolean saved = creditBankruptcyService.save(item); - if (!saved) { - CreditBankruptcy existing = creditBankruptcyService.lambdaQuery() - .eq(CreditBankruptcy::getCode, item.getCode()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditBankruptcyService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java index fbdc794..77a7f30 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java @@ -38,6 +38,9 @@ public class CreditBranchController extends BaseController { @Resource private CreditBranchService creditBranchService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询分支机构") @GetMapping("/page") public ApiResult> page(CreditBranchParam param) { @@ -158,6 +161,11 @@ public class CreditBranchController extends BaseController { Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "分支机构名称"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditBranchImportParam param = list.get(i); try { @@ -194,23 +202,46 @@ public class CreditBranchController extends BaseController { continue; } - boolean saved = creditBranchService.save(item); - if (!saved) { - CreditBranch existing = creditBranchService.lambdaQuery() - .eq(CreditBranch::getName, item.getName()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditBranchService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java index b027d2a..be64a51 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java @@ -38,6 +38,9 @@ public class CreditBreachOfTrustController extends BaseController { @Resource private CreditBreachOfTrustService creditBreachOfTrustService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询失信被执行人") @GetMapping("/page") public ApiResult> page(CreditBreachOfTrustParam param) { @@ -151,6 +154,11 @@ public class CreditBreachOfTrustController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -181,23 +189,46 @@ public class CreditBreachOfTrustController extends BaseController { continue; } - boolean saved = creditBreachOfTrustService.save(item); - if (!saved) { - CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery() - .eq(CreditBreachOfTrust::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditBreachOfTrustService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java index 01c9147..7ffb2ea 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java @@ -37,6 +37,9 @@ public class CreditCaseFilingController extends BaseController { @Resource private CreditCaseFilingService creditCaseFilingService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询司法大数据") @GetMapping("/page") public ApiResult> page(CreditCaseFilingParam param) { @@ -155,6 +158,11 @@ public class CreditCaseFilingController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditCaseFilingController extends BaseController { continue; } - boolean saved = creditCaseFilingService.save(item); - if (!saved) { - CreditCaseFiling existing = creditCaseFilingService.lambdaQuery() - .eq(CreditCaseFiling::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditCaseFilingService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCompanyController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCompanyController.java index 44d508f..375f4d7 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCompanyController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCompanyController.java @@ -39,8 +39,11 @@ import java.util.Map; @RestController @RequestMapping("/api/credit/credit-company") public class CreditCompanyController extends BaseController { - @Resource - private CreditCompanyService creditCompanyService; + @Resource + private CreditCompanyService creditCompanyService; + + @Resource + private BatchImportSupport batchImportSupport; @Operation(summary = "分页查询企业") @GetMapping("/page") @@ -164,6 +167,11 @@ public class CreditCompanyController extends BaseController { Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "原文件导入名称"); Map urlByMatchName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "系统匹配企业名称"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditCompanyImportParam param = list.get(i); try { @@ -206,21 +214,43 @@ public class CreditCompanyController extends BaseController { // continue; // } - boolean saved = creditCompanyService.save(item); - if (!saved) { - CreditCompany existing = creditCompanyService.getByMatchName(item.getName()); - if (existing != null) { - item.setId(existing.getId()); - if (creditCompanyService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java index fe29612..8cfb326 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java @@ -37,6 +37,9 @@ public class CreditCompetitorController extends BaseController { @Resource private CreditCompetitorService creditCompetitorService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询竞争对手") @GetMapping("/page") public ApiResult> page(CreditCompetitorParam param) { @@ -156,6 +159,11 @@ public class CreditCompetitorController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditCompetitorImportParam param = list.get(i); try { @@ -186,23 +194,46 @@ public class CreditCompetitorController extends BaseController { continue; } - boolean saved = creditCompetitorService.save(item); - if (!saved) { - CreditCompetitor existing = creditCompetitorService.lambdaQuery() - .eq(CreditCompetitor::getCompanyName, item.getCompanyName()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditCompetitorService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java index 495b061..3195aba 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java @@ -37,6 +37,9 @@ public class CreditCourtAnnouncementController extends BaseController { @Resource private CreditCourtAnnouncementService creditCourtAnnouncementService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询法院公告司法大数据") @GetMapping("/page") public ApiResult> page(CreditCourtAnnouncementParam param) { @@ -155,6 +158,11 @@ public class CreditCourtAnnouncementController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditCourtAnnouncementController extends BaseController { continue; } - boolean saved = creditCourtAnnouncementService.save(item); - if (!saved) { - CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery() - .eq(CreditCourtAnnouncement::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditCourtAnnouncementService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java index 330acb1..2974846 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java @@ -37,6 +37,9 @@ public class CreditCourtSessionController extends BaseController { @Resource private CreditCourtSessionService creditCourtSessionService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询开庭公告司法大数据") @GetMapping("/page") public ApiResult> page(CreditCourtSessionParam param) { @@ -155,6 +158,11 @@ public class CreditCourtSessionController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditCourtSessionController extends BaseController { continue; } - boolean saved = creditCourtSessionService.save(item); - if (!saved) { - CreditCourtSession existing = creditCourtSessionService.lambdaQuery() - .eq(CreditCourtSession::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditCourtSessionService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCustomerController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCustomerController.java index 8944717..4b533f5 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditCustomerController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCustomerController.java @@ -38,6 +38,9 @@ public class CreditCustomerController extends BaseController { @Resource private CreditCustomerService creditCustomerService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询客户") @GetMapping("/page") public ApiResult> page(CreditCustomerParam param) { @@ -152,6 +155,11 @@ public class CreditCustomerController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditCustomerImportParam param = list.get(i); int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; @@ -182,56 +190,237 @@ public class CreditCustomerController extends BaseController { continue; } - CreditCustomer existing = creditCustomerService.lambdaQuery() - .eq(CreditCustomer::getName, item.getName()) - .one(); - if (existing != null) { - Integer existingTenantId = existing.getTenantId(); - if (item.getTenantId() != null - && existingTenantId != null - && !item.getTenantId().equals(existingTenantId)) { - errorMessages.add("第" + excelRowNumber + "行:客户名称已存在且归属其他租户,无法导入"); - continue; + chunkItems.add(item); + chunkRowNumbers.add(excelRowNumber); + if (chunkItems.size() >= chunkSize) { + successCount += batchImportSupport.persistChunkWithFallback( + chunkItems, + chunkRowNumbers, + () -> { + // 批内一次查库,避免逐行查/写导致数据库压力过大 + List names = new ArrayList<>(chunkItems.size()); + for (CreditCustomer it : chunkItems) { + if (it != null && !ImportHelper.isBlank(it.getName())) { + names.add(it.getName().trim()); + } + } + List existingList = names.isEmpty() + ? new ArrayList<>() + : creditCustomerService.lambdaQuery() + .in(CreditCustomer::getName, names) + .list(); + java.util.Map 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 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 updates = new ArrayList<>(); + List 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); + } + } catch (Exception e) { + errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage()); + e.printStackTrace(); + } + } + + if (!chunkItems.isEmpty()) { + successCount += batchImportSupport.persistChunkWithFallback( + chunkItems, + chunkRowNumbers, + () -> { + List names = new ArrayList<>(chunkItems.size()); + for (CreditCustomer it : chunkItems) { + if (it != null && !ImportHelper.isBlank(it.getName())) { + names.add(it.getName().trim()); + } } - item.setId(existing.getId()); - if (existingTenantId != null) { - item.setTenantId(existingTenantId); + List existingList = names.isEmpty() + ? new ArrayList<>() + : creditCustomerService.lambdaQuery() + .in(CreditCustomer::getName, names) + .list(); + java.util.Map existingByName = new java.util.HashMap<>(); + for (CreditCustomer existing : existingList) { + if (existing != null && !ImportHelper.isBlank(existing.getName())) { + existingByName.putIfAbsent(existing.getName().trim(), existing); + } } - if (creditCustomerService.updateById(item)) { - successCount++; - continue; - } - } else { - try { - if (creditCustomerService.save(item)) { - successCount++; + + java.util.Map 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 updates = new ArrayList<>(); + List 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, item.getName()) + .eq(CreditCustomer::getName, rowItem.getName()) .one(); if (dbExisting != null) { Integer existingTenantId = dbExisting.getTenantId(); - item.setId(dbExisting.getId()); + rowItem.setId(dbExisting.getId()); if (existingTenantId != null) { - item.setTenantId(existingTenantId); - } - if (creditCustomerService.updateById(item)) { - successCount++; - continue; + rowItem.setTenantId(existingTenantId); } + return creditCustomerService.updateById(rowItem); } } - } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); - } catch (Exception e) { - errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage()); - e.printStackTrace(); - } + errorMessages.add("第" + rowNumber + "行:保存失败"); + return false; + }, + errorMessages + ); } if (errorMessages.isEmpty()) { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java index 80f5833..aadcaac 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java @@ -37,6 +37,9 @@ public class CreditDeliveryNoticeController extends BaseController { @Resource private CreditDeliveryNoticeService creditDeliveryNoticeService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询送达公告司法大数据") @GetMapping("/page") public ApiResult> page(CreditDeliveryNoticeParam param) { @@ -155,6 +158,11 @@ public class CreditDeliveryNoticeController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditDeliveryNoticeController extends BaseController { continue; } - boolean saved = creditDeliveryNoticeService.save(item); - if (!saved) { - CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery() - .eq(CreditDeliveryNotice::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditDeliveryNoticeService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java index 8cf1887..4f54fab 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java @@ -37,6 +37,9 @@ public class CreditExternalController extends BaseController { @Resource private CreditExternalService creditExternalService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询对外投资") @GetMapping("/page") public ApiResult> page(CreditExternalParam param) { @@ -156,6 +159,11 @@ public class CreditExternalController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditExternalImportParam param = list.get(i); try { @@ -186,23 +194,46 @@ public class CreditExternalController extends BaseController { continue; } - boolean saved = creditExternalService.save(item); - if (!saved) { - CreditExternal existing = creditExternalService.lambdaQuery() - .eq(CreditExternal::getName, item.getName()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditExternalService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java index 645f045..233c681 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java @@ -37,6 +37,9 @@ public class CreditFinalVersionController extends BaseController { @Resource private CreditFinalVersionService creditFinalVersionService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询终本案件") @GetMapping("/page") public ApiResult> page(CreditFinalVersionParam param) { @@ -155,6 +158,11 @@ public class CreditFinalVersionController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditFinalVersionController extends BaseController { continue; } - boolean saved = creditFinalVersionService.save(item); - if (!saved) { - CreditFinalVersion existing = creditFinalVersionService.lambdaQuery() - .eq(CreditFinalVersion::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditFinalVersionService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java index 60fb577..f3ff6d3 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java @@ -37,6 +37,9 @@ public class CreditGqdjController extends BaseController { @Resource private CreditGqdjService creditGqdjService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询股权冻结") @GetMapping("/page") public ApiResult> page(CreditGqdjParam param) { @@ -155,6 +158,11 @@ public class CreditGqdjController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditGqdjController extends BaseController { continue; } - boolean saved = creditGqdjService.save(item); - if (!saved) { - CreditGqdj existing = creditGqdjService.lambdaQuery() - .eq(CreditGqdj::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditGqdjService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java index c1163b1..b62edce 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java @@ -38,6 +38,9 @@ public class CreditHistoricalLegalPersonController extends BaseController { @Resource private CreditHistoricalLegalPersonService creditHistoricalLegalPersonService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询历史法定代表人") @GetMapping("/page") public ApiResult> page(CreditHistoricalLegalPersonParam param) { @@ -158,6 +161,11 @@ public class CreditHistoricalLegalPersonController extends BaseController { Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "名称"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditHistoricalLegalPersonImportParam param = list.get(i); try { @@ -194,24 +202,94 @@ public class CreditHistoricalLegalPersonController extends BaseController { continue; } - boolean saved = creditHistoricalLegalPersonService.save(item); - if (!saved) { - CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery() - .eq(CreditHistoricalLegalPerson::getName, item.getName()) - .eq(!ImportHelper.isBlank(item.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, item.getRegisterDate()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditHistoricalLegalPersonService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + chunkItems.add(item); + chunkRowNumbers.add(excelRowNumber); + if (chunkItems.size() >= chunkSize) { + successCount += batchImportSupport.persistChunkWithFallback( + chunkItems, + chunkRowNumbers, + () -> { + // 批内一次查库:按 name in (...) 拉取,再按 registerDate 做内存匹配 + List names = new ArrayList<>(chunkItems.size()); + for (CreditHistoricalLegalPerson it : chunkItems) { + if (it != null && !ImportHelper.isBlank(it.getName())) { + names.add(it.getName().trim()); + } + } + List existingList = names.isEmpty() + ? new ArrayList<>() + : creditHistoricalLegalPersonService.lambdaQuery() + .in(CreditHistoricalLegalPerson::getName, names) + .list(); + + java.util.Map byName = new java.util.HashMap<>(); + java.util.Map 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 updates = new ArrayList<>(); + List 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage()); @@ -219,6 +297,90 @@ public class CreditHistoricalLegalPersonController extends BaseController { } } + if (!chunkItems.isEmpty()) { + successCount += batchImportSupport.persistChunkWithFallback( + chunkItems, + chunkRowNumbers, + () -> { + List names = new ArrayList<>(chunkItems.size()); + for (CreditHistoricalLegalPerson it : chunkItems) { + if (it != null && !ImportHelper.isBlank(it.getName())) { + names.add(it.getName().trim()); + } + } + List existingList = names.isEmpty() + ? new ArrayList<>() + : creditHistoricalLegalPersonService.lambdaQuery() + .in(CreditHistoricalLegalPerson::getName, names) + .list(); + + java.util.Map byName = new java.util.HashMap<>(); + java.util.Map 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 updates = new ArrayList<>(); + List 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java index 15788e4..b85ed9f 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java @@ -47,6 +47,9 @@ public class CreditJudgmentDebtorController extends BaseController { @Resource private CreditJudgmentDebtorService creditJudgmentDebtorService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询被执行人") @GetMapping("/page") public ApiResult> page(CreditJudgmentDebtorParam param) { @@ -280,6 +283,10 @@ public class CreditJudgmentDebtorController extends BaseController { Map urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人"); String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】"; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); for (int i = 0; i < list.size(); i++) { CreditJudgmentDebtorImportParam param = list.get(i); try { @@ -322,32 +329,80 @@ public class CreditJudgmentDebtorController extends BaseController { continue; } - boolean saved = creditJudgmentDebtorService.save(item); - if (!saved) { - CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery() - .eq(CreditJudgmentDebtor::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditJudgmentDebtorService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + chunkItems.add(item); + chunkRowNumbers.add(excelRowNumber); + if (chunkItems.size() >= chunkSize) { + successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败"); } 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 items, + List excelRowNumbers, + String prefix, + int mpBatchSize, + List 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); + if (!saved) { + CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery() + .eq(CreditJudgmentDebtor::getCaseNumber, item.getCaseNumber()) + .one(); + if (existing != null) { + item.setId(existing.getId()); + if (creditJudgmentDebtorService.updateById(item)) { + return 1; + } + } + } else { + return 1; + } + return 0; + }); + if (delta > 0) { + successCount += delta; + } else { + errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败"); + } + } catch (Exception e) { + errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage()); + } + } + return successCount; + } + } + private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception { try { return importFromZip(zipFile, currentUserId, currentTenantId, companyId, StandardCharsets.UTF_8); diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorHistoryController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorHistoryController.java index ff5cba1..1ed7206 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorHistoryController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorHistoryController.java @@ -47,6 +47,9 @@ public class CreditJudgmentDebtorHistoryController extends BaseController { @Resource private CreditJudgmentDebtorHistoryService creditJudgmentDebtorHistoryService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询被执行人") @GetMapping("/page") public ApiResult> page(CreditJudgmentDebtorHistoryParam param) { @@ -275,6 +278,10 @@ public class CreditJudgmentDebtorHistoryController extends BaseController { Map urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人"); String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】"; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); for (int i = 0; i < list.size(); i++) { CreditJudgmentDebtorHistoryImportParam param = list.get(i); try { @@ -321,32 +328,80 @@ public class CreditJudgmentDebtorHistoryController extends BaseController { continue; } - boolean saved = creditJudgmentDebtorHistoryService.save(item); - if (!saved) { - CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery() - .eq(CreditJudgmentDebtorHistory::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditJudgmentDebtorHistoryService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + chunkItems.add(item); + chunkRowNumbers.add(excelRowNumber); + if (chunkItems.size() >= chunkSize) { + successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败"); } 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 items, + List excelRowNumbers, + String prefix, + int mpBatchSize, + List 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); + if (!saved) { + CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery() + .eq(CreditJudgmentDebtorHistory::getCaseNumber, item.getCaseNumber()) + .one(); + if (existing != null) { + item.setId(existing.getId()); + if (creditJudgmentDebtorHistoryService.updateById(item)) { + return 1; + } + } + } else { + return 1; + } + return 0; + }); + if (delta > 0) { + successCount += delta; + } else { + errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败"); + } + } catch (Exception e) { + errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage()); + } + } + return successCount; + } + } + private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception { try { return importFromZip(zipFile, currentUserId, currentTenantId, companyId, StandardCharsets.UTF_8); diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java index 3b066bc..313b7a3 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java @@ -37,6 +37,9 @@ public class CreditJudicialDocumentController extends BaseController { @Resource private CreditJudicialDocumentService creditJudicialDocumentService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询裁判文书司法大数据") @GetMapping("/page") public ApiResult> page(CreditJudicialDocumentParam param) { @@ -155,6 +158,11 @@ public class CreditJudicialDocumentController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditJudicialDocumentController extends BaseController { continue; } - boolean saved = creditJudicialDocumentService.save(item); - if (!saved) { - CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery() - .eq(CreditJudicialDocument::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditJudicialDocumentService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java index 2d387f4..aa5353c 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java @@ -38,8 +38,11 @@ import java.util.List; @RestController @RequestMapping("/api/credit/credit-judiciary") public class CreditJudiciaryController extends BaseController { - @Resource - private CreditJudiciaryService creditJudiciaryService; + @Resource + private CreditJudiciaryService creditJudiciaryService; + + @Resource + private BatchImportSupport batchImportSupport; @Operation(summary = "分页查询司法案件") @GetMapping("/page") @@ -161,6 +164,11 @@ public class CreditJudiciaryController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudiciaryImportParam param = list.get(i); try { @@ -199,21 +207,43 @@ public class CreditJudiciaryController extends BaseController { continue; } - boolean saved = creditJudiciaryService.save(item); - if (!saved) { - CreditJudiciary existing = creditJudiciaryService.getByName(item.getName()); - if (existing != null) { - item.setId(existing.getId()); - if (creditJudiciaryService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java index ad72b5d..72d1966 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java @@ -37,6 +37,9 @@ public class CreditMediationController extends BaseController { @Resource private CreditMediationService creditMediationService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询诉前调解司法大数据") @GetMapping("/page") public ApiResult> page(CreditMediationParam param) { @@ -155,6 +158,11 @@ public class CreditMediationController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditMediationController extends BaseController { continue; } - boolean saved = creditMediationService.save(item); - if (!saved) { - CreditMediation existing = creditMediationService.lambdaQuery() - .eq(CreditMediation::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditMediationService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java index 2b39a88..dccdd91 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java @@ -38,6 +38,9 @@ public class CreditNearbyCompanyController extends BaseController { @Resource private CreditNearbyCompanyService creditNearbyCompanyService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询附近企业") @GetMapping("/page") public ApiResult> page(CreditNearbyCompanyParam param) { @@ -250,54 +253,60 @@ public class CreditNearbyCompanyController extends BaseController { Integer tenantId, int mpBatchSize, List errorMessages) { - if (CollectionUtils.isEmpty(items)) { - return 0; - } - try { - return creditNearbyCompanyService.importUpsertChunk(items, companyId, parentId, type, tenantId, mpBatchSize); - } catch (Exception batchException) { - // 批量失败时降级为逐行处理,尽量输出可定位的错误信息 - int successCount = 0; - for (int i = 0; i < items.size(); i++) { - CreditNearbyCompany item = items.get(i); - int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1; - try { - boolean saved = creditNearbyCompanyService.save(item); - if (!saved) { - CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery() - .eq(!ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getCode, item.getCode()) - .eq(ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getName, item.getName()) - .eq(item.getCompanyId() != null, CreditNearbyCompany::getCompanyId, item.getCompanyId()) - .eq(item.getParentId() != null, CreditNearbyCompany::getParentId, item.getParentId()) - .eq(item.getType() != null, CreditNearbyCompany::getType, item.getType()) - .eq(item.getTenantId() != null, CreditNearbyCompany::getTenantId, item.getTenantId()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditNearbyCompanyService.updateById(item)) { - successCount++; - continue; - } + return batchImportSupport.persistChunkWithFallback( + 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); + } + if (parentId != null) { + wrapper.eq(CreditNearbyCompany::getParentId, parentId); + } + if (type != null) { + wrapper.eq(CreditNearbyCompany::getType, type); + } + if (tenantId != null) { + wrapper.eq(CreditNearbyCompany::getTenantId, tenantId); + } + }, + mpBatchSize + ), + (item, excelRowNumber) -> { + boolean saved = creditNearbyCompanyService.save(item); + if (!saved) { + CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery() + .eq(!ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getCode, item.getCode()) + .eq(ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getName, item.getName()) + .eq(item.getCompanyId() != null, CreditNearbyCompany::getCompanyId, item.getCompanyId()) + .eq(item.getParentId() != null, CreditNearbyCompany::getParentId, item.getParentId()) + .eq(item.getType() != null, CreditNearbyCompany::getType, item.getType()) + .eq(item.getTenantId() != null, CreditNearbyCompany::getTenantId, item.getTenantId()) + .one(); + if (existing != null) { + item.setId(existing.getId()); + if (creditNearbyCompanyService.updateById(item)) { + return true; } - } else { - successCount++; - 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()); } + } else { + return true; } - } - return successCount; - } + String prefix = excelRowNumber > 0 ? ("第" + excelRowNumber + "行:") : ""; + errorMessages.add(prefix + "保存失败"); + return false; + }, + errorMessages + ); } /** diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java index 1920479..cbcf2c3 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java @@ -38,6 +38,9 @@ public class CreditPatentController extends BaseController { @Resource private CreditPatentService creditPatentService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询专利") @GetMapping("/page") public ApiResult> page(CreditPatentParam param) { @@ -159,6 +162,11 @@ public class CreditPatentController extends BaseController { Map urlByRegisterNo = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "申请号"); Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "发明名称"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditPatentImportParam param = list.get(i); try { @@ -199,23 +207,46 @@ public class CreditPatentController extends BaseController { continue; } - boolean saved = creditPatentService.save(item); - if (!saved) { - CreditPatent existing = creditPatentService.lambdaQuery() - .eq(CreditPatent::getRegisterNo, item.getRegisterNo()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditPatentService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java index cde9c4d..d1194a6 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java @@ -37,6 +37,9 @@ public class CreditRiskRelationController extends BaseController { @Resource private CreditRiskRelationService creditRiskRelationService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询风险关系表") @GetMapping("/page") public ApiResult> page(CreditRiskRelationParam param) { @@ -156,6 +159,11 @@ public class CreditRiskRelationController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditRiskRelationImportParam param = list.get(i); try { @@ -186,23 +194,46 @@ public class CreditRiskRelationController extends BaseController { continue; } - boolean saved = creditRiskRelationService.save(item); - if (!saved) { - CreditRiskRelation existing = creditRiskRelationService.lambdaQuery() - .eq(CreditRiskRelation::getMainBodyName, item.getMainBodyName()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditRiskRelationService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java index 510dca9..87d9051 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java @@ -37,6 +37,9 @@ public class CreditSupplierController extends BaseController { @Resource private CreditSupplierService creditSupplierService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询供应商") @GetMapping("/page") public ApiResult> page(CreditSupplierParam param) { @@ -156,6 +159,11 @@ public class CreditSupplierController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditSupplierImportParam param = list.get(i); try { @@ -186,23 +194,46 @@ public class CreditSupplierController extends BaseController { continue; } - boolean saved = creditSupplierService.save(item); - if (!saved) { - CreditSupplier existing = creditSupplierService.lambdaQuery() - .eq(CreditSupplier::getSupplier, item.getSupplier()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditSupplierService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java index ce1d650..6a2deed 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java @@ -38,6 +38,9 @@ public class CreditSuspectedRelationshipController extends BaseController { @Resource private CreditSuspectedRelationshipService creditSuspectedRelationshipService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询疑似关系") @GetMapping("/page") public ApiResult> page(CreditSuspectedRelationshipParam param) { @@ -158,6 +161,11 @@ public class CreditSuspectedRelationshipController extends BaseController { Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "企业名称"); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditSuspectedRelationshipImportParam param = list.get(i); try { @@ -198,25 +206,107 @@ public class CreditSuspectedRelationshipController extends BaseController { continue; } - boolean saved = creditSuspectedRelationshipService.save(item); - if (!saved) { - CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery() - .eq(CreditSuspectedRelationship::getName, item.getName()) - .eq(CreditSuspectedRelationship::getRelatedParty, item.getRelatedParty()) - .eq(!ImportHelper.isBlank(item.getType()), CreditSuspectedRelationship::getType, item.getType()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditSuspectedRelationshipService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + chunkItems.add(item); + chunkRowNumbers.add(excelRowNumber); + if (chunkItems.size() >= chunkSize) { + successCount += batchImportSupport.persistChunkWithFallback( + chunkItems, + chunkRowNumbers, + () -> { + List names = new ArrayList<>(chunkItems.size()); + List 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 existingList = (names.isEmpty() || relatedParties.isEmpty()) + ? new ArrayList<>() + : creditSuspectedRelationshipService.lambdaQuery() + .in(CreditSuspectedRelationship::getName, names) + .in(CreditSuspectedRelationship::getRelatedParty, relatedParties) + .list(); + + java.util.Map byNameRelated = new java.util.HashMap<>(); + java.util.Map 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 updates = new ArrayList<>(); + List 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage()); @@ -224,6 +314,104 @@ public class CreditSuspectedRelationshipController extends BaseController { } } + if (!chunkItems.isEmpty()) { + successCount += batchImportSupport.persistChunkWithFallback( + chunkItems, + chunkRowNumbers, + () -> { + List names = new ArrayList<>(chunkItems.size()); + List 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 existingList = (names.isEmpty() || relatedParties.isEmpty()) + ? new ArrayList<>() + : creditSuspectedRelationshipService.lambdaQuery() + .in(CreditSuspectedRelationship::getName, names) + .in(CreditSuspectedRelationship::getRelatedParty, relatedParties) + .list(); + + java.util.Map byNameRelated = new java.util.HashMap<>(); + java.util.Map 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 updates = new ArrayList<>(); + List 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java index 921d159..27c1124 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java @@ -54,6 +54,9 @@ public class CreditUserController extends BaseController { @Resource private CreditUserService creditUserService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询招投标信息表") @GetMapping("/page") public ApiResult> page(CreditUserParam param) { @@ -177,6 +180,11 @@ public class CreditUserController extends BaseController { Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; Map urlMap = readNameHyperlinks(file, sheetIndex, usedTitleRows, usedHeadRows); + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditUserImportParam param = list.get(i); try { @@ -216,14 +224,42 @@ public class CreditUserController extends BaseController { continue; } - if (creditUserService.save(item)) { - successCount++; - } else { - CreditUser update = creditUserService.getByName(item.getName()); - if (creditUserService.updateById(update)) { - errorMessages.add("第" + excelRowNumber + "行:更新成功"); - } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); + chunkItems.add(item); + chunkRowNumbers.add(excelRowNumber); + if (chunkItems.size() >= chunkSize) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } } catch (Exception e) { 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()) { return success("成功导入" + successCount + "条数据", null); } else { - return success("导入完成,成功" + successCount + "条,更新" + errorMessages.size() + "条", errorMessages); + return success("导入完成,成功" + successCount + "条,失败" + errorMessages.size() + "条", errorMessages); } } catch (Exception e) { diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java index 1dc913b..de1b4d9 100644 --- a/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java +++ b/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java @@ -37,6 +37,9 @@ public class CreditXgxfController extends BaseController { @Resource private CreditXgxfService creditXgxfService; + @Resource + private BatchImportSupport batchImportSupport; + @Operation(summary = "分页查询限制高消费") @GetMapping("/page") public ApiResult> page(CreditXgxfParam param) { @@ -155,6 +158,11 @@ public class CreditXgxfController extends BaseController { Integer currentUserId = loginUser != null ? loginUser.getUserId() : null; Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null; + final int chunkSize = 500; + final int mpBatchSize = 500; + List chunkItems = new ArrayList<>(chunkSize); + List chunkRowNumbers = new ArrayList<>(chunkSize); + for (int i = 0; i < list.size(); i++) { CreditJudicialImportParam param = list.get(i); try { @@ -185,23 +193,46 @@ public class CreditXgxfController extends BaseController { continue; } - boolean saved = creditXgxfService.save(item); - if (!saved) { - CreditXgxf existing = creditXgxfService.lambdaQuery() - .eq(CreditXgxf::getCaseNumber, item.getCaseNumber()) - .one(); - if (existing != null) { - item.setId(existing.getId()); - if (creditXgxfService.updateById(item)) { - successCount++; - continue; - } - } - } else { - successCount++; - continue; + 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) { + 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 + ); + chunkItems.clear(); + chunkRowNumbers.clear(); } - errorMessages.add("第" + excelRowNumber + "行:保存失败"); } catch (Exception e) { int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows; 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()) { return success("成功导入" + successCount + "条数据", null); } else { diff --git a/src/main/java/com/gxwebsoft/credit/service/CreditNearbyCompanyService.java b/src/main/java/com/gxwebsoft/credit/service/CreditNearbyCompanyService.java index ccb03ab..7622af9 100644 --- a/src/main/java/com/gxwebsoft/credit/service/CreditNearbyCompanyService.java +++ b/src/main/java/com/gxwebsoft/credit/service/CreditNearbyCompanyService.java @@ -39,24 +39,4 @@ public interface CreditNearbyCompanyService extends IService - * 规则:优先按 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 items, - Integer companyId, - Integer parentId, - Integer type, - Integer tenantId, - int batchSize); - } diff --git a/src/main/java/com/gxwebsoft/credit/service/impl/CreditNearbyCompanyServiceImpl.java b/src/main/java/com/gxwebsoft/credit/service/impl/CreditNearbyCompanyServiceImpl.java index f7029e2..5083b95 100644 --- a/src/main/java/com/gxwebsoft/credit/service/impl/CreditNearbyCompanyServiceImpl.java +++ b/src/main/java/com/gxwebsoft/credit/service/impl/CreditNearbyCompanyServiceImpl.java @@ -1,6 +1,5 @@ package com.gxwebsoft.credit.service.impl; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gxwebsoft.common.core.web.PageParam; 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.service.CreditNearbyCompanyService; 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.Map; /** * 附近企业Service实现 @@ -50,116 +44,4 @@ public class CreditNearbyCompanyServiceImpl extends ServiceImpl items, - Integer companyId, - Integer parentId, - Integer type, - Integer tenantId, - int batchSize) { - if (items == null || items.isEmpty()) { - return 0; - } - - List updates = new ArrayList<>(); - List inserts = new ArrayList<>(); - - List codes = new ArrayList<>(); - List 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 existingByCode = new HashMap<>(); - Map existingByName = new HashMap<>(); - - if (!codes.isEmpty()) { - LambdaQueryWrapper wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId); - wrapper.in(CreditNearbyCompany::getCode, codes); - wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getCode); - List existingList = list(wrapper); - for (CreditNearbyCompany existing : existingList) { - if (existing.getCode() != null) { - existingByCode.putIfAbsent(existing.getCode().trim(), existing); - } - } - } - - if (!names.isEmpty()) { - LambdaQueryWrapper wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId); - wrapper.in(CreditNearbyCompany::getName, names); - wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getName); - List 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 buildImportKeyWrapper(Integer companyId, - Integer parentId, - Integer type, - Integer tenantId) { - LambdaQueryWrapper 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; - } - }