fix(firstleg): allow domestic history container details

This commit is contained in:
2026-09-08 20:29:05 +08:00
parent b19b828861
commit fc079fcdc0
4 changed files with 32 additions and 2 deletions
@@ -38,7 +38,6 @@ public class ContainerWorkbenchService {
public WorkbenchItem domesticDetail(long id, Set<String> permissions) { public WorkbenchItem domesticDetail(long id, Set<String> permissions) {
ContainerBookingEntity value = required(id); ContainerBookingEntity value = required(id);
if (repository.departed(id)) throw new BizException(ResultCode.NOT_FOUND, "国内工作台货柜不存在");
ContainerActualFacts facts = actualFacts(List.of(id)).get(id); ContainerActualFacts facts = actualFacts(List.of(id)).get(id);
return item("DOMESTIC", value, facts, null, permissions); return item("DOMESTIC", value, facts, null, permissions);
} }
@@ -445,7 +445,7 @@ paths:
/api/platform/v1/containers/domestic/{id}: /api/platform/v1/containers/domestic/{id}:
get: get:
summary: 查询国内货柜工作台详情 summary: 查询国内货柜工作台详情
description: 需要 platform:firstleg:container:list;装柜清单只返回唯一loadingPlanId/planNo/planStatus关联 description: 需要 platform:firstleg:container:list;国内ACTIVE与HISTORY共用该只读详情,已真实离仓柜仍可打开;装柜清单只返回唯一loadingPlanId/planNo/planStatus关联
parameters: [{$ref: '#/components/parameters/ContainerBookingId'}] parameters: [{$ref: '#/components/parameters/ContainerBookingId'}]
responses: {'200': {description: 成功, content: {application/json: {schema: {$ref: '#/components/schemas/ContainerWorkbenchEnvelope'}}}}} responses: {'200': {description: 成功, content: {application/json: {schema: {$ref: '#/components/schemas/ContainerWorkbenchEnvelope'}}}}}
/api/platform/v1/containers/overseas/{id}: /api/platform/v1/containers/overseas/{id}:
@@ -66,6 +66,7 @@ class ContainerControllerContractTest {
.contains("/api/platform/v1/containers/{id}/ocean-booking-link:") .contains("/api/platform/v1/containers/{id}/ocean-booking-link:")
.contains("/api/platform/v1/containers/domestic:") .contains("/api/platform/v1/containers/domestic:")
.contains("/api/platform/v1/containers/overseas:") .contains("/api/platform/v1/containers/overseas:")
.contains("国内ACTIVE与HISTORY共用该只读详情,已真实离仓柜仍可打开")
.contains("scope, in: query, required: true") .contains("scope, in: query, required: true")
.contains("首次关联允许 WAIT_LOADING 或已有预排货的 EDITING 模拟柜") .contains("首次关联允许 WAIT_LOADING 或已有预排货的 EDITING 模拟柜")
.contains("RELEASED oceanBookingId") .contains("RELEASED oceanBookingId")
@@ -19,6 +19,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
@@ -83,6 +84,35 @@ class ContainerWorkbenchServiceTest {
verifyNoInteractions(carrierSchedules); verifyNoInteractions(carrierSchedules);
} }
@Test
void domesticHistoryDetailKeepsTheDepartedContainerAndItsUniqueLoadingPlan() {
ContainerBookingEntity container = container();
container.setOutboundConfirmedAt(LocalDateTime.of(2026, 9, 8, 10, 0));
when(repository.find(11L)).thenReturn(container);
when(repository.departed(11L)).thenReturn(true);
when(carrierSchedules.containerActualFacts(List.of(11L))).thenReturn(List.of(facts("DEPARTED_WAREHOUSE")));
var result = service.domesticDetail(11L, Set.of("platform:firstleg:container:list"));
assertThat(result.workbenchStage()).isEqualTo("DEPARTED_WAREHOUSE");
assertThat(result.container().getPlanId()).isEqualTo(31L);
assertThat(result.container().getPlanNo()).isEqualTo("LP-260908-0001");
assertThat(result.allowedActions()).isEmpty();
verify(repository, never()).departed(11L);
verifyNoInteractions(terminalDrayages);
}
@Test
void domesticDetailStillRejectsContainersOutsideTheActiveMasterSet() {
when(repository.find(404L)).thenReturn(null);
assertThatThrownBy(() -> service.domesticDetail(404L, Set.of("platform:firstleg:container:list")))
.isInstanceOf(com.baiyue.common.core.exception.BizException.class)
.hasMessage("货柜不存在");
verifyNoInteractions(carrierSchedules, terminalDrayages);
}
private static Query query(WorkbenchScope scope) { private static Query query(WorkbenchScope scope) {
return new Query(null, null, null, null, null, null, null, null, null, null, null, return new Query(null, null, null, null, null, null, null, null, null, null, null,
null, null, null, scope, 1, 20); null, null, null, scope, 1, 20);