fix(firstleg): allow customs view for empty loading plan

This commit is contained in:
2026-09-10 14:02:26 +08:00
parent a3890e7a55
commit c026edbb2f
7 changed files with 75 additions and 13 deletions
@@ -33,7 +33,7 @@ class ContainerCustomsControllerContractTest {
String yaml=new ClassPathResource("openapi/customs-v1.yaml").getContentAsString(java.nio.charset.StandardCharsets.UTF_8);
new Yaml().load(yaml);
assertThat(yaml).contains("ContainerView:","DocumentView:","FileView:","InboundView:","ActionRequest:","ScopeRequest:")
.contains("merchantStatus:","WAITING_UPLOAD","CUSTOMS_COMPLETED","loadingPlanId:")
.contains("merchantStatus:","WAITING_UPLOAD","CUSTOMS_COMPLETED","loadingPlanId:","hasActualCargo:")
.contains("LOADING_LIST_BUY_DECLARATION_ITEMS")
.doesNotContain("/cases/","CUSTOMS_DECLARATION");
}
@@ -23,6 +23,9 @@ class ContainerCustomsMapperContractTest {
@Test void actualCompletedLoadingItemsAndTaxModeAreTheOnlyTicketFacts() throws Exception {
String plan=sql("planInbounds",long.class);
assertThat(plan).contains("fl_loading_plan_item","fl_inbound_order","p.id=#{planId}","item.deleted=0");
String planIdentity=sql("plan",long.class);
assertThat(planIdentity).contains("fl_loading_plan","fl_container_booking","p.id=#{planId}")
.doesNotContain("fl_loading_plan_item","fl_inbound_order");
String missing=sql("missingRefundCount",long.class,long.class);
assertThat(missing).contains("i.tax_mode='TAX_REFUND'","fl_customs_customer_document_inbound","d.status='ACTIVE'");
}
@@ -44,6 +44,35 @@ class ContainerCustomsServiceTest {
assertMerchantOrderNotFound(7L,22L);
}
@Test void completedPlanWithoutActualCargoReturnsEmptyViewInsteadOfNotFound(){
var plan=new ContainerCustomsMapper.PlanRow(9L,"LP9",8L,"COMPLETED","CAB","C");
when(mapper.planInbounds(9L)).thenReturn(List.of());
when(mapper.plan(9L)).thenReturn(plan);
when(mapper.container(9L)).thenReturn(container(ContainerCustomsService.READY,0));
var view=service.platformView(9L);
assertThat(view.hasActualCargo()).isFalse();
assertThat(view.planNo()).isEqualTo("LP9");
assertThat(view.inbounds()).isEmpty();
assertThat(view.documents()).isEmpty();
assertThat(view.taxRefundCount()).isZero();
verify(mapper).insertContainer(anyLong(),eq(9L),eq(8L),eq(ContainerCustomsService.READY));
}
@Test void completedPlanWithoutActualCargoCannotStartCustoms(){
when(mapper.claimCommand(anyLong(),eq(5L),eq("START_CONTAINER_CUSTOMS_9"),eq("empty-plan"),anyString())).thenReturn(1);
when(mapper.planInbounds(9L)).thenReturn(List.of());
when(mapper.plan(9L)).thenReturn(new ContainerCustomsMapper.PlanRow(9L,"LP9",8L,"COMPLETED","CAB","C"));
when(mapper.container(9L)).thenReturn(container(ContainerCustomsService.READY,0));
assertThatThrownBy(()->service.start(9L,5L,"admin","empty-plan",new ActionRequest(0,true,null)))
.isInstanceOf(BizException.class).hasMessageContaining("没有实际货物,无需报关");
verify(mapper,never()).lockContainer(9L);
verify(mapper,never()).start(anyLong(),anyInt(),anyLong(),anyString());
}
@Test void merchantCompletedTaxRefundOrderReturnsContainerView(){
var row=new ContainerCustomsMapper.InboundRow(9L,"LP9",8L,"COMPLETED","CAB","C",11L,21L,"O","I",7L,"客户","TAX_REFUND");
when(mapper.completedPlanForOrder(7L,21L)).thenReturn(9L);