From 962bcc7879ceab4408e22b0e865589b43202f83d Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Sat, 26 Sep 2026 10:58:15 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E5=8F=B0=E8=B4=A6/=E4=B8=BB=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=AF=BC=E5=85=A5=EF=BC=884=20=E4=B8=AA?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=89=E5=A4=B1=E8=B4=A5=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E8=BF=94=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 覆盖:设备台账 / 保养计划(blade-transport)、铁路站点 / 机场主数据(blade-system)。 问题同前两批:收集 errorList 后 setRollbackOnly 并 return,控制器据此导出 「仅错误行」——失败明细不是原表全量,用户无法对照原表修正。 改动(同构): - 服务层:抛 ImportFailureException(data),明细携带原表全部行; 回滚由异常触发(替代 setRollbackOnly)。注意 blade-system 的两个模块 用的是静态导入 TransactionAspectSupport,模式略有差异。 - 控制器:catch 异常取 getFailureList() 导出(用 export 保留按列标红), 补上传文件校验。 验证:mvn install -DskipTests 通过;台账回归 32/32,记录类回归 80/80。 --- .../controller/AirportMasterController.java | 8 +++++--- .../controller/RailwayStationController.java | 8 +++++--- .../service/impl/AirportMasterServiceImpl.java | 5 +++-- .../service/impl/RailwayStationServiceImpl.java | 5 +++-- .../controller/EquipmentLedgerController.java | 15 ++++++++++++--- .../controller/MaintenancePlanController.java | 15 ++++++++++++--- .../service/impl/EquipmentLedgerServiceImpl.java | 5 +++-- .../service/impl/MaintenancePlanServiceImpl.java | 5 +++-- 8 files changed, 46 insertions(+), 20 deletions(-) diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java index 59950862..42374fa2 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java @@ -157,9 +157,11 @@ public class AirportMasterController extends BladeController { if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) { return R.fail("请上传 .xls,.xlsx 标准格式文件"); } - List failureList = airportMasterService.importAirportMaster(ExcelUtil.read(file, AirportMasterExcel.class)); - if (Func.isNotEmpty(failureList)) { - org.springblade.common.excel.ImportFailureExcelUtil.exportFailureReasonOnly(response, "空港机场主数据导入失败明细" + DateUtil.time(), "导入失败明细", failureList, AirportMasterExcel.class); + try { + airportMasterService.importAirportMaster(ExcelUtil.read(file, AirportMasterExcel.class)); + } catch (org.springblade.common.excel.ImportFailureException exception) { + // 任一行失败即整批回滚,导出原表全部数据并标注错误(含按列标红)。 + org.springblade.common.excel.ImportFailureExcelUtil.export(response, "机场主数据导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), AirportMasterExcel.class); return null; } return R.success("操作成功"); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java index 7bc1f8c2..2e643118 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java @@ -160,9 +160,11 @@ public class RailwayStationController extends BladeController { if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) { return R.fail("请上传 .xls,.xlsx 标准格式文件"); } - List failureList = railwayStationService.importRailwayStation(ExcelUtil.read(file, RailwayStationExcel.class)); - if (Func.isNotEmpty(failureList)) { - org.springblade.common.excel.ImportFailureExcelUtil.exportFailureReasonOnly(response, "铁路车站主数据导入失败明细" + DateUtil.time(), "导入失败明细", failureList, RailwayStationExcel.class); + try { + railwayStationService.importRailwayStation(ExcelUtil.read(file, RailwayStationExcel.class)); + } catch (org.springblade.common.excel.ImportFailureException exception) { + // 任一行失败即整批回滚,导出原表全部数据并标注错误(含按列标红)。 + org.springblade.common.excel.ImportFailureExcelUtil.export(response, "铁路站点导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), RailwayStationExcel.class); return null; } return R.success("操作成功"); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java index 55bdeb12..815ca194 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java @@ -160,8 +160,9 @@ public class AirportMasterServiceImpl extends BaseServiceImpl failureList = equipmentLedgerService.importEquipmentLedger(ExcelUtil.read(file, EquipmentLedgerExcel.class)); - if (Func.isNotEmpty(failureList)) { - org.springblade.common.excel.ImportFailureExcelUtil.export(response, "设备台账导入失败明细" + DateUtil.time(), "导入失败明细", failureList, EquipmentLedgerExcel.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 { + equipmentLedgerService.importEquipmentLedger(ExcelUtil.read(file, EquipmentLedgerExcel.class)); + } catch (org.springblade.common.excel.ImportFailureException exception) { + // 任一行失败即整批回滚,导出原表全部数据并标注错误(含按列标红)。 + org.springblade.common.excel.ImportFailureExcelUtil.export(response, "设备台账导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), EquipmentLedgerExcel.class); return null; } return R.success("操作成功"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/MaintenancePlanController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/MaintenancePlanController.java index b279ccf4..44970f18 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/MaintenancePlanController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/MaintenancePlanController.java @@ -128,9 +128,18 @@ public class MaintenancePlanController extends BladeController { @ApiOperationSupport(order = 5) @Operation(summary = "导入保养记录", description = "传入excel") public R importMaintenancePlan(MultipartFile file, HttpServletResponse response) { - List failureList = maintenancePlanService.importMaintenancePlan(ExcelUtil.read(file, MaintenancePlanExcel.class)); - if (Func.isNotEmpty(failureList)) { - org.springblade.common.excel.ImportFailureExcelUtil.export(response, "保养记录导入失败明细" + DateUtil.time(), "导入失败明细", failureList, MaintenancePlanExcel.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 { + maintenancePlanService.importMaintenancePlan(ExcelUtil.read(file, MaintenancePlanExcel.class)); + } catch (org.springblade.common.excel.ImportFailureException exception) { + // 任一行失败即整批回滚,导出原表全部数据并标注错误(含按列标红)。 + org.springblade.common.excel.ImportFailureExcelUtil.export(response, "保养计划导入失败明细" + DateUtil.time(), "导入失败明细", exception.getFailureList(), MaintenancePlanExcel.class); return null; } return R.success("操作成功"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/EquipmentLedgerServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/EquipmentLedgerServiceImpl.java index cd1eccb5..f1051332 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/EquipmentLedgerServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/EquipmentLedgerServiceImpl.java @@ -114,8 +114,9 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl