From bd3202830c267abe34f2f674a09997d39b04060a Mon Sep 17 00:00:00 2001
From: gxwebsoft <170083662@qq.com>
Date: Wed, 11 Feb 2026 18:52:06 +0800
Subject: [PATCH] =?UTF-8?q?feat(import):=20=E5=AE=9E=E7=8E=B0=E6=89=B9?=
=?UTF-8?q?=E9=87=8F=E5=AF=BC=E5=85=A5=E5=8E=BB=E9=87=8D=E6=9C=BA=E5=88=B6?=
=?UTF-8?q?=E5=B9=B6=E7=AE=80=E5=8C=96=E5=AF=BC=E5=85=A5=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在 BatchImportSupport 中新增 persistInsertOnlyChunk 方法处理仅插入模式的批量保存
- 新增 isDuplicateKey 方法用于检测数据库唯一索引冲突
- 修改行政许可、破产重整、失信被执行人等控制器的导入逻辑,使用新方法替换原有的 upsert 逻辑
- 移除 LinkedHashMap 的去重预处理,改为直接使用数据库唯一索引约束处理重复数据
- 更新导入规则描述,明确使用数据库唯一索引而非覆盖更新逻辑
- 移除 LocalDate 和 LinkedHashMap 等不再使用的导入包
---
.../credit/controller/BatchImportSupport.java | 91 +++++++
...CreditAdministrativeLicenseController.java | 255 +++---------------
.../CreditBankruptcyController.java | 212 +++------------
.../controller/CreditBranchController.java | 70 +----
.../CreditBreachOfTrustController.java | 213 +++------------
.../CreditCaseFilingController.java | 70 +----
.../CreditCompetitorController.java | 70 +----
.../CreditCourtAnnouncementController.java | 70 +----
.../CreditCourtSessionController.java | 212 +++------------
.../CreditDeliveryNoticeController.java | 70 +----
.../controller/CreditExternalController.java | 70 +----
.../CreditFinalVersionController.java | 212 +++------------
.../controller/CreditGqdjController.java | 212 +++------------
...CreditHistoricalLegalPersonController.java | 165 +-----------
.../CreditJudgmentDebtorController.java | 202 +++-----------
.../CreditJudicialDocumentController.java | 212 +++------------
.../controller/CreditJudiciaryController.java | 102 ++-----
.../controller/CreditMediationController.java | 70 +----
.../CreditNearbyCompanyController.java | 60 +----
.../controller/CreditPatentController.java | 70 +----
.../CreditRiskRelationController.java | 70 +----
.../controller/CreditSupplierController.java | 70 +----
...CreditSuspectedRelationshipController.java | 204 +++-----------
.../controller/CreditUserController.java | 67 +----
.../controller/CreditXgxfController.java | 212 +++------------
25 files changed, 650 insertions(+), 2681 deletions(-)
diff --git a/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java b/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java
index bdaf481..49c2a3a 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/BatchImportSupport.java
@@ -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
+ *
+ *
This intentionally does NOT query the database for dedup/upsert.
+ */
+ public int persistInsertOnlyChunk(IService service,
+ List items,
+ List excelRowNumbers,
+ int batchSize,
+ Function rowLabelGetter,
+ String messagePrefix,
+ List 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 入库条数)。
*
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java
index 8564fcc..2d756d8 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditAdministrativeLicenseController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditAdministrativeLicenseService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertByCodeOrName(
- creditAdministrativeLicenseService,
- chunkItems,
- CreditAdministrativeLicense::getId,
- CreditAdministrativeLicense::setId,
- CreditAdministrativeLicense::getCode,
- CreditAdministrativeLicense::getCode,
- CreditAdministrativeLicense::getName,
- CreditAdministrativeLicense::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditAdministrativeLicenseService.save(rowItem);
- if (!saved) {
- CreditAdministrativeLicense existing = null;
- if (!ImportHelper.isBlank(rowItem.getCode())) {
- existing = creditAdministrativeLicenseService.lambdaQuery()
- .eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
- .one();
- }
- if (existing == null) {
- existing = creditAdministrativeLicenseService.lambdaQuery()
- .eq(CreditAdministrativeLicense::getName, rowItem.getName())
- .one();
- }
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditAdministrativeLicenseService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditAdministrativeLicense::getName,
+ "",
errorMessages
);
chunkItems.clear();
@@ -323,48 +287,13 @@ public class CreditAdministrativeLicenseController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditAdministrativeLicenseService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertByCodeOrName(
- creditAdministrativeLicenseService,
- chunkItems,
- CreditAdministrativeLicense::getId,
- CreditAdministrativeLicense::setId,
- CreditAdministrativeLicense::getCode,
- CreditAdministrativeLicense::getCode,
- CreditAdministrativeLicense::getName,
- CreditAdministrativeLicense::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditAdministrativeLicenseService.save(rowItem);
- if (!saved) {
- CreditAdministrativeLicense existing = null;
- if (!ImportHelper.isBlank(rowItem.getCode())) {
- existing = creditAdministrativeLicenseService.lambdaQuery()
- .eq(CreditAdministrativeLicense::getCode, rowItem.getCode())
- .one();
- }
- if (existing == null) {
- existing = creditAdministrativeLicenseService.lambdaQuery()
- .eq(CreditAdministrativeLicense::getName, rowItem.getName())
- .one();
- }
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditAdministrativeLicenseService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditAdministrativeLicense::getName,
+ "",
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 urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可编号");
Map urlByName = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "决定文书/许可证名称");
- LinkedHashMap latestByKey = new LinkedHashMap<>();
- LinkedHashMap latestRowByKey = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
CreditAdministrativeLicenseImportParam param = list.get(i);
@@ -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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditAdministrativeLicenseService,
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;
- },
+ mpBatchSize,
+ CreditAdministrativeLicense::getName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java
index 2ba6a4a..9dbb054 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditBankruptcyController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBankruptcyService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditBankruptcyService,
- chunkItems,
- CreditBankruptcy::getId,
- CreditBankruptcy::setId,
- CreditBankruptcy::getCode,
- CreditBankruptcy::getCode,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditBankruptcyService.save(rowItem);
- if (!saved) {
- CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
- .eq(CreditBankruptcy::getCode, rowItem.getCode())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditBankruptcyService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditBankruptcy::getCode,
+ "",
errorMessages
);
chunkItems.clear();
@@ -308,38 +282,13 @@ public class CreditBankruptcyController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBankruptcyService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditBankruptcyService,
- chunkItems,
- CreditBankruptcy::getId,
- CreditBankruptcy::setId,
- CreditBankruptcy::getCode,
- CreditBankruptcy::getCode,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditBankruptcyService.save(rowItem);
- if (!saved) {
- CreditBankruptcy existing = creditBankruptcyService.lambdaQuery()
- .eq(CreditBankruptcy::getCode, rowItem.getCode())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditBankruptcyService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditBankruptcy::getCode,
+ "",
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 urlByCode = ExcelImportSupport.readHyperlinksByHeaderKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
- LinkedHashMap latestByCode = new LinkedHashMap<>();
- LinkedHashMap latestRowByCode = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
CreditBankruptcyImportParam param = list.get(i);
@@ -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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBankruptcyService,
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;
- },
+ mpBatchSize,
+ CreditBankruptcy::getCode,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java
index 8c81cb1..872fb38 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditBranchController.java
@@ -259,38 +259,13 @@ public class CreditBranchController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBranchService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditBranchService,
- chunkItems,
- CreditBranch::getId,
- CreditBranch::setId,
- CreditBranch::getName,
- CreditBranch::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditBranchService.save(rowItem);
- if (!saved) {
- CreditBranch existing = creditBranchService.lambdaQuery()
- .eq(CreditBranch::getName, rowItem.getName())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditBranchService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditBranch::getName,
+ "",
errorMessages
);
chunkItems.clear();
@@ -304,38 +279,13 @@ public class CreditBranchController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBranchService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditBranchService,
- chunkItems,
- CreditBranch::getId,
- CreditBranch::setId,
- CreditBranch::getName,
- CreditBranch::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditBranchService.save(rowItem);
- if (!saved) {
- CreditBranch existing = creditBranchService.lambdaQuery()
- .eq(CreditBranch::getName, rowItem.getName())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditBranchService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditBranch::getName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java
index 6bab541..bc35c07 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditBreachOfTrustController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBreachOfTrustService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditBreachOfTrustService,
- chunkItems,
- CreditBreachOfTrust::getId,
- CreditBreachOfTrust::setId,
- CreditBreachOfTrust::getCaseNumber,
- CreditBreachOfTrust::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditBreachOfTrustService.save(rowItem);
- if (!saved) {
- CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
- .eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditBreachOfTrustService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditBreachOfTrust::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -309,38 +282,13 @@ public class CreditBreachOfTrustController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBreachOfTrustService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditBreachOfTrustService,
- chunkItems,
- CreditBreachOfTrust::getId,
- CreditBreachOfTrust::setId,
- CreditBreachOfTrust::getCaseNumber,
- CreditBreachOfTrust::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditBreachOfTrustService.save(rowItem);
- if (!saved) {
- CreditBreachOfTrust existing = creditBreachOfTrustService.lambdaQuery()
- .eq(CreditBreachOfTrust::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditBreachOfTrustService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditBreachOfTrust::getCaseNumber,
+ "",
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 urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
// 同案号多条:以导入文件中“最后一条”为准(视为最新)
- LinkedHashMap latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditBreachOfTrustService,
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;
- },
+ mpBatchSize,
+ CreditBreachOfTrust::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java
index 47106df..abab051 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCaseFilingController.java
@@ -265,38 +265,13 @@ public class CreditCaseFilingController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCaseFilingService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCaseFilingService,
- chunkItems,
- CreditCaseFiling::getId,
- CreditCaseFiling::setId,
- CreditCaseFiling::getCaseNumber,
- CreditCaseFiling::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditCaseFilingService.save(rowItem);
- if (!saved) {
- CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
- .eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditCaseFilingService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditCaseFiling::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -310,38 +285,13 @@ public class CreditCaseFilingController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCaseFilingService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCaseFilingService,
- chunkItems,
- CreditCaseFiling::getId,
- CreditCaseFiling::setId,
- CreditCaseFiling::getCaseNumber,
- CreditCaseFiling::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditCaseFilingService.save(rowItem);
- if (!saved) {
- CreditCaseFiling existing = creditCaseFilingService.lambdaQuery()
- .eq(CreditCaseFiling::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditCaseFilingService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditCaseFiling::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java
index 9540c30..b305ea0 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCompetitorController.java
@@ -262,38 +262,13 @@ public class CreditCompetitorController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCompetitorService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCompetitorService,
- chunkItems,
- CreditCompetitor::getId,
- CreditCompetitor::setId,
- 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;
- },
+ mpBatchSize,
+ CreditCompetitor::getName,
+ "",
errorMessages
);
chunkItems.clear();
@@ -307,38 +282,13 @@ public class CreditCompetitorController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCompetitorService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCompetitorService,
- chunkItems,
- CreditCompetitor::getId,
- CreditCompetitor::setId,
- 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;
- },
+ mpBatchSize,
+ CreditCompetitor::getName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java
index d854af9..fffae60 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtAnnouncementController.java
@@ -265,38 +265,13 @@ public class CreditCourtAnnouncementController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCourtAnnouncementService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCourtAnnouncementService,
- chunkItems,
- CreditCourtAnnouncement::getId,
- CreditCourtAnnouncement::setId,
- CreditCourtAnnouncement::getCaseNumber,
- CreditCourtAnnouncement::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditCourtAnnouncementService.save(rowItem);
- if (!saved) {
- CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
- .eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditCourtAnnouncementService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditCourtAnnouncement::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -310,38 +285,13 @@ public class CreditCourtAnnouncementController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCourtAnnouncementService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCourtAnnouncementService,
- chunkItems,
- CreditCourtAnnouncement::getId,
- CreditCourtAnnouncement::setId,
- CreditCourtAnnouncement::getCaseNumber,
- CreditCourtAnnouncement::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditCourtAnnouncementService.save(rowItem);
- if (!saved) {
- CreditCourtAnnouncement existing = creditCourtAnnouncementService.lambdaQuery()
- .eq(CreditCourtAnnouncement::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditCourtAnnouncementService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditCourtAnnouncement::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java
index 34e8e31..8d8094b 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditCourtSessionController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCourtSessionService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCourtSessionService,
- chunkItems,
- CreditCourtSession::getId,
- CreditCourtSession::setId,
- CreditCourtSession::getCaseNumber,
- CreditCourtSession::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditCourtSessionService.save(rowItem);
- if (!saved) {
- CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
- .eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditCourtSessionService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditCourtSession::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -314,38 +288,13 @@ public class CreditCourtSessionController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCourtSessionService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditCourtSessionService,
- chunkItems,
- CreditCourtSession::getId,
- CreditCourtSession::setId,
- CreditCourtSession::getCaseNumber,
- CreditCourtSession::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditCourtSessionService.save(rowItem);
- if (!saved) {
- CreditCourtSession existing = creditCourtSessionService.lambdaQuery()
- .eq(CreditCourtSession::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditCourtSessionService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditCourtSession::getCaseNumber,
+ "",
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 urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
- LinkedHashMap latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditCourtSessionService,
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;
- },
+ mpBatchSize,
+ CreditCourtSession::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java
index 33b8fde..96e6b03 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditDeliveryNoticeController.java
@@ -266,38 +266,13 @@ public class CreditDeliveryNoticeController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditDeliveryNoticeService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditDeliveryNoticeService,
- chunkItems,
- CreditDeliveryNotice::getId,
- CreditDeliveryNotice::setId,
- CreditDeliveryNotice::getCaseNumber,
- CreditDeliveryNotice::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditDeliveryNoticeService.save(rowItem);
- if (!saved) {
- CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
- .eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditDeliveryNoticeService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditDeliveryNotice::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -311,38 +286,13 @@ public class CreditDeliveryNoticeController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditDeliveryNoticeService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditDeliveryNoticeService,
- chunkItems,
- CreditDeliveryNotice::getId,
- CreditDeliveryNotice::setId,
- CreditDeliveryNotice::getCaseNumber,
- CreditDeliveryNotice::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditDeliveryNoticeService.save(rowItem);
- if (!saved) {
- CreditDeliveryNotice existing = creditDeliveryNoticeService.lambdaQuery()
- .eq(CreditDeliveryNotice::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditDeliveryNoticeService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditDeliveryNotice::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java
index 22c67cb..88f70b2 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditExternalController.java
@@ -260,38 +260,13 @@ public class CreditExternalController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditExternalService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditExternalService,
- chunkItems,
- CreditExternal::getId,
- CreditExternal::setId,
- CreditExternal::getName,
- CreditExternal::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditExternalService.save(rowItem);
- if (!saved) {
- CreditExternal existing = creditExternalService.lambdaQuery()
- .eq(CreditExternal::getName, rowItem.getName())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditExternalService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditExternal::getName,
+ "",
errorMessages
);
chunkItems.clear();
@@ -305,38 +280,13 @@ public class CreditExternalController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditExternalService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditExternalService,
- chunkItems,
- CreditExternal::getId,
- CreditExternal::setId,
- CreditExternal::getName,
- CreditExternal::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditExternalService.save(rowItem);
- if (!saved) {
- CreditExternal existing = creditExternalService.lambdaQuery()
- .eq(CreditExternal::getName, rowItem.getName())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditExternalService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditExternal::getName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java
index 3946988..9a26e60 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditFinalVersionController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditFinalVersionService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditFinalVersionService,
- chunkItems,
- CreditFinalVersion::getId,
- CreditFinalVersion::setId,
- CreditFinalVersion::getCaseNumber,
- CreditFinalVersion::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditFinalVersionService.save(rowItem);
- if (!saved) {
- CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
- .eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditFinalVersionService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditFinalVersion::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -314,38 +288,13 @@ public class CreditFinalVersionController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditFinalVersionService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditFinalVersionService,
- chunkItems,
- CreditFinalVersion::getId,
- CreditFinalVersion::setId,
- CreditFinalVersion::getCaseNumber,
- CreditFinalVersion::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditFinalVersionService.save(rowItem);
- if (!saved) {
- CreditFinalVersion existing = creditFinalVersionService.lambdaQuery()
- .eq(CreditFinalVersion::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditFinalVersionService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditFinalVersion::getCaseNumber,
+ "",
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 urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
- LinkedHashMap latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditFinalVersionService,
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;
- },
+ mpBatchSize,
+ CreditFinalVersion::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java
index c9b8193..c57df94 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditGqdjController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditGqdjService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditGqdjService,
- chunkItems,
- CreditGqdj::getId,
- CreditGqdj::setId,
- CreditGqdj::getCaseNumber,
- CreditGqdj::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditGqdjService.save(rowItem);
- if (!saved) {
- CreditGqdj existing = creditGqdjService.lambdaQuery()
- .eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditGqdjService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditGqdj::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -401,38 +375,13 @@ public class CreditGqdjController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditGqdjService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditGqdjService,
- chunkItems,
- CreditGqdj::getId,
- CreditGqdj::setId,
- CreditGqdj::getCaseNumber,
- CreditGqdj::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditGqdjService.save(rowItem);
- if (!saved) {
- CreditGqdj existing = creditGqdjService.lambdaQuery()
- .eq(CreditGqdj::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditGqdjService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditGqdj::getCaseNumber,
+ "",
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 latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditGqdjService,
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;
- },
+ mpBatchSize,
+ CreditGqdj::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java
index 5097d93..cbea59d 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditHistoricalLegalPersonController.java
@@ -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 names = new ArrayList<>(chunkItems.size());
- for (CreditHistoricalLegalPerson it : chunkItems) {
- if (it != null && !ImportHelper.isBlank(it.getName())) {
- names.add(it.getName().trim());
- }
- }
- List existingList = names.isEmpty()
- ? new ArrayList<>()
- : creditHistoricalLegalPersonService.lambdaQuery()
- .in(CreditHistoricalLegalPerson::getName, names)
- .list();
-
- java.util.Map byName = new java.util.HashMap<>();
- java.util.Map byNameDate = new java.util.HashMap<>();
- for (CreditHistoricalLegalPerson existing : existingList) {
- if (existing == null || ImportHelper.isBlank(existing.getName())) {
- continue;
- }
- String n = existing.getName().trim();
- byName.putIfAbsent(n, existing);
- String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
- if (d != null) {
- byNameDate.putIfAbsent(n + "|" + d, existing);
- }
- }
-
- List updates = new ArrayList<>();
- List inserts = new ArrayList<>();
- for (CreditHistoricalLegalPerson it : chunkItems) {
- if (it == null || ImportHelper.isBlank(it.getName())) {
- continue;
- }
- String n = it.getName().trim();
- CreditHistoricalLegalPerson existing;
- if (!ImportHelper.isBlank(it.getRegisterDate())) {
- String d = it.getRegisterDate().trim();
- existing = byNameDate.get(n + "|" + d);
- } else {
- existing = byName.get(n);
- }
- if (existing != null) {
- it.setId(existing.getId());
- updates.add(it);
- } else {
- inserts.add(it);
- }
- }
- if (!updates.isEmpty()) {
- creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
- }
- if (!inserts.isEmpty()) {
- creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
- }
- return updates.size() + inserts.size();
- },
- (rowItem, rowNumber) -> {
- boolean saved = creditHistoricalLegalPersonService.save(rowItem);
- if (!saved) {
- CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
- .eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
- .eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditHistoricalLegalPersonService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ 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 names = new ArrayList<>(chunkItems.size());
- for (CreditHistoricalLegalPerson it : chunkItems) {
- if (it != null && !ImportHelper.isBlank(it.getName())) {
- names.add(it.getName().trim());
- }
- }
- List existingList = names.isEmpty()
- ? new ArrayList<>()
- : creditHistoricalLegalPersonService.lambdaQuery()
- .in(CreditHistoricalLegalPerson::getName, names)
- .list();
-
- java.util.Map byName = new java.util.HashMap<>();
- java.util.Map byNameDate = new java.util.HashMap<>();
- for (CreditHistoricalLegalPerson existing : existingList) {
- if (existing == null || ImportHelper.isBlank(existing.getName())) {
- continue;
- }
- String n = existing.getName().trim();
- byName.putIfAbsent(n, existing);
- String d = ImportHelper.isBlank(existing.getRegisterDate()) ? null : existing.getRegisterDate().trim();
- if (d != null) {
- byNameDate.putIfAbsent(n + "|" + d, existing);
- }
- }
-
- List updates = new ArrayList<>();
- List inserts = new ArrayList<>();
- for (CreditHistoricalLegalPerson it : chunkItems) {
- if (it == null || ImportHelper.isBlank(it.getName())) {
- continue;
- }
- String n = it.getName().trim();
- CreditHistoricalLegalPerson existing;
- if (!ImportHelper.isBlank(it.getRegisterDate())) {
- String d = it.getRegisterDate().trim();
- existing = byNameDate.get(n + "|" + d);
- } else {
- existing = byName.get(n);
- }
- if (existing != null) {
- it.setId(existing.getId());
- updates.add(it);
- } else {
- inserts.add(it);
- }
- }
- if (!updates.isEmpty()) {
- creditHistoricalLegalPersonService.updateBatchById(updates, mpBatchSize);
- }
- if (!inserts.isEmpty()) {
- creditHistoricalLegalPersonService.saveBatch(inserts, mpBatchSize);
- }
- return updates.size() + inserts.size();
- },
- (rowItem, rowNumber) -> {
- boolean saved = creditHistoricalLegalPersonService.save(rowItem);
- if (!saved) {
- CreditHistoricalLegalPerson existing = creditHistoricalLegalPersonService.lambdaQuery()
- .eq(CreditHistoricalLegalPerson::getName, rowItem.getName())
- .eq(!ImportHelper.isBlank(rowItem.getRegisterDate()), CreditHistoricalLegalPerson::getRegisterDate, rowItem.getRegisterDate())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditHistoricalLegalPersonService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditHistoricalLegalPerson::getName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java
index d42a309..3972e1e 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudgmentDebtorController.java
@@ -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 urlByName1 = ExcelImportSupport.readHyperlinksByHeaderKey(excelFile, usedSheetIndex, usedTitleRows, usedHeadRows, "被执行人");
String prefix = ImportHelper.isBlank(fileLabel) ? "" : "【" + fileLabel + "】";
-
- // 同案号多条:以导入文件中“最后一条”为准(视为最新),避免批处理中重复 upsert。
- LinkedHashMap latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
CreditJudgmentDebtorImportParam param = list.get(i);
@@ -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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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 errorMessages) {
- if (CollectionUtils.isEmpty(items)) {
- return 0;
- }
-
- try {
- return batchImportSupport.runInNewTx(() -> {
- List keys = new ArrayList<>(items.size());
- for (CreditJudgmentDebtor item : items) {
- if (item == null || ImportHelper.isBlank(item.getCaseNumber())) {
- continue;
- }
- keys.add(item.getCaseNumber().trim());
- }
-
- Map existingByCaseNumber = new java.util.HashMap<>();
- if (!keys.isEmpty()) {
- List 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 updates = new ArrayList<>();
- List 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 items,
@@ -725,54 +622,15 @@ public class CreditJudgmentDebtorController extends BaseController {
String prefix,
int mpBatchSize,
List errorMessages) {
- if (CollectionUtils.isEmpty(items)) {
- return 0;
- }
- try {
- return batchImportSupport.runInNewTx(() -> batchImportSupport.upsertBySingleKey(
- creditJudgmentDebtorService,
- items,
- CreditJudgmentDebtor::getId,
- CreditJudgmentDebtor::setId,
- CreditJudgmentDebtor::getCaseNumber,
- CreditJudgmentDebtor::getCaseNumber,
- null,
- mpBatchSize
- ));
- } catch (Exception batchException) {
- int successCount = 0;
- for (int i = 0; i < items.size(); i++) {
- CreditJudgmentDebtor item = items.get(i);
- int excelRowNumber = (excelRowNumbers != null && i < excelRowNumbers.size()) ? excelRowNumbers.get(i) : -1;
- try {
- int delta = batchImportSupport.runInNewTx(() -> {
- boolean saved = creditJudgmentDebtorService.save(item);
- if (!saved) {
- CreditJudgmentDebtor existing = creditJudgmentDebtorService.lambdaQuery()
- .eq(CreditJudgmentDebtor::getCaseNumber, item.getCaseNumber())
- .one();
- if (existing != null) {
- item.setId(existing.getId());
- if (creditJudgmentDebtorService.updateById(item)) {
- return 1;
- }
- }
- } else {
- return 1;
- }
- return 0;
- });
- if (delta > 0) {
- successCount += delta;
- } else {
- errorMessages.add(prefix + "第" + excelRowNumber + "行:保存失败");
- }
- } catch (Exception e) {
- errorMessages.add(prefix + "第" + excelRowNumber + "行:" + e.getMessage());
- }
- }
- return successCount;
- }
+ return batchImportSupport.persistInsertOnlyChunk(
+ creditJudgmentDebtorService,
+ items,
+ excelRowNumbers,
+ mpBatchSize,
+ CreditJudgmentDebtor::getCaseNumber,
+ prefix,
+ errorMessages
+ );
}
private ImportOutcome importFromZip(MultipartFile zipFile, Integer currentUserId, Integer currentTenantId, Integer companyId) throws Exception {
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java
index d60733a..cb92876 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudicialDocumentController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditJudicialDocumentService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditJudicialDocumentService,
- chunkItems,
- CreditJudicialDocument::getId,
- CreditJudicialDocument::setId,
- CreditJudicialDocument::getCaseNumber,
- CreditJudicialDocument::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditJudicialDocumentService.save(rowItem);
- if (!saved) {
- CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
- .eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditJudicialDocumentService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditJudicialDocument::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -316,38 +290,13 @@ public class CreditJudicialDocumentController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditJudicialDocumentService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditJudicialDocumentService,
- chunkItems,
- CreditJudicialDocument::getId,
- CreditJudicialDocument::setId,
- CreditJudicialDocument::getCaseNumber,
- CreditJudicialDocument::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditJudicialDocumentService.save(rowItem);
- if (!saved) {
- CreditJudicialDocument existing = creditJudicialDocumentService.lambdaQuery()
- .eq(CreditJudicialDocument::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditJudicialDocumentService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditJudicialDocument::getCaseNumber,
+ "",
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 urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
Map urlByTitle = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "文书标题");
- LinkedHashMap latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditJudicialDocumentService,
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;
- },
+ mpBatchSize,
+ CreditJudicialDocument::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java
index 51f6ffa..69d2870 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditJudiciaryController.java
@@ -294,83 +294,39 @@ public class CreditJudiciaryController extends BaseController {
touchedCompanyIds.add(item.getCompanyId());
}
- chunkItems.add(item);
- chunkRowNumbers.add(excelRowNumber);
- if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
- chunkItems,
- chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditJudiciaryService,
- chunkItems,
- CreditJudiciary::getId,
- CreditJudiciary::setId,
- CreditJudiciary::getName,
- CreditJudiciary::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditJudiciaryService.save(rowItem);
- if (!saved) {
- CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditJudiciaryService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- errorMessages.add("第" + rowNumber + "行:保存失败");
- return false;
- },
- errorMessages
- );
- chunkItems.clear();
- chunkRowNumbers.clear();
- }
- } catch (Exception e) {
+ chunkItems.add(item);
+ chunkRowNumbers.add(excelRowNumber);
+ if (chunkItems.size() >= chunkSize) {
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditJudiciaryService,
+ chunkItems,
+ chunkRowNumbers,
+ mpBatchSize,
+ CreditJudiciary::getCode,
+ "",
+ errorMessages
+ );
+ chunkItems.clear();
+ chunkRowNumbers.clear();
+ }
+ } catch (Exception e) {
int excelRowNumber = i + 1 + usedTitleRows + usedHeadRows;
errorMessages.add("第" + excelRowNumber + "行:" + e.getMessage());
e.printStackTrace();
}
- }
-
- if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
- chunkItems,
- chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditJudiciaryService,
- chunkItems,
- CreditJudiciary::getId,
- CreditJudiciary::setId,
- CreditJudiciary::getName,
- CreditJudiciary::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditJudiciaryService.save(rowItem);
- if (!saved) {
- CreditJudiciary existing = creditJudiciaryService.getByName(rowItem.getName());
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditJudiciaryService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- errorMessages.add("第" + rowNumber + "行:保存失败");
- return false;
- },
- errorMessages
- );
- }
+ }
+
+ if (!chunkItems.isEmpty()) {
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditJudiciaryService,
+ chunkItems,
+ chunkRowNumbers,
+ mpBatchSize,
+ CreditJudiciary::getCode,
+ "",
+ errorMessages
+ );
+ }
creditCompanyRecordCountService.refresh(CreditCompanyRecordCountService.CountType.JUDICIARY, touchedCompanyIds);
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java
index f5dab98..d39b461 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditMediationController.java
@@ -264,38 +264,13 @@ public class CreditMediationController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditMediationService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditMediationService,
- chunkItems,
- CreditMediation::getId,
- CreditMediation::setId,
- CreditMediation::getCaseNumber,
- CreditMediation::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditMediationService.save(rowItem);
- if (!saved) {
- CreditMediation existing = creditMediationService.lambdaQuery()
- .eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditMediationService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditMediation::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -309,38 +284,13 @@ public class CreditMediationController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditMediationService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditMediationService,
- chunkItems,
- CreditMediation::getId,
- CreditMediation::setId,
- CreditMediation::getCaseNumber,
- CreditMediation::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditMediationService.save(rowItem);
- if (!saved) {
- CreditMediation existing = creditMediationService.lambdaQuery()
- .eq(CreditMediation::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditMediationService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditMediation::getCaseNumber,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java
index 8a2ba1a..dedb290 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditNearbyCompanyController.java
@@ -308,58 +308,22 @@ public class CreditNearbyCompanyController extends BaseController {
Integer tenantId,
int mpBatchSize,
List errorMessages) {
- return batchImportSupport.persistChunkWithFallback(
+ return batchImportSupport.persistInsertOnlyChunk(
+ creditNearbyCompanyService,
items,
excelRowNumbers,
- () -> batchImportSupport.upsertByCodeOrName(
- creditNearbyCompanyService,
- items,
- CreditNearbyCompany::getId,
- CreditNearbyCompany::setId,
- CreditNearbyCompany::getCode,
- CreditNearbyCompany::getCode,
- CreditNearbyCompany::getName,
- CreditNearbyCompany::getName,
- wrapper -> {
- if (companyId != null) {
- wrapper.eq(CreditNearbyCompany::getCompanyId, companyId);
- }
- if (parentId != null) {
- wrapper.eq(CreditNearbyCompany::getParentId, parentId);
- }
- if (type != null) {
- wrapper.eq(CreditNearbyCompany::getType, type);
- }
- if (tenantId != null) {
- wrapper.eq(CreditNearbyCompany::getTenantId, tenantId);
- }
- },
- mpBatchSize
- ),
- (item, excelRowNumber) -> {
- boolean saved = creditNearbyCompanyService.save(item);
- if (!saved) {
- CreditNearbyCompany existing = creditNearbyCompanyService.lambdaQuery()
- .eq(!ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getCode, item.getCode())
- .eq(ImportHelper.isBlank(item.getCode()), CreditNearbyCompany::getName, item.getName())
- .eq(item.getCompanyId() != null, CreditNearbyCompany::getCompanyId, item.getCompanyId())
- .eq(item.getParentId() != null, CreditNearbyCompany::getParentId, item.getParentId())
- .eq(item.getType() != null, CreditNearbyCompany::getType, item.getType())
- .eq(item.getTenantId() != null, CreditNearbyCompany::getTenantId, item.getTenantId())
- .one();
- if (existing != null) {
- item.setId(existing.getId());
- if (creditNearbyCompanyService.updateById(item)) {
- return true;
- }
- }
- } else {
- return true;
+ mpBatchSize,
+ it -> {
+ if (it == null) {
+ return null;
}
- String prefix = excelRowNumber > 0 ? ("第" + excelRowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
+ String code = it.getCode();
+ if (code != null && !code.trim().isEmpty()) {
+ return code;
+ }
+ return it.getName();
},
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java
index 262c43b..7700964 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditPatentController.java
@@ -264,38 +264,13 @@ public class CreditPatentController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditPatentService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditPatentService,
- chunkItems,
- CreditPatent::getId,
- CreditPatent::setId,
- CreditPatent::getRegisterNo,
- CreditPatent::getRegisterNo,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditPatentService.save(rowItem);
- if (!saved) {
- CreditPatent existing = creditPatentService.lambdaQuery()
- .eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditPatentService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditPatent::getRegisterNo,
+ "",
errorMessages
);
chunkItems.clear();
@@ -309,38 +284,13 @@ public class CreditPatentController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditPatentService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditPatentService,
- chunkItems,
- CreditPatent::getId,
- CreditPatent::setId,
- CreditPatent::getRegisterNo,
- CreditPatent::getRegisterNo,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditPatentService.save(rowItem);
- if (!saved) {
- CreditPatent existing = creditPatentService.lambdaQuery()
- .eq(CreditPatent::getRegisterNo, rowItem.getRegisterNo())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditPatentService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditPatent::getRegisterNo,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java
index 40e4daf..3dc237f 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditRiskRelationController.java
@@ -252,38 +252,13 @@ public class CreditRiskRelationController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditRiskRelationService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditRiskRelationService,
- chunkItems,
- CreditRiskRelation::getId,
- CreditRiskRelation::setId,
- CreditRiskRelation::getMainBodyName,
- CreditRiskRelation::getMainBodyName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditRiskRelationService.save(rowItem);
- if (!saved) {
- CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
- .eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditRiskRelationService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditRiskRelation::getMainBodyName,
+ "",
errorMessages
);
chunkItems.clear();
@@ -297,38 +272,13 @@ public class CreditRiskRelationController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditRiskRelationService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditRiskRelationService,
- chunkItems,
- CreditRiskRelation::getId,
- CreditRiskRelation::setId,
- CreditRiskRelation::getMainBodyName,
- CreditRiskRelation::getMainBodyName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditRiskRelationService.save(rowItem);
- if (!saved) {
- CreditRiskRelation existing = creditRiskRelationService.lambdaQuery()
- .eq(CreditRiskRelation::getMainBodyName, rowItem.getMainBodyName())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditRiskRelationService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditRiskRelation::getMainBodyName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java
index 071aa3c..22feafc 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditSupplierController.java
@@ -260,38 +260,13 @@ public class CreditSupplierController extends BaseController {
chunkItems.add(item);
chunkRowNumbers.add(excelRowNumber);
if (chunkItems.size() >= chunkSize) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditSupplierService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditSupplierService,
- chunkItems,
- CreditSupplier::getId,
- CreditSupplier::setId,
- CreditSupplier::getSupplier,
- CreditSupplier::getSupplier,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditSupplierService.save(rowItem);
- if (!saved) {
- CreditSupplier existing = creditSupplierService.lambdaQuery()
- .eq(CreditSupplier::getSupplier, rowItem.getSupplier())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditSupplierService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditSupplier::getSupplier,
+ "",
errorMessages
);
chunkItems.clear();
@@ -305,38 +280,13 @@ public class CreditSupplierController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditSupplierService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditSupplierService,
- chunkItems,
- CreditSupplier::getId,
- CreditSupplier::setId,
- CreditSupplier::getSupplier,
- CreditSupplier::getSupplier,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditSupplierService.save(rowItem);
- if (!saved) {
- CreditSupplier existing = creditSupplierService.lambdaQuery()
- .eq(CreditSupplier::getSupplier, rowItem.getSupplier())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditSupplierService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditSupplier::getSupplier,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java
index 46da439..3abb841 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditSuspectedRelationshipController.java
@@ -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 names = new ArrayList<>(chunkItems.size());
- List relatedParties = new ArrayList<>(chunkItems.size());
- for (CreditSuspectedRelationship it : chunkItems) {
- if (it == null) {
- continue;
- }
- if (!ImportHelper.isBlank(it.getName())) {
- names.add(it.getName().trim());
- }
- if (!ImportHelper.isBlank(it.getRelatedParty())) {
- relatedParties.add(it.getRelatedParty().trim());
- }
+ mpBatchSize,
+ it -> {
+ if (it == null) {
+ return null;
}
-
- List existingList = (names.isEmpty() || relatedParties.isEmpty())
- ? new ArrayList<>()
- : creditSuspectedRelationshipService.lambdaQuery()
- .in(CreditSuspectedRelationship::getName, names)
- .in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
- .list();
-
- java.util.Map byNameRelated = new java.util.HashMap<>();
- java.util.Map byNameRelatedType = new java.util.HashMap<>();
- for (CreditSuspectedRelationship existing : existingList) {
- if (existing == null
- || ImportHelper.isBlank(existing.getName())
- || ImportHelper.isBlank(existing.getRelatedParty())) {
- continue;
- }
- String n = existing.getName().trim();
- String r = existing.getRelatedParty().trim();
- byNameRelated.putIfAbsent(n + "|" + r, existing);
- if (!ImportHelper.isBlank(existing.getType())) {
- byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
- }
+ String n = it.getName();
+ String r = it.getRelatedParty();
+ if (n != null) {
+ n = n.trim();
}
-
- List updates = new ArrayList<>();
- List inserts = new ArrayList<>();
- for (CreditSuspectedRelationship it : chunkItems) {
- if (it == null
- || ImportHelper.isBlank(it.getName())
- || ImportHelper.isBlank(it.getRelatedParty())) {
- continue;
- }
- String n = it.getName().trim();
- String r = it.getRelatedParty().trim();
- CreditSuspectedRelationship existing;
- if (!ImportHelper.isBlank(it.getType())) {
- existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
- } else {
- existing = byNameRelated.get(n + "|" + r);
- }
- if (existing != null) {
- it.setId(existing.getId());
- updates.add(it);
- } else {
- inserts.add(it);
- }
+ if (r != null) {
+ r = r.trim();
}
- if (!updates.isEmpty()) {
- creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
+ if (n != null && !n.isEmpty() && r != null && !r.isEmpty()) {
+ return n + "->" + r;
}
- 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 names = new ArrayList<>(chunkItems.size());
- List relatedParties = new ArrayList<>(chunkItems.size());
- for (CreditSuspectedRelationship it : chunkItems) {
- if (it == null) {
- continue;
- }
- if (!ImportHelper.isBlank(it.getName())) {
- names.add(it.getName().trim());
- }
- if (!ImportHelper.isBlank(it.getRelatedParty())) {
- relatedParties.add(it.getRelatedParty().trim());
- }
+ mpBatchSize,
+ it -> {
+ if (it == null) {
+ return null;
}
-
- List existingList = (names.isEmpty() || relatedParties.isEmpty())
- ? new ArrayList<>()
- : creditSuspectedRelationshipService.lambdaQuery()
- .in(CreditSuspectedRelationship::getName, names)
- .in(CreditSuspectedRelationship::getRelatedParty, relatedParties)
- .list();
-
- java.util.Map byNameRelated = new java.util.HashMap<>();
- java.util.Map byNameRelatedType = new java.util.HashMap<>();
- for (CreditSuspectedRelationship existing : existingList) {
- if (existing == null
- || ImportHelper.isBlank(existing.getName())
- || ImportHelper.isBlank(existing.getRelatedParty())) {
- continue;
- }
- String n = existing.getName().trim();
- String r = existing.getRelatedParty().trim();
- byNameRelated.putIfAbsent(n + "|" + r, existing);
- if (!ImportHelper.isBlank(existing.getType())) {
- byNameRelatedType.putIfAbsent(n + "|" + r + "|" + existing.getType().trim(), existing);
- }
+ String n = it.getName();
+ String r = it.getRelatedParty();
+ if (n != null) {
+ n = n.trim();
}
-
- List updates = new ArrayList<>();
- List inserts = new ArrayList<>();
- for (CreditSuspectedRelationship it : chunkItems) {
- if (it == null
- || ImportHelper.isBlank(it.getName())
- || ImportHelper.isBlank(it.getRelatedParty())) {
- continue;
- }
- String n = it.getName().trim();
- String r = it.getRelatedParty().trim();
- CreditSuspectedRelationship existing;
- if (!ImportHelper.isBlank(it.getType())) {
- existing = byNameRelatedType.get(n + "|" + r + "|" + it.getType().trim());
- } else {
- existing = byNameRelated.get(n + "|" + r);
- }
- if (existing != null) {
- it.setId(existing.getId());
- updates.add(it);
- } else {
- inserts.add(it);
- }
+ if (r != null) {
+ r = r.trim();
}
- if (!updates.isEmpty()) {
- creditSuspectedRelationshipService.updateBatchById(updates, mpBatchSize);
+ if (n != null && !n.isEmpty() && r != null && !r.isEmpty()) {
+ return n + "->" + r;
}
- 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
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java
index d5864b4..aa033f4 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditUserController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditUserService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditUserService,
- chunkItems,
- CreditUser::getId,
- CreditUser::setId,
- CreditUser::getName,
- CreditUser::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditUserService.save(rowItem);
- if (!saved) {
- CreditUser existing = creditUserService.getByName(rowItem.getName());
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditUserService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- errorMessages.add("第" + rowNumber + "行:保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditUser::getName,
+ "",
errorMessages
);
chunkItems.clear();
@@ -322,35 +297,13 @@ public class CreditUserController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditUserService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditUserService,
- chunkItems,
- CreditUser::getId,
- CreditUser::setId,
- CreditUser::getName,
- CreditUser::getName,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditUserService.save(rowItem);
- if (!saved) {
- CreditUser existing = creditUserService.getByName(rowItem.getName());
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditUserService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- errorMessages.add("第" + rowNumber + "行:保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditUser::getName,
+ "",
errorMessages
);
}
diff --git a/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java b/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java
index f2e16d9..5fc82d4 100644
--- a/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java
+++ b/src/main/java/com/gxwebsoft/credit/controller/CreditXgxfController.java
@@ -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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditXgxfService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditXgxfService,
- chunkItems,
- CreditXgxf::getId,
- CreditXgxf::setId,
- CreditXgxf::getCaseNumber,
- CreditXgxf::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditXgxfService.save(rowItem);
- if (!saved) {
- CreditXgxf existing = creditXgxfService.lambdaQuery()
- .eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditXgxfService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditXgxf::getCaseNumber,
+ "",
errorMessages
);
chunkItems.clear();
@@ -314,38 +288,13 @@ public class CreditXgxfController extends BaseController {
}
if (!chunkItems.isEmpty()) {
- successCount += batchImportSupport.persistChunkWithFallback(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditXgxfService,
chunkItems,
chunkRowNumbers,
- () -> batchImportSupport.upsertBySingleKey(
- creditXgxfService,
- chunkItems,
- CreditXgxf::getId,
- CreditXgxf::setId,
- CreditXgxf::getCaseNumber,
- CreditXgxf::getCaseNumber,
- null,
- mpBatchSize
- ),
- (rowItem, rowNumber) -> {
- boolean saved = creditXgxfService.save(rowItem);
- if (!saved) {
- CreditXgxf existing = creditXgxfService.lambdaQuery()
- .eq(CreditXgxf::getCaseNumber, rowItem.getCaseNumber())
- .one();
- if (existing != null) {
- rowItem.setId(existing.getId());
- if (creditXgxfService.updateById(rowItem)) {
- return true;
- }
- }
- } else {
- return true;
- }
- String prefix = rowNumber > 0 ? ("第" + rowNumber + "行:") : "";
- errorMessages.add(prefix + "保存失败");
- return false;
- },
+ mpBatchSize,
+ CreditXgxf::getCaseNumber,
+ "",
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 urlByCaseNumber = ExcelImportSupport.readUrlByKey(file, usedSheetIndex, usedTitleRows, usedHeadRows, "案号");
- LinkedHashMap latestByCaseNumber = new LinkedHashMap<>();
- LinkedHashMap latestRowByCaseNumber = new LinkedHashMap<>();
+ final int chunkSize = 500;
+ final int mpBatchSize = 500;
+ List chunkItems = new ArrayList<>(chunkSize);
+ List chunkRowNumbers = new ArrayList<>(chunkSize);
for (int i = 0; i < list.size(); i++) {
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 chunkItems = new ArrayList<>(chunkSize);
- List chunkRowNumbers = new ArrayList<>(chunkSize);
-
- for (Map.Entry 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(
+ successCount += batchImportSupport.persistInsertOnlyChunk(
+ creditXgxfService,
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;
- },
+ mpBatchSize,
+ CreditXgxf::getCaseNumber,
+ "",
errorMessages
);
}