This commit is contained in:
2026-09-09 17:42:26 +08:00
parent 2b0e66ca7e
commit 88b489eb77
29 changed files with 1195 additions and 909 deletions
@@ -12,7 +12,7 @@ class WarehouseSchemaContractTest {
@Test
void shouldHandleCase01() throws IOException {
String sql = read("warehouse.sql");
assertColumns(sql, "wh_warehouse", "warehouse_code", "warehouse_name", "warehouse_type", "country_code",
assertColumns(sql, "wh_warehouse", "warehouse_code", "internal_code", "warehouse_name", "warehouse_type", "country_code",
"timezone", "contact_name", "contact_phone", "contact_email", "status", "remark");
assertColumns(sql, "wh_warehouse_address", "warehouse_id", "address_type", "country_code", "state_province",
"city", "district", "postal_code", "address_line1", "address_line2", "latitude", "longitude");
@@ -61,7 +61,7 @@ class WarehouseApplicationServiceTest {
@Test
void createsDomesticWarehouseWithPlatformDefaults() {
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "CN-SZX-01", "深圳作业仓",
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "CN-SZX-01", null, "深圳作业仓",
null, null, null, "张三", "13800138000", null, null, null,
new WarehouseRequests.AddressRequest(null, null, "广东省", "深圳市", "南山区",
"518000", "前海路 1 号", null, null, null),
@@ -86,7 +86,7 @@ class WarehouseApplicationServiceTest {
@Test
void fbaWarehouseUsesConfirmedStateTimezoneAndDoesNotCreateCapabilities() {
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-LAX9", "LAX9",
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-LAX9", "154", "LAX9",
"FBA", "US", null, null, null, null, null, null,
new WarehouseRequests.AddressRequest(null, "US", "CA", "Redlands", null,
"92374", "Amazon Fulfillment Center", null, null, null),
@@ -99,13 +99,28 @@ class WarehouseApplicationServiceTest {
verify(repository, never()).insertCapability(any());
assertThat(warehouse.getValue().getTenantId()).isZero();
assertThat(warehouse.getValue().getWarehouseType()).isEqualTo("FBA");
assertThat(warehouse.getValue().getInternalCode()).isEqualTo("154");
assertThat(warehouse.getValue().getTimezone()).isEqualTo("UTC-8");
assertThat(warehouse.getValue().getStatus()).isEqualTo("ACTIVE");
}
@Test
void rejectsInternalCodeForNonFbaWarehouse() {
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "CN-SZX-01", "154", "深圳作业仓",
"DOMESTIC", "CN", "UTC+8", null, null, null, null, null,
new WarehouseRequests.AddressRequest(null, "CN", "广东省", "深圳市", null,
"518000", "前海路 1 号", null, null, null),
null);
assertThatThrownBy(() -> service.create(request)).isInstanceOf(BizException.class)
.extracting(exception -> ((BizException) exception).getResultCode())
.isEqualTo(ResultCode.VALIDATION_FAILED);
verify(repository, never()).insertWarehouse(any());
}
@Test
void fbaWarehouseInMultiTimezoneStateRequiresExplicitTimezone() {
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-DFW", "DFW",
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "FBA-DFW", null, "DFW",
"FBA", "US", null, null, null, null, null, null,
new WarehouseRequests.AddressRequest(null, "US", "TX", "Dallas", null,
"75201", "Amazon", null, null, null),
@@ -119,7 +134,7 @@ class WarehouseApplicationServiceTest {
@Test
void createsOverseasPartnerWarehouseAsPlatformPublicMasterData() {
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "US-PARTNER-LAX", "洛杉矶合作仓",
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "US-PARTNER-LAX", null, "洛杉矶合作仓",
"OVERSEAS_PARTNER", "US", "UTC-8", "Alex", "+1-213-555-0100", null, null, null,
new WarehouseRequests.AddressRequest(null, "US", "CA", "Los Angeles", null,
"90001", "123 Partner Ave", null, null, null),
@@ -46,8 +46,8 @@ class WarehouseImportServiceTest {
@DisplayName("默认 CREATE_ONLY 只新增新仓库并返回预检分类")
void shouldCreateOnlyNewWarehousesByDefault() throws Exception {
byte[] file = withRows(service.template(), new String[][] {
{"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""},
{"FBA-LAX9", "", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""}
{"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""},
{"FBA-LAX9", "154", "", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null);
@@ -61,6 +61,7 @@ class WarehouseImportServiceTest {
verify(warehouseService, org.mockito.Mockito.times(2)).create(captor.capture());
assertThat(captor.getAllValues().get(0).tenantId()).isZero();
assertThat(captor.getAllValues().get(1).warehouseType()).isEqualTo("FBA");
assertThat(captor.getAllValues().get(1).internalCode()).isEqualTo("154");
assertThat(captor.getAllValues().get(1).warehouseName()).isEqualTo("FBA-LAX9");
}
@@ -68,7 +69,7 @@ class WarehouseImportServiceTest {
@DisplayName("海外合作仓类型可通过批量导入进入公共仓库主数据")
void shouldImportOverseasPartnerWarehouse() throws Exception {
byte[] file = withRows(service.template(), new String[][] {
{"US-PARTNER-LAX", "洛杉矶合作仓", "OVERSEAS_PARTNER", "US", "CA", "Los Angeles", "", "123 Partner Ave", "90001", "UTC-8", "", "", "", "", ""}
{"US-PARTNER-LAX", "", "洛杉矶合作仓", "OVERSEAS_PARTNER", "US", "CA", "Los Angeles", "", "123 Partner Ave", "90001", "UTC-8", "", "", "", "", ""}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null);
@@ -84,8 +85,8 @@ class WarehouseImportServiceTest {
@DisplayName("任一行错误时整批零写入")
void shouldRejectWholeBatchWhenAnyRowInvalid() throws Exception {
byte[] file = withRows(service.template(), new String[][] {
{"FBA-DFW", "DFW", "FBA", "US", "TX", "Dallas", "", "Amazon FC", "75201", "", "", "", "", "", ""},
{"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "", "前海路 1 号", "", "", "", "", "", "", ""}
{"FBA-DFW", "155", "DFW", "FBA", "US", "TX", "Dallas", "", "Amazon FC", "75201", "", "", "", "", "", ""},
{"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "", "前海路 1 号", "", "", "", "", "", "", ""}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null);
@@ -122,7 +123,7 @@ class WarehouseImportServiceTest {
when(repository.findByCode(0L, "CN-SZX-01")).thenReturn(existing);
when(repository.findAddresses(0L, 9L)).thenReturn(java.util.List.of(address));
byte[] file = withRows(service.template(), new String[][] {
{"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "ACTIVE", "新联系人", "新电话", "new@example.com", "新备注"}
{"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "ACTIVE", "新联系人", "新电话", "new@example.com", "新备注"}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, ImportMode.UPSERT);
@@ -141,8 +142,8 @@ class WarehouseImportServiceTest {
@DisplayName("dryRun 只返回预检分类和计数,不写入仓库")
void shouldOnlyPreviewWhenDryRun() throws Exception {
byte[] file = withRows(service.template(), new String[][] {
{"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""},
{"FBA-LAX9", "LAX9", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""}
{"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "南山区", "前海路 1 号", "518000", "", "", "张三", "13800138000", "", ""},
{"FBA-LAX9", "154", "LAX9", "FBA", "US", "CA", "Redlands", "", "Amazon FC", "92374", "", "", "", "", "", ""}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null, true);
@@ -175,7 +176,7 @@ class WarehouseImportServiceTest {
when(repository.findByCode(0L, "CN-SZX-01")).thenReturn(existing);
when(repository.findAddresses(0L, 9L)).thenReturn(java.util.List.of(address));
byte[] file = withRows(service.template(), new String[][] {
{"CN-SZX-01", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "", "", "", "", ""}
{"CN-SZX-01", "", "深圳作业仓", "", "", "广东省", "深圳市", "", "新地址", "", "", "", "", "", "", ""}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, ImportMode.CREATE_ONLY);