From 81824b50628b66c6ffdb2bf8e8ffeb7269cb39cd Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Sat, 26 Sep 2026 10:30:39 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E8=BF=9D=E7=AB=A0=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=A4=B1=E8=B4=A5=E6=98=8E=E7=BB=86=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=85=A8=E9=87=8F=E5=8E=9F=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:importViolationRecord 收集 errorList 后 setRollbackOnly 并 return, 控制器据此导出「仅错误行」——失败明细不是原表全量,用户看不到哪几行是对的、 也不便对照原表修正(用户反馈:违章记录没有返回全量表格)。 改动: - 服务层:改为抛 ImportFailureException(data),明细携带**原表全部行**; 整批回滚由异常触发(替代 setRollbackOnly,语义不变)。 - 控制器:catch 异常后取 getFailureList() 导出,并补上传文件校验。 用 export(...) 而非 exportFailureReasonOnly(...):后者会把 markErrorColumns 置 false、只标红失败原因列,导致「按列标红」能力丢失(实测 5 个既有用例 标红列变空);export(...) 同时保留全量行与按列标红。 验证:mvn install -DskipTests 通过;违章记录回归 40/40 (既有 9 用例,标红列断言全绿:03 类型 / 04 事项 / 05 事项 / 06 类型 / 08 车牌号/船号); 用户实际上传文件实测:失败明细返回全量 5 行、仅错误行带原因、标红[车船类型,状态]、 库中零写入。其余 8 个导入模块回归 187 项全绿,无连带影响。 --- .../controller/ViolationRecordController.java | 15 ++++++++++++--- .../service/impl/ViolationRecordServiceImpl.java | 7 +++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ViolationRecordController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ViolationRecordController.java index d3a89443..0a87e8ec 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ViolationRecordController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/ViolationRecordController.java @@ -127,9 +127,18 @@ public class ViolationRecordController extends BladeController { @ApiOperationSupport(order = 5) @Operation(summary = "导入违章记录", description = "传入excel") public R importViolationRecord(MultipartFile file, HttpServletResponse response) { - List failureList = violationRecordService.importViolationRecord(ExcelUtil.read(file, ViolationRecordImportExcel.class)); - if (Func.isNotEmpty(failureList)) { - org.springblade.common.excel.ImportFailureExcelUtil.export(response, "违章记录导入失败明细" + DateUtil.time(), "导入失败明细", failureList, ViolationRecordImportExcel.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 { + violationRecordService.importViolationRecord(ExcelUtil.read(file, ViolationRecordImportExcel.class)); + } catch (org.springblade.common.excel.ImportFailureException exception) { + // 任一行失败即整批回滚,导出原表全部数据并标注错误(含按列标红),用户修正后重新导入。 + org.springblade.common.excel.ImportFailureExcelUtil.export(response, "违章记录导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), ViolationRecordImportExcel.class); return null; } return R.success("操作成功"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ViolationRecordServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ViolationRecordServiceImpl.java index 5b41f40d..017d029d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ViolationRecordServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ViolationRecordServiceImpl.java @@ -116,8 +116,11 @@ public class ViolationRecordServiceImpl extends BaseServiceImpl