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
|
@Resource
|
||||||
private CreditAdministrativeLicenseService creditAdministrativeLicenseService;
|
private CreditAdministrativeLicenseService creditAdministrativeLicenseService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询行政许可")
|
@Operation(summary = "分页查询行政许可")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditAdministrativeLicense>> page(CreditAdministrativeLicenseParam param) {
|
public ApiResult<PageResult<CreditAdministrativeLicense>> page(CreditAdministrativeLicenseParam param) {
|
||||||
@@ -159,6 +162,11 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
|||||||
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号");
|
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号");
|
||||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称");
|
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditAdministrativeLicense> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditAdministrativeLicenseImportParam param = list.get(i);
|
CreditAdministrativeLicenseImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -199,31 +207,56 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditAdministrativeLicenseService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertByCodeOrName(
|
||||||
|
creditAdministrativeLicenseService,
|
||||||
|
chunkItems,
|
||||||
|
CreditAdministrativeLicense::getId,
|
||||||
|
CreditAdministrativeLicense::setId,
|
||||||
|
CreditAdministrativeLicense::getCode,
|
||||||
|
CreditAdministrativeLicense::getCode,
|
||||||
|
CreditAdministrativeLicense::getName,
|
||||||
|
CreditAdministrativeLicense::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditAdministrativeLicenseService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditAdministrativeLicense existing = null;
|
CreditAdministrativeLicense existing = null;
|
||||||
if (!ImportHelper.isBlank(item.getCode())) {
|
if (!ImportHelper.isBlank(rowItem.getCode())) {
|
||||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||||
.eq(CreditAdministrativeLicense::getCode, item.getCode())
|
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
|
||||||
.one();
|
.one();
|
||||||
}
|
}
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||||
.eq(CreditAdministrativeLicense::getName, item.getName())
|
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
|
||||||
.one();
|
.one();
|
||||||
}
|
}
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditAdministrativeLicenseService.updateById(item)) {
|
if (creditAdministrativeLicenseService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -231,6 +264,53 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertByCodeOrName(
|
||||||
|
creditAdministrativeLicenseService,
|
||||||
|
chunkItems,
|
||||||
|
CreditAdministrativeLicense::getId,
|
||||||
|
CreditAdministrativeLicense::setId,
|
||||||
|
CreditAdministrativeLicense::getCode,
|
||||||
|
CreditAdministrativeLicense::getCode,
|
||||||
|
CreditAdministrativeLicense::getName,
|
||||||
|
CreditAdministrativeLicense::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditAdministrativeLicenseService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditAdministrativeLicense existing = null;
|
||||||
|
if (!ImportHelper.isBlank(rowItem.getCode())) {
|
||||||
|
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||||
|
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
|
||||||
|
.one();
|
||||||
|
}
|
||||||
|
if (existing == null) {
|
||||||
|
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||||
|
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
|
||||||
|
.one();
|
||||||
|
}
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditAdministrativeLicenseService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditBankruptcyController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditBankruptcyService creditBankruptcyService;
|
private CreditBankruptcyService creditBankruptcyService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询破产重整")
|
@Operation(summary = "分页查询破产重整")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditBankruptcy>> page(CreditBankruptcyParam param) {
|
public ApiResult<PageResult<CreditBankruptcy>> page(CreditBankruptcyParam param) {
|
||||||
@@ -158,6 +161,11 @@ public class CreditBankruptcyController extends BaseController {
|
|||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditBankruptcy> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditBankruptcyImportParam param = list.get(i);
|
CreditBankruptcyImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -194,23 +202,46 @@ public class CreditBankruptcyController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditBankruptcyService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditBankruptcyService,
|
||||||
|
chunkItems,
|
||||||
|
CreditBankruptcy::getId,
|
||||||
|
CreditBankruptcy::setId,
|
||||||
|
CreditBankruptcy::getCode,
|
||||||
|
CreditBankruptcy::getCode,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditBankruptcyService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
||||||
.eq(CreditBankruptcy::getCode, item.getCode())
|
.eq(CreditBankruptcy::getCode, rowItem.getCode())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditBankruptcyService.updateById(item)) {
|
if (creditBankruptcyService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -218,6 +249,43 @@ public class CreditBankruptcyController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditBankruptcyService,
|
||||||
|
chunkItems,
|
||||||
|
CreditBankruptcy::getId,
|
||||||
|
CreditBankruptcy::setId,
|
||||||
|
CreditBankruptcy::getCode,
|
||||||
|
CreditBankruptcy::getCode,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditBankruptcyService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
||||||
|
.eq(CreditBankruptcy::getCode, rowItem.getCode())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditBankruptcyService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditBranchController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditBranchService creditBranchService;
|
private CreditBranchService creditBranchService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询分支机构")
|
@Operation(summary = "分页查询分支机构")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditBranch>> page(CreditBranchParam param) {
|
public ApiResult<PageResult<CreditBranch>> page(CreditBranchParam param) {
|
||||||
@@ -158,6 +161,11 @@ public class CreditBranchController extends BaseController {
|
|||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "分支机构名称");
|
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "分支机构名称");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditBranch> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditBranchImportParam param = list.get(i);
|
CreditBranchImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -194,23 +202,46 @@ public class CreditBranchController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditBranchService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditBranchService,
|
||||||
|
chunkItems,
|
||||||
|
CreditBranch::getId,
|
||||||
|
CreditBranch::setId,
|
||||||
|
CreditBranch::getName,
|
||||||
|
CreditBranch::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditBranchService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditBranch existing = creditBranchService.lambdaQuery()
|
CreditBranch existing = creditBranchService.lambdaQuery()
|
||||||
.eq(CreditBranch::getName, item.getName())
|
.eq(CreditBranch::getName, rowItem.getName())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditBranchService.updateById(item)) {
|
if (creditBranchService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -218,6 +249,43 @@ public class CreditBranchController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditBranchService,
|
||||||
|
chunkItems,
|
||||||
|
CreditBranch::getId,
|
||||||
|
CreditBranch::setId,
|
||||||
|
CreditBranch::getName,
|
||||||
|
CreditBranch::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditBranchService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditBranch existing = creditBranchService.lambdaQuery()
|
||||||
|
.eq(CreditBranch::getName, rowItem.getName())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditBranchService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditBreachOfTrustController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditBreachOfTrustService creditBreachOfTrustService;
|
private CreditBreachOfTrustService creditBreachOfTrustService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询失信被执行人")
|
@Operation(summary = "分页查询失信被执行人")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditBreachOfTrust>> page(CreditBreachOfTrustParam param) {
|
public ApiResult<PageResult<CreditBreachOfTrust>> page(CreditBreachOfTrustParam param) {
|
||||||
@@ -151,6 +154,11 @@ public class CreditBreachOfTrustController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditBreachOfTrust> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -181,23 +189,46 @@ public class CreditBreachOfTrustController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditBreachOfTrustService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditBreachOfTrustService,
|
||||||
|
chunkItems,
|
||||||
|
CreditBreachOfTrust::getId,
|
||||||
|
CreditBreachOfTrust::setId,
|
||||||
|
CreditBreachOfTrust::getCaseNumber,
|
||||||
|
CreditBreachOfTrust::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditBreachOfTrustService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
|
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
|
||||||
.eq(CreditBreachOfTrust::getCaseNumber, item.getCaseNumber())
|
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditBreachOfTrustService.updateById(item)) {
|
if (creditBreachOfTrustService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -205,6 +236,43 @@ public class CreditBreachOfTrustController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditBreachOfTrustService,
|
||||||
|
chunkItems,
|
||||||
|
CreditBreachOfTrust::getId,
|
||||||
|
CreditBreachOfTrust::setId,
|
||||||
|
CreditBreachOfTrust::getCaseNumber,
|
||||||
|
CreditBreachOfTrust::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditBreachOfTrustService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
|
||||||
|
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditBreachOfTrustService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditCaseFilingController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditCaseFilingService creditCaseFilingService;
|
private CreditCaseFilingService creditCaseFilingService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询司法大数据")
|
@Operation(summary = "分页查询司法大数据")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditCaseFiling>> page(CreditCaseFilingParam param) {
|
public ApiResult<PageResult<CreditCaseFiling>> page(CreditCaseFilingParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditCaseFilingController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditCaseFiling> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditCaseFilingController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditCaseFilingService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCaseFilingService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCaseFiling::getId,
|
||||||
|
CreditCaseFiling::setId,
|
||||||
|
CreditCaseFiling::getCaseNumber,
|
||||||
|
CreditCaseFiling::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCaseFilingService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
|
CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
|
||||||
.eq(CreditCaseFiling::getCaseNumber, item.getCaseNumber())
|
.eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditCaseFilingService.updateById(item)) {
|
if (creditCaseFilingService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditCaseFilingController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCaseFilingService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCaseFiling::getId,
|
||||||
|
CreditCaseFiling::setId,
|
||||||
|
CreditCaseFiling::getCaseNumber,
|
||||||
|
CreditCaseFiling::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCaseFilingService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
|
||||||
|
.eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditCaseFilingService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -42,6 +42,9 @@ public class CreditCompanyController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditCompanyService creditCompanyService;
|
private CreditCompanyService creditCompanyService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询企业")
|
@Operation(summary = "分页查询企业")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditCompany>> page(CreditCompanyParam param) {
|
public ApiResult<PageResult<CreditCompany>> page(CreditCompanyParam param) {
|
||||||
@@ -164,6 +167,11 @@ public class CreditCompanyController extends BaseController {
|
|||||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "原文件导入名称");
|
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "原文件导入名称");
|
||||||
Map<String, String> urlByMatchName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "系统匹配企业名称");
|
Map<String, String> urlByMatchName = ExcelImportSupport.readHyperlinksByHeaderKey(file, 0, usedTitleRows, usedHeadRows, "系统匹配企业名称");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditCompany> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditCompanyImportParam param = list.get(i);
|
CreditCompanyImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -206,21 +214,43 @@ public class CreditCompanyController extends BaseController {
|
|||||||
// continue;
|
// continue;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
boolean saved = creditCompanyService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCompanyService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCompany::getId,
|
||||||
|
CreditCompany::setId,
|
||||||
|
CreditCompany::getMatchName,
|
||||||
|
CreditCompany::getMatchName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCompanyService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditCompany existing = creditCompanyService.getByMatchName(item.getName());
|
CreditCompany existing = creditCompanyService.getByMatchName(rowItem.getMatchName());
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditCompanyService.updateById(item)) {
|
if (creditCompanyService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -228,6 +258,40 @@ public class CreditCompanyController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCompanyService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCompany::getId,
|
||||||
|
CreditCompany::setId,
|
||||||
|
CreditCompany::getMatchName,
|
||||||
|
CreditCompany::getMatchName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCompanyService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditCompany existing = creditCompanyService.getByMatchName(rowItem.getMatchName());
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditCompanyService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditCompetitorController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditCompetitorService creditCompetitorService;
|
private CreditCompetitorService creditCompetitorService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询竞争对手")
|
@Operation(summary = "分页查询竞争对手")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditCompetitor>> page(CreditCompetitorParam param) {
|
public ApiResult<PageResult<CreditCompetitor>> page(CreditCompetitorParam param) {
|
||||||
@@ -156,6 +159,11 @@ public class CreditCompetitorController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditCompetitor> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditCompetitorImportParam param = list.get(i);
|
CreditCompetitorImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -186,23 +194,46 @@ public class CreditCompetitorController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditCompetitorService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCompetitorService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCompetitor::getId,
|
||||||
|
CreditCompetitor::setId,
|
||||||
|
CreditCompetitor::getCompanyName,
|
||||||
|
CreditCompetitor::getCompanyName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCompetitorService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
|
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
|
||||||
.eq(CreditCompetitor::getCompanyName, item.getCompanyName())
|
.eq(CreditCompetitor::getCompanyName, rowItem.getCompanyName())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditCompetitorService.updateById(item)) {
|
if (creditCompetitorService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -210,6 +241,43 @@ public class CreditCompetitorController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCompetitorService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCompetitor::getId,
|
||||||
|
CreditCompetitor::setId,
|
||||||
|
CreditCompetitor::getCompanyName,
|
||||||
|
CreditCompetitor::getCompanyName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCompetitorService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
|
||||||
|
.eq(CreditCompetitor::getCompanyName, rowItem.getCompanyName())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditCompetitorService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditCourtAnnouncementController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditCourtAnnouncementService creditCourtAnnouncementService;
|
private CreditCourtAnnouncementService creditCourtAnnouncementService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询法院公告司法大数据")
|
@Operation(summary = "分页查询法院公告司法大数据")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditCourtAnnouncement>> page(CreditCourtAnnouncementParam param) {
|
public ApiResult<PageResult<CreditCourtAnnouncement>> page(CreditCourtAnnouncementParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditCourtAnnouncementController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditCourtAnnouncement> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditCourtAnnouncementController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditCourtAnnouncementService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCourtAnnouncementService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCourtAnnouncement::getId,
|
||||||
|
CreditCourtAnnouncement::setId,
|
||||||
|
CreditCourtAnnouncement::getCaseNumber,
|
||||||
|
CreditCourtAnnouncement::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCourtAnnouncementService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
|
CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
|
||||||
.eq(CreditCourtAnnouncement::getCaseNumber, item.getCaseNumber())
|
.eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditCourtAnnouncementService.updateById(item)) {
|
if (creditCourtAnnouncementService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditCourtAnnouncementController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCourtAnnouncementService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCourtAnnouncement::getId,
|
||||||
|
CreditCourtAnnouncement::setId,
|
||||||
|
CreditCourtAnnouncement::getCaseNumber,
|
||||||
|
CreditCourtAnnouncement::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCourtAnnouncementService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
|
||||||
|
.eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditCourtAnnouncementService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditCourtSessionController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditCourtSessionService creditCourtSessionService;
|
private CreditCourtSessionService creditCourtSessionService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询开庭公告司法大数据")
|
@Operation(summary = "分页查询开庭公告司法大数据")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditCourtSession>> page(CreditCourtSessionParam param) {
|
public ApiResult<PageResult<CreditCourtSession>> page(CreditCourtSessionParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditCourtSessionController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditCourtSession> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditCourtSessionController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditCourtSessionService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCourtSessionService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCourtSession::getId,
|
||||||
|
CreditCourtSession::setId,
|
||||||
|
CreditCourtSession::getCaseNumber,
|
||||||
|
CreditCourtSession::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCourtSessionService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
|
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
|
||||||
.eq(CreditCourtSession::getCaseNumber, item.getCaseNumber())
|
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditCourtSessionService.updateById(item)) {
|
if (creditCourtSessionService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditCourtSessionController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditCourtSessionService,
|
||||||
|
chunkItems,
|
||||||
|
CreditCourtSession::getId,
|
||||||
|
CreditCourtSession::setId,
|
||||||
|
CreditCourtSession::getCaseNumber,
|
||||||
|
CreditCourtSession::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditCourtSessionService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
|
||||||
|
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditCourtSessionService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditCustomerController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditCustomerService creditCustomerService;
|
private CreditCustomerService creditCustomerService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询客户")
|
@Operation(summary = "分页查询客户")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditCustomer>> page(CreditCustomerParam param) {
|
public ApiResult<PageResult<CreditCustomer>> page(CreditCustomerParam param) {
|
||||||
@@ -152,6 +155,11 @@ public class CreditCustomerController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditCustomer> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditCustomerImportParam param = list.get(i);
|
CreditCustomerImportParam param = list.get(i);
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
@@ -182,58 +190,239 @@ public class CreditCustomerController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> {
|
||||||
|
// 批内一次查库,避免逐行查/写导致数据库压力过大
|
||||||
|
List<String> names = new ArrayList<>(chunkItems.size());
|
||||||
|
for (CreditCustomer it : chunkItems) {
|
||||||
|
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||||
|
names.add(it.getName().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<CreditCustomer> existingList = names.isEmpty()
|
||||||
|
? new ArrayList<>()
|
||||||
|
: creditCustomerService.lambdaQuery()
|
||||||
|
.in(CreditCustomer::getName, names)
|
||||||
|
.list();
|
||||||
|
java.util.Map<String, CreditCustomer> existingByName = new java.util.HashMap<>();
|
||||||
|
for (CreditCustomer existing : existingList) {
|
||||||
|
if (existing != null && !ImportHelper.isBlank(existing.getName())) {
|
||||||
|
existingByName.putIfAbsent(existing.getName().trim(), existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
java.util.Map<String, CreditCustomer> latestByName = new java.util.HashMap<>();
|
||||||
|
int acceptedRows = 0;
|
||||||
|
for (int idx = 0; idx < chunkItems.size(); idx++) {
|
||||||
|
CreditCustomer it = chunkItems.get(idx);
|
||||||
|
int rowNo = (idx < chunkRowNumbers.size()) ? chunkRowNumbers.get(idx) : -1;
|
||||||
|
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String name = it.getName().trim();
|
||||||
|
CreditCustomer existing = existingByName.get(name);
|
||||||
|
if (existing != null) {
|
||||||
|
Integer existingTenantId = existing.getTenantId();
|
||||||
|
if (it.getTenantId() != null
|
||||||
|
&& existingTenantId != null
|
||||||
|
&& !it.getTenantId().equals(existingTenantId)) {
|
||||||
|
errorMessages.add("第" + rowNo + "行:客户名称已存在且归属其他租户,无法导入");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
it.setId(existing.getId());
|
||||||
|
if (existingTenantId != null) {
|
||||||
|
it.setTenantId(existingTenantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 同名多行:保留最后一行的值(等价于“先插入/更新,再被后续行更新”)
|
||||||
|
latestByName.put(name, it);
|
||||||
|
acceptedRows++;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditCustomer> updates = new ArrayList<>();
|
||||||
|
List<CreditCustomer> inserts = new ArrayList<>();
|
||||||
|
for (CreditCustomer it : latestByName.values()) {
|
||||||
|
if (it.getId() != null) {
|
||||||
|
updates.add(it);
|
||||||
|
} else {
|
||||||
|
inserts.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
creditCustomerService.updateBatchById(updates, mpBatchSize);
|
||||||
|
}
|
||||||
|
if (!inserts.isEmpty()) {
|
||||||
|
creditCustomerService.saveBatch(inserts, mpBatchSize);
|
||||||
|
}
|
||||||
|
return acceptedRows;
|
||||||
|
},
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
CreditCustomer existing = creditCustomerService.lambdaQuery()
|
CreditCustomer existing = creditCustomerService.lambdaQuery()
|
||||||
.eq(CreditCustomer::getName, item.getName())
|
.eq(CreditCustomer::getName, rowItem.getName())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
Integer existingTenantId = existing.getTenantId();
|
Integer existingTenantId = existing.getTenantId();
|
||||||
if (item.getTenantId() != null
|
if (rowItem.getTenantId() != null
|
||||||
&& existingTenantId != null
|
&& existingTenantId != null
|
||||||
&& !item.getTenantId().equals(existingTenantId)) {
|
&& !rowItem.getTenantId().equals(existingTenantId)) {
|
||||||
errorMessages.add("第" + excelRowNumber + "行:客户名称已存在且归属其他租户,无法导入");
|
errorMessages.add("第" + rowNumber + "行:客户名称已存在且归属其他租户,无法导入");
|
||||||
continue;
|
return false;
|
||||||
}
|
}
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (existingTenantId != null) {
|
if (existingTenantId != null) {
|
||||||
item.setTenantId(existingTenantId);
|
rowItem.setTenantId(existingTenantId);
|
||||||
}
|
}
|
||||||
if (creditCustomerService.updateById(item)) {
|
return creditCustomerService.updateById(rowItem);
|
||||||
successCount++;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
try {
|
try {
|
||||||
if (creditCustomerService.save(item)) {
|
return creditCustomerService.save(rowItem);
|
||||||
successCount++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
} catch (DataIntegrityViolationException e) {
|
} catch (DataIntegrityViolationException e) {
|
||||||
if (!isDuplicateCustomerName(e)) {
|
if (!isDuplicateCustomerName(e)) {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
CreditCustomer dbExisting = creditCustomerService.lambdaQuery()
|
CreditCustomer dbExisting = creditCustomerService.lambdaQuery()
|
||||||
.eq(CreditCustomer::getName, item.getName())
|
.eq(CreditCustomer::getName, rowItem.getName())
|
||||||
.one();
|
.one();
|
||||||
if (dbExisting != null) {
|
if (dbExisting != null) {
|
||||||
Integer existingTenantId = dbExisting.getTenantId();
|
Integer existingTenantId = dbExisting.getTenantId();
|
||||||
item.setId(dbExisting.getId());
|
rowItem.setId(dbExisting.getId());
|
||||||
if (existingTenantId != null) {
|
if (existingTenantId != null) {
|
||||||
item.setTenantId(existingTenantId);
|
rowItem.setTenantId(existingTenantId);
|
||||||
}
|
}
|
||||||
if (creditCustomerService.updateById(item)) {
|
return creditCustomerService.updateById(rowItem);
|
||||||
successCount++;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> {
|
||||||
|
List<String> names = new ArrayList<>(chunkItems.size());
|
||||||
|
for (CreditCustomer it : chunkItems) {
|
||||||
|
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||||
|
names.add(it.getName().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<CreditCustomer> existingList = names.isEmpty()
|
||||||
|
? new ArrayList<>()
|
||||||
|
: creditCustomerService.lambdaQuery()
|
||||||
|
.in(CreditCustomer::getName, names)
|
||||||
|
.list();
|
||||||
|
java.util.Map<String, CreditCustomer> existingByName = new java.util.HashMap<>();
|
||||||
|
for (CreditCustomer existing : existingList) {
|
||||||
|
if (existing != null && !ImportHelper.isBlank(existing.getName())) {
|
||||||
|
existingByName.putIfAbsent(existing.getName().trim(), existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
java.util.Map<String, CreditCustomer> latestByName = new java.util.HashMap<>();
|
||||||
|
int acceptedRows = 0;
|
||||||
|
for (int idx = 0; idx < chunkItems.size(); idx++) {
|
||||||
|
CreditCustomer it = chunkItems.get(idx);
|
||||||
|
int rowNo = (idx < chunkRowNumbers.size()) ? chunkRowNumbers.get(idx) : -1;
|
||||||
|
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String name = it.getName().trim();
|
||||||
|
CreditCustomer existing = existingByName.get(name);
|
||||||
|
if (existing != null) {
|
||||||
|
Integer existingTenantId = existing.getTenantId();
|
||||||
|
if (it.getTenantId() != null
|
||||||
|
&& existingTenantId != null
|
||||||
|
&& !it.getTenantId().equals(existingTenantId)) {
|
||||||
|
errorMessages.add("第" + rowNo + "行:客户名称已存在且归属其他租户,无法导入");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
it.setId(existing.getId());
|
||||||
|
if (existingTenantId != null) {
|
||||||
|
it.setTenantId(existingTenantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
latestByName.put(name, it);
|
||||||
|
acceptedRows++;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditCustomer> updates = new ArrayList<>();
|
||||||
|
List<CreditCustomer> inserts = new ArrayList<>();
|
||||||
|
for (CreditCustomer it : latestByName.values()) {
|
||||||
|
if (it.getId() != null) {
|
||||||
|
updates.add(it);
|
||||||
|
} else {
|
||||||
|
inserts.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
creditCustomerService.updateBatchById(updates, mpBatchSize);
|
||||||
|
}
|
||||||
|
if (!inserts.isEmpty()) {
|
||||||
|
creditCustomerService.saveBatch(inserts, mpBatchSize);
|
||||||
|
}
|
||||||
|
return acceptedRows;
|
||||||
|
},
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
CreditCustomer existing = creditCustomerService.lambdaQuery()
|
||||||
|
.eq(CreditCustomer::getName, rowItem.getName())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
Integer existingTenantId = existing.getTenantId();
|
||||||
|
if (rowItem.getTenantId() != null
|
||||||
|
&& existingTenantId != null
|
||||||
|
&& !rowItem.getTenantId().equals(existingTenantId)) {
|
||||||
|
errorMessages.add("第" + rowNumber + "行:客户名称已存在且归属其他租户,无法导入");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (existingTenantId != null) {
|
||||||
|
rowItem.setTenantId(existingTenantId);
|
||||||
|
}
|
||||||
|
return creditCustomerService.updateById(rowItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return creditCustomerService.save(rowItem);
|
||||||
|
} catch (DataIntegrityViolationException e) {
|
||||||
|
if (!isDuplicateCustomerName(e)) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
CreditCustomer dbExisting = creditCustomerService.lambdaQuery()
|
||||||
|
.eq(CreditCustomer::getName, rowItem.getName())
|
||||||
|
.one();
|
||||||
|
if (dbExisting != null) {
|
||||||
|
Integer existingTenantId = dbExisting.getTenantId();
|
||||||
|
rowItem.setId(dbExisting.getId());
|
||||||
|
if (existingTenantId != null) {
|
||||||
|
rowItem.setTenantId(existingTenantId);
|
||||||
|
}
|
||||||
|
return creditCustomerService.updateById(rowItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditDeliveryNoticeController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditDeliveryNoticeService creditDeliveryNoticeService;
|
private CreditDeliveryNoticeService creditDeliveryNoticeService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询送达公告司法大数据")
|
@Operation(summary = "分页查询送达公告司法大数据")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditDeliveryNotice>> page(CreditDeliveryNoticeParam param) {
|
public ApiResult<PageResult<CreditDeliveryNotice>> page(CreditDeliveryNoticeParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditDeliveryNoticeController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditDeliveryNotice> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditDeliveryNoticeController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditDeliveryNoticeService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditDeliveryNoticeService,
|
||||||
|
chunkItems,
|
||||||
|
CreditDeliveryNotice::getId,
|
||||||
|
CreditDeliveryNotice::setId,
|
||||||
|
CreditDeliveryNotice::getCaseNumber,
|
||||||
|
CreditDeliveryNotice::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditDeliveryNoticeService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
|
CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
|
||||||
.eq(CreditDeliveryNotice::getCaseNumber, item.getCaseNumber())
|
.eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditDeliveryNoticeService.updateById(item)) {
|
if (creditDeliveryNoticeService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditDeliveryNoticeController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditDeliveryNoticeService,
|
||||||
|
chunkItems,
|
||||||
|
CreditDeliveryNotice::getId,
|
||||||
|
CreditDeliveryNotice::setId,
|
||||||
|
CreditDeliveryNotice::getCaseNumber,
|
||||||
|
CreditDeliveryNotice::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditDeliveryNoticeService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
|
||||||
|
.eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditDeliveryNoticeService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditExternalController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditExternalService creditExternalService;
|
private CreditExternalService creditExternalService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询对外投资")
|
@Operation(summary = "分页查询对外投资")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditExternal>> page(CreditExternalParam param) {
|
public ApiResult<PageResult<CreditExternal>> page(CreditExternalParam param) {
|
||||||
@@ -156,6 +159,11 @@ public class CreditExternalController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditExternal> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditExternalImportParam param = list.get(i);
|
CreditExternalImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -186,23 +194,46 @@ public class CreditExternalController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditExternalService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditExternalService,
|
||||||
|
chunkItems,
|
||||||
|
CreditExternal::getId,
|
||||||
|
CreditExternal::setId,
|
||||||
|
CreditExternal::getName,
|
||||||
|
CreditExternal::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditExternalService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditExternal existing = creditExternalService.lambdaQuery()
|
CreditExternal existing = creditExternalService.lambdaQuery()
|
||||||
.eq(CreditExternal::getName, item.getName())
|
.eq(CreditExternal::getName, rowItem.getName())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditExternalService.updateById(item)) {
|
if (creditExternalService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -210,6 +241,43 @@ public class CreditExternalController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditExternalService,
|
||||||
|
chunkItems,
|
||||||
|
CreditExternal::getId,
|
||||||
|
CreditExternal::setId,
|
||||||
|
CreditExternal::getName,
|
||||||
|
CreditExternal::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditExternalService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditExternal existing = creditExternalService.lambdaQuery()
|
||||||
|
.eq(CreditExternal::getName, rowItem.getName())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditExternalService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditFinalVersionController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditFinalVersionService creditFinalVersionService;
|
private CreditFinalVersionService creditFinalVersionService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询终本案件")
|
@Operation(summary = "分页查询终本案件")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditFinalVersion>> page(CreditFinalVersionParam param) {
|
public ApiResult<PageResult<CreditFinalVersion>> page(CreditFinalVersionParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditFinalVersionController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditFinalVersion> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditFinalVersionController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditFinalVersionService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditFinalVersionService,
|
||||||
|
chunkItems,
|
||||||
|
CreditFinalVersion::getId,
|
||||||
|
CreditFinalVersion::setId,
|
||||||
|
CreditFinalVersion::getCaseNumber,
|
||||||
|
CreditFinalVersion::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditFinalVersionService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
|
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
|
||||||
.eq(CreditFinalVersion::getCaseNumber, item.getCaseNumber())
|
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditFinalVersionService.updateById(item)) {
|
if (creditFinalVersionService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditFinalVersionController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditFinalVersionService,
|
||||||
|
chunkItems,
|
||||||
|
CreditFinalVersion::getId,
|
||||||
|
CreditFinalVersion::setId,
|
||||||
|
CreditFinalVersion::getCaseNumber,
|
||||||
|
CreditFinalVersion::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditFinalVersionService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
|
||||||
|
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditFinalVersionService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditGqdjController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditGqdjService creditGqdjService;
|
private CreditGqdjService creditGqdjService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询股权冻结")
|
@Operation(summary = "分页查询股权冻结")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditGqdj>> page(CreditGqdjParam param) {
|
public ApiResult<PageResult<CreditGqdj>> page(CreditGqdjParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditGqdjController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditGqdj> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditGqdjController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditGqdjService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditGqdjService,
|
||||||
|
chunkItems,
|
||||||
|
CreditGqdj::getId,
|
||||||
|
CreditGqdj::setId,
|
||||||
|
CreditGqdj::getCaseNumber,
|
||||||
|
CreditGqdj::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditGqdjService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditGqdj existing = creditGqdjService.lambdaQuery()
|
CreditGqdj existing = creditGqdjService.lambdaQuery()
|
||||||
.eq(CreditGqdj::getCaseNumber, item.getCaseNumber())
|
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditGqdjService.updateById(item)) {
|
if (creditGqdjService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditGqdjController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditGqdjService,
|
||||||
|
chunkItems,
|
||||||
|
CreditGqdj::getId,
|
||||||
|
CreditGqdj::setId,
|
||||||
|
CreditGqdj::getCaseNumber,
|
||||||
|
CreditGqdj::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditGqdjService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditGqdj existing = creditGqdjService.lambdaQuery()
|
||||||
|
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditGqdjService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditHistoricalLegalPersonService creditHistoricalLegalPersonService;
|
private CreditHistoricalLegalPersonService creditHistoricalLegalPersonService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询历史法定代表人")
|
@Operation(summary = "分页查询历史法定代表人")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditHistoricalLegalPerson>> page(CreditHistoricalLegalPersonParam param) {
|
public ApiResult<PageResult<CreditHistoricalLegalPerson>> page(CreditHistoricalLegalPersonParam param) {
|
||||||
@@ -158,6 +161,11 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
|||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "名称");
|
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "名称");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditHistoricalLegalPerson> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditHistoricalLegalPersonImportParam param = list.get(i);
|
CreditHistoricalLegalPersonImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -194,24 +202,94 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditHistoricalLegalPersonService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> {
|
||||||
|
// 批内一次查库:按 name in (...) 拉取,再按 registerDate 做内存匹配
|
||||||
|
List<String> names = new ArrayList<>(chunkItems.size());
|
||||||
|
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||||
|
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||||
|
names.add(it.getName().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
|
||||||
|
? new ArrayList<>()
|
||||||
|
: creditHistoricalLegalPersonService.lambdaQuery()
|
||||||
|
.in(CreditHistoricalLegalPerson::getName, names)
|
||||||
|
.list();
|
||||||
|
|
||||||
|
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
|
||||||
|
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
|
||||||
|
for (CreditHistoricalLegalPerson existing : existingList) {
|
||||||
|
if (existing == null || ImportHelper.isBlank(existing.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = existing.getName().trim();
|
||||||
|
byName.putIfAbsent(n, existing);
|
||||||
|
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
|
||||||
|
if (d != null) {
|
||||||
|
byNameDate.putIfAbsent(n + "|" + d, existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
|
||||||
|
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
|
||||||
|
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||||
|
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = it.getName().trim();
|
||||||
|
CreditHistoricalLegalPerson existing;
|
||||||
|
if (!ImportHelper.isBlank(it.getRegisterDate())) {
|
||||||
|
String d = it.getRegisterDate().trim();
|
||||||
|
existing = byNameDate.get(n + "|" + d);
|
||||||
|
} else {
|
||||||
|
existing = byName.get(n);
|
||||||
|
}
|
||||||
|
if (existing != null) {
|
||||||
|
it.setId(existing.getId());
|
||||||
|
updates.add(it);
|
||||||
|
} else {
|
||||||
|
inserts.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
|
||||||
|
}
|
||||||
|
if (!inserts.isEmpty()) {
|
||||||
|
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
|
||||||
|
}
|
||||||
|
return updates.size() + inserts.size();
|
||||||
|
},
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
|
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
|
||||||
.eq(CreditHistoricalLegalPerson::getName, item.getName())
|
.eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
|
||||||
.eq(!ImportHelper.isBlank(item.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, item.getRegisterDate())
|
.eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditHistoricalLegalPersonService.updateById(item)) {
|
if (creditHistoricalLegalPersonService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -219,6 +297,90 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> {
|
||||||
|
List<String> names = new ArrayList<>(chunkItems.size());
|
||||||
|
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||||
|
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||||
|
names.add(it.getName().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
|
||||||
|
? new ArrayList<>()
|
||||||
|
: creditHistoricalLegalPersonService.lambdaQuery()
|
||||||
|
.in(CreditHistoricalLegalPerson::getName, names)
|
||||||
|
.list();
|
||||||
|
|
||||||
|
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
|
||||||
|
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
|
||||||
|
for (CreditHistoricalLegalPerson existing : existingList) {
|
||||||
|
if (existing == null || ImportHelper.isBlank(existing.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = existing.getName().trim();
|
||||||
|
byName.putIfAbsent(n, existing);
|
||||||
|
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
|
||||||
|
if (d != null) {
|
||||||
|
byNameDate.putIfAbsent(n + "|" + d, existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
|
||||||
|
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
|
||||||
|
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||||
|
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = it.getName().trim();
|
||||||
|
CreditHistoricalLegalPerson existing;
|
||||||
|
if (!ImportHelper.isBlank(it.getRegisterDate())) {
|
||||||
|
String d = it.getRegisterDate().trim();
|
||||||
|
existing = byNameDate.get(n + "|" + d);
|
||||||
|
} else {
|
||||||
|
existing = byName.get(n);
|
||||||
|
}
|
||||||
|
if (existing != null) {
|
||||||
|
it.setId(existing.getId());
|
||||||
|
updates.add(it);
|
||||||
|
} else {
|
||||||
|
inserts.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
|
||||||
|
}
|
||||||
|
if (!inserts.isEmpty()) {
|
||||||
|
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
|
||||||
|
}
|
||||||
|
return updates.size() + inserts.size();
|
||||||
|
},
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
|
||||||
|
.eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
|
||||||
|
.eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditHistoricalLegalPersonService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ public class CreditJudgmentDebtorController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditJudgmentDebtorService creditJudgmentDebtorService;
|
private CreditJudgmentDebtorService creditJudgmentDebtorService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询被执行人")
|
@Operation(summary = "分页查询被执行人")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditJudgmentDebtor>> page(CreditJudgmentDebtorParam param) {
|
public ApiResult<PageResult<CreditJudgmentDebtor>> page(CreditJudgmentDebtorParam param) {
|
||||||
@@ -280,6 +283,10 @@ public class CreditJudgmentDebtorController extends BaseController {
|
|||||||
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
||||||
|
|
||||||
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditJudgmentDebtor> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudgmentDebtorImportParam param = list.get(i);
|
CreditJudgmentDebtorImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -322,6 +329,51 @@ public class CreditJudgmentDebtorController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
|
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||||
|
}
|
||||||
|
return new ImportOutcome(true, successCount, errorMessages);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int persistImportChunk(List<CreditJudgmentDebtor> items,
|
||||||
|
List<Integer> excelRowNumbers,
|
||||||
|
String prefix,
|
||||||
|
int mpBatchSize,
|
||||||
|
List<String> errorMessages) {
|
||||||
|
if (CollectionUtils.isEmpty(items)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditJudgmentDebtorService,
|
||||||
|
items,
|
||||||
|
CreditJudgmentDebtor::getId,
|
||||||
|
CreditJudgmentDebtor::setId,
|
||||||
|
CreditJudgmentDebtor::getCaseNumber,
|
||||||
|
CreditJudgmentDebtor::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
));
|
||||||
|
} catch (Exception batchException) {
|
||||||
|
int successCount = 0;
|
||||||
|
for (int i = 0; i < items.size(); i++) {
|
||||||
|
CreditJudgmentDebtor item = items.get(i);
|
||||||
|
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
||||||
|
try {
|
||||||
|
int delta = batchImportSupport.runInNewTx(() -> {
|
||||||
boolean saved = creditJudgmentDebtorService.save(item);
|
boolean saved = creditJudgmentDebtorService.save(item);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
|
CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
|
||||||
@@ -330,22 +382,25 @@ public class CreditJudgmentDebtorController extends BaseController {
|
|||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
item.setId(existing.getId());
|
||||||
if (creditJudgmentDebtorService.updateById(item)) {
|
if (creditJudgmentDebtorService.updateById(item)) {
|
||||||
successCount++;
|
return 1;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return 1;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
if (delta > 0) {
|
||||||
|
successCount += delta;
|
||||||
|
} else {
|
||||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
|
||||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ImportOutcome(true, successCount, errorMessages);
|
return successCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
||||||
|
|||||||
@@ -47,6 +47,9 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditJudgmentDebtorHistoryService creditJudgmentDebtorHistoryService;
|
private CreditJudgmentDebtorHistoryService creditJudgmentDebtorHistoryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询被执行人")
|
@Operation(summary = "分页查询被执行人")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditJudgmentDebtorHistory>> page(CreditJudgmentDebtorHistoryParam param) {
|
public ApiResult<PageResult<CreditJudgmentDebtorHistory>> page(CreditJudgmentDebtorHistoryParam param) {
|
||||||
@@ -275,6 +278,10 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
|||||||
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
||||||
|
|
||||||
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditJudgmentDebtorHistory> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudgmentDebtorHistoryImportParam param = list.get(i);
|
CreditJudgmentDebtorHistoryImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -321,6 +328,51 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
|
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += persistImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||||
|
}
|
||||||
|
return new ImportOutcome(true, successCount, errorMessages);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int persistImportChunk(List<CreditJudgmentDebtorHistory> items,
|
||||||
|
List<Integer> excelRowNumbers,
|
||||||
|
String prefix,
|
||||||
|
int mpBatchSize,
|
||||||
|
List<String> errorMessages) {
|
||||||
|
if (CollectionUtils.isEmpty(items)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditJudgmentDebtorHistoryService,
|
||||||
|
items,
|
||||||
|
CreditJudgmentDebtorHistory::getId,
|
||||||
|
CreditJudgmentDebtorHistory::setId,
|
||||||
|
CreditJudgmentDebtorHistory::getCaseNumber,
|
||||||
|
CreditJudgmentDebtorHistory::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
));
|
||||||
|
} catch (Exception batchException) {
|
||||||
|
int successCount = 0;
|
||||||
|
for (int i = 0; i < items.size(); i++) {
|
||||||
|
CreditJudgmentDebtorHistory item = items.get(i);
|
||||||
|
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
||||||
|
try {
|
||||||
|
int delta = batchImportSupport.runInNewTx(() -> {
|
||||||
boolean saved = creditJudgmentDebtorHistoryService.save(item);
|
boolean saved = creditJudgmentDebtorHistoryService.save(item);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery()
|
CreditJudgmentDebtorHistory existing = creditJudgmentDebtorHistoryService.lambdaQuery()
|
||||||
@@ -329,22 +381,25 @@ public class CreditJudgmentDebtorHistoryController extends BaseController {
|
|||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
item.setId(existing.getId());
|
||||||
if (creditJudgmentDebtorHistoryService.updateById(item)) {
|
if (creditJudgmentDebtorHistoryService.updateById(item)) {
|
||||||
successCount++;
|
return 1;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return 1;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
if (delta > 0) {
|
||||||
|
successCount += delta;
|
||||||
|
} else {
|
||||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
|
||||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new ImportOutcome(true, successCount, errorMessages);
|
return successCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditJudicialDocumentController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditJudicialDocumentService creditJudicialDocumentService;
|
private CreditJudicialDocumentService creditJudicialDocumentService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询裁判文书司法大数据")
|
@Operation(summary = "分页查询裁判文书司法大数据")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditJudicialDocument>> page(CreditJudicialDocumentParam param) {
|
public ApiResult<PageResult<CreditJudicialDocument>> page(CreditJudicialDocumentParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditJudicialDocumentController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditJudicialDocument> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditJudicialDocumentController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditJudicialDocumentService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditJudicialDocumentService,
|
||||||
|
chunkItems,
|
||||||
|
CreditJudicialDocument::getId,
|
||||||
|
CreditJudicialDocument::setId,
|
||||||
|
CreditJudicialDocument::getCaseNumber,
|
||||||
|
CreditJudicialDocument::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditJudicialDocumentService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
|
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
|
||||||
.eq(CreditJudicialDocument::getCaseNumber, item.getCaseNumber())
|
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditJudicialDocumentService.updateById(item)) {
|
if (creditJudicialDocumentService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditJudicialDocumentController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditJudicialDocumentService,
|
||||||
|
chunkItems,
|
||||||
|
CreditJudicialDocument::getId,
|
||||||
|
CreditJudicialDocument::setId,
|
||||||
|
CreditJudicialDocument::getCaseNumber,
|
||||||
|
CreditJudicialDocument::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditJudicialDocumentService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
|
||||||
|
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditJudicialDocumentService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ public class CreditJudiciaryController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditJudiciaryService creditJudiciaryService;
|
private CreditJudiciaryService creditJudiciaryService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询司法案件")
|
@Operation(summary = "分页查询司法案件")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditJudiciary>> page(CreditJudiciaryParam param) {
|
public ApiResult<PageResult<CreditJudiciary>> page(CreditJudiciaryParam param) {
|
||||||
@@ -161,6 +164,11 @@ public class CreditJudiciaryController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditJudiciary> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudiciaryImportParam param = list.get(i);
|
CreditJudiciaryImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -199,21 +207,43 @@ public class CreditJudiciaryController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditJudiciaryService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditJudiciaryService,
|
||||||
|
chunkItems,
|
||||||
|
CreditJudiciary::getId,
|
||||||
|
CreditJudiciary::setId,
|
||||||
|
CreditJudiciary::getName,
|
||||||
|
CreditJudiciary::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditJudiciaryService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditJudiciary existing = creditJudiciaryService.getByName(item.getName());
|
CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditJudiciaryService.updateById(item)) {
|
if (creditJudiciaryService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -221,6 +251,40 @@ public class CreditJudiciaryController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditJudiciaryService,
|
||||||
|
chunkItems,
|
||||||
|
CreditJudiciary::getId,
|
||||||
|
CreditJudiciary::setId,
|
||||||
|
CreditJudiciary::getName,
|
||||||
|
CreditJudiciary::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditJudiciaryService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditJudiciaryService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditMediationController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditMediationService creditMediationService;
|
private CreditMediationService creditMediationService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询诉前调解司法大数据")
|
@Operation(summary = "分页查询诉前调解司法大数据")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditMediation>> page(CreditMediationParam param) {
|
public ApiResult<PageResult<CreditMediation>> page(CreditMediationParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditMediationController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditMediation> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditMediationController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditMediationService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditMediationService,
|
||||||
|
chunkItems,
|
||||||
|
CreditMediation::getId,
|
||||||
|
CreditMediation::setId,
|
||||||
|
CreditMediation::getCaseNumber,
|
||||||
|
CreditMediation::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditMediationService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditMediation existing = creditMediationService.lambdaQuery()
|
CreditMediation existing = creditMediationService.lambdaQuery()
|
||||||
.eq(CreditMediation::getCaseNumber, item.getCaseNumber())
|
.eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditMediationService.updateById(item)) {
|
if (creditMediationService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditMediationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditMediationService,
|
||||||
|
chunkItems,
|
||||||
|
CreditMediation::getId,
|
||||||
|
CreditMediation::setId,
|
||||||
|
CreditMediation::getCaseNumber,
|
||||||
|
CreditMediation::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditMediationService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditMediation existing = creditMediationService.lambdaQuery()
|
||||||
|
.eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditMediationService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditNearbyCompanyController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditNearbyCompanyService creditNearbyCompanyService;
|
private CreditNearbyCompanyService creditNearbyCompanyService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询附近企业")
|
@Operation(summary = "分页查询附近企业")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditNearbyCompany>> page(CreditNearbyCompanyParam param) {
|
public ApiResult<PageResult<CreditNearbyCompany>> page(CreditNearbyCompanyParam param) {
|
||||||
@@ -250,18 +253,35 @@ public class CreditNearbyCompanyController extends BaseController {
|
|||||||
Integer tenantId,
|
Integer tenantId,
|
||||||
int mpBatchSize,
|
int mpBatchSize,
|
||||||
List<String> errorMessages) {
|
List<String> errorMessages) {
|
||||||
if (CollectionUtils.isEmpty(items)) {
|
return batchImportSupport.persistChunkWithFallback(
|
||||||
return 0;
|
items,
|
||||||
|
excelRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertByCodeOrName(
|
||||||
|
creditNearbyCompanyService,
|
||||||
|
items,
|
||||||
|
CreditNearbyCompany::getId,
|
||||||
|
CreditNearbyCompany::setId,
|
||||||
|
CreditNearbyCompany::getCode,
|
||||||
|
CreditNearbyCompany::getCode,
|
||||||
|
CreditNearbyCompany::getName,
|
||||||
|
CreditNearbyCompany::getName,
|
||||||
|
wrapper -> {
|
||||||
|
if (companyId != null) {
|
||||||
|
wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
|
||||||
}
|
}
|
||||||
try {
|
if (parentId != null) {
|
||||||
return creditNearbyCompanyService.importUpsertChunk(items, companyId, parentId, type, tenantId, mpBatchSize);
|
wrapper.eq(CreditNearbyCompany::getParentId, parentId);
|
||||||
} catch (Exception batchException) {
|
}
|
||||||
// 批量失败时降级为逐行处理,尽量输出可定位的错误信息
|
if (type != null) {
|
||||||
int successCount = 0;
|
wrapper.eq(CreditNearbyCompany::getType, type);
|
||||||
for (int i = 0; i < items.size(); i++) {
|
}
|
||||||
CreditNearbyCompany item = items.get(i);
|
if (tenantId != null) {
|
||||||
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
|
||||||
try {
|
}
|
||||||
|
},
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(item, excelRowNumber) -> {
|
||||||
boolean saved = creditNearbyCompanyService.save(item);
|
boolean saved = creditNearbyCompanyService.save(item);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery()
|
CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery()
|
||||||
@@ -275,29 +295,18 @@ public class CreditNearbyCompanyController extends BaseController {
|
|||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
item.setId(existing.getId());
|
||||||
if (creditNearbyCompanyService.updateById(item)) {
|
if (creditNearbyCompanyService.updateById(item)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (excelRowNumber > 0) {
|
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} else {
|
|
||||||
errorMessages.add("保存失败");
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
if (excelRowNumber > 0) {
|
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
|
||||||
} else {
|
|
||||||
errorMessages.add(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return successCount;
|
|
||||||
}
|
}
|
||||||
|
String prefix = excelRowNumber > 0 ? ("第" + excelRowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditPatentController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditPatentService creditPatentService;
|
private CreditPatentService creditPatentService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询专利")
|
@Operation(summary = "分页查询专利")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditPatent>> page(CreditPatentParam param) {
|
public ApiResult<PageResult<CreditPatent>> page(CreditPatentParam param) {
|
||||||
@@ -159,6 +162,11 @@ public class CreditPatentController extends BaseController {
|
|||||||
Map<String, String> urlByRegisterNo = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "申请号");
|
Map<String, String> urlByRegisterNo = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "申请号");
|
||||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "发明名称");
|
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "发明名称");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditPatent> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditPatentImportParam param = list.get(i);
|
CreditPatentImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -199,23 +207,46 @@ public class CreditPatentController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditPatentService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditPatentService,
|
||||||
|
chunkItems,
|
||||||
|
CreditPatent::getId,
|
||||||
|
CreditPatent::setId,
|
||||||
|
CreditPatent::getRegisterNo,
|
||||||
|
CreditPatent::getRegisterNo,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditPatentService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditPatent existing = creditPatentService.lambdaQuery()
|
CreditPatent existing = creditPatentService.lambdaQuery()
|
||||||
.eq(CreditPatent::getRegisterNo, item.getRegisterNo())
|
.eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditPatentService.updateById(item)) {
|
if (creditPatentService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -223,6 +254,43 @@ public class CreditPatentController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditPatentService,
|
||||||
|
chunkItems,
|
||||||
|
CreditPatent::getId,
|
||||||
|
CreditPatent::setId,
|
||||||
|
CreditPatent::getRegisterNo,
|
||||||
|
CreditPatent::getRegisterNo,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditPatentService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditPatent existing = creditPatentService.lambdaQuery()
|
||||||
|
.eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditPatentService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditRiskRelationController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditRiskRelationService creditRiskRelationService;
|
private CreditRiskRelationService creditRiskRelationService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询风险关系表")
|
@Operation(summary = "分页查询风险关系表")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditRiskRelation>> page(CreditRiskRelationParam param) {
|
public ApiResult<PageResult<CreditRiskRelation>> page(CreditRiskRelationParam param) {
|
||||||
@@ -156,6 +159,11 @@ public class CreditRiskRelationController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditRiskRelation> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditRiskRelationImportParam param = list.get(i);
|
CreditRiskRelationImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -186,23 +194,46 @@ public class CreditRiskRelationController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditRiskRelationService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditRiskRelationService,
|
||||||
|
chunkItems,
|
||||||
|
CreditRiskRelation::getId,
|
||||||
|
CreditRiskRelation::setId,
|
||||||
|
CreditRiskRelation::getMainBodyName,
|
||||||
|
CreditRiskRelation::getMainBodyName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditRiskRelationService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
|
CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
|
||||||
.eq(CreditRiskRelation::getMainBodyName, item.getMainBodyName())
|
.eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditRiskRelationService.updateById(item)) {
|
if (creditRiskRelationService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -210,6 +241,43 @@ public class CreditRiskRelationController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditRiskRelationService,
|
||||||
|
chunkItems,
|
||||||
|
CreditRiskRelation::getId,
|
||||||
|
CreditRiskRelation::setId,
|
||||||
|
CreditRiskRelation::getMainBodyName,
|
||||||
|
CreditRiskRelation::getMainBodyName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditRiskRelationService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
|
||||||
|
.eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditRiskRelationService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditSupplierController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditSupplierService creditSupplierService;
|
private CreditSupplierService creditSupplierService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询供应商")
|
@Operation(summary = "分页查询供应商")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditSupplier>> page(CreditSupplierParam param) {
|
public ApiResult<PageResult<CreditSupplier>> page(CreditSupplierParam param) {
|
||||||
@@ -156,6 +159,11 @@ public class CreditSupplierController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditSupplier> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditSupplierImportParam param = list.get(i);
|
CreditSupplierImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -186,23 +194,46 @@ public class CreditSupplierController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditSupplierService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditSupplierService,
|
||||||
|
chunkItems,
|
||||||
|
CreditSupplier::getId,
|
||||||
|
CreditSupplier::setId,
|
||||||
|
CreditSupplier::getSupplier,
|
||||||
|
CreditSupplier::getSupplier,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditSupplierService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditSupplier existing = creditSupplierService.lambdaQuery()
|
CreditSupplier existing = creditSupplierService.lambdaQuery()
|
||||||
.eq(CreditSupplier::getSupplier, item.getSupplier())
|
.eq(CreditSupplier::getSupplier, rowItem.getSupplier())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditSupplierService.updateById(item)) {
|
if (creditSupplierService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -210,6 +241,43 @@ public class CreditSupplierController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditSupplierService,
|
||||||
|
chunkItems,
|
||||||
|
CreditSupplier::getId,
|
||||||
|
CreditSupplier::setId,
|
||||||
|
CreditSupplier::getSupplier,
|
||||||
|
CreditSupplier::getSupplier,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditSupplierService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditSupplier existing = creditSupplierService.lambdaQuery()
|
||||||
|
.eq(CreditSupplier::getSupplier, rowItem.getSupplier())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditSupplierService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditSuspectedRelationshipService creditSuspectedRelationshipService;
|
private CreditSuspectedRelationshipService creditSuspectedRelationshipService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询疑似关系")
|
@Operation(summary = "分页查询疑似关系")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditSuspectedRelationship>> page(CreditSuspectedRelationshipParam param) {
|
public ApiResult<PageResult<CreditSuspectedRelationship>> page(CreditSuspectedRelationshipParam param) {
|
||||||
@@ -158,6 +161,11 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
|||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "企业名称");
|
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "企业名称");
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditSuspectedRelationship> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditSuspectedRelationshipImportParam param = list.get(i);
|
CreditSuspectedRelationshipImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -198,25 +206,107 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditSuspectedRelationshipService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> {
|
||||||
|
List<String> names = new ArrayList<>(chunkItems.size());
|
||||||
|
List<String> relatedParties = new ArrayList<>(chunkItems.size());
|
||||||
|
for (CreditSuspectedRelationship it : chunkItems) {
|
||||||
|
if (it == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!ImportHelper.isBlank(it.getName())) {
|
||||||
|
names.add(it.getName().trim());
|
||||||
|
}
|
||||||
|
if (!ImportHelper.isBlank(it.getRelatedParty())) {
|
||||||
|
relatedParties.add(it.getRelatedParty().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditSuspectedRelationship> existingList = (names.isEmpty() || relatedParties.isEmpty())
|
||||||
|
? new ArrayList<>()
|
||||||
|
: creditSuspectedRelationshipService.lambdaQuery()
|
||||||
|
.in(CreditSuspectedRelationship::getName, names)
|
||||||
|
.in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
|
||||||
|
.list();
|
||||||
|
|
||||||
|
java.util.Map<String, CreditSuspectedRelationship> byNameRelated = new java.util.HashMap<>();
|
||||||
|
java.util.Map<String, CreditSuspectedRelationship> byNameRelatedType = new java.util.HashMap<>();
|
||||||
|
for (CreditSuspectedRelationship existing : existingList) {
|
||||||
|
if (existing == null
|
||||||
|
|| ImportHelper.isBlank(existing.getName())
|
||||||
|
|| ImportHelper.isBlank(existing.getRelatedParty())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = existing.getName().trim();
|
||||||
|
String r = existing.getRelatedParty().trim();
|
||||||
|
byNameRelated.putIfAbsent(n + "|" + r, existing);
|
||||||
|
if (!ImportHelper.isBlank(existing.getType())) {
|
||||||
|
byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditSuspectedRelationship> updates = new ArrayList<>();
|
||||||
|
List<CreditSuspectedRelationship> inserts = new ArrayList<>();
|
||||||
|
for (CreditSuspectedRelationship it : chunkItems) {
|
||||||
|
if (it == null
|
||||||
|
|| ImportHelper.isBlank(it.getName())
|
||||||
|
|| ImportHelper.isBlank(it.getRelatedParty())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = it.getName().trim();
|
||||||
|
String r = it.getRelatedParty().trim();
|
||||||
|
CreditSuspectedRelationship existing;
|
||||||
|
if (!ImportHelper.isBlank(it.getType())) {
|
||||||
|
existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
|
||||||
|
} else {
|
||||||
|
existing = byNameRelated.get(n + "|" + r);
|
||||||
|
}
|
||||||
|
if (existing != null) {
|
||||||
|
it.setId(existing.getId());
|
||||||
|
updates.add(it);
|
||||||
|
} else {
|
||||||
|
inserts.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
|
||||||
|
}
|
||||||
|
if (!inserts.isEmpty()) {
|
||||||
|
creditSuspectedRelationshipService.saveBatch(inserts, mpBatchSize);
|
||||||
|
}
|
||||||
|
return updates.size() + inserts.size();
|
||||||
|
},
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditSuspectedRelationshipService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
|
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
|
||||||
.eq(CreditSuspectedRelationship::getName, item.getName())
|
.eq(CreditSuspectedRelationship::getName, rowItem.getName())
|
||||||
.eq(CreditSuspectedRelationship::getRelatedParty, item.getRelatedParty())
|
.eq(CreditSuspectedRelationship::getRelatedParty, rowItem.getRelatedParty())
|
||||||
.eq(!ImportHelper.isBlank(item.getType()), CreditSuspectedRelationship::getType, item.getType())
|
.eq(!ImportHelper.isBlank(rowItem.getType()), CreditSuspectedRelationship::getType, rowItem.getType())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditSuspectedRelationshipService.updateById(item)) {
|
if (creditSuspectedRelationshipService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -224,6 +314,104 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> {
|
||||||
|
List<String> names = new ArrayList<>(chunkItems.size());
|
||||||
|
List<String> relatedParties = new ArrayList<>(chunkItems.size());
|
||||||
|
for (CreditSuspectedRelationship it : chunkItems) {
|
||||||
|
if (it == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!ImportHelper.isBlank(it.getName())) {
|
||||||
|
names.add(it.getName().trim());
|
||||||
|
}
|
||||||
|
if (!ImportHelper.isBlank(it.getRelatedParty())) {
|
||||||
|
relatedParties.add(it.getRelatedParty().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditSuspectedRelationship> existingList = (names.isEmpty() || relatedParties.isEmpty())
|
||||||
|
? new ArrayList<>()
|
||||||
|
: creditSuspectedRelationshipService.lambdaQuery()
|
||||||
|
.in(CreditSuspectedRelationship::getName, names)
|
||||||
|
.in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
|
||||||
|
.list();
|
||||||
|
|
||||||
|
java.util.Map<String, CreditSuspectedRelationship> byNameRelated = new java.util.HashMap<>();
|
||||||
|
java.util.Map<String, CreditSuspectedRelationship> byNameRelatedType = new java.util.HashMap<>();
|
||||||
|
for (CreditSuspectedRelationship existing : existingList) {
|
||||||
|
if (existing == null
|
||||||
|
|| ImportHelper.isBlank(existing.getName())
|
||||||
|
|| ImportHelper.isBlank(existing.getRelatedParty())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = existing.getName().trim();
|
||||||
|
String r = existing.getRelatedParty().trim();
|
||||||
|
byNameRelated.putIfAbsent(n + "|" + r, existing);
|
||||||
|
if (!ImportHelper.isBlank(existing.getType())) {
|
||||||
|
byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<CreditSuspectedRelationship> updates = new ArrayList<>();
|
||||||
|
List<CreditSuspectedRelationship> inserts = new ArrayList<>();
|
||||||
|
for (CreditSuspectedRelationship it : chunkItems) {
|
||||||
|
if (it == null
|
||||||
|
|| ImportHelper.isBlank(it.getName())
|
||||||
|
|| ImportHelper.isBlank(it.getRelatedParty())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String n = it.getName().trim();
|
||||||
|
String r = it.getRelatedParty().trim();
|
||||||
|
CreditSuspectedRelationship existing;
|
||||||
|
if (!ImportHelper.isBlank(it.getType())) {
|
||||||
|
existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
|
||||||
|
} else {
|
||||||
|
existing = byNameRelated.get(n + "|" + r);
|
||||||
|
}
|
||||||
|
if (existing != null) {
|
||||||
|
it.setId(existing.getId());
|
||||||
|
updates.add(it);
|
||||||
|
} else {
|
||||||
|
inserts.add(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!updates.isEmpty()) {
|
||||||
|
creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
|
||||||
|
}
|
||||||
|
if (!inserts.isEmpty()) {
|
||||||
|
creditSuspectedRelationshipService.saveBatch(inserts, mpBatchSize);
|
||||||
|
}
|
||||||
|
return updates.size() + inserts.size();
|
||||||
|
},
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditSuspectedRelationshipService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditSuspectedRelationship existing = creditSuspectedRelationshipService.lambdaQuery()
|
||||||
|
.eq(CreditSuspectedRelationship::getName, rowItem.getName())
|
||||||
|
.eq(CreditSuspectedRelationship::getRelatedParty, rowItem.getRelatedParty())
|
||||||
|
.eq(!ImportHelper.isBlank(rowItem.getType()), CreditSuspectedRelationship::getType, rowItem.getType())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditSuspectedRelationshipService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ public class CreditUserController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditUserService creditUserService;
|
private CreditUserService creditUserService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询招投标信息表")
|
@Operation(summary = "分页查询招投标信息表")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditUser>> page(CreditUserParam param) {
|
public ApiResult<PageResult<CreditUser>> page(CreditUserParam param) {
|
||||||
@@ -177,6 +180,11 @@ public class CreditUserController extends BaseController {
|
|||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
Map<Integer, String> urlMap = readNameHyperlinks(file, sheetIndex, usedTitleRows, usedHeadRows);
|
Map<Integer, String> urlMap = readNameHyperlinks(file, sheetIndex, usedTitleRows, usedHeadRows);
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditUser> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditUserImportParam param = list.get(i);
|
CreditUserImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -216,14 +224,42 @@ public class CreditUserController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (creditUserService.save(item)) {
|
chunkItems.add(item);
|
||||||
successCount++;
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
} else {
|
if (chunkItems.size() >= chunkSize) {
|
||||||
CreditUser update = creditUserService.getByName(item.getName());
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
if (creditUserService.updateById(update)) {
|
chunkItems,
|
||||||
errorMessages.add("第" + excelRowNumber + "行:更新成功");
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditUserService,
|
||||||
|
chunkItems,
|
||||||
|
CreditUser::getId,
|
||||||
|
CreditUser::setId,
|
||||||
|
CreditUser::getName,
|
||||||
|
CreditUser::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditUserService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditUser existing = creditUserService.getByName(rowItem.getName());
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditUserService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
@@ -232,10 +268,44 @@ public class CreditUserController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditUserService,
|
||||||
|
chunkItems,
|
||||||
|
CreditUser::getId,
|
||||||
|
CreditUser::setId,
|
||||||
|
CreditUser::getName,
|
||||||
|
CreditUser::getName,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditUserService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditUser existing = creditUserService.getByName(rowItem.getName());
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditUserService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
return success("导入完成,成功" + successCount + "条,更新" + errorMessages.size() + "条", errorMessages);
|
return success("导入完成,成功" + successCount + "条,失败" + errorMessages.size() + "条", errorMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ public class CreditXgxfController extends BaseController {
|
|||||||
@Resource
|
@Resource
|
||||||
private CreditXgxfService creditXgxfService;
|
private CreditXgxfService creditXgxfService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private BatchImportSupport batchImportSupport;
|
||||||
|
|
||||||
@Operation(summary = "分页查询限制高消费")
|
@Operation(summary = "分页查询限制高消费")
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
public ApiResult<PageResult<CreditXgxf>> page(CreditXgxfParam param) {
|
public ApiResult<PageResult<CreditXgxf>> page(CreditXgxfParam param) {
|
||||||
@@ -155,6 +158,11 @@ public class CreditXgxfController extends BaseController {
|
|||||||
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
Integer currentUserId = loginUser != null ? loginUser.getUserId() : null;
|
||||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||||
|
|
||||||
|
final int chunkSize = 500;
|
||||||
|
final int mpBatchSize = 500;
|
||||||
|
List<CreditXgxf> chunkItems = new ArrayList<>(chunkSize);
|
||||||
|
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
CreditJudicialImportParam param = list.get(i);
|
CreditJudicialImportParam param = list.get(i);
|
||||||
try {
|
try {
|
||||||
@@ -185,23 +193,46 @@ public class CreditXgxfController extends BaseController {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean saved = creditXgxfService.save(item);
|
chunkItems.add(item);
|
||||||
|
chunkRowNumbers.add(excelRowNumber);
|
||||||
|
if (chunkItems.size() >= chunkSize) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditXgxfService,
|
||||||
|
chunkItems,
|
||||||
|
CreditXgxf::getId,
|
||||||
|
CreditXgxf::setId,
|
||||||
|
CreditXgxf::getCaseNumber,
|
||||||
|
CreditXgxf::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditXgxfService.save(rowItem);
|
||||||
if (!saved) {
|
if (!saved) {
|
||||||
CreditXgxf existing = creditXgxfService.lambdaQuery()
|
CreditXgxf existing = creditXgxfService.lambdaQuery()
|
||||||
.eq(CreditXgxf::getCaseNumber, item.getCaseNumber())
|
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
|
||||||
.one();
|
.one();
|
||||||
if (existing != null) {
|
if (existing != null) {
|
||||||
item.setId(existing.getId());
|
rowItem.setId(existing.getId());
|
||||||
if (creditXgxfService.updateById(item)) {
|
if (creditXgxfService.updateById(rowItem)) {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
successCount++;
|
return true;
|
||||||
continue;
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
chunkItems.clear();
|
||||||
|
chunkRowNumbers.clear();
|
||||||
}
|
}
|
||||||
errorMessages.add("第" + excelRowNumber + "行:保存失败");
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
|
||||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||||
@@ -209,6 +240,43 @@ public class CreditXgxfController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!chunkItems.isEmpty()) {
|
||||||
|
successCount += batchImportSupport.persistChunkWithFallback(
|
||||||
|
chunkItems,
|
||||||
|
chunkRowNumbers,
|
||||||
|
() -> batchImportSupport.upsertBySingleKey(
|
||||||
|
creditXgxfService,
|
||||||
|
chunkItems,
|
||||||
|
CreditXgxf::getId,
|
||||||
|
CreditXgxf::setId,
|
||||||
|
CreditXgxf::getCaseNumber,
|
||||||
|
CreditXgxf::getCaseNumber,
|
||||||
|
null,
|
||||||
|
mpBatchSize
|
||||||
|
),
|
||||||
|
(rowItem, rowNumber) -> {
|
||||||
|
boolean saved = creditXgxfService.save(rowItem);
|
||||||
|
if (!saved) {
|
||||||
|
CreditXgxf existing = creditXgxfService.lambdaQuery()
|
||||||
|
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
|
||||||
|
.one();
|
||||||
|
if (existing != null) {
|
||||||
|
rowItem.setId(existing.getId());
|
||||||
|
if (creditXgxfService.updateById(rowItem)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||||
|
errorMessages.add(prefix + "保存失败");
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
errorMessages
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (errorMessages.isEmpty()) {
|
if (errorMessages.isEmpty()) {
|
||||||
return success("成功导入" + successCount + "条数据", null);
|
return success("成功导入" + successCount + "条数据", null);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -39,24 +39,4 @@ public interface CreditNearbyCompanyService extends IService<CreditNearbyCompany
|
|||||||
*/
|
*/
|
||||||
CreditNearbyCompany getByIdRel(Integer id);
|
CreditNearbyCompany getByIdRel(Integer id);
|
||||||
|
|
||||||
/**
|
|
||||||
* 导入用:按给定维度(companyId/parentId/type/tenantId)批量 upsert,避免逐行写库导致数据库压力过大。
|
|
||||||
* <p>
|
|
||||||
* 规则:优先按 code 匹配;code 为空时按 name 匹配。
|
|
||||||
*
|
|
||||||
* @param items 待写入数据(需保证 name/code 已做基础清洗/默认值填充)
|
|
||||||
* @param companyId 企业ID(可空)
|
|
||||||
* @param parentId 上级ID(可空)
|
|
||||||
* @param type 类型(可空)
|
|
||||||
* @param tenantId 租户ID(可空)
|
|
||||||
* @param batchSize MyBatis-Plus 批处理大小
|
|
||||||
* @return 本次写入成功的条数(插入 + 更新)
|
|
||||||
*/
|
|
||||||
int importUpsertChunk(List<CreditNearbyCompany> items,
|
|
||||||
Integer companyId,
|
|
||||||
Integer parentId,
|
|
||||||
Integer type,
|
|
||||||
Integer tenantId,
|
|
||||||
int batchSize);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.gxwebsoft.credit.service.impl;
|
package com.gxwebsoft.credit.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.gxwebsoft.common.core.web.PageParam;
|
import com.gxwebsoft.common.core.web.PageParam;
|
||||||
import com.gxwebsoft.common.core.web.PageResult;
|
import com.gxwebsoft.common.core.web.PageResult;
|
||||||
@@ -9,13 +8,8 @@ import com.gxwebsoft.credit.mapper.CreditNearbyCompanyMapper;
|
|||||||
import com.gxwebsoft.credit.param.CreditNearbyCompanyParam;
|
import com.gxwebsoft.credit.param.CreditNearbyCompanyParam;
|
||||||
import com.gxwebsoft.credit.service.CreditNearbyCompanyService;
|
import com.gxwebsoft.credit.service.CreditNearbyCompanyService;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Propagation;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 附近企业Service实现
|
* 附近企业Service实现
|
||||||
@@ -50,116 +44,4 @@ public class CreditNearbyCompanyServiceImpl extends ServiceImpl<CreditNearbyComp
|
|||||||
return param.getOne(baseMapper.selectListRel(param));
|
return param.getOne(baseMapper.selectListRel(param));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
|
|
||||||
public int importUpsertChunk(List<CreditNearbyCompany> items,
|
|
||||||
Integer companyId,
|
|
||||||
Integer parentId,
|
|
||||||
Integer type,
|
|
||||||
Integer tenantId,
|
|
||||||
int batchSize) {
|
|
||||||
if (items == null || items.isEmpty()) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<CreditNearbyCompany> updates = new ArrayList<>();
|
|
||||||
List<CreditNearbyCompany> inserts = new ArrayList<>();
|
|
||||||
|
|
||||||
List<String> codes = new ArrayList<>();
|
|
||||||
List<String> names = new ArrayList<>();
|
|
||||||
|
|
||||||
for (CreditNearbyCompany item : items) {
|
|
||||||
if (item == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (item.getCode() != null) {
|
|
||||||
item.setCode(item.getCode().trim());
|
|
||||||
}
|
|
||||||
if (item.getName() != null) {
|
|
||||||
item.setName(item.getName().trim());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.getCode() != null && !item.getCode().isEmpty()) {
|
|
||||||
codes.add(item.getCode());
|
|
||||||
} else if (item.getName() != null && !item.getName().isEmpty()) {
|
|
||||||
names.add(item.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, CreditNearbyCompany> existingByCode = new HashMap<>();
|
|
||||||
Map<String, CreditNearbyCompany> existingByName = new HashMap<>();
|
|
||||||
|
|
||||||
if (!codes.isEmpty()) {
|
|
||||||
LambdaQueryWrapper<CreditNearbyCompany> wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId);
|
|
||||||
wrapper.in(CreditNearbyCompany::getCode, codes);
|
|
||||||
wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getCode);
|
|
||||||
List<CreditNearbyCompany> existingList = list(wrapper);
|
|
||||||
for (CreditNearbyCompany existing : existingList) {
|
|
||||||
if (existing.getCode() != null) {
|
|
||||||
existingByCode.putIfAbsent(existing.getCode().trim(), existing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!names.isEmpty()) {
|
|
||||||
LambdaQueryWrapper<CreditNearbyCompany> wrapper = buildImportKeyWrapper(companyId, parentId, type, tenantId);
|
|
||||||
wrapper.in(CreditNearbyCompany::getName, names);
|
|
||||||
wrapper.select(CreditNearbyCompany::getId, CreditNearbyCompany::getName);
|
|
||||||
List<CreditNearbyCompany> existingList = list(wrapper);
|
|
||||||
for (CreditNearbyCompany existing : existingList) {
|
|
||||||
if (existing.getName() != null) {
|
|
||||||
existingByName.putIfAbsent(existing.getName().trim(), existing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (CreditNearbyCompany item : items) {
|
|
||||||
if (item == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
CreditNearbyCompany existing = null;
|
|
||||||
if (item.getCode() != null && !item.getCode().isEmpty()) {
|
|
||||||
existing = existingByCode.get(item.getCode());
|
|
||||||
} else if (item.getName() != null && !item.getName().isEmpty()) {
|
|
||||||
existing = existingByName.get(item.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (existing != null) {
|
|
||||||
item.setId(existing.getId());
|
|
||||||
updates.add(item);
|
|
||||||
} else {
|
|
||||||
inserts.add(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!updates.isEmpty()) {
|
|
||||||
// 直接按主键批量更新,避免 saveOrUpdateBatch 产生额外的存在性查询
|
|
||||||
updateBatchById(updates, batchSize);
|
|
||||||
}
|
|
||||||
if (!inserts.isEmpty()) {
|
|
||||||
saveBatch(inserts, batchSize);
|
|
||||||
}
|
|
||||||
return updates.size() + inserts.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
private LambdaQueryWrapper<CreditNearbyCompany> buildImportKeyWrapper(Integer companyId,
|
|
||||||
Integer parentId,
|
|
||||||
Integer type,
|
|
||||||
Integer tenantId) {
|
|
||||||
LambdaQueryWrapper<CreditNearbyCompany> wrapper = new LambdaQueryWrapper<>();
|
|
||||||
if (companyId != null) {
|
|
||||||
wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
|
|
||||||
}
|
|
||||||
if (parentId != null) {
|
|
||||||
wrapper.eq(CreditNearbyCompany::getParentId, parentId);
|
|
||||||
}
|
|
||||||
if (type != null) {
|
|
||||||
wrapper.eq(CreditNearbyCompany::getType, type);
|
|
||||||
}
|
|
||||||
if (tenantId != null) {
|
|
||||||
wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
|
|
||||||
}
|
|
||||||
return wrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user