This commit is contained in:
2026-09-18 16:48:30 +08:00
parent 7d6ca17c02
commit fd27a0ed21
4 changed files with 177 additions and 100 deletions
@@ -117,7 +117,7 @@ class ReceivingContainerServiceBehaviorTest {
when(shippingGates.receivingAvailable("BOOKING-A", "CONT-A")).thenReturn(0);
assertThat(service.candidates("7", 100L)).isEmpty();
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-A",
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-A", "BOOKING-A",
new ReceivingContainerRequests.Action("not-ready")))
.isInstanceOf(ResponseStatusException.class).hasMessageContaining("409");
verifyNoInteractions(warehouse);
@@ -133,7 +133,7 @@ class ReceivingContainerServiceBehaviorTest {
when(sessions.insert(any(ReceivingContainerSession.class))).thenReturn(1);
when(operations.insert(any(ReceivingContainerOperation.class))).thenReturn(1);
when(warehouse.requireActiveSharedWarehouse(100L)).thenReturn(warehouseReference());
var response = service.prepare("7", "receiver", 100L, "CONT-A",
var response = service.prepare("7", "receiver", 100L, "CONT-A", "BOOKING-A",
new ReceivingContainerRequests.Action("same-key"));
assertThat(response.overseasWarehouseId()).isEqualTo(100L);
assertThat(response.overseasWarehouseName()).isEqualTo("Shared LAX");
@@ -145,7 +145,7 @@ class ReceivingContainerServiceBehaviorTest {
verify(operations).insert(saved.capture());
when(operations.find("7", "same-key")).thenReturn(saved.getValue());
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-B",
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-B", "BOOKING-A",
new ReceivingContainerRequests.Action("same-key"))).isInstanceOf(ResponseStatusException.class)
.hasMessageContaining("409");
}
@@ -249,13 +249,44 @@ class ReceivingContainerServiceBehaviorTest {
when(warehouse.requireActiveSharedWarehouse(100L)).thenReturn(warehouseReference());
var candidate = service.candidates("7", 100L).get(0);
var detail = service.detail("7", 100L, "TSTU0000204");
var detail = service.detail("7", 100L, "TSTU0000204", "BOOKING-204");
assertThat(candidate.operable()).isTrue();
assertThat(detail.overseasWarehouseId()).isEqualTo(100L);
assertThat(detail.overseasWarehouseCode()).isEqualTo("SHARED-LAX");
}
@Test
void detailUsesBookingOccurrenceWhenPhysicalContainerNumberIsReused() {
InboundPlan historicalPlan = plan("VAXU2748524");
historicalPlan.setId(2L); historicalPlan.setPlanNo("PLAN-OLD"); historicalPlan.setStatus("COMPLETED");
InboundPlan currentPlan = plan("VAXU2748524");
currentPlan.setId(3L); currentPlan.setPlanNo("PLAN-CURRENT");
InboundPlanLine historicalLine = line("FBA");
historicalLine.setId(10L); historicalLine.setPlanId(2L); historicalLine.setOrderId(1L);
historicalLine.setInboundCode("IN-OLD");
InboundPlanLine currentLine = line("FBA");
currentLine.setId(11L); currentLine.setPlanId(3L); currentLine.setOrderId(2L);
currentLine.setInboundCode("IN-CURRENT");
LastlegOrder historicalOrder = containerOrder(
1L, "100", "VAXU2748524", "BOOKING-OLD", "IN-OLD");
LastlegOrder currentOrder = containerOrder(
2L, "100", "VAXU2748524", "BOOKING-CURRENT", "IN-CURRENT");
when(plans.selectList(any())).thenReturn(List.of(historicalPlan, currentPlan));
when(lines.selectList(any())).thenReturn(
List.of(currentLine),
List.of(historicalLine), List.of(currentLine),
List.of(historicalLine), List.of(currentLine));
when(orders.selectList(any())).thenReturn(List.of(currentOrder));
when(orders.selectById(1L)).thenReturn(historicalOrder);
when(orders.selectById(2L)).thenReturn(currentOrder);
when(warehouse.requireActiveSharedWarehouse(100L)).thenReturn(warehouseReference());
var detail = service.detail("7", 100L, "VAXU2748524", "BOOKING-CURRENT");
assertThat(detail.inbounds()).extracting("inboundCode").containsExactly("IN-CURRENT");
}
@Test
void prepareAtomicallyBindsUnassignedPlansToThePickerWarehouse() {
InboundPlan unassigned = plan("TSTU0195472");
@@ -269,7 +300,7 @@ class ReceivingContainerServiceBehaviorTest {
when(orders.selectById(1L)).thenReturn(order);
when(warehouse.requireActiveSharedWarehouse(100L)).thenReturn(warehouseReference());
var result = service.prepare("7", "receiver", 100L, "TSTU0195472",
var result = service.prepare("7", "receiver", 100L, "TSTU0195472", "BOOKING-472",
new ReceivingContainerRequests.Action("bind-warehouse"));
assertThat(result.overseasWarehouseId()).isEqualTo(100L);
@@ -285,9 +316,10 @@ class ReceivingContainerServiceBehaviorTest {
when(plans.selectList(any())).thenReturn(List.of(plan));
when(lines.selectList(any())).thenReturn(List.of(planLine));
when(orders.selectList(any())).thenReturn(List.of(order));
when(orders.selectById(1L)).thenReturn(order);
when(pallets.selectCount(any())).thenReturn(0L);
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "TSTU0195472",
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "TSTU0195472", "BOOKING-472",
new ReceivingContainerRequests.Action("missing-real-pallets")))
.isInstanceOf(ResponseStatusException.class)
.hasMessageContaining("尚未完整绑定真实托盘");
@@ -339,7 +371,7 @@ class ReceivingContainerServiceBehaviorTest {
assertThat(candidate.pendingPlanCount()).isEqualTo(1);
assertThat(candidate.operable()).isFalse();
assertThat(candidate.blockReason()).isEqualTo("1个入仓码已生成计划,1个订单未操作/缺入仓码");
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-A",
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-A", "BOOKING-A",
new ReceivingContainerRequests.Action("partial")))
.isInstanceOf(ResponseStatusException.class).hasMessageContaining("409");
verify(sessions, never()).insert(any(ReceivingContainerSession.class));
@@ -351,12 +383,14 @@ class ReceivingContainerServiceBehaviorTest {
when(lines.selectList(any())).thenReturn(List.of(line("FBA")));
when(orders.selectList(any())).thenReturn(List.of(
containerOrder(1L, "100", "CONT-B", "BOOKING-B", "IN-1")));
when(orders.selectById(1L)).thenReturn(
containerOrder(1L, "100", "CONT-B", "BOOKING-B", "IN-1"));
ReceivingContainerSession other = session("CONT-B", "SIGNED");
other.setOperatorKey("8"); other.setActiveOperatorKey("OPERATOR:8");
other.setActiveContainerKey("CONTAINER:CONT-B");
when(sessions.findActiveByContainer("CONTAINER:CONT-B")).thenReturn(other);
assertThatThrownBy(() -> service.detail("7", 100L, "CONT-B"))
assertThatThrownBy(() -> service.detail("7", 100L, "CONT-B", "BOOKING-B"))
.isInstanceOf(ResponseStatusException.class).hasMessageContaining("409");
verifyNoInteractions(warehouse);
}
@@ -367,8 +401,10 @@ class ReceivingContainerServiceBehaviorTest {
when(lines.selectList(any())).thenReturn(List.of(line("FBA")));
when(orders.selectList(any())).thenReturn(List.of(
containerOrder(1L, "100", "CONT-B", "BOOKING-B", "IN-1")));
when(orders.selectById(1L)).thenReturn(
containerOrder(1L, "100", "CONT-B", "BOOKING-B", "IN-1"));
when(sessions.findActiveByOperator("OPERATOR:7")).thenReturn(session("CONT-A", "WAIT_SIGN"));
assertThatThrownBy(() -> service.detail("7", 100L, "CONT-B"))
assertThatThrownBy(() -> service.detail("7", 100L, "CONT-B", "BOOKING-B"))
.isInstanceOf(ResponseStatusException.class).hasMessageContaining("409");
}
@@ -378,14 +414,15 @@ class ReceivingContainerServiceBehaviorTest {
when(lines.selectList(any())).thenReturn(List.of(line("FBA")));
LastlegOrder order = containerOrder(1L, "100", "CONT-B", "BOOKING-B", "IN-1");
when(orders.selectList(any())).thenReturn(List.of(order));
when(orders.selectById(1L)).thenReturn(order);
when(sessions.lockActiveByOperator("OPERATOR:7")).thenReturn(session("CONT-A", "WAIT_SIGN"));
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-B",
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-B", "BOOKING-B",
new ReceivingContainerRequests.Action("account-lock"))).isInstanceOf(ResponseStatusException.class);
verify(sessions, never()).insert(any(ReceivingContainerSession.class));
org.mockito.Mockito.reset(sessions, operations);
when(sessions.lockActiveByContainer("CONTAINER:CONT-B")).thenReturn(session("CONT-B", "WAIT_SIGN"));
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-B",
assertThatThrownBy(() -> service.prepare("7", "receiver", 100L, "CONT-B", "BOOKING-B",
new ReceivingContainerRequests.Action("container-lock"))).isInstanceOf(ResponseStatusException.class);
verify(sessions, never()).insert(any(ReceivingContainerSession.class));
}
@@ -675,7 +712,8 @@ class ReceivingContainerServiceBehaviorTest {
void signRequiresEachTypedPhotoExactlyOnceAndRestoresRoles() {
when(sessions.lockActiveByOperator("OPERATOR:7")).thenReturn(session("CONT-A", "WAIT_SIGN"));
when(plans.selectList(any())).thenReturn(List.of(plan("CONT-A")));
when(lines.selectList(any())).thenReturn(List.of());
when(lines.selectList(any())).thenReturn(List.of(line("FBA")));
when(orders.selectById(1L)).thenReturn(order("FBA"));
when(sessions.updateById(any(ReceivingContainerSession.class))).thenReturn(1);
when(operations.insert(any(ReceivingContainerOperation.class))).thenReturn(1);
ReceivingContainerRequests.Sign request = new ReceivingContainerRequests.Sign(List.of(
@@ -1046,9 +1084,12 @@ class ReceivingContainerServiceBehaviorTest {
InboundPlan plan = plan(containerNo);
InboundPlanLine line = line(destinationType);
LastlegOrder order = order(destinationType);
order.setContainerNo(containerNo); order.setSourceContainerBookingId("BOOKING-A");
order.setInboundCode("IN-1");
when(sessions.lockActiveByOperator("OPERATOR:7")).thenReturn(session(containerNo, "SIGNED"));
when(plans.selectList(any())).thenReturn(List.of(plan));
when(lines.selectList(any())).thenReturn(List.of(line));
org.mockito.Mockito.lenient().when(orders.selectList(any())).thenReturn(List.of(order));
when(orders.selectById(1L)).thenReturn(order);
}
@@ -1076,6 +1117,8 @@ class ReceivingContainerServiceBehaviorTest {
private static LastlegOrder order(String destinationType) {
LastlegOrder value = new LastlegOrder();
value.setId(1L); value.setCustomerId("100"); value.setDestinationType(destinationType);
value.setContainerNo("CONT-A"); value.setSourceContainerBookingId("BOOKING-A");
value.setInboundCode("IN-1");
value.setOverseasWarehouseId("100"); value.setOverseasWarehouseCode("SHARED-LAX");
value.setOverseasWarehouseName("Shared LAX");
value.setFbaWarehouseCode("FBA".equals(destinationType) ? "FBA-1" : null);
@@ -1100,6 +1143,7 @@ class ReceivingContainerServiceBehaviorTest {
private static ReceivingContainerSession session(String containerNo, String status) {
ReceivingContainerSession value = new ReceivingContainerSession();
value.setId(8L); value.setContainerNo(containerNo); value.setOperatorKey("7");
value.setSourceContainerBookingId("BOOKING-A");
value.setOverseasWarehouseId(100L); value.setOverseasWarehouseCode("SHARED-LAX");
value.setOverseasWarehouseName("Shared LAX");
value.setStatus(status); value.setVersion(0);