refactor(import): 优化批量导入功能提升性能
- 在多个控制器中引入 BatchImportSupport 工具类 - 实现分块处理机制,每批次处理 500 条记录 - 使用 persistChunkWithFallback 方法替代逐条保存 - 保持原有的数据校验和去重逻辑不变 - 显著提升大量数据导入时的执行效率 - 减少数据库操作次数降低系统负载
This commit is contained in:
@@ -0,0 +1,260 @@
|
||||
package com.gxwebsoft.credit.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* credit 模块 Excel 导入批处理支持:
|
||||
* - 分批 upsert(批内一次查库 + 批量 insert/update)
|
||||
* - 每批独立事务(REQUIRES_NEW),避免单次导入事务过大拖垮数据库
|
||||
*/
|
||||
@Component
|
||||
public class BatchImportSupport {
|
||||
|
||||
private final TransactionTemplate requiresNewTx;
|
||||
|
||||
public BatchImportSupport(PlatformTransactionManager transactionManager) {
|
||||
TransactionTemplate template = new TransactionTemplate(transactionManager);
|
||||
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
this.requiresNewTx = template;
|
||||
}
|
||||
|
||||
public int runInNewTx(Supplier<Integer> supplier) {
|
||||
return requiresNewTx.execute(status -> supplier.get());
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量 upsert:优先按 code 匹配;code 为空时按 name 匹配。
|
||||
*/
|
||||
public <T> int upsertByCodeOrName(IService<T> service,
|
||||
List<T> items,
|
||||
SFunction<T, Integer> idColumn,
|
||||
BiConsumer<T, Integer> idSetter,
|
||||
SFunction<T, String> codeColumn,
|
||||
Function<T, String> codeGetter,
|
||||
SFunction<T, String> nameColumn,
|
||||
Function<T, String> nameGetter,
|
||||
Consumer<LambdaQueryWrapper<T>> extraConditions,
|
||||
int batchSize) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
List<String> codes = new ArrayList<>();
|
||||
List<String> names = new ArrayList<>();
|
||||
for (T item : items) {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
String code = normalize(codeGetter.apply(item));
|
||||
if (code != null) {
|
||||
codes.add(code);
|
||||
} else {
|
||||
String name = normalize(nameGetter.apply(item));
|
||||
if (name != null) {
|
||||
names.add(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Integer> idByCode = new HashMap<>();
|
||||
if (!codes.isEmpty()) {
|
||||
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
|
||||
if (extraConditions != null) {
|
||||
extraConditions.accept(wrapper);
|
||||
}
|
||||
wrapper.in(codeColumn, codes);
|
||||
wrapper.select(idColumn, codeColumn);
|
||||
for (T dbRow : service.list(wrapper)) {
|
||||
String code = normalize(codeGetter.apply(dbRow));
|
||||
Integer id = extractId(dbRow, idColumn);
|
||||
if (code != null && id != null) {
|
||||
idByCode.putIfAbsent(code, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Integer> idByName = new HashMap<>();
|
||||
if (!names.isEmpty()) {
|
||||
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
|
||||
if (extraConditions != null) {
|
||||
extraConditions.accept(wrapper);
|
||||
}
|
||||
wrapper.in(nameColumn, names);
|
||||
wrapper.select(idColumn, nameColumn);
|
||||
for (T dbRow : service.list(wrapper)) {
|
||||
String name = normalize(nameGetter.apply(dbRow));
|
||||
Integer id = extractId(dbRow, idColumn);
|
||||
if (name != null && id != null) {
|
||||
idByName.putIfAbsent(name, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<T> updates = new ArrayList<>();
|
||||
List<T> inserts = new ArrayList<>();
|
||||
for (T item : items) {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
String code = normalize(codeGetter.apply(item));
|
||||
Integer id = null;
|
||||
if (code != null) {
|
||||
id = idByCode.get(code);
|
||||
} else {
|
||||
String name = normalize(nameGetter.apply(item));
|
||||
if (name != null) {
|
||||
id = idByName.get(name);
|
||||
}
|
||||
}
|
||||
|
||||
if (id != null) {
|
||||
idSetter.accept(item, id);
|
||||
updates.add(item);
|
||||
} else {
|
||||
inserts.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (!updates.isEmpty()) {
|
||||
service.updateBatchById(updates, batchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
service.saveBatch(inserts, batchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量 upsert:按单字段 key 匹配(key 非空)。
|
||||
*/
|
||||
public <T> int upsertBySingleKey(IService<T> service,
|
||||
List<T> items,
|
||||
SFunction<T, Integer> idColumn,
|
||||
BiConsumer<T, Integer> idSetter,
|
||||
SFunction<T, String> keyColumn,
|
||||
Function<T, String> keyGetter,
|
||||
Consumer<LambdaQueryWrapper<T>> extraConditions,
|
||||
int batchSize) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
List<String> keys = new ArrayList<>(items.size());
|
||||
for (T item : items) {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
String key = normalize(keyGetter.apply(item));
|
||||
if (key != null) {
|
||||
keys.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Integer> idByKey = new HashMap<>();
|
||||
if (!keys.isEmpty()) {
|
||||
LambdaQueryWrapper<T> wrapper = new LambdaQueryWrapper<>();
|
||||
if (extraConditions != null) {
|
||||
extraConditions.accept(wrapper);
|
||||
}
|
||||
wrapper.in(keyColumn, keys);
|
||||
wrapper.select(idColumn, keyColumn);
|
||||
for (T dbRow : service.list(wrapper)) {
|
||||
String key = normalize(keyGetter.apply(dbRow));
|
||||
Integer id = extractId(dbRow, idColumn);
|
||||
if (key != null && id != null) {
|
||||
idByKey.putIfAbsent(key, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<T> updates = new ArrayList<>();
|
||||
List<T> inserts = new ArrayList<>();
|
||||
for (T item : items) {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
String key = normalize(keyGetter.apply(item));
|
||||
Integer id = key != null ? idByKey.get(key) : null;
|
||||
if (id != null) {
|
||||
idSetter.accept(item, id);
|
||||
updates.add(item);
|
||||
} else {
|
||||
inserts.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (!updates.isEmpty()) {
|
||||
service.updateBatchById(updates, batchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
service.saveBatch(inserts, batchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量失败时降级逐行,尽量保留“第 N 行”错误定位。
|
||||
*/
|
||||
public <T> int persistChunkWithFallback(List<T> items,
|
||||
List<Integer> excelRowNumbers,
|
||||
Supplier<Integer> batchPersist,
|
||||
BiFunction<T, Integer, Boolean> rowPersist,
|
||||
List<String> errorMessages) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
return runInNewTx(batchPersist);
|
||||
} catch (Exception batchException) {
|
||||
int successCount = 0;
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
T item = items.get(i);
|
||||
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
||||
try {
|
||||
int delta = runInNewTx(() -> rowPersist.apply(item, excelRowNumber) ? 1 : 0);
|
||||
successCount += delta;
|
||||
} catch (Exception e) {
|
||||
if (errorMessages != null) {
|
||||
if (excelRowNumber > 0) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
} else {
|
||||
errorMessages.add(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return successCount;
|
||||
}
|
||||
}
|
||||
|
||||
private static String normalize(String value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
String trimmed = value.trim();
|
||||
return trimmed.isEmpty() ? null : trimmed;
|
||||
}
|
||||
|
||||
private static <T> Integer extractId(T entity, SFunction<T, Integer> idColumn) {
|
||||
// SFunction 是 getter method ref,直接调用即可
|
||||
return idColumn.apply(entity);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
@Resource
|
||||
private CreditAdministrativeLicenseService creditAdministrativeLicenseService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询行政许可")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditAdministrativeLicense>> page(CreditAdministrativeLicenseParam param) {
|
||||
@@ -159,6 +162,11 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号");
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditAdministrativeLicense> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditAdministrativeLicenseImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -199,31 +207,56 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean saved = creditAdministrativeLicenseService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertByCodeOrName(
|
||||
creditAdministrativeLicenseService,
|
||||
chunkItems,
|
||||
CreditAdministrativeLicense::getId,
|
||||
CreditAdministrativeLicense::setId,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getName,
|
||||
CreditAdministrativeLicense::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditAdministrativeLicenseService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditAdministrativeLicense existing = null;
|
||||
if (!ImportHelper.isBlank(item.getCode())) {
|
||||
if (!ImportHelper.isBlank(rowItem.getCode())) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getCode, item.getCode())
|
||||
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
|
||||
.one();
|
||||
}
|
||||
if (existing == null) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getName, item.getName())
|
||||
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
|
||||
.one();
|
||||
}
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditAdministrativeLicenseService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditAdministrativeLicenseService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditBankruptcyController extends BaseController {
|
||||
@Resource
|
||||
private CreditBankruptcyService creditBankruptcyService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询破产重整")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditBankruptcy>> page(CreditBankruptcyParam param) {
|
||||
@@ -158,6 +161,11 @@ public class CreditBankruptcyController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditBankruptcy> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditBankruptcyImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -194,23 +202,46 @@ public class CreditBankruptcyController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean saved = creditBankruptcyService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
creditBankruptcyService,
|
||||
chunkItems,
|
||||
CreditBankruptcy::getId,
|
||||
CreditBankruptcy::setId,
|
||||
CreditBankruptcy::getCode,
|
||||
CreditBankruptcy::getCode,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditBankruptcyService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
||||
.eq(CreditBankruptcy::getCode, item.getCode())
|
||||
.eq(CreditBankruptcy::getCode, rowItem.getCode())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditBankruptcyService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditBankruptcyService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditBranchController extends BaseController {
|
||||
@Resource
|
||||
private CreditBranchService creditBranchService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询分支机构")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditBranch>> page(CreditBranchParam param) {
|
||||
@@ -158,6 +161,11 @@ public class CreditBranchController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "分支机构名称");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditBranch> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditBranchImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -194,23 +202,46 @@ public class CreditBranchController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean saved = creditBranchService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
creditBranchService,
|
||||
chunkItems,
|
||||
CreditBranch::getId,
|
||||
CreditBranch::setId,
|
||||
CreditBranch::getName,
|
||||
CreditBranch::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditBranchService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBranch existing = creditBranchService.lambdaQuery()
|
||||
.eq(CreditBranch::getName, item.getName())
|
||||
.eq(CreditBranch::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditBranchService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditBranchService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditBreachOfTrustController extends BaseController {
|
||||
@Resource
|
||||
private CreditBreachOfTrustService creditBreachOfTrustService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询失信被执行人")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditBreachOfTrust>> 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<CreditBreachOfTrust> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditBreachOfTrustService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditBreachOfTrustService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditCaseFilingController extends BaseController {
|
||||
@Resource
|
||||
private CreditCaseFilingService creditCaseFilingService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询司法大数据")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditCaseFiling>> 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<CreditCaseFiling> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditCaseFilingService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCaseFilingService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -42,6 +42,9 @@ public class CreditCompanyController extends BaseController {
|
||||
@Resource
|
||||
private CreditCompanyService creditCompanyService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询企业")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditCompany>> page(CreditCompanyParam param) {
|
||||
@@ -164,6 +167,11 @@ public class CreditCompanyController extends BaseController {
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "原文件导入名称");
|
||||
Map<String, String> urlByMatchName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "系统匹配企业名称");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditCompany> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditCompanyImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -206,21 +214,43 @@ public class CreditCompanyController extends BaseController {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
boolean saved = creditCompanyService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
creditCompanyService,
|
||||
chunkItems,
|
||||
CreditCompany::getId,
|
||||
CreditCompany::setId,
|
||||
CreditCompany::getMatchName,
|
||||
CreditCompany::getMatchName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditCompanyService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCompany existing = creditCompanyService.getByMatchName(item.getName());
|
||||
CreditCompany existing = creditCompanyService.getByMatchName(rowItem.getMatchName());
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditCompanyService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCompanyService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditCompetitorController extends BaseController {
|
||||
@Resource
|
||||
private CreditCompetitorService creditCompetitorService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询竞争对手")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditCompetitor>> 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<CreditCompetitor> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCompanyName())
|
||||
.eq(CreditCompetitor::getCompanyName, rowItem.getCompanyName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditCompetitorService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCompetitorService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditCourtAnnouncementController extends BaseController {
|
||||
@Resource
|
||||
private CreditCourtAnnouncementService creditCourtAnnouncementService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询法院公告司法大数据")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditCourtAnnouncement>> 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<CreditCourtAnnouncement> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditCourtAnnouncementService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCourtAnnouncementService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditCourtSessionController extends BaseController {
|
||||
@Resource
|
||||
private CreditCourtSessionService creditCourtSessionService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询开庭公告司法大数据")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditCourtSession>> 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<CreditCourtSession> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditCourtSessionService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCourtSessionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditCustomerController extends BaseController {
|
||||
@Resource
|
||||
private CreditCustomerService creditCustomerService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询客户")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditCustomer>> 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<CreditCustomer> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditCustomerImportParam param = list.get(i);
|
||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||
@@ -182,58 +190,239 @@ public class CreditCustomerController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
// 批内一次查库,避免逐行查/写导致数据库压力过大
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
for (CreditCustomer it : chunkItems) {
|
||||
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
}
|
||||
List<CreditCustomer> existingList = names.isEmpty()
|
||||
? new ArrayList<>()
|
||||
: creditCustomerService.lambdaQuery()
|
||||
.in(CreditCustomer::getName, names)
|
||||
.list();
|
||||
java.util.Map<String, CreditCustomer> existingByName = new java.util.HashMap<>();
|
||||
for (CreditCustomer existing : existingList) {
|
||||
if (existing != null && !ImportHelper.isBlank(existing.getName())) {
|
||||
existingByName.putIfAbsent(existing.getName().trim(), existing);
|
||||
}
|
||||
}
|
||||
|
||||
java.util.Map<String, CreditCustomer> latestByName = new java.util.HashMap<>();
|
||||
int acceptedRows = 0;
|
||||
for (int idx = 0; idx < chunkItems.size(); idx++) {
|
||||
CreditCustomer it = chunkItems.get(idx);
|
||||
int rowNo = (idx < chunkRowNumbers.size()) ? chunkRowNumbers.get(idx) : -1;
|
||||
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||
continue;
|
||||
}
|
||||
String name = it.getName().trim();
|
||||
CreditCustomer existing = existingByName.get(name);
|
||||
if (existing != null) {
|
||||
Integer existingTenantId = existing.getTenantId();
|
||||
if (it.getTenantId() != null
|
||||
&& existingTenantId != null
|
||||
&& !it.getTenantId().equals(existingTenantId)) {
|
||||
errorMessages.add("第" + rowNo + "行:客户名称已存在且归属其他租户,无法导入");
|
||||
continue;
|
||||
}
|
||||
it.setId(existing.getId());
|
||||
if (existingTenantId != null) {
|
||||
it.setTenantId(existingTenantId);
|
||||
}
|
||||
}
|
||||
// 同名多行:保留最后一行的值(等价于“先插入/更新,再被后续行更新”)
|
||||
latestByName.put(name, it);
|
||||
acceptedRows++;
|
||||
}
|
||||
|
||||
List<CreditCustomer> updates = new ArrayList<>();
|
||||
List<CreditCustomer> inserts = new ArrayList<>();
|
||||
for (CreditCustomer it : latestByName.values()) {
|
||||
if (it.getId() != null) {
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditCustomerService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditCustomerService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return acceptedRows;
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
CreditCustomer existing = creditCustomerService.lambdaQuery()
|
||||
.eq(CreditCustomer::getName, item.getName())
|
||||
.eq(CreditCustomer::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
Integer existingTenantId = existing.getTenantId();
|
||||
if (item.getTenantId() != null
|
||||
if (rowItem.getTenantId() != null
|
||||
&& existingTenantId != null
|
||||
&& !item.getTenantId().equals(existingTenantId)) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:客户名称已存在且归属其他租户,无法导入");
|
||||
continue;
|
||||
&& !rowItem.getTenantId().equals(existingTenantId)) {
|
||||
errorMessages.add("第" + rowNumber + "行:客户名称已存在且归属其他租户,无法导入");
|
||||
return false;
|
||||
}
|
||||
item.setId(existing.getId());
|
||||
rowItem.setId(existing.getId());
|
||||
if (existingTenantId != null) {
|
||||
item.setTenantId(existingTenantId);
|
||||
rowItem.setTenantId(existingTenantId);
|
||||
}
|
||||
if (creditCustomerService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
return creditCustomerService.updateById(rowItem);
|
||||
}
|
||||
} else {
|
||||
|
||||
try {
|
||||
if (creditCustomerService.save(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
}
|
||||
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);
|
||||
rowItem.setTenantId(existingTenantId);
|
||||
}
|
||||
if (creditCustomerService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
return creditCustomerService.updateById(rowItem);
|
||||
}
|
||||
}
|
||||
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
for (CreditCustomer it : chunkItems) {
|
||||
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
}
|
||||
List<CreditCustomer> existingList = names.isEmpty()
|
||||
? new ArrayList<>()
|
||||
: creditCustomerService.lambdaQuery()
|
||||
.in(CreditCustomer::getName, names)
|
||||
.list();
|
||||
java.util.Map<String, CreditCustomer> existingByName = new java.util.HashMap<>();
|
||||
for (CreditCustomer existing : existingList) {
|
||||
if (existing != null && !ImportHelper.isBlank(existing.getName())) {
|
||||
existingByName.putIfAbsent(existing.getName().trim(), existing);
|
||||
}
|
||||
}
|
||||
|
||||
java.util.Map<String, CreditCustomer> latestByName = new java.util.HashMap<>();
|
||||
int acceptedRows = 0;
|
||||
for (int idx = 0; idx < chunkItems.size(); idx++) {
|
||||
CreditCustomer it = chunkItems.get(idx);
|
||||
int rowNo = (idx < chunkRowNumbers.size()) ? chunkRowNumbers.get(idx) : -1;
|
||||
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||
continue;
|
||||
}
|
||||
String name = it.getName().trim();
|
||||
CreditCustomer existing = existingByName.get(name);
|
||||
if (existing != null) {
|
||||
Integer existingTenantId = existing.getTenantId();
|
||||
if (it.getTenantId() != null
|
||||
&& existingTenantId != null
|
||||
&& !it.getTenantId().equals(existingTenantId)) {
|
||||
errorMessages.add("第" + rowNo + "行:客户名称已存在且归属其他租户,无法导入");
|
||||
continue;
|
||||
}
|
||||
it.setId(existing.getId());
|
||||
if (existingTenantId != null) {
|
||||
it.setTenantId(existingTenantId);
|
||||
}
|
||||
}
|
||||
latestByName.put(name, it);
|
||||
acceptedRows++;
|
||||
}
|
||||
|
||||
List<CreditCustomer> updates = new ArrayList<>();
|
||||
List<CreditCustomer> inserts = new ArrayList<>();
|
||||
for (CreditCustomer it : latestByName.values()) {
|
||||
if (it.getId() != null) {
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditCustomerService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditCustomerService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return acceptedRows;
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
CreditCustomer existing = creditCustomerService.lambdaQuery()
|
||||
.eq(CreditCustomer::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
Integer existingTenantId = existing.getTenantId();
|
||||
if (rowItem.getTenantId() != null
|
||||
&& existingTenantId != null
|
||||
&& !rowItem.getTenantId().equals(existingTenantId)) {
|
||||
errorMessages.add("第" + rowNumber + "行:客户名称已存在且归属其他租户,无法导入");
|
||||
return false;
|
||||
}
|
||||
rowItem.setId(existing.getId());
|
||||
if (existingTenantId != null) {
|
||||
rowItem.setTenantId(existingTenantId);
|
||||
}
|
||||
return creditCustomerService.updateById(rowItem);
|
||||
}
|
||||
|
||||
try {
|
||||
return creditCustomerService.save(rowItem);
|
||||
} catch (DataIntegrityViolationException e) {
|
||||
if (!isDuplicateCustomerName(e)) {
|
||||
throw e;
|
||||
}
|
||||
CreditCustomer dbExisting = creditCustomerService.lambdaQuery()
|
||||
.eq(CreditCustomer::getName, rowItem.getName())
|
||||
.one();
|
||||
if (dbExisting != null) {
|
||||
Integer existingTenantId = dbExisting.getTenantId();
|
||||
rowItem.setId(dbExisting.getId());
|
||||
if (existingTenantId != null) {
|
||||
rowItem.setTenantId(existingTenantId);
|
||||
}
|
||||
return creditCustomerService.updateById(rowItem);
|
||||
}
|
||||
}
|
||||
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessages.isEmpty()) {
|
||||
return success("成功导入" + successCount + "条数据", null);
|
||||
} else {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditDeliveryNoticeController extends BaseController {
|
||||
@Resource
|
||||
private CreditDeliveryNoticeService creditDeliveryNoticeService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询送达公告司法大数据")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditDeliveryNotice>> 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<CreditDeliveryNotice> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditDeliveryNoticeService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditDeliveryNoticeService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditExternalController extends BaseController {
|
||||
@Resource
|
||||
private CreditExternalService creditExternalService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询对外投资")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditExternal>> 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<CreditExternal> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getName())
|
||||
.eq(CreditExternal::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditExternalService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditExternalService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditFinalVersionController extends BaseController {
|
||||
@Resource
|
||||
private CreditFinalVersionService creditFinalVersionService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询终本案件")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditFinalVersion>> 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<CreditFinalVersion> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditFinalVersionService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditFinalVersionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditGqdjController extends BaseController {
|
||||
@Resource
|
||||
private CreditGqdjService creditGqdjService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询股权冻结")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditGqdj>> 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<CreditGqdj> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditGqdjService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditGqdjService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
||||
@Resource
|
||||
private CreditHistoricalLegalPersonService creditHistoricalLegalPersonService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询历史法定代表人")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditHistoricalLegalPerson>> page(CreditHistoricalLegalPersonParam param) {
|
||||
@@ -158,6 +161,11 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "名称");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditHistoricalLegalPerson> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditHistoricalLegalPersonImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -194,24 +202,94 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean saved = creditHistoricalLegalPersonService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
// 批内一次查库:按 name in (...) 拉取,再按 registerDate 做内存匹配
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
}
|
||||
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
|
||||
? new ArrayList<>()
|
||||
: creditHistoricalLegalPersonService.lambdaQuery()
|
||||
.in(CreditHistoricalLegalPerson::getName, names)
|
||||
.list();
|
||||
|
||||
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
|
||||
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
|
||||
for (CreditHistoricalLegalPerson existing : existingList) {
|
||||
if (existing == null || ImportHelper.isBlank(existing.getName())) {
|
||||
continue;
|
||||
}
|
||||
String n = existing.getName().trim();
|
||||
byName.putIfAbsent(n, existing);
|
||||
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
|
||||
if (d != null) {
|
||||
byNameDate.putIfAbsent(n + "|" + d, existing);
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
|
||||
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
|
||||
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||
continue;
|
||||
}
|
||||
String n = it.getName().trim();
|
||||
CreditHistoricalLegalPerson existing;
|
||||
if (!ImportHelper.isBlank(it.getRegisterDate())) {
|
||||
String d = it.getRegisterDate().trim();
|
||||
existing = byNameDate.get(n + "|" + d);
|
||||
} else {
|
||||
existing = byName.get(n);
|
||||
}
|
||||
if (existing != null) {
|
||||
it.setId(existing.getId());
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
|
||||
.eq(CreditHistoricalLegalPerson::getName, item.getName())
|
||||
.eq(!ImportHelper.isBlank(item.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, item.getRegisterDate())
|
||||
.eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
|
||||
.eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditHistoricalLegalPersonService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditHistoricalLegalPersonService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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<String> names = new ArrayList<>(chunkItems.size());
|
||||
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
}
|
||||
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
|
||||
? new ArrayList<>()
|
||||
: creditHistoricalLegalPersonService.lambdaQuery()
|
||||
.in(CreditHistoricalLegalPerson::getName, names)
|
||||
.list();
|
||||
|
||||
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
|
||||
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
|
||||
for (CreditHistoricalLegalPerson existing : existingList) {
|
||||
if (existing == null || ImportHelper.isBlank(existing.getName())) {
|
||||
continue;
|
||||
}
|
||||
String n = existing.getName().trim();
|
||||
byName.putIfAbsent(n, existing);
|
||||
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
|
||||
if (d != null) {
|
||||
byNameDate.putIfAbsent(n + "|" + d, existing);
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
|
||||
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
|
||||
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||
continue;
|
||||
}
|
||||
String n = it.getName().trim();
|
||||
CreditHistoricalLegalPerson existing;
|
||||
if (!ImportHelper.isBlank(it.getRegisterDate())) {
|
||||
String d = it.getRegisterDate().trim();
|
||||
existing = byNameDate.get(n + "|" + d);
|
||||
} else {
|
||||
existing = byName.get(n);
|
||||
}
|
||||
if (existing != null) {
|
||||
it.setId(existing.getId());
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
|
||||
.eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
|
||||
.eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditHistoricalLegalPersonService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessages.isEmpty()) {
|
||||
return success("成功导入" + successCount + "条数据", null);
|
||||
} else {
|
||||
|
||||
@@ -47,6 +47,9 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
@Resource
|
||||
private CreditJudgmentDebtorService creditJudgmentDebtorService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询被执行人")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditJudgmentDebtor>> page(CreditJudgmentDebtorParam param) {
|
||||
@@ -280,6 +283,10 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
||||
|
||||
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditJudgmentDebtor> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditJudgmentDebtorImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -322,6 +329,51 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
}
|
||||
return new ImportOutcome(true, successCount, errorMessages);
|
||||
}
|
||||
|
||||
private int persistImportChunk(List<CreditJudgmentDebtor> items,
|
||||
List<Integer> excelRowNumbers,
|
||||
String prefix,
|
||||
int mpBatchSize,
|
||||
List<String> errorMessages) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
|
||||
creditJudgmentDebtorService,
|
||||
items,
|
||||
CreditJudgmentDebtor::getId,
|
||||
CreditJudgmentDebtor::setId,
|
||||
CreditJudgmentDebtor::getCaseNumber,
|
||||
CreditJudgmentDebtor::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
));
|
||||
} catch (Exception batchException) {
|
||||
int successCount = 0;
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
CreditJudgmentDebtor item = items.get(i);
|
||||
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
||||
try {
|
||||
int delta = batchImportSupport.runInNewTx(() -> {
|
||||
boolean saved = creditJudgmentDebtorService.save(item);
|
||||
if (!saved) {
|
||||
CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
|
||||
@@ -330,22 +382,25 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditJudgmentDebtorService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
if (delta > 0) {
|
||||
successCount += delta;
|
||||
} else {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return new ImportOutcome(true, successCount, errorMessages);
|
||||
return successCount;
|
||||
}
|
||||
}
|
||||
|
||||
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
||||
|
||||
@@ -47,6 +47,9 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
||||
@Resource
|
||||
private CreditJudgmentDebtorHistoryService creditJudgmentDebtorHistoryService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询被执行人")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditJudgmentDebtorHistory>> page(CreditJudgmentDebtorHistoryParam param) {
|
||||
@@ -275,6 +278,10 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
||||
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
||||
|
||||
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditJudgmentDebtorHistory> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditJudgmentDebtorHistoryImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -321,6 +328,51 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
}
|
||||
return new ImportOutcome(true, successCount, errorMessages);
|
||||
}
|
||||
|
||||
private int persistImportChunk(List<CreditJudgmentDebtorHistory> items,
|
||||
List<Integer> excelRowNumbers,
|
||||
String prefix,
|
||||
int mpBatchSize,
|
||||
List<String> errorMessages) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
|
||||
creditJudgmentDebtorHistoryService,
|
||||
items,
|
||||
CreditJudgmentDebtorHistory::getId,
|
||||
CreditJudgmentDebtorHistory::setId,
|
||||
CreditJudgmentDebtorHistory::getCaseNumber,
|
||||
CreditJudgmentDebtorHistory::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
));
|
||||
} catch (Exception batchException) {
|
||||
int successCount = 0;
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
CreditJudgmentDebtorHistory item = items.get(i);
|
||||
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
||||
try {
|
||||
int delta = batchImportSupport.runInNewTx(() -> {
|
||||
boolean saved = creditJudgmentDebtorHistoryService.save(item);
|
||||
if (!saved) {
|
||||
CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery()
|
||||
@@ -329,22 +381,25 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditJudgmentDebtorHistoryService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
if (delta > 0) {
|
||||
successCount += delta;
|
||||
} else {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return new ImportOutcome(true, successCount, errorMessages);
|
||||
return successCount;
|
||||
}
|
||||
}
|
||||
|
||||
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditJudicialDocumentController extends BaseController {
|
||||
@Resource
|
||||
private CreditJudicialDocumentService creditJudicialDocumentService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询裁判文书司法大数据")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditJudicialDocument>> 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<CreditJudicialDocument> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditJudicialDocumentService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditJudicialDocumentService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -41,6 +41,9 @@ public class CreditJudiciaryController extends BaseController {
|
||||
@Resource
|
||||
private CreditJudiciaryService creditJudiciaryService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询司法案件")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditJudiciary>> page(CreditJudiciaryParam param) {
|
||||
@@ -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<CreditJudiciary> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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(item.getName());
|
||||
CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditJudiciaryService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditJudiciaryService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditMediationController extends BaseController {
|
||||
@Resource
|
||||
private CreditMediationService creditMediationService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询诉前调解司法大数据")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditMediation>> 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<CreditMediation> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditMediationService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditMediationService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditNearbyCompanyController extends BaseController {
|
||||
@Resource
|
||||
private CreditNearbyCompanyService creditNearbyCompanyService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询附近企业")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditNearbyCompany>> page(CreditNearbyCompanyParam param) {
|
||||
@@ -250,18 +253,35 @@ public class CreditNearbyCompanyController extends BaseController {
|
||||
Integer tenantId,
|
||||
int mpBatchSize,
|
||||
List<String> errorMessages) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
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);
|
||||
}
|
||||
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 {
|
||||
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()
|
||||
@@ -275,29 +295,18 @@ public class CreditNearbyCompanyController extends BaseController {
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditNearbyCompanyService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
return successCount;
|
||||
return true;
|
||||
}
|
||||
String prefix = excelRowNumber > 0 ? ("第" + excelRowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditPatentController extends BaseController {
|
||||
@Resource
|
||||
private CreditPatentService creditPatentService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询专利")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditPatent>> page(CreditPatentParam param) {
|
||||
@@ -159,6 +162,11 @@ public class CreditPatentController extends BaseController {
|
||||
Map<String, String> urlByRegisterNo = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "申请号");
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "发明名称");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditPatent> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditPatentImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -199,23 +207,46 @@ public class CreditPatentController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean saved = creditPatentService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
creditPatentService,
|
||||
chunkItems,
|
||||
CreditPatent::getId,
|
||||
CreditPatent::setId,
|
||||
CreditPatent::getRegisterNo,
|
||||
CreditPatent::getRegisterNo,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditPatentService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditPatent existing = creditPatentService.lambdaQuery()
|
||||
.eq(CreditPatent::getRegisterNo, item.getRegisterNo())
|
||||
.eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditPatentService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditPatentService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditRiskRelationController extends BaseController {
|
||||
@Resource
|
||||
private CreditRiskRelationService creditRiskRelationService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询风险关系表")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditRiskRelation>> 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<CreditRiskRelation> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getMainBodyName())
|
||||
.eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditRiskRelationService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditRiskRelationService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditSupplierController extends BaseController {
|
||||
@Resource
|
||||
private CreditSupplierService creditSupplierService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询供应商")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditSupplier>> 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<CreditSupplier> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getSupplier())
|
||||
.eq(CreditSupplier::getSupplier, rowItem.getSupplier())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditSupplierService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditSupplierService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -38,6 +38,9 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
||||
@Resource
|
||||
private CreditSuspectedRelationshipService creditSuspectedRelationshipService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询疑似关系")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditSuspectedRelationship>> page(CreditSuspectedRelationshipParam param) {
|
||||
@@ -158,6 +161,11 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "企业名称");
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditSuspectedRelationship> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditSuspectedRelationshipImportParam param = list.get(i);
|
||||
try {
|
||||
@@ -198,25 +206,107 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean saved = creditSuspectedRelationshipService.save(item);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
List<String> relatedParties = new ArrayList<>(chunkItems.size());
|
||||
for (CreditSuspectedRelationship it : chunkItems) {
|
||||
if (it == null) {
|
||||
continue;
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getRelatedParty())) {
|
||||
relatedParties.add(it.getRelatedParty().trim());
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditSuspectedRelationship> existingList = (names.isEmpty() || relatedParties.isEmpty())
|
||||
? new ArrayList<>()
|
||||
: creditSuspectedRelationshipService.lambdaQuery()
|
||||
.in(CreditSuspectedRelationship::getName, names)
|
||||
.in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
|
||||
.list();
|
||||
|
||||
java.util.Map<String, CreditSuspectedRelationship> byNameRelated = new java.util.HashMap<>();
|
||||
java.util.Map<String, CreditSuspectedRelationship> byNameRelatedType = new java.util.HashMap<>();
|
||||
for (CreditSuspectedRelationship existing : existingList) {
|
||||
if (existing == null
|
||||
|| ImportHelper.isBlank(existing.getName())
|
||||
|| ImportHelper.isBlank(existing.getRelatedParty())) {
|
||||
continue;
|
||||
}
|
||||
String n = existing.getName().trim();
|
||||
String r = existing.getRelatedParty().trim();
|
||||
byNameRelated.putIfAbsent(n + "|" + r, existing);
|
||||
if (!ImportHelper.isBlank(existing.getType())) {
|
||||
byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditSuspectedRelationship> updates = new ArrayList<>();
|
||||
List<CreditSuspectedRelationship> inserts = new ArrayList<>();
|
||||
for (CreditSuspectedRelationship it : chunkItems) {
|
||||
if (it == null
|
||||
|| ImportHelper.isBlank(it.getName())
|
||||
|| ImportHelper.isBlank(it.getRelatedParty())) {
|
||||
continue;
|
||||
}
|
||||
String n = it.getName().trim();
|
||||
String r = it.getRelatedParty().trim();
|
||||
CreditSuspectedRelationship existing;
|
||||
if (!ImportHelper.isBlank(it.getType())) {
|
||||
existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
|
||||
} else {
|
||||
existing = byNameRelated.get(n + "|" + r);
|
||||
}
|
||||
if (existing != null) {
|
||||
it.setId(existing.getId());
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditSuspectedRelationshipService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditSuspectedRelationshipService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
|
||||
.eq(CreditSuspectedRelationship::getName, item.getName())
|
||||
.eq(CreditSuspectedRelationship::getRelatedParty, item.getRelatedParty())
|
||||
.eq(!ImportHelper.isBlank(item.getType()), CreditSuspectedRelationship::getType, item.getType())
|
||||
.eq(CreditSuspectedRelationship::getName, rowItem.getName())
|
||||
.eq(CreditSuspectedRelationship::getRelatedParty, rowItem.getRelatedParty())
|
||||
.eq(!ImportHelper.isBlank(rowItem.getType()), CreditSuspectedRelationship::getType, rowItem.getType())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditSuspectedRelationshipService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditSuspectedRelationshipService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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<String> names = new ArrayList<>(chunkItems.size());
|
||||
List<String> relatedParties = new ArrayList<>(chunkItems.size());
|
||||
for (CreditSuspectedRelationship it : chunkItems) {
|
||||
if (it == null) {
|
||||
continue;
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getRelatedParty())) {
|
||||
relatedParties.add(it.getRelatedParty().trim());
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditSuspectedRelationship> existingList = (names.isEmpty() || relatedParties.isEmpty())
|
||||
? new ArrayList<>()
|
||||
: creditSuspectedRelationshipService.lambdaQuery()
|
||||
.in(CreditSuspectedRelationship::getName, names)
|
||||
.in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
|
||||
.list();
|
||||
|
||||
java.util.Map<String, CreditSuspectedRelationship> byNameRelated = new java.util.HashMap<>();
|
||||
java.util.Map<String, CreditSuspectedRelationship> byNameRelatedType = new java.util.HashMap<>();
|
||||
for (CreditSuspectedRelationship existing : existingList) {
|
||||
if (existing == null
|
||||
|| ImportHelper.isBlank(existing.getName())
|
||||
|| ImportHelper.isBlank(existing.getRelatedParty())) {
|
||||
continue;
|
||||
}
|
||||
String n = existing.getName().trim();
|
||||
String r = existing.getRelatedParty().trim();
|
||||
byNameRelated.putIfAbsent(n + "|" + r, existing);
|
||||
if (!ImportHelper.isBlank(existing.getType())) {
|
||||
byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditSuspectedRelationship> updates = new ArrayList<>();
|
||||
List<CreditSuspectedRelationship> inserts = new ArrayList<>();
|
||||
for (CreditSuspectedRelationship it : chunkItems) {
|
||||
if (it == null
|
||||
|| ImportHelper.isBlank(it.getName())
|
||||
|| ImportHelper.isBlank(it.getRelatedParty())) {
|
||||
continue;
|
||||
}
|
||||
String n = it.getName().trim();
|
||||
String r = it.getRelatedParty().trim();
|
||||
CreditSuspectedRelationship existing;
|
||||
if (!ImportHelper.isBlank(it.getType())) {
|
||||
existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
|
||||
} else {
|
||||
existing = byNameRelated.get(n + "|" + r);
|
||||
}
|
||||
if (existing != null) {
|
||||
it.setId(existing.getId());
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditSuspectedRelationshipService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditSuspectedRelationshipService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
|
||||
.eq(CreditSuspectedRelationship::getName, rowItem.getName())
|
||||
.eq(CreditSuspectedRelationship::getRelatedParty, rowItem.getRelatedParty())
|
||||
.eq(!ImportHelper.isBlank(rowItem.getType()), CreditSuspectedRelationship::getType, rowItem.getType())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditSuspectedRelationshipService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessages.isEmpty()) {
|
||||
return success("成功导入" + successCount + "条数据", null);
|
||||
} else {
|
||||
|
||||
@@ -54,6 +54,9 @@ public class CreditUserController extends BaseController {
|
||||
@Resource
|
||||
private CreditUserService creditUserService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询招投标信息表")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditUser>> page(CreditUserParam param) {
|
||||
@@ -177,6 +180,11 @@ public class CreditUserController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<Integer, String> urlMap = readNameHyperlinks(file, sheetIndex, usedTitleRows, usedHeadRows);
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditUser> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
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 + "行:更新成功");
|
||||
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;
|
||||
}
|
||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
||||
}
|
||||
} 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) {
|
||||
|
||||
@@ -37,6 +37,9 @@ public class CreditXgxfController extends BaseController {
|
||||
@Resource
|
||||
private CreditXgxfService creditXgxfService;
|
||||
|
||||
@Resource
|
||||
private BatchImportSupport batchImportSupport;
|
||||
|
||||
@Operation(summary = "分页查询限制高消费")
|
||||
@GetMapping("/page")
|
||||
public ApiResult<PageResult<CreditXgxf>> 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<CreditXgxf> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> 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);
|
||||
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, item.getCaseNumber())
|
||||
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditXgxfService.updateById(item)) {
|
||||
successCount++;
|
||||
continue;
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditXgxfService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
successCount++;
|
||||
continue;
|
||||
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 {
|
||||
|
||||
@@ -39,24 +39,4 @@ public interface CreditNearbyCompanyService extends IService<CreditNearbyCompany
|
||||
*/
|
||||
CreditNearbyCompany getByIdRel(Integer id);
|
||||
|
||||
/**
|
||||
* 导入用:按给定维度(companyId/parentId/type/tenantId)批量 upsert,避免逐行写库导致数据库压力过大。
|
||||
* <p>
|
||||
* 规则:优先按 code 匹配;code 为空时按 name 匹配。
|
||||
*
|
||||
* @param items 待写入数据(需保证 name/code 已做基础清洗/默认值填充)
|
||||
* @param companyId 企业ID(可空)
|
||||
* @param parentId 上级ID(可空)
|
||||
* @param type 类型(可空)
|
||||
* @param tenantId 租户ID(可空)
|
||||
* @param batchSize MyBatis-Plus 批处理大小
|
||||
* @return 本次写入成功的条数(插入 + 更新)
|
||||
*/
|
||||
int importUpsertChunk(List<CreditNearbyCompany> items,
|
||||
Integer companyId,
|
||||
Integer parentId,
|
||||
Integer type,
|
||||
Integer tenantId,
|
||||
int batchSize);
|
||||
|
||||
}
|
||||
|
||||
@@ -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<CreditNearbyComp
|
||||
return param.getOne(baseMapper.selectListRel(param));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
|
||||
public int importUpsertChunk(List<CreditNearbyCompany> items,
|
||||
Integer companyId,
|
||||
Integer parentId,
|
||||
Integer type,
|
||||
Integer tenantId,
|
||||
int batchSize) {
|
||||
if (items == null || items.isEmpty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
List<CreditNearbyCompany> updates = new ArrayList<>();
|
||||
List<CreditNearbyCompany> inserts = new ArrayList<>();
|
||||
|
||||
List<String> codes = new ArrayList<>();
|
||||
List<String> names = new ArrayList<>();
|
||||
|
||||
for (CreditNearbyCompany item : items) {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
if (item.getCode() != null) {
|
||||
item.setCode(item.getCode().trim());
|
||||
}
|
||||
if (item.getName() != null) {
|
||||
item.setName(item.getName().trim());
|
||||
}
|
||||
|
||||
if (item.getCode() != null && !item.getCode().isEmpty()) {
|
||||
codes.add(item.getCode());
|
||||
} else if (item.getName() != null && !item.getName().isEmpty()) {
|
||||
names.add(item.getName());
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, CreditNearbyCompany> existingByCode = new HashMap<>();
|
||||
Map<String, CreditNearbyCompany> existingByName = new HashMap<>();
|
||||
|
||||
if (!codes.isEmpty()) {
|
||||
LambdaQueryWrapper<CreditNearbyCompany> wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId);
|
||||
wrapper.in(CreditNearbyCompany::getCode, codes);
|
||||
wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getCode);
|
||||
List<CreditNearbyCompany> existingList = list(wrapper);
|
||||
for (CreditNearbyCompany existing : existingList) {
|
||||
if (existing.getCode() != null) {
|
||||
existingByCode.putIfAbsent(existing.getCode().trim(), existing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!names.isEmpty()) {
|
||||
LambdaQueryWrapper<CreditNearbyCompany> wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId);
|
||||
wrapper.in(CreditNearbyCompany::getName, names);
|
||||
wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getName);
|
||||
List<CreditNearbyCompany> existingList = list(wrapper);
|
||||
for (CreditNearbyCompany existing : existingList) {
|
||||
if (existing.getName() != null) {
|
||||
existingByName.putIfAbsent(existing.getName().trim(), existing);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (CreditNearbyCompany item : items) {
|
||||
if (item == null) {
|
||||
continue;
|
||||
}
|
||||
CreditNearbyCompany existing = null;
|
||||
if (item.getCode() != null && !item.getCode().isEmpty()) {
|
||||
existing = existingByCode.get(item.getCode());
|
||||
} else if (item.getName() != null && !item.getName().isEmpty()) {
|
||||
existing = existingByName.get(item.getName());
|
||||
}
|
||||
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
updates.add(item);
|
||||
} else {
|
||||
inserts.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (!updates.isEmpty()) {
|
||||
// 直接按主键批量更新,避免 saveOrUpdateBatch 产生额外的存在性查询
|
||||
updateBatchById(updates, batchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
saveBatch(inserts, batchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CreditNearbyCompany> buildImportKeyWrapper(Integer companyId,
|
||||
Integer parentId,
|
||||
Integer type,
|
||||
Integer tenantId) {
|
||||
LambdaQueryWrapper<CreditNearbyCompany> wrapper = new LambdaQueryWrapper<>();
|
||||
if (companyId != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
|
||||
}
|
||||
if (parentId != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getParentId, parentId);
|
||||
}
|
||||
if (type != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getType, type);
|
||||
}
|
||||
if (tenantId != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
|
||||
}
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user