This commit is contained in:
2026-09-01 15:25:15 +08:00
parent 4d7ea28a61
commit d1225845ec
12 changed files with 129 additions and 45 deletions
@@ -113,7 +113,7 @@ class LoadingPickServiceTest {
}).when(completionTransaction).executeWithoutResult(any());
ContainerBookingEntity booking = new ContainerBookingEntity();
booking.setId(99L);
booking.setContainerNo("CSLU1234567");
booking.setContainerNo("MSCU6639870");
booking.setWarehouseId(101L);
booking.setSourceType("SIMULATION");
booking.setRecordStatus("ACTIVE");
@@ -124,9 +124,9 @@ class LoadingPickServiceTest {
}
@Test
void opensTaskOnlyAfterReleasedBookingAndRealContainerNumber() {
void opensTaskAfterReleasedBookingWithoutWaitingForRealContainerNumber() {
var booking = new com.baiyue.firstleg.entity.ContainerBookingEntity();
booking.setId(40L); booking.setContainerNo("MSCU-001");
booking.setId(40L);
var plan = new com.baiyue.firstleg.entity.LoadingPlanEntity();
plan.setId(10L); plan.setContainerBookingId(40L); plan.setPlanStatus("EDITING");
plan.setPreloadPushedAt(java.time.LocalDateTime.now());
@@ -136,7 +136,7 @@ class LoadingPickServiceTest {
when(smartLoadingRepository.planByBooking(40L)).thenReturn(plan);
when(smartLoadingRepository.plan(10L)).thenReturn(plan);
when(loadingModelBridge.byLoadingPlan(10L)).thenReturn(List.of(
new Link(1L, 1L, 50L, 2L, "CONFIRMED", 1, 10L, 40L, "MSCU-001", "EDITING", 1, 1, null)));
new Link(1L, 1L, 50L, 2L, "CONFIRMED", 1, 10L, 40L, null, "EDITING", 1, 1, null)));
when(oceanBookingRepository.allocationByContainer(40L)).thenReturn(allocation);
when(oceanBookingRepository.find(90L)).thenReturn(ocean);
when(repository.taskByPlan(10L)).thenReturn(null);
@@ -191,11 +191,11 @@ class LoadingPickServiceTest {
}
@Test
void planConfirmationGateRequiresRealContainerAndReleasedBooking() {
void planConfirmationGateRequiresReleasedBookingButNotRealContainerNumber() {
Link link = new Link(1L, 1L, 50L, 2L, "PENDING", 1,
10L, 40L, "MSCU-001", "EDITING", 3, 2, null);
var booking = new com.baiyue.firstleg.entity.ContainerBookingEntity();
booking.setId(40L); booking.setContainerNo("MSCU-001");
booking.setId(40L);
var allocation = new OceanBookingContainerAllocationEntity();
allocation.setOceanBookingId(90L);
var ocean = new OceanBookingEntity();
@@ -209,17 +209,21 @@ class LoadingPickServiceTest {
}
@Test
void planConfirmationGateRejectsMissingRealContainerNumber() {
void planConfirmationGateAllowsMissingRealContainerNumber() {
Link link = new Link(1L, 1L, 50L, 2L, "PENDING", 1,
10L, 40L, null, "EDITING", 3, 2, null);
var booking = new com.baiyue.firstleg.entity.ContainerBookingEntity();
booking.setId(40L);
var allocation = new OceanBookingContainerAllocationEntity();
allocation.setOceanBookingId(90L);
var ocean = new OceanBookingEntity();
ocean.setId(90L); ocean.setStatus("RELEASED");
when(loadingModelBridge.requireAllocatedLinksForConfirmation(10L)).thenReturn(List.of(link));
when(smartLoadingRepository.booking(40L)).thenReturn(booking);
when(oceanBookingRepository.allocationByContainer(40L)).thenReturn(allocation);
when(oceanBookingRepository.find(90L)).thenReturn(ocean);
assertThatThrownBy(() -> service.requirePreloadConfirmationReady(10L))
.isInstanceOf(BizException.class).hasMessageContaining("真实集装箱号");
verify(oceanBookingRepository, never()).allocationByContainer(anyLong());
assertThat(service.requirePreloadConfirmationReady(10L)).containsExactly(link);
}
@Test
@@ -775,6 +779,25 @@ class LoadingPickServiceTest {
verify(loadingListService, never()).finishFromPda(anyLong(), anyLong(), anyLong(), anyString());
}
@Test
void completionRejectsMissingRealContainerNumberBeforeCreatingCommand() {
LoadingPickTaskEntity loading = task();
ContainerBookingEntity booking = new ContainerBookingEntity();
booking.setId(99L);
booking.setWarehouseId(101L);
booking.setRecordStatus("ACTIVE");
when(repository.taskForUpdate(20L)).thenReturn(loading);
when(repository.activeBookingByTask(20L)).thenReturn(booking);
assertThatThrownBy(() -> service.complete(20L,
new CompleteLoadingRequest(0, "complete-missing-container", "checked"), 9L, "operator"))
.isInstanceOf(BizException.class).hasMessageContaining("确认装柜完成前");
verify(repository, never()).allTaskItemsResolved(20L);
verify(completionCommands, never()).insert(any());
verify(repository, never()).acceptCompletion(anyLong(), anyInt());
}
@Test
void differentOperationIdIsRejectedImmediatelyWithConflict() {
// different operationId is a canonical A0409 CONFLICT while the durable command is active.