feat(ft546): add WCS operations console

This commit is contained in:
zgw
2026-08-11 19:25:29 +08:00
parent c80acf0d99
commit ceba465675
20 changed files with 1313 additions and 18 deletions

View File

@@ -33,11 +33,29 @@ class WcsOperationsQueryServiceTest {
new FakeReadRepository());
assertEquals("ALARM-1", queries.device("VEH-1").getActiveAlarmCode());
assertEquals(77L, queries.resource("NODE:A").getFencingToken());
ResourceOperationsView resource = queries.resource("NODE:A");
assertEquals("NODE", resource.getResourceType());
assertEquals(2, resource.getCapacity());
assertEquals(1, resource.getProtectedCount());
assertEquals("VEH-1", resource.getHolder());
assertEquals(77L, resource.getFencingToken());
assertEquals("TASK_NUMBER_MISMATCH",
queries.recoveryCase("RC-1").getReason());
}
@Test
void representsAFreeResourceWithoutFabricatingReservationOwnership() {
ResourceOperationsView resource = new ResourceOperationsView(
"NODE:B", "NODE", 2, 0, null, "FREE", null, null,
null, 0L, null, Instant.EPOCH);
assertEquals("FREE", resource.getReservationState());
assertEquals(0, resource.getProtectedCount());
assertEquals(null, resource.getHolder());
assertEquals(null, resource.getOrderId());
assertEquals(0L, resource.getFencingToken());
}
@Test
void pagesRecoveryCasesByExplicitStateWithABoundedLimit() {
WcsOperationsQueryService queries = new WcsOperationsQueryService(
@@ -54,6 +72,31 @@ class WcsOperationsQueryServiceTest {
() -> queries.recoveryCases("OPEN", 0, 501));
}
@Test
void pagesOperationalViewsWithStableTotalsAndOrderIdentifiers() {
WcsOperationsQueryService queries = new WcsOperationsQueryService(
new FakeReadRepository());
OperationsPage<OrderExecutionView> orders = queries.orders(
"EXECUTING", 0, 20);
OperationsPage<DeviceOperationsView> devices = queries.devices(
"UNKNOWN", 0, 20);
OperationsPage<ResourceOperationsView> resources = queries.resources(
"OCCUPIED", 0, 20);
OperationsPage<RecoveryCaseView> recovery = queries.recoveryCasePage(
"OPEN", 0, 20);
assertEquals(2L, orders.getTotal());
assertEquals("TASK-1", orders.getRows().get(0)
.getExternalRequestId());
assertEquals("EXECUTING", orders.getRows().get(0).getOrderState());
assertEquals(1L, devices.getTotal());
assertEquals(1L, resources.getTotal());
assertEquals(2L, recovery.getTotal());
assertThrows(UnsupportedOperationException.class,
() -> orders.getRows().add(orders.getRows().get(0)));
}
@Test
void missingOrBlankOperationsLookupFailsExplicitly() {
WcsOperationsQueryService queries = new WcsOperationsQueryService(
@@ -71,8 +114,9 @@ class WcsOperationsQueryServiceTest {
if (!"ORDER-1".equals(orderId)) {
return null;
}
return new OrderExecutionView("ORDER-1", "WF-1", "STEP-1",
"VEH-1", "CMD-1", "UNKNOWN", "RC-1", Instant.EPOCH);
return new OrderExecutionView("ORDER-1", "TASK-1", "EXECUTING",
"WF-1", "STEP-1", "VEH-1", "CMD-1", "UNKNOWN",
"RC-1", Instant.EPOCH);
}
@Override
@@ -89,9 +133,9 @@ class WcsOperationsQueryServiceTest {
@Override
public ResourceOperationsView findResource(String resourceKey) {
return new ResourceOperationsView("NODE:A", "OCCUPIED",
"ORDER-1", "STEP-1", "VEH-1", 77L, null,
Instant.EPOCH);
return new ResourceOperationsView("NODE:A", "NODE", 2, 1,
"VEH-1", "OCCUPIED", "ORDER-1", "STEP-1",
"VEH-1", 77L, null, Instant.EPOCH);
}
@Override
@@ -106,6 +150,48 @@ class WcsOperationsQueryServiceTest {
return Arrays.asList(recovery("RC-1"), recovery("RC-2"));
}
@Override
public List<OrderExecutionView> findOrders(String state, int offset,
int limit) {
return Arrays.asList(findOrder("ORDER-1"),
new OrderExecutionView("ORDER-2", "TASK-2", "PLANNED",
"WF-2", null, null, null, null, null,
Instant.EPOCH));
}
@Override
public long countOrders(String state) {
return 2L;
}
@Override
public List<DeviceOperationsView> findDevices(String state,
int offset, int limit) {
return Collections.singletonList(findDevice("VEH-1"));
}
@Override
public long countDevices(String state) {
return 1L;
}
@Override
public List<ResourceOperationsView> findResources(String state,
int offset,
int limit) {
return Collections.singletonList(findResource("NODE:A"));
}
@Override
public long countResources(String state) {
return 1L;
}
@Override
public long countRecoveryCases(String state) {
return 2L;
}
private static RecoveryCaseView recovery(String caseId) {
return new RecoveryCaseView(caseId, "VEH-1", "CMD-1", "OPEN",
"TASK_NUMBER_MISMATCH", Instant.EPOCH, null, null);