From f5f72d681ddf21475fa12642cee9fdd1de777d9f Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 27 Aug 2026 18:05:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/LoadingDeliveryService.java | 15 +++++++++--- .../service/LoadingDeliveryServiceTest.java | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java b/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java index aa1795907..43321e6da 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/loading/service/LoadingDeliveryService.java @@ -135,12 +135,12 @@ public class LoadingDeliveryService { key, request, target, acceptedPdaCompletion); } if ("LOADED".equals(inbound.processStatus()) || "DELIVERED".equals(inbound.processStatus())) { - loadingModelBridge.requireCompleted(tenantId, inboundId); + requireLoadingPlanGate(tenantId, inboundId, acceptedPdaCompletion); return complete(tenantId, inboundId, operatorId, COMPLETE_LOADING, key, new LoadingActionResponse(inbound.processStatus(), evidenceResponse(tenantId, inboundId))); } if (!"LOADING".equals(inbound.processStatus())) throw new BizException(ResultCode.CONFLICT, "当前订单不在装柜中"); - loadingModelBridge.requireCompleted(tenantId, inboundId); + requireLoadingPlanGate(tenantId, inboundId, acceptedPdaCompletion); completionGate.requireReleasedBooking(tenantId, inboundId); requirePickingGate(tenantId, inboundId, acceptedPdaCompletion); requireCompletionEvidence(tenantId, evidenceInboundId); @@ -206,7 +206,7 @@ public class LoadingDeliveryService { if (!"LOADING".equals(target.loadedChildStatus())) { throw new BizException(ResultCode.CONFLICT, "实装履约分片不在装柜中"); } - loadingModelBridge.requireCompleted(tenantId, target.sourceInboundId()); + requireLoadingPlanGate(tenantId, target.sourceInboundId(), acceptedPdaCompletion); completionGate.requireReleasedBooking(tenantId, target.sourceInboundId()); requirePickingGate(tenantId, target.sourceInboundId(), acceptedPdaCompletion); requireCompletionEvidence(tenantId, evidenceInboundId); @@ -321,6 +321,15 @@ public class LoadingDeliveryService { task.getExpectedCount(), task.getPickedCount(), task.getRemark()); } + /** worker 先完成各入库单,之后才完成柜次计划;这里不能循环要求计划已经 COMPLETED。 */ + private void requireLoadingPlanGate(long tenantId, long inboundId, boolean acceptedPdaCompletion) { + if (acceptedPdaCompletion) { + loadingModelBridge.requireStarted(tenantId, inboundId); + return; + } + loadingModelBridge.requireCompleted(tenantId, inboundId); + } + /** completion worker 已持有 durable lease;此时 task 尚为 COMPLETING,不能循环要求最终 COMPLETED。 */ private void requirePickingGate(long tenantId, long inboundId, boolean acceptedPdaCompletion) { CanonicalPicking picking = canonicalPicking(tenantId, inboundId); diff --git a/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java index 1d140af65..f4e7fe2a1 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/loading/service/LoadingDeliveryServiceTest.java @@ -196,6 +196,8 @@ class LoadingDeliveryServiceTest { verify(repository).findInboundForUpdate(10, 20); verify(repository).completeLoadedChild(10, 20, 7, 7); verify(repository, never()).completeLoadedChild(10, 20, 7, 6); + verify(loadingModelBridge).requireStarted(10, 20); + verify(loadingModelBridge, never()).requireCompleted(10, 20); } @Test @@ -223,6 +225,26 @@ class LoadingDeliveryServiceTest { verify(repository).completeLoadedChild(10, 20, 7, 7); verify(repository).completeOperation(eq(10L), eq(20L), eq(7L), eq("COMPLETE_LOADING"), eq("pda-resume"), anyString()); + verify(loadingModelBridge).requireStarted(10, 20); + verify(loadingModelBridge, never()).requireCompleted(10, 20); + } + + @Test + void pdaFinalizeConvergesAnAlreadyLoadedInboundBeforeThePlanIsCompleted() { + when(repository.claimOperation(anyLong(), anyLong(), anyLong(), anyString(), anyString(), anyString())) + .thenReturn(true); + when(repository.findInboundForUpdate(10, 20)).thenReturn(new Snapshot(20L, 10L, "LOADED", 8)); + when(repository.findInbound(10, 20)).thenReturn(new Snapshot(20L, 10L, "LOADED", 8)); + when(repository.listEvidence(10, 20)).thenReturn(List.of()); + + LoadingActionResponse result = service.completeAfterPdaSettlement( + 10, 20, 7, "admin", "pda-already-loaded", "完成"); + + assertThat(result.mainStatus()).isEqualTo("LOADED"); + verify(loadingModelBridge).requireStarted(10, 20); + verify(loadingModelBridge, never()).requireCompleted(10, 20); + verify(repository).completeOperation(eq(10L), eq(20L), eq(7L), + eq("COMPLETE_LOADING"), eq("pda-already-loaded"), anyString()); } @Test @@ -251,6 +273,8 @@ class LoadingDeliveryServiceTest { assertThat(result.mainStatus()).isEqualTo("LOADED"); verify(repository).findInboundForUpdate(10, 21); verify(repository).completeLoadedChild(10, 20, 7, 2); + verify(loadingModelBridge).requireStarted(10, 20); + verify(loadingModelBridge, never()).requireCompleted(10, 20); } @Test