From 287c0f3ce850f1891b15087c78c475edc4bbc533 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 8 Sep 2026 00:51:32 +0800 Subject: [PATCH] fix: publish holds for local overseas orders --- .../InboundOrderDetainedOutboxService.java | 4 +- ...InboundOrderDetainedOutboxServiceTest.java | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 lastleg-service/src/test/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxServiceTest.java diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxService.java index f3bcdc4f0..52bf9194a 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxService.java @@ -38,11 +38,13 @@ public class InboundOrderDetainedOutboxService { JsonNode payloadNode = objectMapper.valueToTree(payload); String eventKey = EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED + ':' + order.getSourceInboundId() + ':' + changeVersion; + String causationId = EventIdentifiers.isSupported(order.getSourceEventId()) + ? order.getSourceEventId() : null; EventEnvelope envelope = new EventEnvelope(EventIdentifiers.newUuid(), EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED, 1, changedAt, RegionCode.OVERSEAS, RegionCode.CN, order.getCustomerId(), "INBOUND_ORDER", order.getSourceInboundId(), changeVersion, 1L, EventIdentifiers.newUuid(), - eventKey, order.getSourceEventId(), payloadNode, + eventKey, causationId, payloadNode, EventPayloadHash.sha256(EventPayloadCanonicalizer.canonicalize(payloadNode))).requireValid(); LastlegEventOutbox event = new LastlegEventOutbox(); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxServiceTest.java new file mode 100644 index 000000000..5df840907 --- /dev/null +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/service/InboundOrderDetainedOutboxServiceTest.java @@ -0,0 +1,52 @@ +package com.baiyue.lastleg.service; + +import com.baiyue.lastleg.entity.LastlegEventOutbox; +import com.baiyue.lastleg.entity.LastlegOrder; +import com.baiyue.lastleg.mapper.LastlegEventOutboxMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.test.util.ReflectionTestUtils; + +import java.time.Instant; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class InboundOrderDetainedOutboxServiceTest { + @Mock private LastlegEventOutboxMapper mapper; + private final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); + private InboundOrderDetainedOutboxService service; + + @BeforeEach + void setUp() { + service = new InboundOrderDetainedOutboxService(); + ReflectionTestUtils.setField(service, "mapper", mapper); + ReflectionTestUtils.setField(service, "objectMapper", objectMapper); + } + + @Test + void localSyntheticSourceReferenceIsNotWrittenAsEventCausationId() throws Exception { + LastlegOrder order = new LastlegOrder(); + order.setId(101L); + order.setCustomerId("201"); + order.setOrderNo("WT-WH-20260907-972865"); + order.setSourceInboundId("WAREHOUSE_TRANSFER:WT-WH-20260907-778561"); + order.setInboundCode("NYEXX2609070253"); + order.setSourceEventId("WAREHOUSE_TRANSFER:WT-WH-20260907-778561"); + + service.publish(order, true, "等待质检", "301", "operator", Instant.parse("2026-09-07T16:00:00Z"), 1L); + + ArgumentCaptor captor = ArgumentCaptor.forClass(LastlegEventOutbox.class); + verify(mapper).insert(captor.capture()); + JsonNode envelope = objectMapper.readTree(captor.getValue().getPayloadJson()); + assertThat(envelope.path("causationId").isNull()).isTrue(); + assertThat(envelope.path("aggregateId").asText()).isEqualTo(order.getSourceInboundId()); + } +}