fix(firstleg): map declaration inbound projection

This commit is contained in:
2026-09-02 11:51:56 +08:00
parent 6acb5297e5
commit d786b88030
3 changed files with 17 additions and 4 deletions
@@ -41,7 +41,7 @@ public interface OrderDeclarationSyncMapper {
WHERE inbound.tenant_id=#{tenantId} AND inbound.order_id=#{orderId} AND inbound.deleted=0 WHERE inbound.tenant_id=#{tenantId} AND inbound.order_id=#{orderId} AND inbound.deleted=0
ORDER BY inbound.created_at DESC,inbound.id DESC LIMIT 1 FOR UPDATE ORDER BY inbound.created_at DESC,inbound.id DESC LIMIT 1 FOR UPDATE
""") """)
GateRow lockInbound(@Param("tenantId") long tenantId, @Param("orderId") long orderId); InboundRow lockInbound(@Param("tenantId") long tenantId, @Param("orderId") long orderId);
@Select("SELECT tenant_id tenantId,order_id orderId,event_id eventId,order_version orderVersion,request_hash requestHash " @Select("SELECT tenant_id tenantId,order_id orderId,event_id eventId,order_version orderVersion,request_hash requestHash "
+ "FROM fl_order_declaration_snapshot WHERE tenant_id=#{tenantId} AND order_id=#{orderId} FOR UPDATE") + "FROM fl_order_declaration_snapshot WHERE tenant_id=#{tenantId} AND order_id=#{orderId} FOR UPDATE")
@@ -110,5 +110,7 @@ public interface OrderDeclarationSyncMapper {
record GateRow(Long inboundId, Long orderId, String orderNo, String inboundCode, String processStatus, record GateRow(Long inboundId, Long orderId, String orderNo, String inboundCode, String processStatus,
String channelCode, Integer incompatibleGroupCount, Integer splitCount, String channelCode, Integer incompatibleGroupCount, Integer splitCount,
Integer preloadCount, Integer pdaCount) {} Integer preloadCount, Integer pdaCount) {}
record InboundRow(Long inboundId, Long orderId, String orderNo, String inboundCode,
String processStatus, String channelCode) {}
record SnapshotRow(Long tenantId, Long orderId, String eventId, Integer orderVersion, String requestHash) {} record SnapshotRow(Long tenantId, Long orderId, String eventId, Integer orderVersion, String requestHash) {}
} }
@@ -13,6 +13,12 @@ class OrderDeclarationSyncMapperContractTest {
@Test @Test
void mapperIsExplicitAndProjectionUpdateCannotOverwriteOperationalFacts() throws Exception { void mapperIsExplicitAndProjectionUpdateCannotOverwriteOperationalFacts() throws Exception {
assertThat(OrderDeclarationSyncMapper.class).hasAnnotation(Mapper.class); assertThat(OrderDeclarationSyncMapper.class).hasAnnotation(Mapper.class);
assertThat(OrderDeclarationSyncMapper.class
.getDeclaredMethod("lockInbound", long.class, long.class).getReturnType())
.isEqualTo(OrderDeclarationSyncMapper.InboundRow.class);
assertThat(OrderDeclarationSyncMapper.InboundRow.class.getRecordComponents())
.extracting(java.lang.reflect.RecordComponent::getName)
.containsExactly("inboundId", "orderId", "orderNo", "inboundCode", "processStatus", "channelCode");
String sql = String.join(" ", OrderDeclarationSyncMapper.class String sql = String.join(" ", OrderDeclarationSyncMapper.class
.getDeclaredMethod("updateAllowedSnapshot", long.class, long.class, long.class, String.class, .getDeclaredMethod("updateAllowedSnapshot", long.class, long.class, long.class, String.class,
String.class, String.class, java.time.LocalDateTime.class, String.class, String.class, long.class) String.class, String.class, java.time.LocalDateTime.class, String.class, String.class, long.class)
@@ -66,7 +66,7 @@ class OrderDeclarationSyncServiceTest {
@Test @Test
void persistsVersionedDeclarationAndUpdatesOnlyAllowedInboundProjection() { void persistsVersionedDeclarationAndUpdatesOnlyAllowedInboundProjection() {
var event = event(4, "event-4"); var event = event(4, "event-4");
when(mapper.lockInbound(10001L, 77L)).thenReturn(row("WAIT_MEASURE", null, null, null, null)); when(mapper.lockInbound(10001L, 77L)).thenReturn(inboundRow("WAIT_MEASURE"));
when(mapper.insertSnapshot(anyLong(), anyLong(), anyString(), anyInt(), anyString(), any(), any(), when(mapper.insertSnapshot(anyLong(), anyLong(), anyString(), anyInt(), anyString(), any(), any(),
anyString(), anyString(), anyString(), anyString(), any())).thenReturn(1); anyString(), anyString(), anyString(), anyString(), any())).thenReturn(1);
when(mapper.insertConsumedEvent(anyLong(), anyString(), anyLong(), anyInt(), anyString())).thenReturn(1); when(mapper.insertConsumedEvent(anyLong(), anyString(), anyLong(), anyInt(), anyString())).thenReturn(1);
@@ -82,7 +82,7 @@ class OrderDeclarationSyncServiceTest {
@Test @Test
void ignoresOlderVersionWithoutOverwritingCurrentProjection() { void ignoresOlderVersionWithoutOverwritingCurrentProjection() {
var event = event(4, "event-4"); var event = event(4, "event-4");
when(mapper.lockInbound(10001L, 77L)).thenReturn(row("WAIT_MEASURE", null, null, null, null)); when(mapper.lockInbound(10001L, 77L)).thenReturn(inboundRow("WAIT_MEASURE"));
when(mapper.lockSnapshot(10001L, 77L)).thenReturn( when(mapper.lockSnapshot(10001L, 77L)).thenReturn(
new OrderDeclarationSyncMapper.SnapshotRow(10001L, 77L, "event-5", 5, "hash")); new OrderDeclarationSyncMapper.SnapshotRow(10001L, 77L, "event-5", 5, "hash"));
when(mapper.insertConsumedEvent(anyLong(), anyString(), anyLong(), anyInt(), anyString())).thenReturn(1); when(mapper.insertConsumedEvent(anyLong(), anyString(), anyLong(), anyInt(), anyString())).thenReturn(1);
@@ -101,7 +101,7 @@ class OrderDeclarationSyncServiceTest {
var event = event(4, "event-4"); var event = event(4, "event-4");
String hash = HexFormat.of().formatHex(MessageDigest.getInstance("SHA-256") String hash = HexFormat.of().formatHex(MessageDigest.getInstance("SHA-256")
.digest(json.writeValueAsBytes(event))); .digest(json.writeValueAsBytes(event)));
when(mapper.lockInbound(10001L, 77L)).thenReturn(row("WAIT_MEASURE", null, null, null, null)); when(mapper.lockInbound(10001L, 77L)).thenReturn(inboundRow("WAIT_MEASURE"));
when(mapper.byEvent(10001L, "event-4")).thenReturn( when(mapper.byEvent(10001L, "event-4")).thenReturn(
new OrderDeclarationSyncMapper.SnapshotRow(10001L, 77L, "event-4", 4, hash)); new OrderDeclarationSyncMapper.SnapshotRow(10001L, 77L, "event-4", 4, hash));
@@ -118,6 +118,11 @@ class OrderDeclarationSyncServiceTest {
"MATSON_OLD", group, split, preload, pda); "MATSON_OLD", group, split, preload, pda);
} }
private static OrderDeclarationSyncMapper.InboundRow inboundRow(String status) {
return new OrderDeclarationSyncMapper.InboundRow(
88L, 77L, "FL-77", "RK-77", status, "MATSON_OLD");
}
private static OrderDeclarationSync.UpdatedEvent event(int version, String eventId) { private static OrderDeclarationSync.UpdatedEvent event(int version, String eventId) {
var cargo = new OrderDeclarationSync.Cargo(1, "衣服", "clothes", "SKU-1", null, 2, 20, var cargo = new OrderDeclarationSync.Cargo(1, "衣服", "clothes", "SKU-1", null, 2, 20,
new BigDecimal("10"), new BigDecimal("20"), new BigDecimal("30"), new BigDecimal("37"), new BigDecimal("10"), new BigDecimal("20"), new BigDecimal("30"), new BigDecimal("37"),