diff --git a/ruoyi-admin/src/main/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryService.java b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryService.java index 6e04b9d..ed938ce 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryService.java @@ -29,9 +29,10 @@ public class TidyWorkflowRecoveryService { } if (evidence.stepId() == null) { if (evidence.activeTidyJobCount() == 0) { - mapper.completeTidyWorkflow(evidence.workflowId()); - mapper.releaseTidyResources(evidence.workflowId()); - changed++; + if (mapper.completeTidyWorkflow(evidence.workflowId()) > 0) { + mapper.releaseTidyResources(evidence.workflowId()); + changed++; + } } else { changed += pause(evidence, "RECOVERY_JOB_MISMATCH"); } @@ -100,7 +101,9 @@ public class TidyWorkflowRecoveryService { } private int pause(TidyRecoveryEvidence evidence, String reason) { - mapper.pauseTidyWorkflow(evidence.workflowId(), reason); + if (mapper.pauseTidyWorkflow(evidence.workflowId(), reason) == 0) { + return 0; + } if (evidence.stepNo() != null) { mapper.pauseTidyStep(evidence.workflowId(), evidence.stepNo(), reason); } diff --git a/ruoyi-admin/src/test/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryServiceTest.java b/ruoyi-admin/src/test/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryServiceTest.java index f82cb41..a92339c 100644 --- a/ruoyi-admin/src/test/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryServiceTest.java +++ b/ruoyi-admin/src/test/java/com/ruoyi/algorithm/wms/tidy/TidyWorkflowRecoveryServiceTest.java @@ -30,6 +30,8 @@ class TidyWorkflowRecoveryServiceTest { mapper = mock(WmsAlgorithmMapper.class); transaction = mock(TidyWorkflowTransaction.class); service = new TidyWorkflowRecoveryService(mapper, transaction); + when(mapper.completeTidyWorkflow(anyString())).thenReturn(1); + when(mapper.pauseTidyWorkflow(anyString(), anyString())).thenReturn(1); } @Test @@ -70,6 +72,17 @@ class TidyWorkflowRecoveryServiceTest { verify(mapper).releaseTidyResources(evidence.workflowId()); } + @Test + void completedStepsAlreadyFinalizedReturnZeroAndDoNotReleaseLocksAgain() { + TidyRecoveryEvidence evidence = matching().allStepsCompleted().build(); + when(mapper.selectTidyRecoveryEvidence("01")).thenReturn(List.of(evidence)); + when(mapper.completeTidyWorkflow(evidence.workflowId())).thenReturn(0); + + assertThat(service.reconcile("01")).isZero(); + + verify(mapper, never()).releaseTidyResources(anyString()); + } + @Test void completedStepsWithALingeringActiveJobPauseWithoutReleasingLocks() { TidyRecoveryEvidence evidence = matching().allStepsCompleted().activeTidyJobCount(1).build(); @@ -82,6 +95,20 @@ class TidyWorkflowRecoveryServiceTest { verify(mapper, never()).releaseTidyResources(anyString()); } + @Test + void pauseThatChangesNoWorkflowRowReturnsZeroAndDoesNotPauseTheStep() { + TidyRecoveryEvidence evidence = matching().missingJobs().build(); + when(mapper.selectTidyRecoveryEvidence("01")).thenReturn(List.of(evidence)); + when(mapper.pauseTidyWorkflow(evidence.workflowId(), "RECOVERY_JOB_MISSING")) + .thenReturn(0); + + assertThat(service.reconcile("01")).isZero(); + + verify(mapper, never()).pauseTidyStep(anyString(), + org.mockito.ArgumentMatchers.anyInt(), anyString()); + verify(mapper, never()).releaseTidyResources(anyString()); + } + @ParameterizedTest(name = "{0}") @MethodSource("pauseCases") void inconsistentLocalEvidencePausesWithoutReleasingLocks(