fix(lastleg): create remaining container plans

This commit is contained in:
2026-09-08 13:52:37 +08:00
parent 3c05525e27
commit d318f4a450
4 changed files with 79 additions and 33 deletions
@@ -524,16 +524,50 @@ class InboundPlanServiceTest {
}
@Test
void partialExistingPlansAreRejectedBeforeAnyWrite() {
void partialExistingPlansArePreservedWhileOnlyRemainingOrdersAreCreated() {
when(orderMapper.lockContainerOrders("BOOKING-1")).thenReturn(List.of(
new InboundPlanOrderMapper.ContainerOrderRef("100", 1L, "INBOUND_PLANNED", "MSCU6639870", "STANDARD"),
new InboundPlanOrderMapper.ContainerOrderRef("100", 2L, "PENDING_ASSIGNMENT", "MSCU6639870", "STANDARD")));
when(planMapper.findBySourceOrder("100", 1L)).thenReturn(existingPlan("100", 1L, "LIP-1"));
when(orderMapper.lockOrder("100", 2L)).thenReturn(List.of(order("100", 2L, "RK-2", "WH-B")));
when(orderMapper.markPlanned(eq("100"), eq(2L), any(), org.mockito.ArgumentMatchers.anyInt(), any()))
.thenReturn(1);
assertThrows(ResponseStatusException.class, () -> service.convertContainer("BOOKING-1"));
var result = service.convertContainer("BOOKING-1");
verify(orderMapper, never()).lockOrder(any(), any());
assertEquals(2, result.size());
assertEquals("LIP-1", result.get(0).planNo());
assertEquals(2L, result.get(1).sourceOrderId());
verify(orderMapper, never()).lockOrder("100", 1L);
verify(orderMapper).lockOrder("100", 2L);
verify(planMapper).insert(any(InboundPlan.class));
verify(orderMapper, never()).markPlanned(eq("100"), eq(1L), any(),
org.mockito.ArgumentMatchers.anyInt(), any());
verify(orderMapper).markPlanned(eq("100"), eq(2L), any(),
org.mockito.ArgumentMatchers.anyInt(), any());
}
@Test
void partialExistingPlansWithMixedWarehouseFactsCauseZeroNewWrites() {
when(orderMapper.lockContainerOrders("BOOKING-1")).thenReturn(List.of(
new InboundPlanOrderMapper.ContainerOrderRef("100", 1L, "INBOUND_PLANNED", "MSCU6639870", "STANDARD"),
new InboundPlanOrderMapper.ContainerOrderRef("100", 2L, "PENDING_ASSIGNMENT", "MSCU6639870", "STANDARD")));
when(planMapper.findBySourceOrder("100", 1L)).thenReturn(existingPlan("100", 1L, "LIP-1"));
when(orderMapper.findReceivingWarehouse("100", 1L)).thenReturn(
new InboundPlanOrderMapper.ReceivingWarehouseSnapshot(
"193000000000200003", "US-LAX-01", "洛杉矶仓"));
SourceOrderSnapshot differentWarehouse = new SourceOrderSnapshot(2L, "100", "MSCU6639870", "RK-2",
"PENDING_ASSIGNMENT", null, BigDecimal.ONE, 10, 0,
"193000000000200004", null, null, null, "WH-B", "WH-B", "仓B", 1, 0, false, 0);
when(orderMapper.lockOrder("100", 2L)).thenReturn(List.of(differentWarehouse));
ResponseStatusException error = assertThrows(ResponseStatusException.class,
() -> service.convertContainer("BOOKING-1"));
assertEquals(409, error.getStatusCode().value());
verify(planMapper, never()).insert(any(InboundPlan.class));
verify(orderMapper, never()).markPlanned(any(), any(), any(), org.mockito.ArgumentMatchers.anyInt(), any());
verify(inventoryBalanceMapper, never()).bindInboundPlan(any(), any(), any(), any(), any());
}
@Test