feat(import): 实现批量导入去重机制并简化导入逻辑
- 在 BatchImportSupport 中新增 persistInsertOnlyChunk 方法处理仅插入模式的批量保存 - 新增 isDuplicateKey 方法用于检测数据库唯一索引冲突 - 修改行政许可、破产重整、失信被执行人等控制器的导入逻辑,使用新方法替换原有的 upsert 逻辑 - 移除 LinkedHashMap 的去重预处理,改为直接使用数据库唯一索引约束处理重复数据 - 更新导入规则描述,明确使用数据库唯一索引而非覆盖更新逻辑 - 移除 LocalDate 和 LinkedHashMap 等不再使用的导入包
This commit is contained in:
@@ -6,12 +6,14 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapp
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.gxwebsoft.credit.entity.CreditCompany;
|
||||
import com.gxwebsoft.credit.service.CreditCompanyService;
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
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.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.HashMap;
|
||||
@@ -973,6 +975,95 @@ public class BatchImportSupport {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert-only batch persist with "unique index" duplicate handling:
|
||||
* - try saveBatch
|
||||
* - on failure, fallback to row-by-row save
|
||||
* - if a row hits duplicate-key constraint, add a friendly error and continue
|
||||
*
|
||||
* <p>This intentionally does NOT query the database for dedup/upsert.</p>
|
||||
*/
|
||||
public <T> int persistInsertOnlyChunk(IService<T> service,
|
||||
List<T> items,
|
||||
List<Integer> excelRowNumbers,
|
||||
int batchSize,
|
||||
Function<T, String> rowLabelGetter,
|
||||
String messagePrefix,
|
||||
List<String> errorMessages) {
|
||||
String prefix = messagePrefix == null ? "" : messagePrefix;
|
||||
return persistChunkWithFallback(
|
||||
items,
|
||||
excelRowNumbers,
|
||||
() -> {
|
||||
boolean ok = service.saveBatch(items, batchSize);
|
||||
if (!ok) {
|
||||
throw new RuntimeException("批量保存失败");
|
||||
}
|
||||
return items.size();
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
try {
|
||||
boolean ok = service.save(rowItem);
|
||||
if (!ok) {
|
||||
if (errorMessages != null) {
|
||||
String p = (rowNumber != null && rowNumber > 0) ? (prefix + "第" + rowNumber + "行:") : prefix;
|
||||
errorMessages.add(p + "保存失败");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} catch (DataIntegrityViolationException e) {
|
||||
if (!isDuplicateKey(e)) {
|
||||
throw e;
|
||||
}
|
||||
if (errorMessages != null) {
|
||||
String label = null;
|
||||
if (rowLabelGetter != null && rowItem != null) {
|
||||
try {
|
||||
label = rowLabelGetter.apply(rowItem);
|
||||
} catch (Exception ignore) {
|
||||
// ignore label extraction failures
|
||||
}
|
||||
}
|
||||
if (label != null) {
|
||||
label = label.trim();
|
||||
}
|
||||
String what = (label == null || label.isEmpty()) ? "数据" : ("【" + label + "】");
|
||||
String p = (rowNumber != null && rowNumber > 0) ? (prefix + "第" + rowNumber + "行:") : prefix;
|
||||
errorMessages.add(p + what + "重复(唯一索引冲突)");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Best-effort duplicate-key detection across common drivers.
|
||||
*/
|
||||
public static boolean isDuplicateKey(DataIntegrityViolationException e) {
|
||||
for (Throwable t = e; t != null; t = t.getCause()) {
|
||||
if (t instanceof SQLException) {
|
||||
SQLException se = (SQLException) t;
|
||||
// MySQL: 1062 Duplicate entry; PostgreSQL/H2: SQLState 23505 unique_violation
|
||||
if (se.getErrorCode() == 1062) {
|
||||
return true;
|
||||
}
|
||||
if ("23505".equals(se.getSQLState())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
Throwable mostSpecificCause = e.getMostSpecificCause();
|
||||
String message = mostSpecificCause != null ? mostSpecificCause.getMessage() : e.getMessage();
|
||||
if (message == null) {
|
||||
return false;
|
||||
}
|
||||
String lower = message.toLowerCase();
|
||||
return lower.contains("duplicate") && lower.contains("key");
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量失败时降级逐行:允许调用方自定义“成功条数”的计算口径(例如:仅统计 insert 入库条数)。
|
||||
*
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -268,48 +267,13 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertByCodeOrName(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditAdministrativeLicenseService,
|
||||
chunkItems,
|
||||
CreditAdministrativeLicense::getId,
|
||||
CreditAdministrativeLicense::setId,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditAdministrativeLicense::getName,
|
||||
CreditAdministrativeLicense::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditAdministrativeLicenseService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditAdministrativeLicense existing = null;
|
||||
if (!ImportHelper.isBlank(rowItem.getCode())) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
|
||||
.one();
|
||||
}
|
||||
if (existing == null) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
|
||||
.one();
|
||||
}
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditAdministrativeLicenseService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -323,48 +287,13 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertByCodeOrName(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditAdministrativeLicenseService,
|
||||
chunkItems,
|
||||
CreditAdministrativeLicense::getId,
|
||||
CreditAdministrativeLicense::setId,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -384,7 +313,7 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史行政许可(仅解析“历史行政许可”选项卡)
|
||||
* 规则:优先按编号(code)匹配;code 为空时按名称(name)匹配;匹配到则覆盖更新(recommend++ 记录更新次数)。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditAdministrativeLicense:save')")
|
||||
@Operation(summary = "批量导入历史行政许可")
|
||||
@@ -418,8 +347,10 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号");
|
||||
Map<String, String> urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称");
|
||||
|
||||
LinkedHashMap<String, CreditAdministrativeLicense> latestByKey = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByKey = new LinkedHashMap<>();
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditAdministrativeLicense> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditAdministrativeLicenseImportParam param = list.get(i);
|
||||
@@ -467,144 +398,42 @@ public class CreditAdministrativeLicenseController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
String dedupKey = !ImportHelper.isBlank(item.getCode()) ? ("CODE:" + item.getCode()) : ("NAME:" + item.getName());
|
||||
latestByKey.put(dedupKey, item);
|
||||
latestRowByKey.put(dedupKey, excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditAdministrativeLicenseService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditAdministrativeLicense::getName,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByKey.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditAdministrativeLicense> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditAdministrativeLicense> entry : latestByKey.entrySet()) {
|
||||
String dedupKey = entry.getKey();
|
||||
CreditAdministrativeLicense item = entry.getValue();
|
||||
Integer rowNo = latestRowByKey.get(dedupKey);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertByCodeOrNameAndIncrementCounterOnUpdate(
|
||||
creditAdministrativeLicenseService,
|
||||
chunkItems,
|
||||
CreditAdministrativeLicense::getId,
|
||||
CreditAdministrativeLicense::setId,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getName,
|
||||
CreditAdministrativeLicense::getName,
|
||||
CreditAdministrativeLicense::getRecommend,
|
||||
CreditAdministrativeLicense::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditAdministrativeLicenseService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditAdministrativeLicense existing = null;
|
||||
if (!ImportHelper.isBlank(rowItem.getCode())) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
|
||||
.select(CreditAdministrativeLicense::getId, CreditAdministrativeLicense::getRecommend)
|
||||
.one();
|
||||
}
|
||||
if (existing == null && !ImportHelper.isBlank(rowItem.getName())) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
|
||||
.select(CreditAdministrativeLicense::getId, CreditAdministrativeLicense::getRecommend)
|
||||
.one();
|
||||
}
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditAdministrativeLicenseService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertByCodeOrNameAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditAdministrativeLicenseService,
|
||||
chunkItems,
|
||||
CreditAdministrativeLicense::getId,
|
||||
CreditAdministrativeLicense::setId,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
CreditAdministrativeLicense::getCode,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditAdministrativeLicense::getName,
|
||||
CreditAdministrativeLicense::getName,
|
||||
CreditAdministrativeLicense::getRecommend,
|
||||
CreditAdministrativeLicense::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditAdministrativeLicenseService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditAdministrativeLicense existing = null;
|
||||
if (!ImportHelper.isBlank(rowItem.getCode())) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
|
||||
.select(CreditAdministrativeLicense::getId, CreditAdministrativeLicense::getRecommend)
|
||||
.one();
|
||||
}
|
||||
if (existing == null && !ImportHelper.isBlank(rowItem.getName())) {
|
||||
existing = creditAdministrativeLicenseService.lambdaQuery()
|
||||
.eq(CreditAdministrativeLicense::getName, rowItem.getName())
|
||||
.select(CreditAdministrativeLicense::getId, CreditAdministrativeLicense::getRecommend)
|
||||
.one();
|
||||
}
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditAdministrativeLicenseService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -263,38 +262,13 @@ public class CreditBankruptcyController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBankruptcyService,
|
||||
chunkItems,
|
||||
CreditBankruptcy::getId,
|
||||
CreditBankruptcy::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBankruptcy::getCode,
|
||||
CreditBankruptcy::getCode,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditBankruptcyService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
||||
.eq(CreditBankruptcy::getCode, rowItem.getCode())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditBankruptcyService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -308,38 +282,13 @@ public class CreditBankruptcyController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBankruptcyService,
|
||||
chunkItems,
|
||||
CreditBankruptcy::getId,
|
||||
CreditBankruptcy::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -359,7 +308,7 @@ public class CreditBankruptcyController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史破产重整(仅解析“历史破产重整”选项卡)
|
||||
* 规则:案号/唯一标识相同则覆盖更新(recommend++ 记录更新次数);不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditBankruptcy:save')")
|
||||
@Operation(summary = "批量导入历史破产重整")
|
||||
@@ -392,8 +341,10 @@ public class CreditBankruptcyController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
|
||||
LinkedHashMap<String, CreditBankruptcy> latestByCode = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCode = new LinkedHashMap<>();
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditBankruptcy> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditBankruptcyImportParam param = list.get(i);
|
||||
@@ -429,121 +380,42 @@ public class CreditBankruptcyController extends BaseController {
|
||||
item.setDeleted(0);
|
||||
}
|
||||
|
||||
latestByCode.put(item.getCode(), item);
|
||||
latestRowByCode.put(item.getCode(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBankruptcyService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBankruptcy::getCode,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCode.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditBankruptcy> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditBankruptcy> entry : latestByCode.entrySet()) {
|
||||
String code = entry.getKey();
|
||||
CreditBankruptcy item = entry.getValue();
|
||||
Integer rowNo = latestRowByCode.get(code);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditBankruptcyService,
|
||||
chunkItems,
|
||||
CreditBankruptcy::getId,
|
||||
CreditBankruptcy::setId,
|
||||
CreditBankruptcy::getCode,
|
||||
CreditBankruptcy::getCode,
|
||||
CreditBankruptcy::getRecommend,
|
||||
CreditBankruptcy::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditBankruptcyService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
||||
.eq(CreditBankruptcy::getCode, rowItem.getCode())
|
||||
.select(CreditBankruptcy::getId, CreditBankruptcy::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditBankruptcyService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBankruptcyService,
|
||||
chunkItems,
|
||||
CreditBankruptcy::getId,
|
||||
CreditBankruptcy::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBankruptcy::getCode,
|
||||
CreditBankruptcy::getCode,
|
||||
CreditBankruptcy::getRecommend,
|
||||
CreditBankruptcy::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditBankruptcyService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
|
||||
.eq(CreditBankruptcy::getCode, rowItem.getCode())
|
||||
.select(CreditBankruptcy::getId, CreditBankruptcy::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditBankruptcyService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -259,38 +259,13 @@ public class CreditBranchController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBranchService,
|
||||
chunkItems,
|
||||
CreditBranch::getId,
|
||||
CreditBranch::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBranch::getName,
|
||||
CreditBranch::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditBranchService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBranch existing = creditBranchService.lambdaQuery()
|
||||
.eq(CreditBranch::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditBranchService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -304,38 +279,13 @@ public class CreditBranchController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBranchService,
|
||||
chunkItems,
|
||||
CreditBranch::getId,
|
||||
CreditBranch::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -23,10 +23,8 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -264,38 +262,13 @@ public class CreditBreachOfTrustController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBreachOfTrustService,
|
||||
chunkItems,
|
||||
CreditBreachOfTrust::getId,
|
||||
CreditBreachOfTrust::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditBreachOfTrustService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
|
||||
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditBreachOfTrustService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -309,38 +282,13 @@ public class CreditBreachOfTrustController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBreachOfTrustService,
|
||||
chunkItems,
|
||||
CreditBreachOfTrust::getId,
|
||||
CreditBreachOfTrust::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -360,7 +308,7 @@ public class CreditBreachOfTrustController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史失信被执行人(仅解析“历史失信被执行人”选项卡)
|
||||
* 规则:案号相同则覆盖更新(recommend++ 记录更新次数);案号不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditBreachOfTrust:save')")
|
||||
@Operation(summary = "批量导入历史失信被执行人")
|
||||
@@ -394,8 +342,10 @@ public class CreditBreachOfTrustController extends BaseController {
|
||||
Map<String, String> urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
|
||||
// 同案号多条:以导入文件中“最后一条”为准(视为最新)
|
||||
LinkedHashMap<String, CreditBreachOfTrust> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
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++) {
|
||||
CreditBreachOfTrustImportParam param = list.get(i);
|
||||
@@ -433,121 +383,42 @@ public class CreditBreachOfTrustController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBreachOfTrustService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditBreachOfTrust> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditBreachOfTrust> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditBreachOfTrust item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditBreachOfTrustService,
|
||||
chunkItems,
|
||||
CreditBreachOfTrust::getId,
|
||||
CreditBreachOfTrust::setId,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
CreditBreachOfTrust::getRecommend,
|
||||
CreditBreachOfTrust::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditBreachOfTrustService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
|
||||
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditBreachOfTrust::getId, CreditBreachOfTrust::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditBreachOfTrustService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditBreachOfTrustService,
|
||||
chunkItems,
|
||||
CreditBreachOfTrust::getId,
|
||||
CreditBreachOfTrust::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
CreditBreachOfTrust::getCaseNumber,
|
||||
CreditBreachOfTrust::getRecommend,
|
||||
CreditBreachOfTrust::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditBreachOfTrustService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
|
||||
.eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditBreachOfTrust::getId, CreditBreachOfTrust::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditBreachOfTrustService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -265,38 +265,13 @@ public class CreditCaseFilingController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCaseFilingService,
|
||||
chunkItems,
|
||||
CreditCaseFiling::getId,
|
||||
CreditCaseFiling::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCaseFiling::getCaseNumber,
|
||||
CreditCaseFiling::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditCaseFilingService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
|
||||
.eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCaseFilingService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -310,38 +285,13 @@ public class CreditCaseFilingController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCaseFilingService,
|
||||
chunkItems,
|
||||
CreditCaseFiling::getId,
|
||||
CreditCaseFiling::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -262,38 +262,13 @@ public class CreditCompetitorController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCompetitorService,
|
||||
chunkItems,
|
||||
CreditCompetitor::getId,
|
||||
CreditCompetitor::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCompetitor::getName,
|
||||
CreditCompetitor::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditCompetitorService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
|
||||
.eq(CreditCompetitor::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCompetitorService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -307,38 +282,13 @@ public class CreditCompetitorController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCompetitorService,
|
||||
chunkItems,
|
||||
CreditCompetitor::getId,
|
||||
CreditCompetitor::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCompetitor::getName,
|
||||
CreditCompetitor::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditCompetitorService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCompetitor existing = creditCompetitorService.lambdaQuery()
|
||||
.eq(CreditCompetitor::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCompetitorService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -265,38 +265,13 @@ public class CreditCourtAnnouncementController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCourtAnnouncementService,
|
||||
chunkItems,
|
||||
CreditCourtAnnouncement::getId,
|
||||
CreditCourtAnnouncement::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCourtAnnouncement::getCaseNumber,
|
||||
CreditCourtAnnouncement::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditCourtAnnouncementService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
|
||||
.eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCourtAnnouncementService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -310,38 +285,13 @@ public class CreditCourtAnnouncementController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCourtAnnouncementService,
|
||||
chunkItems,
|
||||
CreditCourtAnnouncement::getId,
|
||||
CreditCourtAnnouncement::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -269,38 +268,13 @@ public class CreditCourtSessionController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCourtSessionService,
|
||||
chunkItems,
|
||||
CreditCourtSession::getId,
|
||||
CreditCourtSession::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditCourtSessionService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
|
||||
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditCourtSessionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -314,38 +288,13 @@ public class CreditCourtSessionController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCourtSessionService,
|
||||
chunkItems,
|
||||
CreditCourtSession::getId,
|
||||
CreditCourtSession::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -365,7 +314,7 @@ public class CreditCourtSessionController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史开庭公告(仅解析“历史开庭公告”选项卡)
|
||||
* 规则:案号相同则覆盖更新(recommend++ 记录更新次数);案号不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditCourtSession:save')")
|
||||
@Operation(summary = "批量导入历史开庭公告司法大数据")
|
||||
@@ -398,8 +347,10 @@ public class CreditCourtSessionController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
|
||||
LinkedHashMap<String, CreditCourtSession> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
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++) {
|
||||
CreditCourtSessionImportParam param = list.get(i);
|
||||
@@ -437,121 +388,42 @@ public class CreditCourtSessionController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCourtSessionService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditCourtSession> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditCourtSession> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditCourtSession item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditCourtSessionService,
|
||||
chunkItems,
|
||||
CreditCourtSession::getId,
|
||||
CreditCourtSession::setId,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
CreditCourtSession::getRecommend,
|
||||
CreditCourtSession::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditCourtSessionService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
|
||||
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditCourtSession::getId, CreditCourtSession::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditCourtSessionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditCourtSessionService,
|
||||
chunkItems,
|
||||
CreditCourtSession::getId,
|
||||
CreditCourtSession::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
CreditCourtSession::getCaseNumber,
|
||||
CreditCourtSession::getRecommend,
|
||||
CreditCourtSession::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditCourtSessionService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
|
||||
.eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditCourtSession::getId, CreditCourtSession::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditCourtSessionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -266,38 +266,13 @@ public class CreditDeliveryNoticeController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditDeliveryNoticeService,
|
||||
chunkItems,
|
||||
CreditDeliveryNotice::getId,
|
||||
CreditDeliveryNotice::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditDeliveryNotice::getCaseNumber,
|
||||
CreditDeliveryNotice::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditDeliveryNoticeService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
|
||||
.eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditDeliveryNoticeService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -311,38 +286,13 @@ public class CreditDeliveryNoticeController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditDeliveryNoticeService,
|
||||
chunkItems,
|
||||
CreditDeliveryNotice::getId,
|
||||
CreditDeliveryNotice::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -260,38 +260,13 @@ public class CreditExternalController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditExternalService,
|
||||
chunkItems,
|
||||
CreditExternal::getId,
|
||||
CreditExternal::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditExternal::getName,
|
||||
CreditExternal::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditExternalService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditExternal existing = creditExternalService.lambdaQuery()
|
||||
.eq(CreditExternal::getName, rowItem.getName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditExternalService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -305,38 +280,13 @@ public class CreditExternalController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditExternalService,
|
||||
chunkItems,
|
||||
CreditExternal::getId,
|
||||
CreditExternal::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -269,38 +268,13 @@ public class CreditFinalVersionController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditFinalVersionService,
|
||||
chunkItems,
|
||||
CreditFinalVersion::getId,
|
||||
CreditFinalVersion::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditFinalVersionService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
|
||||
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditFinalVersionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -314,38 +288,13 @@ public class CreditFinalVersionController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditFinalVersionService,
|
||||
chunkItems,
|
||||
CreditFinalVersion::getId,
|
||||
CreditFinalVersion::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -365,7 +314,7 @@ public class CreditFinalVersionController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史终本案件(仅解析“历史终本案件”选项卡)
|
||||
* 规则:案号相同则覆盖更新(recommend++ 记录更新次数);案号不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditFinalVersion:save')")
|
||||
@Operation(summary = "批量导入历史终本案件")
|
||||
@@ -398,8 +347,10 @@ public class CreditFinalVersionController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
|
||||
LinkedHashMap<String, CreditFinalVersion> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
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++) {
|
||||
CreditFinalVersionImportParam param = list.get(i);
|
||||
@@ -437,121 +388,42 @@ public class CreditFinalVersionController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditFinalVersionService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditFinalVersion> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditFinalVersion> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditFinalVersion item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditFinalVersionService,
|
||||
chunkItems,
|
||||
CreditFinalVersion::getId,
|
||||
CreditFinalVersion::setId,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
CreditFinalVersion::getRecommend,
|
||||
CreditFinalVersion::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditFinalVersionService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
|
||||
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditFinalVersion::getId, CreditFinalVersion::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditFinalVersionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditFinalVersionService,
|
||||
chunkItems,
|
||||
CreditFinalVersion::getId,
|
||||
CreditFinalVersion::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
CreditFinalVersion::getCaseNumber,
|
||||
CreditFinalVersion::getRecommend,
|
||||
CreditFinalVersion::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditFinalVersionService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
|
||||
.eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditFinalVersion::getId, CreditFinalVersion::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditFinalVersionService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -356,38 +355,13 @@ public class CreditGqdjController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditGqdjService,
|
||||
chunkItems,
|
||||
CreditGqdj::getId,
|
||||
CreditGqdj::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditGqdj::getCaseNumber,
|
||||
CreditGqdj::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditGqdjService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditGqdj existing = creditGqdjService.lambdaQuery()
|
||||
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditGqdjService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -401,38 +375,13 @@ public class CreditGqdjController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditGqdjService,
|
||||
chunkItems,
|
||||
CreditGqdj::getId,
|
||||
CreditGqdj::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -452,7 +401,7 @@ public class CreditGqdjController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史股权冻结(仅解析“历史股权冻结”选项卡)
|
||||
* 规则:执行通知文书号/案号相同则覆盖更新(recommend++ 记录更新次数);不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditGqdj:save')")
|
||||
@Operation(summary = "批量导入历史股权冻结司法大数据")
|
||||
@@ -547,8 +496,10 @@ public class CreditGqdjController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
LinkedHashMap<String, CreditGqdj> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
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++) {
|
||||
CreditGqdjImportParam param = list.get(i);
|
||||
@@ -590,121 +541,42 @@ public class CreditGqdjController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditGqdjService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditGqdj::getCaseNumber,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditGqdj> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditGqdj> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditGqdj item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditGqdjService,
|
||||
chunkItems,
|
||||
CreditGqdj::getId,
|
||||
CreditGqdj::setId,
|
||||
CreditGqdj::getCaseNumber,
|
||||
CreditGqdj::getCaseNumber,
|
||||
CreditGqdj::getRecommend,
|
||||
CreditGqdj::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditGqdjService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditGqdj existing = creditGqdjService.lambdaQuery()
|
||||
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditGqdj::getId, CreditGqdj::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditGqdjService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditGqdjService,
|
||||
chunkItems,
|
||||
CreditGqdj::getId,
|
||||
CreditGqdj::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditGqdj::getCaseNumber,
|
||||
CreditGqdj::getCaseNumber,
|
||||
CreditGqdj::getRecommend,
|
||||
CreditGqdj::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditGqdjService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditGqdj existing = creditGqdjService.lambdaQuery()
|
||||
.eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditGqdj::getId, CreditGqdj::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditGqdjService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -259,86 +259,13 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditHistoricalLegalPersonService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
// 批内一次查库:按 name in (...) 拉取,再按 registerDate 做内存匹配
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||
if (it != null && !ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
}
|
||||
}
|
||||
List<CreditHistoricalLegalPerson> existingList = names.isEmpty()
|
||||
? new ArrayList<>()
|
||||
: creditHistoricalLegalPersonService.lambdaQuery()
|
||||
.in(CreditHistoricalLegalPerson::getName, names)
|
||||
.list();
|
||||
|
||||
java.util.Map<String, CreditHistoricalLegalPerson> byName = new java.util.HashMap<>();
|
||||
java.util.Map<String, CreditHistoricalLegalPerson> byNameDate = new java.util.HashMap<>();
|
||||
for (CreditHistoricalLegalPerson existing : existingList) {
|
||||
if (existing == null || ImportHelper.isBlank(existing.getName())) {
|
||||
continue;
|
||||
}
|
||||
String n = existing.getName().trim();
|
||||
byName.putIfAbsent(n, existing);
|
||||
String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
|
||||
if (d != null) {
|
||||
byNameDate.putIfAbsent(n + "|" + d, existing);
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditHistoricalLegalPerson> updates = new ArrayList<>();
|
||||
List<CreditHistoricalLegalPerson> inserts = new ArrayList<>();
|
||||
for (CreditHistoricalLegalPerson it : chunkItems) {
|
||||
if (it == null || ImportHelper.isBlank(it.getName())) {
|
||||
continue;
|
||||
}
|
||||
String n = it.getName().trim();
|
||||
CreditHistoricalLegalPerson existing;
|
||||
if (!ImportHelper.isBlank(it.getRegisterDate())) {
|
||||
String d = it.getRegisterDate().trim();
|
||||
existing = byNameDate.get(n + "|" + d);
|
||||
} else {
|
||||
existing = byName.get(n);
|
||||
}
|
||||
if (existing != null) {
|
||||
it.setId(existing.getId());
|
||||
updates.add(it);
|
||||
} else {
|
||||
inserts.add(it);
|
||||
}
|
||||
}
|
||||
if (!updates.isEmpty()) {
|
||||
creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
},
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditHistoricalLegalPersonService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
|
||||
.eq(CreditHistoricalLegalPerson::getName, 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;
|
||||
},
|
||||
mpBatchSize,
|
||||
CreditHistoricalLegalPerson::getName,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -352,85 +279,13 @@ public class CreditHistoricalLegalPersonController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditHistoricalLegalPersonService,
|
||||
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;
|
||||
},
|
||||
mpBatchSize,
|
||||
CreditHistoricalLegalPerson::getName,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ import java.nio.file.Files;
|
||||
import java.util.Locale;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -241,7 +240,7 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史被执行人(写入被执行人表 credit_judgment_debtor,仅解析“历史被执行人”选项卡)
|
||||
* 规则:案号相同则更新;案号不存在则插入;导入文件内案号重复时取最后一条覆盖。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditJudgmentDebtor:save')")
|
||||
@Operation(summary = "批量导入历史被执行人")
|
||||
@@ -528,10 +527,10 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
Map<String, String> urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
|
||||
|
||||
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
|
||||
|
||||
// 同案号多条:以导入文件中“最后一条”为准(视为最新),避免批处理中重复 upsert。
|
||||
LinkedHashMap<String, CreditJudgmentDebtor> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditJudgmentDebtor> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
CreditJudgmentDebtorImportParam param = list.get(i);
|
||||
@@ -582,35 +581,19 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += persistHistoryImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
return new ImportOutcome(true, 0, errorMessages, touchedCompanyIds);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditJudgmentDebtor> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditJudgmentDebtor> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditJudgmentDebtor item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += persistHistoryImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += persistHistoryImportChunk(chunkItems, chunkRowNumbers, prefix, mpBatchSize, errorMessages);
|
||||
}
|
||||
@@ -623,101 +606,15 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
String prefix,
|
||||
int mpBatchSize,
|
||||
List<String> errorMessages) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
return batchImportSupport.runInNewTx(() -> {
|
||||
List<String> keys = new ArrayList<>(items.size());
|
||||
for (CreditJudgmentDebtor item : items) {
|
||||
if (item == null || ImportHelper.isBlank(item.getCaseNumber())) {
|
||||
continue;
|
||||
}
|
||||
keys.add(item.getCaseNumber().trim());
|
||||
}
|
||||
|
||||
Map<String, CreditJudgmentDebtor> existingByCaseNumber = new java.util.HashMap<>();
|
||||
if (!keys.isEmpty()) {
|
||||
List<CreditJudgmentDebtor> existingList = creditJudgmentDebtorService.lambdaQuery()
|
||||
.in(CreditJudgmentDebtor::getCaseNumber, keys)
|
||||
.select(CreditJudgmentDebtor::getId, CreditJudgmentDebtor::getCaseNumber, CreditJudgmentDebtor::getRecommend)
|
||||
.list();
|
||||
for (CreditJudgmentDebtor existing : existingList) {
|
||||
if (existing == null || ImportHelper.isBlank(existing.getCaseNumber())) {
|
||||
continue;
|
||||
}
|
||||
existingByCaseNumber.putIfAbsent(existing.getCaseNumber().trim(), existing);
|
||||
}
|
||||
}
|
||||
|
||||
List<CreditJudgmentDebtor> updates = new ArrayList<>();
|
||||
List<CreditJudgmentDebtor> inserts = new ArrayList<>();
|
||||
for (CreditJudgmentDebtor item : items) {
|
||||
if (item == null || ImportHelper.isBlank(item.getCaseNumber())) {
|
||||
continue;
|
||||
}
|
||||
String caseNumber = item.getCaseNumber().trim();
|
||||
CreditJudgmentDebtor existing = existingByCaseNumber.get(caseNumber);
|
||||
if (existing != null && existing.getId() != null) {
|
||||
// 覆盖更新:recommend 记录“被更新次数”,每次更新 +1
|
||||
item.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
item.setRecommend(old == null ? 1 : old + 1);
|
||||
updates.add(item);
|
||||
} else {
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
inserts.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
if (!updates.isEmpty()) {
|
||||
creditJudgmentDebtorService.updateBatchById(updates, mpBatchSize);
|
||||
}
|
||||
if (!inserts.isEmpty()) {
|
||||
creditJudgmentDebtorService.saveBatch(inserts, mpBatchSize);
|
||||
}
|
||||
return updates.size() + inserts.size();
|
||||
});
|
||||
} 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(() -> {
|
||||
if (item == null || ImportHelper.isBlank(item.getCaseNumber())) {
|
||||
return 0;
|
||||
}
|
||||
String caseNumber = item.getCaseNumber().trim();
|
||||
CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
|
||||
.eq(CreditJudgmentDebtor::getCaseNumber, caseNumber)
|
||||
.select(CreditJudgmentDebtor::getId, CreditJudgmentDebtor::getRecommend)
|
||||
.one();
|
||||
if (existing != null && existing.getId() != null) {
|
||||
item.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
item.setRecommend(old == null ? 1 : old + 1);
|
||||
return creditJudgmentDebtorService.updateById(item) ? 1 : 0;
|
||||
}
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
return creditJudgmentDebtorService.save(item) ? 1 : 0;
|
||||
});
|
||||
if (delta > 0) {
|
||||
successCount += delta;
|
||||
} else {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
return successCount;
|
||||
}
|
||||
return batchImportSupport.persistInsertOnlyChunk(
|
||||
creditJudgmentDebtorService,
|
||||
items,
|
||||
excelRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudgmentDebtor::getCaseNumber,
|
||||
prefix,
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
private int persistImportChunk(List<CreditJudgmentDebtor> items,
|
||||
@@ -725,54 +622,15 @@ public class CreditJudgmentDebtorController extends BaseController {
|
||||
String prefix,
|
||||
int mpBatchSize,
|
||||
List<String> errorMessages) {
|
||||
if (CollectionUtils.isEmpty(items)) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
|
||||
return batchImportSupport.persistInsertOnlyChunk(
|
||||
creditJudgmentDebtorService,
|
||||
items,
|
||||
CreditJudgmentDebtor::getId,
|
||||
CreditJudgmentDebtor::setId,
|
||||
excelRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudgmentDebtor::getCaseNumber,
|
||||
CreditJudgmentDebtor::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
));
|
||||
} catch (Exception batchException) {
|
||||
int successCount = 0;
|
||||
for (int i = 0; i < items.size(); i++) {
|
||||
CreditJudgmentDebtor item = items.get(i);
|
||||
int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
|
||||
try {
|
||||
int delta = batchImportSupport.runInNewTx(() -> {
|
||||
boolean saved = creditJudgmentDebtorService.save(item);
|
||||
if (!saved) {
|
||||
CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
|
||||
.eq(CreditJudgmentDebtor::getCaseNumber, item.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditJudgmentDebtorService.updateById(item)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
if (delta > 0) {
|
||||
successCount += delta;
|
||||
} else {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
return successCount;
|
||||
}
|
||||
prefix,
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -271,38 +270,13 @@ public class CreditJudicialDocumentController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditJudicialDocumentService,
|
||||
chunkItems,
|
||||
CreditJudicialDocument::getId,
|
||||
CreditJudicialDocument::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditJudicialDocumentService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
|
||||
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditJudicialDocumentService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -316,38 +290,13 @@ public class CreditJudicialDocumentController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditJudicialDocumentService,
|
||||
chunkItems,
|
||||
CreditJudicialDocument::getId,
|
||||
CreditJudicialDocument::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -367,7 +316,7 @@ public class CreditJudicialDocumentController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史裁判文书(仅解析“历史裁判文书”选项卡)
|
||||
* 规则:案号相同则覆盖更新(recommend++ 记录更新次数);案号不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditJudicialDocument:save')")
|
||||
@Operation(summary = "批量导入历史裁判文书司法大数据")
|
||||
@@ -401,8 +350,10 @@ public class CreditJudicialDocumentController extends BaseController {
|
||||
Map<String, String> urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
Map<String, String> urlByTitle = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "文书标题");
|
||||
|
||||
LinkedHashMap<String, CreditJudicialDocument> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
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++) {
|
||||
CreditJudicialDocumentImportParam param = list.get(i);
|
||||
@@ -446,121 +397,42 @@ public class CreditJudicialDocumentController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditJudicialDocumentService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditJudicialDocument> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditJudicialDocument> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditJudicialDocument item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditJudicialDocumentService,
|
||||
chunkItems,
|
||||
CreditJudicialDocument::getId,
|
||||
CreditJudicialDocument::setId,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
CreditJudicialDocument::getRecommend,
|
||||
CreditJudicialDocument::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditJudicialDocumentService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
|
||||
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditJudicialDocument::getId, CreditJudicialDocument::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditJudicialDocumentService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditJudicialDocumentService,
|
||||
chunkItems,
|
||||
CreditJudicialDocument::getId,
|
||||
CreditJudicialDocument::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
CreditJudicialDocument::getCaseNumber,
|
||||
CreditJudicialDocument::getRecommend,
|
||||
CreditJudicialDocument::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditJudicialDocumentService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
|
||||
.eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditJudicialDocument::getId, CreditJudicialDocument::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditJudicialDocumentService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -297,35 +297,13 @@ public class CreditJudiciaryController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
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;
|
||||
},
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudiciary::getCode,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -339,35 +317,13 @@ public class CreditJudiciaryController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
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;
|
||||
},
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditJudiciary::getCode,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -264,38 +264,13 @@ public class CreditMediationController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditMediationService,
|
||||
chunkItems,
|
||||
CreditMediation::getId,
|
||||
CreditMediation::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditMediation::getCaseNumber,
|
||||
CreditMediation::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditMediationService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditMediation existing = creditMediationService.lambdaQuery()
|
||||
.eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditMediationService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -309,38 +284,13 @@ public class CreditMediationController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditMediationService,
|
||||
chunkItems,
|
||||
CreditMediation::getId,
|
||||
CreditMediation::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -308,58 +308,22 @@ public class CreditNearbyCompanyController extends BaseController {
|
||||
Integer tenantId,
|
||||
int mpBatchSize,
|
||||
List<String> errorMessages) {
|
||||
return batchImportSupport.persistChunkWithFallback(
|
||||
items,
|
||||
excelRowNumbers,
|
||||
() -> batchImportSupport.upsertByCodeOrName(
|
||||
return batchImportSupport.persistInsertOnlyChunk(
|
||||
creditNearbyCompanyService,
|
||||
items,
|
||||
CreditNearbyCompany::getId,
|
||||
CreditNearbyCompany::setId,
|
||||
CreditNearbyCompany::getCode,
|
||||
CreditNearbyCompany::getCode,
|
||||
CreditNearbyCompany::getName,
|
||||
CreditNearbyCompany::getName,
|
||||
wrapper -> {
|
||||
if (companyId != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
|
||||
excelRowNumbers,
|
||||
mpBatchSize,
|
||||
it -> {
|
||||
if (it == null) {
|
||||
return null;
|
||||
}
|
||||
if (parentId != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getParentId, parentId);
|
||||
}
|
||||
if (type != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getType, type);
|
||||
}
|
||||
if (tenantId != null) {
|
||||
wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
|
||||
String code = it.getCode();
|
||||
if (code != null && !code.trim().isEmpty()) {
|
||||
return code;
|
||||
}
|
||||
return it.getName();
|
||||
},
|
||||
mpBatchSize
|
||||
),
|
||||
(item, excelRowNumber) -> {
|
||||
boolean saved = creditNearbyCompanyService.save(item);
|
||||
if (!saved) {
|
||||
CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery()
|
||||
.eq(!ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getCode, item.getCode())
|
||||
.eq(ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getName, item.getName())
|
||||
.eq(item.getCompanyId() != null, CreditNearbyCompany::getCompanyId, item.getCompanyId())
|
||||
.eq(item.getParentId() != null, CreditNearbyCompany::getParentId, item.getParentId())
|
||||
.eq(item.getType() != null, CreditNearbyCompany::getType, item.getType())
|
||||
.eq(item.getTenantId() != null, CreditNearbyCompany::getTenantId, item.getTenantId())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
item.setId(existing.getId());
|
||||
if (creditNearbyCompanyService.updateById(item)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = excelRowNumber > 0 ? ("第" + excelRowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -264,38 +264,13 @@ public class CreditPatentController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditPatentService,
|
||||
chunkItems,
|
||||
CreditPatent::getId,
|
||||
CreditPatent::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditPatent::getRegisterNo,
|
||||
CreditPatent::getRegisterNo,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditPatentService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditPatent existing = creditPatentService.lambdaQuery()
|
||||
.eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditPatentService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -309,38 +284,13 @@ public class CreditPatentController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditPatentService,
|
||||
chunkItems,
|
||||
CreditPatent::getId,
|
||||
CreditPatent::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -252,38 +252,13 @@ public class CreditRiskRelationController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditRiskRelationService,
|
||||
chunkItems,
|
||||
CreditRiskRelation::getId,
|
||||
CreditRiskRelation::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditRiskRelation::getMainBodyName,
|
||||
CreditRiskRelation::getMainBodyName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditRiskRelationService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
|
||||
.eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditRiskRelationService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -297,38 +272,13 @@ public class CreditRiskRelationController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditRiskRelationService,
|
||||
chunkItems,
|
||||
CreditRiskRelation::getId,
|
||||
CreditRiskRelation::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -260,38 +260,13 @@ public class CreditSupplierController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditSupplierService,
|
||||
chunkItems,
|
||||
CreditSupplier::getId,
|
||||
CreditSupplier::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditSupplier::getSupplier,
|
||||
CreditSupplier::getSupplier,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditSupplierService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditSupplier existing = creditSupplierService.lambdaQuery()
|
||||
.eq(CreditSupplier::getSupplier, rowItem.getSupplier())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditSupplierService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -305,38 +280,13 @@ public class CreditSupplierController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditSupplierService,
|
||||
chunkItems,
|
||||
CreditSupplier::getId,
|
||||
CreditSupplier::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -263,99 +263,29 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditSuspectedRelationshipService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
List<String> relatedParties = new ArrayList<>(chunkItems.size());
|
||||
for (CreditSuspectedRelationship it : chunkItems) {
|
||||
mpBatchSize,
|
||||
it -> {
|
||||
if (it == null) {
|
||||
continue;
|
||||
return null;
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
String n = it.getName();
|
||||
String r = it.getRelatedParty();
|
||||
if (n != null) {
|
||||
n = n.trim();
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getRelatedParty())) {
|
||||
relatedParties.add(it.getRelatedParty().trim());
|
||||
if (r != null) {
|
||||
r = r.trim();
|
||||
}
|
||||
if (n != null && !n.isEmpty() && r != null && !r.isEmpty()) {
|
||||
return n + "->" + r;
|
||||
}
|
||||
|
||||
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;
|
||||
return n;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -369,99 +299,29 @@ public class CreditSuspectedRelationshipController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditSuspectedRelationshipService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> {
|
||||
List<String> names = new ArrayList<>(chunkItems.size());
|
||||
List<String> relatedParties = new ArrayList<>(chunkItems.size());
|
||||
for (CreditSuspectedRelationship it : chunkItems) {
|
||||
mpBatchSize,
|
||||
it -> {
|
||||
if (it == null) {
|
||||
continue;
|
||||
return null;
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getName())) {
|
||||
names.add(it.getName().trim());
|
||||
String n = it.getName();
|
||||
String r = it.getRelatedParty();
|
||||
if (n != null) {
|
||||
n = n.trim();
|
||||
}
|
||||
if (!ImportHelper.isBlank(it.getRelatedParty())) {
|
||||
relatedParties.add(it.getRelatedParty().trim());
|
||||
if (r != null) {
|
||||
r = r.trim();
|
||||
}
|
||||
if (n != null && !n.isEmpty() && r != null && !r.isEmpty()) {
|
||||
return n + "->" + r;
|
||||
}
|
||||
|
||||
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;
|
||||
return n;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import com.gxwebsoft.common.core.annotation.OperationLog;
|
||||
import com.gxwebsoft.common.core.web.ApiResult;
|
||||
import com.gxwebsoft.common.core.web.BaseController;
|
||||
import com.gxwebsoft.common.core.web.BatchParam;
|
||||
import com.gxwebsoft.common.core.web.PageParam;
|
||||
import com.gxwebsoft.common.core.web.PageResult;
|
||||
import com.gxwebsoft.common.system.entity.User;
|
||||
import com.gxwebsoft.credit.entity.CreditUser;
|
||||
@@ -25,7 +24,6 @@ import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.ss.usermodel.WorkbookFactory;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@@ -34,7 +32,6 @@ import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -280,35 +277,13 @@ public class CreditUserController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditUserService,
|
||||
chunkItems,
|
||||
CreditUser::getId,
|
||||
CreditUser::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditUser::getName,
|
||||
CreditUser::getName,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditUserService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditUser existing = creditUserService.getByName(rowItem.getName());
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditUserService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
errorMessages.add("第" + rowNumber + "行:保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -322,35 +297,13 @@ public class CreditUserController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditUserService,
|
||||
chunkItems,
|
||||
CreditUser::getId,
|
||||
CreditUser::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -269,38 +268,13 @@ public class CreditXgxfController extends BaseController {
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditXgxfService,
|
||||
chunkItems,
|
||||
CreditXgxf::getId,
|
||||
CreditXgxf::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditXgxf::getCaseNumber,
|
||||
CreditXgxf::getCaseNumber,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
boolean saved = creditXgxfService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditXgxf existing = creditXgxfService.lambdaQuery()
|
||||
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
if (creditXgxfService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
@@ -314,38 +288,13 @@ public class CreditXgxfController extends BaseController {
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKey(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditXgxfService,
|
||||
chunkItems,
|
||||
CreditXgxf::getId,
|
||||
CreditXgxf::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
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
|
||||
);
|
||||
}
|
||||
@@ -365,7 +314,7 @@ public class CreditXgxfController extends BaseController {
|
||||
|
||||
/**
|
||||
* 批量导入历史限制高消费(仅解析“历史限制高消费”选项卡)
|
||||
* 规则:案号相同则覆盖更新(recommend++ 记录更新次数);案号不存在则插入。
|
||||
* 规则:使用数据库唯一索引约束,重复数据不导入。
|
||||
*/
|
||||
@PreAuthorize("hasAuthority('credit:creditXgxf:save')")
|
||||
@Operation(summary = "批量导入历史限制高消费司法大数据")
|
||||
@@ -398,8 +347,10 @@ public class CreditXgxfController extends BaseController {
|
||||
Integer currentTenantId = loginUser != null ? loginUser.getTenantId() : null;
|
||||
Map<String, String> urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
|
||||
|
||||
LinkedHashMap<String, CreditXgxf> latestByCaseNumber = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Integer> latestRowByCaseNumber = new LinkedHashMap<>();
|
||||
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++) {
|
||||
CreditXgxfImportParam param = list.get(i);
|
||||
@@ -437,121 +388,42 @@ public class CreditXgxfController extends BaseController {
|
||||
// 历史导入的数据统一标记为“失效”
|
||||
item.setDataStatus("失效");
|
||||
|
||||
latestByCaseNumber.put(item.getCaseNumber(), item);
|
||||
latestRowByCaseNumber.put(item.getCaseNumber(), excelRowNumber);
|
||||
if (item.getRecommend() == null) {
|
||||
item.setRecommend(0);
|
||||
}
|
||||
if (item.getCompanyId() != null && item.getCompanyId() > 0) {
|
||||
touchedCompanyIds.add(item.getCompanyId());
|
||||
}
|
||||
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(excelRowNumber);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditXgxfService,
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditXgxf::getCaseNumber,
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (latestByCaseNumber.isEmpty()) {
|
||||
if (errorMessages.isEmpty()) {
|
||||
return fail("未读取到数据,请确认模板表头与示例格式一致", null);
|
||||
}
|
||||
return success("导入完成,成功0条,失败" + errorMessages.size() + "条", errorMessages);
|
||||
}
|
||||
|
||||
final int chunkSize = 500;
|
||||
final int mpBatchSize = 500;
|
||||
List<CreditXgxf> chunkItems = new ArrayList<>(chunkSize);
|
||||
List<Integer> chunkRowNumbers = new ArrayList<>(chunkSize);
|
||||
|
||||
for (Map.Entry<String, CreditXgxf> entry : latestByCaseNumber.entrySet()) {
|
||||
String caseNumber = entry.getKey();
|
||||
CreditXgxf item = entry.getValue();
|
||||
Integer rowNo = latestRowByCaseNumber.get(caseNumber);
|
||||
chunkItems.add(item);
|
||||
chunkRowNumbers.add(rowNo != null ? rowNo : -1);
|
||||
if (chunkItems.size() >= chunkSize) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
creditXgxfService,
|
||||
chunkItems,
|
||||
CreditXgxf::getId,
|
||||
CreditXgxf::setId,
|
||||
CreditXgxf::getCaseNumber,
|
||||
CreditXgxf::getCaseNumber,
|
||||
CreditXgxf::getRecommend,
|
||||
CreditXgxf::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditXgxfService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditXgxf existing = creditXgxfService.lambdaQuery()
|
||||
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditXgxf::getId, CreditXgxf::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditXgxfService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
errorMessages
|
||||
);
|
||||
chunkItems.clear();
|
||||
chunkRowNumbers.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (!chunkItems.isEmpty()) {
|
||||
successCount += batchImportSupport.persistChunkWithFallback(
|
||||
chunkItems,
|
||||
chunkRowNumbers,
|
||||
() -> batchImportSupport.upsertBySingleKeyAndIncrementCounterOnUpdate(
|
||||
successCount += batchImportSupport.persistInsertOnlyChunk(
|
||||
creditXgxfService,
|
||||
chunkItems,
|
||||
CreditXgxf::getId,
|
||||
CreditXgxf::setId,
|
||||
chunkRowNumbers,
|
||||
mpBatchSize,
|
||||
CreditXgxf::getCaseNumber,
|
||||
CreditXgxf::getCaseNumber,
|
||||
CreditXgxf::getRecommend,
|
||||
CreditXgxf::setRecommend,
|
||||
null,
|
||||
mpBatchSize
|
||||
),
|
||||
(rowItem, rowNumber) -> {
|
||||
if (rowItem.getRecommend() == null) {
|
||||
rowItem.setRecommend(0);
|
||||
}
|
||||
boolean saved = creditXgxfService.save(rowItem);
|
||||
if (!saved) {
|
||||
CreditXgxf existing = creditXgxfService.lambdaQuery()
|
||||
.eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
|
||||
.select(CreditXgxf::getId, CreditXgxf::getRecommend)
|
||||
.one();
|
||||
if (existing != null) {
|
||||
rowItem.setId(existing.getId());
|
||||
Integer old = existing.getRecommend();
|
||||
rowItem.setRecommend(old == null ? 1 : old + 1);
|
||||
if (creditXgxfService.updateById(rowItem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
|
||||
errorMessages.add(prefix + "保存失败");
|
||||
return false;
|
||||
},
|
||||
"",
|
||||
errorMessages
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user