fix(lastleg): snapshot customer name for incoming cargo

This commit is contained in:
2026-10-10 08:05:23 +08:00
parent 373f1b2c18
commit 2c970f252d
2 changed files with 35 additions and 2 deletions
@@ -88,6 +88,7 @@ import java.util.stream.Collectors;
@Service
public class WarehouseTransferService {
@Resource private com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory customerDirectory;
@Resource private com.baiyue.lastleg.fleet.business.FleetPoolOrderBridge fleetPool;
@Resource private com.baiyue.lastleg.fleet.business.FleetPoolOrderQueries fleetPoolQueries;
public static final String ORDER_TYPE = "WAREHOUSE_TRANSFER";
@@ -166,6 +167,10 @@ public class WarehouseTransferService {
return detail(customerId, replay.getTransferNo());
}
var customer = customerDirectory.find(customerId);
if (customer == null || !customerId.equals(customer.id()) || !StringUtils.hasText(customer.name())) {
throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE, "客户名称暂不可用,请稍后重试");
}
LocalDateTime now = LocalDateTime.now();
long transferId = IdWorker.getId();
String transferNo = orderNoGenerator.next("TRANSFER", request.operatingWarehouseId(), transferId);
@@ -201,7 +206,7 @@ public class WarehouseTransferService {
inboundOrderId = createInboundSnapshot(customerId, transferId, transferNo, request, requestHash, now);
selectedOrders = List.of();
}
LastlegOrder order = createTailOrder(customerId, inboundOrderId, inboundCode, transferNo,
LastlegOrder order = createTailOrder(customerId, customer.name().trim(), inboundOrderId, inboundCode, transferNo,
request, requestHash, now);
WarehouseTransferOrder transfer = new WarehouseTransferOrder();
@@ -1852,10 +1857,11 @@ public class WarehouseTransferService {
return inbound.getId();
}
private LastlegOrder createTailOrder(String customerId, Long inboundOrderId, String inboundCode, String transferNo,
private LastlegOrder createTailOrder(String customerId, String customerName, Long inboundOrderId, String inboundCode, String transferNo,
WarehouseTransferRequests.Create request, String requestHash, LocalDateTime now) {
LastlegOrder order = new LastlegOrder();
order.setId(IdWorker.getId()); order.setOrderNo(orderNoGenerator.next("TRANSFER", request.operatingWarehouseId(), order.getId())); order.setCustomerId(customerId);
order.setCustomerName(customerName);
order.setOrderType(ORDER_TYPE);
order.setInboundCode(inboundCode); order.setSourceRegion("CUSTOMER");
order.setSourceInboundId("WAREHOUSE_TRANSFER:" + transferNo); order.setRootInboundId(String.valueOf(inboundOrderId));
@@ -186,10 +186,14 @@ class WarehouseTransferServiceTest {
@Mock com.baiyue.lastleg.relabel.service.RelabelApplicationService relabelService;
private WarehouseTransferService service;
@Mock WarehouseTransferReceiptCoordinator receiptCoordinator;
@Mock com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory customerDirectory;
@BeforeEach
void setUp() {
service = new WarehouseTransferService();
ReflectionTestUtils.setField(service, "customerDirectory", customerDirectory);
lenient().when(customerDirectory.find("TENANT-A")).thenReturn(
new com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory.Customer("TENANT-A", "C-A", "Customer A", null, null));
org.springframework.test.util.ReflectionTestUtils.setField(service, "fleetPool", org.mockito.Mockito.mock(com.baiyue.lastleg.fleet.business.FleetPoolOrderBridge.class));
org.springframework.test.util.ReflectionTestUtils.setField(service, "fleetPoolQueries", org.mockito.Mockito.mock(com.baiyue.lastleg.fleet.business.FleetPoolOrderQueries.class));
ReflectionTestUtils.setField(service, "receiptCoordinator", receiptCoordinator);
@@ -386,6 +390,7 @@ class WarehouseTransferServiceTest {
ArgumentCaptor<LastlegOrder> tailOrder = ArgumentCaptor.forClass(LastlegOrder.class);
verify(orders).insert(tailOrder.capture());
assertEquals(WarehouseTransferService.ORDER_TYPE, tailOrder.getValue().getOrderType());
assertEquals("Customer A", tailOrder.getValue().getCustomerName());
assertEquals(WarehouseTransferService.DRAFT, tailOrder.getValue().getCurrentStatus());
assertEquals("WAREHOUSE_TRANSFER:DRAFT;RELABEL:PENDING_BINDING", tailOrder.getValue().getSubOrderStatus());
assertTrue(tailOrder.getValue().getOrderNo().matches("WT-[0-9A-Z]{25}"));
@@ -534,6 +539,7 @@ class WarehouseTransferServiceTest {
verify(transfers).insert(transfer.capture());
verify(transferCartons, times(5)).insert(cartons.capture());
verify(orders).insert(tailOrder.capture());
assertEquals("Customer A", tailOrder.getValue().getCustomerName());
verify(sourceOrders, never()).insert(any(WarehouseTransferSourceOrder.class));
verify(relabelApplications, never()).insert(any(RelabelApplication.class));
@@ -547,6 +553,13 @@ class WarehouseTransferServiceTest {
.map(WarehouseTransferCarton::getCartonIndex).toList());
assertTrue(cartons.getAllValues().stream().allMatch(value -> value.getCartonMark()
.matches("WT-[0-9A-Z]{25}#5-[1-5]")));
when(transfers.findKey("TENANT-A", request.idempotencyKey())).thenReturn(transfer.getValue());
clearInvocations(customerDirectory, orders, inboundOrders);
service.create("TENANT-A", "USER-1", request);
verifyNoInteractions(customerDirectory, inboundOrders);
verify(orders, never()).insert(any(LastlegOrder.class));
verify(orders, never()).updateById(any(LastlegOrder.class));
assertEquals("Customer A", tailOrder.getValue().getCustomerName());
}
@Test
@@ -1089,6 +1102,20 @@ class WarehouseTransferServiceTest {
verify(orders, never()).insert(any(LastlegOrder.class));
}
@Test
void missingOrForeignCustomerNameStopsCreationBeforeAnyBusinessWrites() {
for (var customer : List.of(
new com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory.Customer("TENANT-A", "C-A", " ", null, null),
new com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory.Customer("OTHER", "C-B", "Other customer", null, null))) {
when(customerDirectory.find("TENANT-A")).thenReturn(customer);
var error = assertThrows(ResponseStatusException.class, () -> service.create("TENANT-A", "USER-1", request(false)));
assertEquals(503, error.getStatusCode().value());
}
verify(orders, never()).insert(any(LastlegOrder.class));
verify(inboundOrders, never()).insert(any(LastlegInboundOrder.class));
verify(transfers, never()).insert(any(WarehouseTransferOrder.class));
}
private static WarehouseTransferRequests.Create request(boolean needRelabel) {
if (!needRelabel) {
return new WarehouseTransferRequests.Create(