diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java index 9f9f28a3f..07cbf6a04 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/transfer/service/WarehouseTransferService.java @@ -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)); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java index ef75e2f19..daa5b3abb 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/transfer/service/WarehouseTransferServiceTest.java @@ -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 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(