From a8808942a33d65d04e3a9fa501df043c0e7d0645 Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Thu, 24 Sep 2026 05:46:19 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E8=AF=84=E5=88=86?= =?UTF-8?q?=E9=87=8F=E5=8C=96=E8=A1=A8=E5=AF=BC=E5=85=A5=E6=9C=AA=E6=95=B4?= =?UTF-8?q?=E6=89=B9=E5=9B=9E=E6=BB=9A=EF=BC=88=E6=8C=89=E8=AF=84=E5=AE=9A?= =?UTF-8?q?=E8=A1=A8=E5=88=86=E7=BB=84=E7=B2=92=E5=BA=A6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: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),非错误。 --- .../CreditScoreQuantificationController.java | 15 ++++++++++++--- .../CreditScoreQuantificationServiceImpl.java | 7 +++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CreditScoreQuantificationController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CreditScoreQuantificationController.java index 59c404ff..d10852ba 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CreditScoreQuantificationController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CreditScoreQuantificationController.java @@ -138,9 +138,18 @@ public class CreditScoreQuantificationController extends BladeController { @ApiOperationSupport(order = 7) @Operation(summary = "导入评分量化表", description = "传入excel") public R importCreditScoreQuantification(MultipartFile file, HttpServletResponse response) { - List 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("操作成功"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java index c5915da9..cebba5e9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CreditScoreQuantificationServiceImpl.java @@ -214,6 +214,13 @@ public class CreditScoreQuantificationServiceImpl extends BaseServiceImpl