diff --git a/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchService.java b/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchService.java index 8c2fc4b0d..333213814 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchService.java @@ -45,8 +45,10 @@ public class ContainerWorkbenchService { public WorkbenchItem overseasDetail(long id, Set permissions) { ContainerBookingEntity value = required(id); if (!repository.departed(id)) throw new BizException(ResultCode.NOT_FOUND, "国外工作台货柜不存在"); - View drayage = terminalDrayages.authorize(terminalDrayages.detail(id), permissions); - return item("OVERSEAS", value, drayage.actualFacts(), drayage, permissions); + View drayage = terminalDrayages.authorize(terminalDrayages.views(List.of(id)), permissions).stream() + .filter(candidate -> candidate.containerBookingId() == id) + .findFirst().orElse(null); + return item("OVERSEAS", value, drayage == null ? null : drayage.actualFacts(), drayage, permissions); } private PageResult page(String workbench, Query query, Set permissions) { diff --git a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchServiceTest.java index ef54e5fd8..d826c6b86 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/terminaldrayage/service/ContainerWorkbenchServiceTest.java @@ -84,6 +84,27 @@ class ContainerWorkbenchServiceTest { verifyNoInteractions(carrierSchedules); } + @Test + void overseasDetailKeepsNewlyDepartedContainerBeforeCarrierTrackingExists() { + ContainerBookingEntity container = container(); + container.setOutboundConfirmedAt(LocalDateTime.of(2026, 9, 10, 10, 50)); + Set permissions = Set.of("platform:firstleg:terminal-drayage:list", + "platform:firstleg:terminal-drayage:document:edit"); + when(repository.find(11L)).thenReturn(container); + when(repository.departed(11L)).thenReturn(true); + when(terminalDrayages.views(List.of(11L))).thenReturn(List.of()); + when(terminalDrayages.authorize(List.of(), permissions)).thenReturn(List.of()); + + var result = service.overseasDetail(11L, permissions); + + assertThat(result.workbenchStage()).isEqualTo("DEPARTED_WAREHOUSE"); + assertThat(result.actualFacts()).isNull(); + assertThat(result.terminalDrayage()).isNull(); + assertThat(result.allowedActions()).containsExactly("MANAGE_DESTINATION_DOCUMENTS"); + verify(terminalDrayages, never()).detail(11L); + verifyNoInteractions(carrierSchedules); + } + @Test void realOverseasListAndDetailProjectBothEmptyReturnActions() throws Exception { verifyRealEmptyReturnProjection(true, true); @@ -139,8 +160,8 @@ class ContainerWorkbenchServiceTest { var serialized = json.readTree(json.writeValueAsString(com.baiyue.common.core.api.ApiResponse.success(page))); assertThat(serialized.at("/data/records/0/allowedActions")).isEqualTo(json.valueToTree(expected)); assertThat(serialized.at("/data/records/0/terminalDrayage/allowedActions")).isEqualTo(json.valueToTree(expected)); - verify(mapper).findAll(List.of(11L)); - verify(mapper).contexts(List.of(11L)); + verify(mapper, times(2)).findAll(List.of(11L)); + verify(mapper, times(2)).contexts(List.of(11L)); } @Test