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 ); }