fix(warehouse): use location time zones for appointment scheduling

This commit is contained in:
2026-10-10 11:02:49 +08:00
parent c4c1bddeec
commit 47dc9e8bf6
16 changed files with 1002 additions and 969 deletions
@@ -78,7 +78,7 @@ class WarehouseApplicationServiceTest {
assertThat(warehouse.getValue().getTenantId()).isZero();
assertThat(warehouse.getValue().getWarehouseType()).isEqualTo("DOMESTIC");
assertThat(warehouse.getValue().getCountryCode()).isEqualTo("CN");
assertThat(warehouse.getValue().getTimezone()).isEqualTo("UTC+8");
assertThat(warehouse.getValue().getTimezone()).isEqualTo("Asia/Shanghai");
assertThat(warehouse.getValue().getStatus()).isEqualTo("ACTIVE");
assertThat(address.getValue().getAddressType()).isEqualTo("WAREHOUSE");
assertThat(address.getValue().getCountryCode()).isEqualTo("CN");
@@ -100,14 +100,14 @@ class WarehouseApplicationServiceTest {
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().getTimezone()).isEqualTo("America/Los_Angeles");
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,
"DOMESTIC", "CN", "Asia/Shanghai", null, null, null, null, null,
new WarehouseRequests.AddressRequest(null, "CN", "广东省", "深圳市", null,
"518000", "前海路 1 号", null, null, null),
null);
@@ -135,7 +135,7 @@ class WarehouseApplicationServiceTest {
@Test
void createsOverseasPartnerWarehouseAsPlatformPublicMasterData() {
WarehouseRequests.SaveRequest request = new WarehouseRequests.SaveRequest(null, "US-PARTNER-LAX", null, "洛杉矶合作仓",
"OVERSEAS_PARTNER", "US", "UTC-8", "Alex", "+1-213-555-0100", null, null, null,
"OVERSEAS_PARTNER", "US", "America/Los_Angeles", "Alex", "+1-213-555-0100", null, null, null,
new WarehouseRequests.AddressRequest(null, "US", "CA", "Los Angeles", null,
"90001", "123 Partner Ave", null, null, null),
java.util.List.of(new WarehouseRequests.CapabilityRequest("STORAGE", "仓储", true, null, null)));
@@ -147,7 +147,7 @@ class WarehouseApplicationServiceTest {
assertThat(warehouse.getValue().getTenantId()).isZero();
assertThat(warehouse.getValue().getWarehouseType()).isEqualTo("OVERSEAS_PARTNER");
assertThat(warehouse.getValue().getCountryCode()).isEqualTo("US");
assertThat(warehouse.getValue().getTimezone()).isEqualTo("UTC-8");
assertThat(warehouse.getValue().getTimezone()).isEqualTo("America/Los_Angeles");
}
@Test
@@ -69,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", "America/Los_Angeles", "", "", "", "", ""}
});
WarehouseImportResult result = service.importFile(0L, "warehouses.xlsx", file, null);
@@ -109,7 +109,7 @@ class WarehouseImportServiceTest {
existing.setWarehouseName("旧名称");
existing.setWarehouseType("DOMESTIC");
existing.setCountryCode("CN");
existing.setTimezone("UTC+8");
existing.setTimezone("Asia/Shanghai");
existing.setContactName("旧联系人");
existing.setContactPhone("旧电话");
existing.setContactEmail("old@example.com");
@@ -166,7 +166,7 @@ class WarehouseImportServiceTest {
existing.setWarehouseName("旧名称");
existing.setWarehouseType("DOMESTIC");
existing.setCountryCode("CN");
existing.setTimezone("UTC+8");
existing.setTimezone("Asia/Shanghai");
existing.setStatus("ACTIVE");
WarehouseAddressEntity address = new WarehouseAddressEntity();
address.setCountryCode("CN");
@@ -0,0 +1,29 @@
package com.baiyue.warehouse.service;
import com.baiyue.common.core.exception.BizException;
import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
import java.time.ZoneId;
import static org.assertj.core.api.Assertions.*;
class WarehouseTimezoneTest {
@Test void inferredCaliforniaZoneTracksSummerAndWinterInsteadOfFixingTheOffset() {
var id=WarehouseSaveNormalizer.resolveTimezone("FBA","US",null,"CA");
assertThat(id).isEqualTo("America/Los_Angeles");
var zone=ZoneId.of(id);
assertThat(LocalDateTime.parse("2026-07-01T09:00:00").atZone(zone).getOffset().toString()).isEqualTo("-07:00");
assertThat(LocalDateTime.parse("2026-12-01T09:00:00").atZone(zone).getOffset().toString()).isEqualTo("-08:00");
}
@Test void rejectsFixedOffsetsAndUnrecognizedZonesOnWrite() {
for(var value:new String[]{"UTC-5","UTC-08:00","-08:00","Etc/GMT+8","Mars/Base"}) {
assertThatThrownBy(()->WarehouseSaveNormalizer.resolveTimezone("FBA","US",value,"CA")).isInstanceOf(BizException.class);
}
}
@Test void exceptionalStatesNeedAnExplicitLocationZoneAndPhoenixRemainsValid() {
for(var state:new String[]{"AK","AZ","NV","TX"}) {
assertThatThrownBy(()->WarehouseSaveNormalizer.resolveTimezone("FBA","US",null,state)).isInstanceOf(BizException.class);
}
assertThat(WarehouseSaveNormalizer.resolveTimezone("FBA","US","America/Phoenix","AZ")).isEqualTo("America/Phoenix");
assertThat(WarehouseSaveNormalizer.resolveTimezone("DOMESTIC","CN",null,null)).isEqualTo("Asia/Shanghai");
}
}