From cd2052e5d0aa3871689994a48f8e9d263a553080 Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Thu, 24 Sep 2026 04:57:26 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=B8=B8=E7=94=A8?= =?UTF-8?q?=E7=BA=BF=E8=B7=AF=E5=AF=BC=E5=85=A5=E6=9C=AA=E6=95=B4=E6=89=B9?= =?UTF-8?q?=E5=9B=9E=E6=BB=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:CommonRouteServiceImpl.importCommonRoute 循环内吞掉异常后正常 return, 方法正常返回导致 Spring 照常提交事务。方法虽有 @Transactional(rollbackFor = Exception.class),但异常被吞后注解救不了——失败行之前的正确行已经落库。 改动: - 服务层:错误收集完毕后若 failureList 非空,抛 ImportFailureException (org.springblade.common.excel)触发整批回滚。catch 里原本就把原因 写在原行对象上,失败明细原因不丢,无需额外处理。 - 控制器:改为 catch 异常 → 取 failureList 导出(exportFailureReasonOnly) → return null,并补上传文件校验,对齐 PortTerminalController 写法。 验证: - mvn install -DskipTests 全量编译通过。 - 常用线路回归 29/29 通过(新增 tests/fixtures/common-route/, scripts/api-common-route-import-test.sh),含 02_一行错误多行正确_应零写入、 07_与库中线路重名(基线行不受回滚影响)。 - 港口码头 45/45、常用货物 25/25 基线回归通过,确认无连带影响。 --- .../controller/CommonRouteController.java | 20 +++++++++++++------ .../service/impl/CommonRouteServiceImpl.java | 10 ++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CommonRouteController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CommonRouteController.java index 61966056..db31a347 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CommonRouteController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/CommonRouteController.java @@ -38,6 +38,7 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.common.excel.ImportFailureExcelUtil; +import org.springblade.common.excel.ImportFailureException; import org.springblade.transport.excel.CommonRouteExportExcel; import org.springblade.transport.excel.CommonRouteImportExcel; import org.springblade.transport.pojo.entity.CommonRoute; @@ -109,15 +110,22 @@ public class CommonRouteController extends BladeController { @ApiOperationSupport(order = 6) @Operation(summary = "导入常用线路", description = "传入excel") public R importCommonRoute(MultipartFile file, HttpServletResponse response) { - List failureList = commonRouteService.importCommonRoute( - ExcelUtil.read(file, CommonRouteImportExcel.class) - ); - if (Func.isNotEmpty(failureList)) { - ImportFailureExcelUtil.export( + 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 { + commonRouteService.importCommonRoute(ExcelUtil.read(file, CommonRouteImportExcel.class)); + } catch (ImportFailureException exception) { + // 任一行失败即整批回滚,导出原表全部数据并标注错误,用户修正后重新导入。 + ImportFailureExcelUtil.exportFailureReasonOnly( response, "常用线路导入失败明细" + DateUtil.time(), "导入失败明细", - failureList, + exception.getFailureList(), CommonRouteImportExcel.class ); return null; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonRouteServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonRouteServiceImpl.java index 10d7f8d0..505ffd51 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonRouteServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/CommonRouteServiceImpl.java @@ -25,6 +25,7 @@ package org.springblade.transport.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springblade.common.excel.ImportFailureException; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.tool.utils.BeanUtil; @@ -130,6 +131,10 @@ public class CommonRouteServiceImpl extends BaseServiceImpl failureList = new ArrayList<>(); for (int index = 0; index < data.size(); index++) { CommonRouteImportExcel excel = data.get(index); @@ -142,6 +147,11 @@ public class CommonRouteServiceImpl extends BaseServiceImpl