From 38958c891ae73aa9931f621d937438bcf90b187a Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Tue, 13 Oct 2026 18:05:30 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=B4=E6=A0=87=E7=94=B3=E8=AF=B7=EF=BC=8C?= =?UTF-8?q?=E4=BB=93=E5=82=A8=E8=BD=AC=E8=BF=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lastleg/relabel/dto/RelabelResponses.java | 3 ++- .../service/RelabelApplicationService.java | 17 +++++++++++++- .../RelabelApplicationServiceTest.java | 23 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/dto/RelabelResponses.java b/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/dto/RelabelResponses.java index de4e8e220..1ba2d252d 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/dto/RelabelResponses.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/dto/RelabelResponses.java @@ -20,7 +20,8 @@ public final class RelabelResponses { String fulfillmentStatus, String outboundOrderNo, LocalDateTime customerConfirmedAt, String reviewChannel, String reviewRemark, LocalDateTime createdAt, LocalDateTime reviewedAt, LocalDateTime relabelCompletedAt, LocalDateTime outboundAt, - String productNameZh, String labelRequirement, List operationTypes) {} + String productNameZh, String labelRequirement, List operationTypes, + List relatedBusinessOrderNos) {} public record Milestones(LocalDateTime reviewedAt, LocalDateTime relabelCompletedAt, LocalDateTime outboundAt) {} public record Item(Long id, String skuCode, String productImageFileId, String productImageFileName, diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/service/RelabelApplicationService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/service/RelabelApplicationService.java index 56c9825dc..122601547 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/service/RelabelApplicationService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/service/RelabelApplicationService.java @@ -1228,7 +1228,22 @@ public class RelabelApplicationService implements WalletResultHandler { detailItems.stream().map(RelabelItem::getLabelRequirement).filter(StringUtils::hasText) .map(String::trim).distinct().collect(Collectors.joining(";")), detailItems.stream().map(RelabelItem::getOperationType).filter(StringUtils::hasText) - .map(String::trim).distinct().toList()); + .map(String::trim).distinct().toList(), relatedBusinessOrderNos(value, order, detailItems)); + } + + private List relatedBusinessOrderNos(RelabelApplication application, LastlegOrder order, + List detailItems) { + if (order != null && Objects.equals(application.getCustomerId(), order.getCustomerId()) + && !"RELABEL_APPLICATION".equals(order.getOrderType())) { + String businessNo = StringUtils.hasText(order.getSourceOrderNo()) ? order.getSourceOrderNo() : order.getOrderNo(); + if (StringUtils.hasText(businessNo)) return List.of(businessNo.trim()); + } + // Standalone relabel orders keep the actual inventory source on their item snapshots. + // Their tail sourceOrderNo is a customer reference, not a business order number. + return detailItems.stream().map(item -> StringUtils.hasText(item.getSourceInboundOrderNo()) + ? item.getSourceInboundOrderNo() + : "RETURN_BULK_SKU_LABEL".equals(item.getOperationType()) ? item.getShipmentNo() : null) + .filter(StringUtils::hasText).map(String::trim).distinct().toList(); } @Override public boolean supports(String businessType) { return "RELABEL_ORDER".equals(businessType); } diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/relabel/service/RelabelApplicationServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/relabel/service/RelabelApplicationServiceTest.java index 1f762d90b..f69a4d46a 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/relabel/service/RelabelApplicationServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/relabel/service/RelabelApplicationServiceTest.java @@ -66,6 +66,29 @@ import static org.mockito.Mockito.times; @ExtendWith(MockitoExtension.class) class RelabelApplicationServiceTest { + @Test void relatedBusinessNumbersUseAuthoritativeSourcesInsteadOfCustomerReferences() { + var application = new RelabelApplication(); application.setCustomerId("C1"); application.setCustomerOrderNo("CUSTOMER-REFERENCE"); + var order = new LastlegOrder(); order.setCustomerId("C1"); order.setOrderNo("TAIL-INTERNAL-NO"); + for (var type : List.of("WAREHOUSE_TRANSFER", "RETURN_RELABEL", "FIRST_LEG")) { + order.setOrderType(type); order.setSourceOrderNo(type + "-BUSINESS-NO"); + List numbers = ReflectionTestUtils.invokeMethod(service, "relatedBusinessOrderNos", application, order, List.of()); + assertEquals(List.of(type + "-BUSINESS-NO"), numbers); + } + order.setOrderType("RELABEL_APPLICATION"); order.setSourceOrderNo("CUSTOMER-REFERENCE"); + var first = new RelabelItem(); first.setSourceInboundOrderNo(" RT-SOURCE-1 "); + var duplicate = new RelabelItem(); duplicate.setSourceInboundOrderNo("RT-SOURCE-1"); + var second = new RelabelItem(); second.setSourceInboundOrderNo("IN-SOURCE-2"); + var bulkReturn = new RelabelItem(); bulkReturn.setOperationType("RETURN_BULK_SKU_LABEL"); bulkReturn.setShipmentNo("RT-SOURCE-3"); + var shipment = new RelabelItem(); shipment.setOperationType("CARTON_LABEL"); shipment.setShipmentNo("FBA-SHIPMENT"); + List sources = ReflectionTestUtils.invokeMethod(service, "relatedBusinessOrderNos", application, order, + List.of(first, duplicate, second, bulkReturn, shipment)); + assertEquals(List.of("RT-SOURCE-1", "IN-SOURCE-2", "RT-SOURCE-3"), sources); + List missing = ReflectionTestUtils.invokeMethod(service, "relatedBusinessOrderNos", application, order, List.of(shipment)); + assertEquals(List.of(), missing); + order.setOrderType("RETURN_RELABEL"); order.setCustomerId("OTHER"); order.setSourceOrderNo("RT-OTHER-CUSTOMER"); + List foreign = ReflectionTestUtils.invokeMethod(service, "relatedBusinessOrderNos", application, order, List.of()); + assertEquals(List.of(), foreign); + } @Test void summaryReturnsMilestonesFromCustomerScopedFacts() { var application = new RelabelApplication(); application.setId(42L); application.setCustomerId("10001");