🐛 修复评分量化表导入未整批回滚(按评定表分组粒度)
问题:CreditScoreQuantificationServiceImpl.importCreditScoreQuantification 循环单位是「评定表名称」分组(每分组一次 submit,写主表+项目+选项等多表), 异常被 catch 吞掉后正常 return,Spring 照常提交——失败分组之前的 正确分组已经落库。 改动: - 服务层:任一分组失败、errorList 非空时抛 ImportFailureException (org.springblade.common.excel)触发整批回滚,失败分组之前已 submit 的正确分组一起退掉。失败明细粒度保留既有行为:覆盖失败分组的全部行。 「评定表名称」为空的行不走 submit、保持早退标错路径。 - 控制器:改 catch 异常导出(exportFailureReasonOnly)+ 补上传文件校验。 验证:mvn install -DskipTests 通过;评分量化表回归 15/15 (tests/fixtures/credit-score/,含 02_后组失败前组正确_应零写入)。 另确认既有语义:与库中重名的分组走覆盖式更新(saveOrUpdate),非错误。
This commit is contained in:
+12
-3
@@ -138,9 +138,18 @@ public class CreditScoreQuantificationController extends BladeController {
|
||||
@ApiOperationSupport(order = 7)
|
||||
@Operation(summary = "导入评分量化表", description = "传入excel")
|
||||
public R importCreditScoreQuantification(MultipartFile file, HttpServletResponse response) {
|
||||
List<CreditScoreQuantificationExcel> failureList = creditScoreQuantificationService.importCreditScoreQuantification(ExcelUtil.read(file, CreditScoreQuantificationExcel.class));
|
||||
if (Func.isNotEmpty(failureList)) {
|
||||
org.springblade.common.excel.ImportFailureExcelUtil.export(response, "评分量化表导入失败明细" + DateUtil.time(), "导入失败明细", failureList, CreditScoreQuantificationExcel.class);
|
||||
if (file == null || file.isEmpty()) {
|
||||
return R.fail("上传文件不能为空");
|
||||
}
|
||||
String fileName = Func.toStrWithEmpty(file.getOriginalFilename(), "").toLowerCase();
|
||||
if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) {
|
||||
return R.fail("请上传 .xls,.xlsx 标准格式文件");
|
||||
}
|
||||
try {
|
||||
creditScoreQuantificationService.importCreditScoreQuantification(ExcelUtil.read(file, CreditScoreQuantificationExcel.class));
|
||||
} catch (org.springblade.common.excel.ImportFailureException exception) {
|
||||
// 任一分组失败即整批回滚,导出原表全部数据并标注错误,用户修正后重新导入。
|
||||
org.springblade.common.excel.ImportFailureExcelUtil.exportFailureReasonOnly(response, "评分量化表导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), CreditScoreQuantificationExcel.class);
|
||||
return null;
|
||||
}
|
||||
return R.success("操作成功");
|
||||
|
||||
+7
@@ -214,6 +214,13 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl<Credit
|
||||
errorList.addAll(rows);
|
||||
}
|
||||
});
|
||||
if (Func.isNotEmpty(errorList)) {
|
||||
// 抛出携带失败明细的异常,触发事务回滚:任一分组失败时,
|
||||
// 失败分组**之前已 submit 的正确分组**也必须一起退掉。
|
||||
// 注意不能只往 errorList 里塞数据就 return——异常被吞掉后方法会正常返回,
|
||||
// Spring 会照常提交事务,@Transactional 起不到回滚作用。
|
||||
throw new org.springblade.common.excel.ImportFailureException(data);
|
||||
}
|
||||
return errorList;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user