Files
FT546-WCS/javaTest/README.md

198 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# FT546 WCS 中心调度与交通管制 Demo
这是一个独立的 Java 8 Maven Demo。它保留 FT546 WCS 的 LEGACY 调度模拟,并旁路提供 P0-B1 离线 SHADOW 交通决策内核。
## 安全边界
- 仅使用内存车辆、任务、队列和地图。
- 不启动 Spring,不连接 SQL Server、PLC 或 WMS。
- 不发送真实设备命令。
- 不修改生产 `ruoyi-*` 模块。
- SHADOW 仅在离线内存中计算、记录和回放,写端口会直接拒绝调用。
- 不启用现场 SHADOW、HIL、LIMITED_ACTIVE、ACTIVE 或 PRODUCTION。
- 不把离线模拟结果作为现场证据。
## 已覆盖行为
- 每个调度周期只执行一次业务任务准入。
- 在线、自动、空闲、允许下发且电量大于 30 的车辆才可参与分配。
- 同层、楼层差、Y 距离、X 距离、车辆编号的稳定选车规则。
- 其他车辆剩余路径和离线车辆当前位置锁定。
- 同通道阻挡、高优先级避让任务和避让去重。
- 模拟协议失败、下一周期重试。
- 队列 `0/1 → 1/3 → 1/4` 状态流转、完成归档和占用释放。
- 无路可达时返回 HOLD,而不是抛出空指针。
## P0-B1 离线 SHADOW 覆盖
- 带版本、区域确认和基础地图校验和的不可变交通地图。
- `NODE`、规范化无向 `EDGE` 和显式 `CONFLICT` 资源及容量。
- `SOFT/COMMIT_GUARD/HARD/UNKNOWN_HARD/RELEASED` 资源保护契约。
- 区段 Prepare/Commit 状态机及非法跳转拒绝。
- 带 `plcBootId/heartbeatSeq/snapshotSeq` 的不可变复合快照。
- 陈旧、序号倒退、PLC 重启、失联和人工模式的 fail-closed 检查。
- 确定性 `GRANT/HOLD/YIELD`、等待图环拒绝及安全让行点门禁。
- 匹配反馈逐步释放;重复、跳点、版本错配和 ACK 未知不释放。
- SHADOW PLC、业务状态和权威预约三类禁写端口。
- JSON 黄金决策事件、SHA-256 输入哈希和离线回放。
- 固定种子 `546001` 至 `546010` 的容量、无环和确定性不变量回归。
- `shadow-simulation-60.json` 提供 60 条独立模拟数据,覆盖 12 类资源、决策、快照和反馈场景;每条数据由参数化测试独立计数。
- `shadow/history` 保存从 `FT546-wcs.dbo.wcs_srgv_queue_finish` 只读抽取的 240 条真实队列历史样本,并独立保存 `dbo.wcs_srgv_map` 的 2,552 行完整网格快照;任务历史路径不用于构建地图。
- 真实历史数据覆盖车辆 `1/2/3` 和任务类型 `1/2/3`;数据库全量扫描口径为 17,136 条,其中 11,943 条带有非空路径。
- 历史回放使用 `[create_date, finish_date)` 推导潜在并发窗口;数据库“已完成”事实与当前 SHADOW 的 `GRANT/HOLD/INSUFFICIENT_DATA` 推演结果分栏记录。
`com.ft546.wcs.demo` 是 LEGACY 演示;新增能力位于 `com.ft546.wcs.shadow`,交通区段状态不会写入 LEGACY 业务队列。
## 有界冲突感知路径规划
- `GridPathPlanner` 保留原 BFS 行为作为兼容基线;历史调度仿真使用独立的有界候选规划器。
- 候选规划先按地图坐标欧氏距离求确定性最短路,再用 Yen 算法枚举无环候选;只保留最短距离
`110%` 以内的路线,最多输出 32 条。
- 候选不使用加权总分,而是依次比较对向冲突、占用节点、不兼容边预约、活动路线重叠、
转弯、坐标距离和规范站点序列;前一项优先于全部后一项。
- 自动选车规则保持不变。选车完成后,车辆到任务源点的接近段和源点到目标的服务段分别生成、
评价候选,再拼成实际执行路线。
- 临时交通冲突不会被误判为永久无路。只有地图端点未知或静态候选集合为空才以 `NO_ROUTE`
失效关闭;可达但暂时冲突的任务继续走预约和 HOLD 流程。
- 同一车辆、任务、阻塞资源和交通原因连续 HOLD 三次时触发重规划。新剩余路线必须严格更优,
且走廊预约原子替换成功后才生效;换路后至少 MOVE 一个节点才允许再次普通重规划。
- PLC 发送失败、断线、重启、低电量和车辆故障不计入交通 HOLD 连续次数,各自按协议重试、
恢复或重新调度流程处理。
- 历史 `path_info` 从不作为规划输入。只有路径全部位于权威地图且首尾等于本次解析的物理业务
端点时,才进入 `EXACT_MATCH/SHORTER_PHYSICAL_DISTANCE/SAME_DISTANCE_BETTER_QUALITY/
BOUNDED_DETOUR_FEWER_CONFLICTS/WORSE_QUALITY` 公平比较;其他记录标记为端点不一致或历史路径无效。
## 运行测试
```bash
mvn clean test
```
测试必须由 Maven Surefire 实际发现并执行;验收标准为测试数大于 0、Failures 为 0、Errors 为 0。
真实历史专项测试:
```bash
mvn -Dtest=HistoricalQueueDatabaseReplayTest test
```
生成真实历史离线回放证据:
```bash
mvn compile exec:java \
-Dexec.mainClass=com.ft546.wcs.shadow.history.HistoricalReplayApplication \
-Dexec.args="outputs/wcs-shadow-history-replay-local"
```
输出包括 `summary.json`、`replay-results.csv`、`data-quality-issues.csv` 和
`manifest.sha256`。报告保留数据库原始业务编号,方便回查。
> 这些结果是“真实历史队列离线回放”,不是现场 SHADOW 验收。历史队列表没有保存
> 当时每一轮 PLC 快照、资源账本或 LEGACY 决策,因此不能把最终完成状态当作算法正确率。
## 运行真实历史负载全链路调度仿真
历史数据包含 240 条原始扫描快照、98 个唯一队列 GUID、142 条重复快照、76 个业务父任务和
17 个车辆运行作业。默认 `business` 模式按生产源码语义组装 76 个父任务,再按 `create_date`
生成到达事件;`raw` 模式才按旧口径逐条运行 240 条快照。两种模式都由调度中心重新选车和
规划路径,经过 SHADOW 交通裁决、模拟 PLC/ACK、逐节点移动、资源释放、完成归档和
幂等 WMS 回调。历史 `agv_id/path_info/finish_date/完成状态` 仅用于对照。
```bash
mvn -q -DskipTests compile exec:java \
-Dexec.mainClass=com.ft546.wcs.shadow.history.simulation.HistoricalDispatchSimulationApplication \
-Dexec.args="outputs/wcs-history-business-dispatch-local 100 business"
mvn -q -DskipTests compile exec:java \
-Dexec.mainClass=com.ft546.wcs.shadow.history.simulation.HistoricalDispatchSimulationApplication \
-Dexec.args="outputs/wcs-history-raw-dispatch-local 100 raw"
```
第二个参数只允许 `10` 或 `100`,第三个参数只允许 `business` 或 `raw`。Java 原始证据包括 `summary.json`、`route-decisions.json`、
`task-results.csv`、`tick-events.csv`、`invariant-results.json` 和 `manifest.sha256`,回答完成/等待/失败、
每车完成数、车辆和路径差异、资源安全、平均/P95/P99、HOLD/重试原因、历史耗时差异、
归档和 WMS 幂等情况。正式验收证据目录另包含由这些原始证据生成的
`readable-report.xlsx`,并纳入 `manifest.sha256`。
每个已完成任务会注入一次重复 WMS 投递,用于验证接收端幂等;报告分别记录
`wmsDuplicateDeliveryAttempts` 和 `wmsDuplicateBusinessEffects`,验收要求后者为 `0`。
任务到达时间按相邻 `create_date` 的真实间隔除以加速倍率计算,长空闲间隔不截断。
等待和完成时间用于观察本次确定性仿真流程,不进入车辆选择或路径质量元组。历史环境中的故障、
拥堵和 PLC 时序没有完整快照,因此仿真耗时与历史耗时的差值不能单独证明路线优劣或现场产能。
> 这是“真实历史负载驱动纯内存仿真”,不是现场 SHADOW、HIL 或 ACTIVE 验收。
> 历史表不含独立的仿真起始时刻车辆位置/状态快照,因此车辆 `1/2/3` 分别从完整地图中的
> 固定站点 `010701/010702/010703` 初始化;历史 `agv_id` 仅用于对照,不参与初始位置或选车约束。
## 打开调度路径审计页面
审计页面调用上述同一套 Java 调度、规划、交通裁决和仿真代码,浏览器只负责显示服务端
返回的选车、`plannedPath` 和逐 tick 事件,不在 JavaScript 中复制算法。启动命令:
```powershell
mvn compile exec:java "-Dexec.mainClass=com.ft546.wcs.shadow.history.visualizer.HistoricalDispatchVisualizerApplication" "-Dexec.args=18084"
```
浏览器访问 `http://127.0.0.1:18084`。在“A → B 单任务”中填写完整地图内的起点和终点,
选择任务类型、优先级、加速倍率及可选故障预设,然后运行调度。页面会显示中心选车、车辆到
起点的接近路径、调度中心重新规划的 A → B 路径、逐节点移动、HOLD 和 PLC 重试事件。
地图默认显示当前楼层完整拓扑。“全图”用于确认规划路径位于真实地图的哪些通道,“路径”
用于放大查看新旧路线的分叉和汇合;也可以用工具栏或鼠标滚轮缩放,按住地图拖动平移,
复位按钮恢复完整地图。楼层下拉始终包含 1-8 楼,并标出任务路径和当前车辆所在楼层。
时间线可逐事件前进、后退或自动播放。浅灰色为完整地图,灰色虚线为车辆到起点的接近路径,
绿色为调度中心当前 `plannedPath`,橙色点线为历史 `path_info` 参考,蓝色为已经通过的边;
共同路段同时保留绿色底线和橙色点线。右侧检查器分别统计共同边、仅新规划边、仅历史边,并
报告无法映射到权威地图的历史无效段;无效段只列为证据,不会被画成真实道路。关闭“历史参考”
只隐藏橙色证据,不影响绿色的新规划结果。
地图图层可分别开关历史、初始规划、当前规划、MOVE 轨迹和 HOLD 点。右侧“候选与质量”按接近段/
服务段和路径版本展示最短距离、选中距离、绕行比例、候选数量、选择原因以及完整质量元组;候选表
直接显示 Java 返回的候选和最终选中项。成功 REROUTE 事件保存换路前后剩余路径及同一交通快照的
质量,选择重规划记录后会在完整地图上同时叠加两条路线。页面不重新规划,也不自行推断地图邻接。
“历史任务回放”默认使用“业务任务”口径,运行 76 个业务父任务,并同时显示 240/98/142/76/17
五项输入审计计数。右侧按真实执行顺序列出空车取货、载货回源通道前端、载货入位和空车回目标
通道前端等阶段;点击任一阶段,完整地图只叠加后端返回的该阶段 `plannedPath`。检查器还显示货物
状态、源/目标通道前端、业务完成时间、车辆释放时间和归并后的原始 GUID。
切换到“RAW 快照”后,会执行 240 条兼容任务并恢复历史 `path_info` 与新规划路径的共同边、专属边
和无效段对照。跨层过程始终以换层入口、出口和独立作业事件表达,页面不会在两个楼层之间画一条
虚假的普通地图边。
“安全审计”集中显示节点双占、资源超容量、对向换边、死锁、归档完整性和 WMS 回调幂等。
导出的 JSON 是本次内存仿真的页面证据。
服务严格绑定 `127.0.0.1`,只读取打包的历史与地图资源,不接收任意文件路径,不连接数据库、
真实 PLC 或 WMS。按 `Ctrl+C` 停止服务。该页面用于离线上线前检查,不能替代现场 HIL/ACTIVE 验收。
服务运行时可在另一个终端执行真实 Chromium 验收;脚本会运行 A→B、76 个业务父任务和 240 条
RAW 快照,并检查完整地图、业务阶段切换、跨层端口、历史路径差异、图层开关、视口、候选证据、
桌面/移动布局、横向溢出及控制台错误:
```bash
python scripts/visualizer_browser_qa.py http://127.0.0.1:18084 outputs/browser-qa
```
## 运行控制台模拟
```bash
mvn exec:java
```
输出事件包括:
- `CYCLE`:调度周期开始
- `ASSIGN`:任务选车和裁决理由
- `PATH`:规划成功的路径
- `AVOID`:创建避让队列
- `HOLD`:交通或协议原因导致等待
- `SEND`:模拟协议下发成功
- `MOVE`:模拟车辆推进
- `COMPLETE`:队列完成并归档
- `SUMMARY`:最终周期、活动队列、历史和协议尝试次数
- `SHADOW-SUMMARY`:离线 SHADOW 的 GRANT/HOLD 数量和零写入声明
## 未覆盖的生产门槛
本项目不包含 SQL Server 事务与 Outbox、真实 PLC Prepare/Commit、CRC 与寄存器布局、提升机物理信号、深位真实执行、硬件在环、现场 SHADOW 样本或区域 ACTIVE 回退。相关能力仍以 `docs/WCS算法优化` 的外部签字和验收门禁为准。