From d49b4128bc3842cca4575a9ca95c72e7c2092ebd Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 8 Aug 2026 15:54:31 +0800 Subject: [PATCH] fix(warehouse): reject invalid import files with validation code --- .../controller/PlatformExpressCompanyController.java | 6 +++++- .../controller/PlatformPartnerController.java | 6 +++++- .../controller/PlatformWarehouseController.java | 6 +++++- .../service/ExpressCompanyImportServiceTest.java | 10 ++++++++++ .../warehouse/service/PartnerImportServiceTest.java | 10 ++++++++++ .../warehouse/service/WarehouseImportServiceTest.java | 11 +++++++++++ 6 files changed, 46 insertions(+), 3 deletions(-) diff --git a/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformExpressCompanyController.java b/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformExpressCompanyController.java index f57a010a4..3123367ee 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformExpressCompanyController.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformExpressCompanyController.java @@ -94,7 +94,11 @@ public class PlatformExpressCompanyController { requirePlatform(user); requirePlatformScope(tenantId); try { - return ApiResponse.success(importService.importFile(tenantId, file.getOriginalFilename(), file.getBytes())); + ExpressCompanyImportResult result = importService.importFile(tenantId, file.getOriginalFilename(), file.getBytes()); + if (!result.success()) { + throw new BizException(ResultCode.VALIDATION_FAILED, "快递公司导入文件校验失败"); + } + return ApiResponse.success(result); } catch (IOException exception) { throw new BizException(ResultCode.BAD_REQUEST, "导入文件读取失败"); } diff --git a/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformPartnerController.java b/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformPartnerController.java index 382e558e5..bfa90b263 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformPartnerController.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformPartnerController.java @@ -75,7 +75,11 @@ public class PlatformPartnerController { requirePlatform(user); requirePlatformScope(tenantId); try { - return ApiResponse.success(importService.importFile(0L, file.getOriginalFilename(), file.getBytes())); + PartnerImportResult result = importService.importFile(0L, file.getOriginalFilename(), file.getBytes()); + if (!result.success()) { + throw new BizException(ResultCode.VALIDATION_FAILED, "往来单位导入文件校验失败"); + } + return ApiResponse.success(result); } catch (IOException exception) { throw new BizException(ResultCode.BAD_REQUEST, "导入文件读取失败"); } diff --git a/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformWarehouseController.java b/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformWarehouseController.java index 8b210d66f..ba4424cda 100644 --- a/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformWarehouseController.java +++ b/warehouse/src/main/java/com/baiyue/warehouse/controller/PlatformWarehouseController.java @@ -163,7 +163,11 @@ public class PlatformWarehouseController { requireImportPermission(user, mode); if (tenantId != null) requireTenant(tenantId); try { - return ApiResponse.success(importService.importFile(0L, file.getOriginalFilename(), file.getBytes(), mode, dryRun)); + WarehouseImportResult result = importService.importFile(0L, file.getOriginalFilename(), file.getBytes(), mode, dryRun); + if (!result.success()) { + throw new BizException(ResultCode.VALIDATION_FAILED, "仓库导入文件校验失败"); + } + return ApiResponse.success(result); } catch (IOException exception) { throw new BizException(ResultCode.BAD_REQUEST, "导入文件读取失败"); } diff --git a/warehouse/src/test/java/com/baiyue/warehouse/service/ExpressCompanyImportServiceTest.java b/warehouse/src/test/java/com/baiyue/warehouse/service/ExpressCompanyImportServiceTest.java index f9295ef63..417e6b954 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/service/ExpressCompanyImportServiceTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/service/ExpressCompanyImportServiceTest.java @@ -23,6 +23,16 @@ import static org.mockito.Mockito.verify; class ExpressCompanyImportServiceTest { @MockBean private ExpressCompanyRepository repository; @Resource private ExpressCompanyImportService service; + + @Test + @DisplayName("空文件或错误扩展名整批拒绝且不写入") + void shouldRejectMalformedWorkbookWithoutWrites() { + var empty = service.importFile(0L, "express.xlsx", new byte[0]); + var wrongExtension = service.importFile(0L, "express.xls", new byte[] {1, 2, 3}); + assertThat(empty.success()).isFalse(); + assertThat(wrongExtension.success()).isFalse(); + verify(repository, never()).insert(any()); + } @Test @DisplayName("标准模板通过整批校验后写入全部数据") void shouldImportValidWorkbookAfterFullValidation() throws Exception { diff --git a/warehouse/src/test/java/com/baiyue/warehouse/service/PartnerImportServiceTest.java b/warehouse/src/test/java/com/baiyue/warehouse/service/PartnerImportServiceTest.java index a767ece50..dad534b25 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/service/PartnerImportServiceTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/service/PartnerImportServiceTest.java @@ -25,6 +25,16 @@ import static org.mockito.Mockito.verify; class PartnerImportServiceTest { @MockBean private PartnerRepository repository; @Resource private PartnerImportService service; + + @Test + @DisplayName("空文件或非 XLSX 整批拒绝且不写入") + void shouldRejectMalformedWorkbookWithoutWrites() { + PartnerImportResult empty = service.importFile(0L, "partners.xlsx", new byte[0]); + PartnerImportResult nonXlsx = service.importFile(0L, "partners.csv", new byte[] {1, 2, 3}); + assertThat(empty.success()).isFalse(); + assertThat(nonXlsx.success()).isFalse(); + verify(repository, never()).insert(any()); + } @Test @DisplayName("标准模板支持多类型并写入服务端数据范围") void shouldImportValidMultiTypeRow() throws Exception { diff --git a/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java b/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java index 4425f3d0e..aa7ef5033 100644 --- a/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java +++ b/warehouse/src/test/java/com/baiyue/warehouse/service/WarehouseImportServiceTest.java @@ -31,6 +31,17 @@ class WarehouseImportServiceTest { @MockBean private WarehouseApplicationService warehouseService; @Resource private WarehouseImportService service; + @Test + @DisplayName("空文件或损坏 XLSX 整批拒绝且不写入") + void shouldRejectMalformedWorkbookWithoutWrites() { + WarehouseImportResult empty = service.importFile(0L, "warehouses.xlsx", new byte[0], null); + WarehouseImportResult corrupt = service.importFile(0L, "warehouses.xlsx", new byte[] {1, 2, 3}, null); + assertThat(empty.success()).isFalse(); + assertThat(corrupt.success()).isFalse(); + verify(warehouseService, never()).create(any()); + verify(warehouseService, never()).update(org.mockito.ArgumentMatchers.anyLong(), org.mockito.ArgumentMatchers.anyLong(), any()); + } + @Test @DisplayName("默认 CREATE_ONLY 只新增新仓库并返回预检分类") void shouldCreateOnlyNewWarehousesByDefault() throws Exception {