feat(wcs): add transport order state machine

This commit is contained in:
zgw
2026-08-10 15:08:57 +08:00
parent 74979e3226
commit ba245255f9
4 changed files with 325 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
package com.ruoyi.wcs.domain.task;
import com.ruoyi.wcs.domain.shared.DomainRuleViolation;
import org.junit.jupiter.api.Test;
import java.time.Instant;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class TransportOrderTest {
@Test
void completesOnlyThroughPlannedAndExecuting() {
TransportOrder order = order();
order.plan("WF-1");
order.start();
order.complete();
assertEquals(TransportOrderState.COMPLETED, order.getState());
assertEquals(4, order.getUncommittedEvents().size());
assertEquals("OrderCompleted", order.getUncommittedEvents().get(3).getType());
}
@Test
void cannotCompleteBeforeExecutionStarts() {
TransportOrder order = order();
order.plan("WF-1");
assertThrows(DomainRuleViolation.class, order::complete);
}
@Test
void terminalOrderCannotResume() {
TransportOrder order = order();
order.plan("WF-1");
order.cancel();
assertThrows(DomainRuleViolation.class, order::resumeToPlanned);
}
@Test
void successfulTransitionsIncrementVersionAndEventSequenceOnce() {
TransportOrder order = order();
order.plan("WF-1");
order.start();
order.suspend("PLC snapshot stale");
order.resumeToExecuting();
assertEquals(4L, order.getStateVersion());
assertEquals(5L, order.getUncommittedEvents().get(4).getSequence());
assertThrows(DomainRuleViolation.class, order::resumeToPlanned);
assertEquals(4L, order.getStateVersion());
assertEquals(5, order.getUncommittedEvents().size());
}
@Test
void runningCancellationRequiresTheExplicitConvergenceState() {
TransportOrder order = order();
order.plan("WF-1");
order.start();
assertThrows(DomainRuleViolation.class, order::cancel);
order.requestCancel();
order.cancel();
assertEquals(TransportOrderState.CANCELLED, order.getState());
}
private TransportOrder order() {
return TransportOrder.accept(
"ORDER-1",
"REQ-1",
TransportOrderType.INBOUND,
"LOAD-1",
"PORT-1",
"SPACE-1",
50,
Instant.parse("2026-08-04T00:00:00Z"));
}
}