From 5927034b1c2d7e0d0688dc3d5fa2c1d72f7e649a Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 26 Sep 2026 17:45:41 +0800 Subject: [PATCH] fix(firstleg): freeze customs receipt after broker submission --- .../container/service/ContainerCustomsService.java | 3 +++ .../container/ContainerCustomsServiceTest.java | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/customs/container/service/ContainerCustomsService.java b/firstleg/src/main/java/com/baiyue/firstleg/customs/container/service/ContainerCustomsService.java index 8e013fdbe..6a208ec24 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/customs/container/service/ContainerCustomsService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/customs/container/service/ContainerCustomsService.java @@ -205,6 +205,9 @@ public class ContainerCustomsService { if (container == null || !DECLARING.equals(container.status()) || source.frozenAt() == null) { throw conflict("当前客户资料不在报关中冻结版本"); } + if (mapper.brokerSubmittedAt(container.id()) != null) { + throw conflict("客户确认回执已发送给报关行,不可再修改回执"); + } CompletionRow completion = mapper.lockCompletion(documentId); CustomsFileClient.Metadata metadata = upload(source.tenantId(), RECEIPT_FILE_TYPE, Long.toString(container.loadingPlanId()), operatorId, file); long completionId; diff --git a/firstleg/src/test/java/com/baiyue/firstleg/customs/container/ContainerCustomsServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/customs/container/ContainerCustomsServiceTest.java index 6df5f6cba..363ae3538 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/customs/container/ContainerCustomsServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/customs/container/ContainerCustomsServiceTest.java @@ -274,6 +274,18 @@ class ContainerCustomsServiceTest { verifyNoInteractions(files); } + @Test void receiptCannotBeReplacedAfterBrokerSubmission(){ + var source=document(1L);when(mapper.document(1L)).thenReturn(source); + when(mapper.claimCommand(anyLong(),eq(5L),eq("UPLOAD_COMPLETION_1"),eq("broker-sent-key"),anyString())).thenReturn(1); + when(mapper.lockContainerById(2L)).thenReturn(container(ContainerCustomsService.DECLARING,4)); + when(mapper.lockDocument(1L)).thenReturn(source); + when(mapper.brokerSubmittedAt(2L)).thenReturn(java.time.LocalDateTime.now()); + var file=new MockMultipartFile("file","result.bin","application/octet-stream",new byte[]{1}); + assertThatThrownBy(()->service.uploadCompletion(1L,5L,"admin","broker-sent-key",0,file)) + .isInstanceOf(BizException.class).hasMessageContaining("不可再修改回执"); + verifyNoInteractions(files); + } + @Test void receiptReplaySucceedsAndDoesNotCompleteContainer(){ var source=document(1L); var declaring=container(ContainerCustomsService.DECLARING,3);