feat(javaTest): visualize floor transfer evidence

This commit is contained in:
zgw
2026-08-07 11:29:38 +08:00
parent 31fa643993
commit 744edb6a37
6 changed files with 416 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ import com.ft546.wcs.shadow.history.HistoricalQueueRecord;
import com.ft546.wcs.shadow.history.simulation.HistoricalDispatchSimulationResult;
import com.ft546.wcs.shadow.history.simulation.HistoricalSimulationInput;
import com.ft546.wcs.shadow.history.simulation.HistoricalSimulationTask;
import com.ft546.wcs.shadow.history.simulation.FloorTransferJob;
import com.ft546.wcs.shadow.history.simulation.RoutePlanningEvidence;
import com.ft546.wcs.shadow.history.simulation.RerouteDecisionEvidence;
import com.ft546.wcs.shadow.history.simulation.SimulationInvariantSummary;
@@ -207,6 +208,11 @@ public final class SimulationVisualizationMapper {
? record.getEndSite() : definition.getPhysicalTarget());
value.put("historicalVehicleId", record.getAgvId());
value.put("simulatedVehicleId", task.getSimulatedVehicleId());
value.put("assignmentMode", task.getAssignmentMode() == null
? null : task.getAssignmentMode().name());
value.put("floorTransferCount", task.getFloorTransferCount());
value.put("involvedFloors", involvedFloors(task.getFloorTransferJobs()));
value.put("floorTransferJobs", floorTransferJobs(task.getFloorTransferJobs()));
value.put("historicalPath", historicalPath);
value.put("plannedPath", task.getPlannedPath());
// 边差证据解释新旧路线在哪里重合或分叉,但不参与调度中心的规划结果。
@@ -253,6 +259,38 @@ public final class SimulationVisualizationMapper {
return value;
}
/**
* 汇总父任务换层作业经过的楼层,供页面楼层选择器标记整条业务链涉及的地图。
*/
private List<Integer> involvedFloors(List<FloorTransferJob> jobs) {
Set<Integer> floors = new TreeSet<Integer>();
for (FloorTransferJob job : jobs) {
floors.add(job.getSourceFloor());
floors.add(job.getTargetFloor());
}
return new ArrayList<Integer>(floors);
}
/**
* 输出中心提交给现有 WCS 的换层意图;幂等键用于核对重试是否复用了同一个物理作业。
*/
private List<Map<String, Object>> floorTransferJobs(List<FloorTransferJob> jobs) {
List<Map<String, Object>> values = new ArrayList<Map<String, Object>>();
for (FloorTransferJob job : jobs) {
Map<String, Object> value = new LinkedHashMap<String, Object>();
value.put("idempotencyKey", job.getIdempotencyKey());
value.put("parentTaskId", job.getParentTaskId());
value.put("vehicleId", job.getVehicleId());
value.put("sourceFloor", job.getSourceFloor());
value.put("targetFloor", job.getTargetFloor());
value.put("sourceSite", job.getSourceSite());
value.put("targetSite", job.getTargetSite());
value.put("priority", job.getPriority());
values.add(value);
}
return values;
}
/** 返回当前任务的重规划触发、拒绝和成功事件,供前端按版本还原决策链。 */
private List<Map<String, Object>> rerouteEvents(
String taskId, List<SimulationTickEvent> allEvents) {