feat(wcs): add workflow and task step model

This commit is contained in:
zgw
2026-08-10 15:12:05 +08:00
parent ba245255f9
commit fd83225c75
8 changed files with 502 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
package com.ruoyi.wcs.domain.task;
import com.ruoyi.wcs.domain.shared.DomainRuleViolation;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class WorkflowInstanceTest {
@Test
void exposesOnlyStepsWhoseMandatoryDependenciesSucceeded() {
WorkflowInstance workflow = workflow();
assertEquals(Collections.singletonList("MOVE"), keys(workflow.readySteps()));
workflow.step("MOVE").assign("VEH-1", Collections.singletonList("RES-1"));
workflow.step("MOVE").start();
workflow.step("MOVE").succeed();
workflow.onStepSucceeded("MOVE");
assertEquals(Collections.singletonList("DROP"), keys(workflow.readySteps()));
}
@Test
void failedMandatoryDependencyFailsItsSuccessor() {
WorkflowInstance workflow = workflow();
TaskStep move = workflow.readySteps().get(0);
move.fail("PLC rejected command before movement");
assertEquals(Collections.emptyList(), workflow.readySteps());
assertEquals(TaskStepState.FAILED, workflow.step("DROP").getState());
}
@Test
void excludedOptionalBranchIsSkippedAndDoesNotBlockRequiredWork() {
WorkflowDefinition definition = new WorkflowDefinition(
TransportOrderType.INBOUND,
Arrays.asList(
new WorkflowStepDefinition("MOVE", TaskStepType.MOVE, true,
true, Collections.<String>emptyList()),
new WorkflowStepDefinition("AUDIT", TaskStepType.INVENTORY_CHECK,
false, false, Collections.singletonList("MOVE"))));
WorkflowInstance workflow = WorkflowInstance.create("WF-2", "ORDER-2", definition);
assertEquals(TaskStepState.SKIPPED, workflow.step("AUDIT").getState());
assertEquals(Collections.singletonList("MOVE"), keys(workflow.readySteps()));
}
@Test
void terminalStepRejectsFurtherTransitions() {
TaskStep step = workflow().readySteps().get(0);
step.cancel();
assertThrows(DomainRuleViolation.class, step::markReady);
}
private WorkflowInstance workflow() {
WorkflowDefinition definition = new WorkflowDefinition(
TransportOrderType.INBOUND,
Arrays.asList(
new WorkflowStepDefinition("MOVE", TaskStepType.MOVE, true,
true, Collections.<String>emptyList()),
new WorkflowStepDefinition("DROP", TaskStepType.UNLOAD, true,
true, Collections.singletonList("MOVE"))));
return WorkflowInstance.create("WF-1", "ORDER-1", definition);
}
private List<String> keys(List<TaskStep> steps) {
return steps.stream().map(TaskStep::getStepKey).collect(Collectors.toList());
}
}