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