fix(firstleg): allow late initial container fill

This commit is contained in:
2026-09-01 15:38:33 +08:00
parent 07ffd8ddce
commit 8b2a964bfb
8 changed files with 93 additions and 11 deletions
@@ -69,7 +69,7 @@ class LoadingListControllerContractTest {
.contains("beforeSnapshot")
.contains("containerNo")
.contains("voyageNo")
.contains("可首次补录真实集装箱号")
.contains("首次补录真实集装箱号")
.contains("校验ISO 6346结构、设备类别和校验位")
.contains("PDA任务尚未领取且无任何物理作业事实")
.contains("/loading-plans/{planId}/confirm")
@@ -80,6 +80,8 @@ class LoadingListQueryMapperContractTest {
void mutationsShouldUseStatusAndOptimisticVersionConditions() throws Exception {
String touch = sql("touchEditable", Update.class);
String transport = sql("updateTransport", Update.class);
String touchInitialFill = sql("touchForInitialContainerFill", Update.class);
String initialFill = sql("fillInitialContainerNo", Update.class);
String confirmPreload = sql("confirmLinkedPreload", Update.class);
String confirmPlan = sql("touchForPreloadConfirmation", Update.class);
String advance = sql("advance", Update.class);
@@ -98,6 +100,16 @@ class LoadingListQueryMapperContractTest {
.contains("fl_loading_pick_task", "fl_loading_pick_assignment")
.doesNotContain("DELETE")
.doesNotContain("fl_loading_plan_item");
assertThat(touchInitialFill)
.contains("p.plan_status IN ('EDITING','LOADING')")
.contains("p.version=#{expectedVersion}")
.contains("b.container_no IS NULL")
.doesNotContain("fl_loading_pick_assignment", "item_status");
assertThat(initialFill)
.contains("p.plan_status IN ('EDITING','LOADING')")
.contains("b.container_no IS NULL")
.contains("#{containerNo} IS NOT NULL")
.doesNotContain("fl_loading_pick_assignment", "item_status");
assertThat(advance)
.contains("plan_status = #{fromStatus}")
.contains("plan_status = #{toStatus}")
@@ -218,7 +218,7 @@ class LoadingListServiceTest {
afterFill.setPreloadPushedAt(missing.getPreloadPushedAt());
afterFill.setContainerNo("CSQU3054383");
when(repository.aggregate(10L)).thenReturn(loading, missing, afterFill);
when(repository.updateTransport(10L, 3, "CSQU3054383", null, 9L, "operator"))
when(repository.fillInitialContainerNo(10L, 3, "CSQU3054383", null, 9L, "operator"))
.thenReturn(1);
when(repository.preloadDetail(afterFill)).thenReturn(
new com.baiyue.firstleg.dto.LoadingListDtos.PreloadDetail(null, List.of(), List.of()));
@@ -229,10 +229,34 @@ class LoadingListServiceTest {
service.updateTransport(10L, 100L, 9L, "operator", "missing-key",
new TransportUpdateRequest("CSQU3054383", null, 3, null));
verify(repository).updateTransport(10L, 3, "CSQU3054383", null, 9L, "operator");
verify(repository).fillInitialContainerNo(10L, 3, "CSQU3054383", null, 9L, "operator");
verify(loadingPickService).beginIfReady(30L, 9L, "operator");
}
@Test
void loadingPlanWithClaimedAndPickedPdaTaskStillAllowsInitialContainerFill() {
AggregateRow before = row("LOADING", 7);
before.setPreloadPushedAt(java.time.LocalDateTime.now());
AggregateRow after = row("LOADING", 8);
after.setPreloadPushedAt(before.getPreloadPushedAt());
after.setContainerNo("CSQU3054383");
when(repository.aggregate(10L)).thenReturn(before, after);
when(repository.hasPdaWorkStarted(10L)).thenReturn(true);
when(repository.fillInitialContainerNo(10L, 7, "CSQU3054383", "023E", 9L, "operator"))
.thenReturn(1);
when(repository.preloadDetail(after)).thenReturn(
new com.baiyue.firstleg.dto.LoadingListDtos.PreloadDetail(null, List.of(), List.of()));
service.updateTransport(10L, 100L, 9L, "operator", "late-fill-key",
new TransportUpdateRequest("CSQU3054383", "023E", 7, null));
verify(repository).fillInitialContainerNo(10L, 7, "CSQU3054383", "023E", 9L, "operator");
verify(repository, never()).hasPdaWorkStarted(10L);
verify(repository).appendHistory(eq(10L), anyString(), eq("UPDATE_PRELOAD_TRANSPORT"),
eq("LOADING"), eq("LOADING"), anyString(), anyString(), eq(9L), eq("operator"),
org.mockito.ArgumentMatchers.isNull());
}
@Test
void correctingExistingContainerNumberStillRequiresReason() {
AggregateRow before = row("EDITING", 3);