Files
FT546-WCS/docs/superpowers/specs/2026-07-31-wcs-complete-center-dispatch-simulation-design.md

220 lines
9.4 KiB
Markdown
Raw 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.
# WCS 完整地图中心调度历史任务仿真设计
## 1. 目标与强制结果
把固化的 240 条 `dbo.wcs_srgv_queue_finish` 历史记录只作为任务负载输入,
由调度中心基于独立完整地图重新选车、重新规划路径并执行全生命周期。
最终真实负载验收必须同时满足:
- 输入 240 条,完成 240 条,等待 0 条,失败 0 条。
- 每条任务均实际经历到达、排队、选车、寻路、资源裁决、PLC/ACK、逐节点移动、
逐段释放、归档和 WMS 完成回调。
- 节点双占、资源超容量、对向换边、重复归档和重复 WMS 业务效果均为 0。
- 不能读取历史完成状态直接完成任务,不能把历史 `path_info` 作为地图或规划结果。
这是纯内存确定性仿真,不连接真实 PLC/WMS,不修改 `ruoyi-*` 生产模块,不替代
SHADOW、HIL 或 ACTIVE 现场验收。
## 2. 方案选择
### 方案 A:继续从历史 `path_info` 生成拓扑
拒绝。`path_info` 是调度中心规划后的历史输出,用它生成地图会形成循环验证,
无法证明新算法独立规划。
### 方案 B:启动生产 Spring 服务并连接实时数据库
不采用。它更接近现场,但受实时车辆、队列、设备和数据库状态影响,无法生成可重复的
自动化验收证据,还会扩大测试对生产模块的依赖。
### 方案 C:完整权威地图快照驱动纯内存中心调度
采用。只读固化 `dbo.wcs_srgv_map` 的完整非敏感投影,按生产地图规则构建网格;
任务与地图完全独立,调度结果可重复,同时仍复用当前中心调度、交通资源账本和协议模拟。
## 3. 权威输入
### 3.1 历史任务快照
沿用已经 SHA-256 校验的 240 条任务记录。字段口径如下:
- `task_no/guid/task_type/start_site/end_site/priority/create_date`:真实业务输入。
- `agv_id`:历史车辆对照,不参与选车约束。
- `path_info`:历史规划结果对照,不参与地图、可达性、寻路或交通裁决。
- `finish_date`:历史耗时对照,不控制仿真结束。
- 历史完成状态:只说明该任务曾完成,不产生仿真状态迁移。
### 3.2 完整地图快照
新增完整 `dbo.wcs_srgv_map` 快照,至少保留:
```text
site_id, x, y, z, value, axy, warehouse, space_area
```
只读核验基线:
- 全表 2,552 个网格单元,覆盖 `x=1..29`、`y=1..11`、`z=1..8`。
- `value IN (1,2)` 的可通行单元 1,175 个,且都有唯一非空 `site_id`。
- 240 条样本所在 1~3 层共有 445 个可通行站点。
- 完整地图及 manifest 均计算 SHA-256,测试运行不再连接数据库。
快照不包含连接串、设备地址、凭据或其他敏感字段。
## 4. 地图编译与端点解析
地图编译遵循生产 `RoadCacheServiceImpl` 与 `PathFinder` 的网格语义:
1. 仅 `value=1/2` 的单元可通行。
2. 同一层中曼哈顿距离为 1 的可通行单元建立无向边。
3. 每个节点和边的交通容量为 1。
4. 站点坐标直接来自地图快照,不从任务历史路径推断。
5. 地图编译后必须校验站点 ID 唯一、坐标唯一、边端点存在和每层连通分量。
业务端点按生产规则解析:
- 普通站点直接使用 `wcs_srgv_map.site_id`。
- `tsj` 映射到任务所在层的 `07050{floor}`。
- 优先使用起点地图层作为任务物理层;历史 `the_floor` 只在业务别名解析时使用并交叉校验。
- 解析后的物理起终点必须存在且位于同一可达连通分量,否则真实负载验收立即失败,
不降级使用 `path_info`。
只读验证已经证明上述规则下 240 条任务的起终点均存在,且不读取 `path_info` 时
240 对起终点全部可达。
## 5. 中心调度数据流
```text
create_date 到达事件
-> 饥饿保护优先队列
-> 健康空闲车辆候选
-> 中心选车
-> 完整地图重新规划 vehicle->source->target
-> 路线/走廊预约
-> SHADOW 下一段资源裁决
-> 模拟 PLC 发送与 ACK
-> 车辆移动一个节点
-> 释放旧节点和已通过边
-> 到达后唯一归档
-> WMS 幂等完成回调
```
规划器必须在每次初始分配、故障恢复、协议重试耗尽和避让完成后重新计算路径。
报告保存新规划路径,并在任务结束后才与历史 `path_info` 比较。
## 6. 交通预约与确定性解锁
当前活锁的根因是:一个车辆的剩余路线被空闲车辆占用,其他任务又被整条路线反向冲突
门禁阻塞。新调度器采用以下规则:
### 6.1 路线预约
- 每个活动任务保存当前规划路径和剩余无向边集合。
- 路线重叠但方向一致时可以并行准入,具体移动仍由下一段资源账本串行化。
- 路线存在反向共享边时,按有效优先级、等待年龄、到达时间、任务 ID 决定唯一方向所有者。
- 方向所有者到达冲突区出口前不可被新任务反向抢占;释放出口后重新裁决。
### 6.2 阻塞车辆迁移
- 若方向所有者的剩余路径被空闲车辆当前位置占用,中心调度生成内部
`CLEARANCE_MOVE`,而不是让业务任务无限 HOLD。
- 清障目标必须是完整地图中的真实可通行节点,且不在方向所有者剩余路径、其他车辆位置
或已预约资源中。
- 目标按最短路径长度、非主干优先、站点 ID 稳定排序选择;迁移本身也经过规划、
SHADOW 裁决、PLC/ACK、逐节点移动和资源释放,严禁瞬移。
- 清障完成后原业务任务重新规划。内部迁移不计入 240 条业务任务完成数,但完整写入事件证据。
### 6.3 进展保证
- 每个冲突连通分量同时只有一个方向所有者。
- 连续 HOLD 达阈值时保留原到达时间和老化优先级,不把任务放回队尾。
- 无冲突任务可在其他地图区域继续并行。
- watchdog 监视“业务终态增加、车辆沿授权路线前进、清障迁移完成”三类有效进展;
重复 HOLD 和重复分配不算进展。
- 真实负载出现 watchdog 或 tick 上限即测试失败,不再作为可接受的 WAITING 报告。
## 7. 优先级与饥饿保护
- 排序键:有效优先级、`create_date`、`task_no`、`guid`、稳定序号。
- 数值越小优先级越高。
- 每等待 30 仿真秒提升一级,有效优先级最低提升到 0。
- 清障迁移继承被保障业务任务的方向所有权,但不能改变业务任务自身优先级。
- 低优先级任务一旦成为方向所有者,必须获得至少一个可验证移动进展后才允许重新竞争。
## 8. 故障和恢复
模拟 PLC 发送失败、ACK 超时/丢失、断线、PLC 重启、低电量和车辆故障继续使用固定故障计划。
- 故障车辆停止接收新任务并释放未执行的下一段资源。
- 活动业务任务保留原到达时间后重新调度。
- 旧 boot ID 的 ACK 拒绝生效。
- 低电量或故障恢复后车辆重新进入候选池。
- 故障不能把真实负载任务转为 FAILED;达到重试阈值后必须换车或延后重试。
- 只有地图快照自身违反结构契约时才允许启动失败,不能把单条真实任务关闭来满足总数。
## 9. 归档与 WMS
- 只有车辆逐节点抵达物理终点才能完成业务任务。
- 每个任务 ID 只允许一条归档记录。
- 仿真主动对每个完成任务投递两次 WMS 完成通知,业务接收器只产生一次业务效果。
- 最终必须满足归档数 240、WMS 投递尝试 480、WMS 业务效果 240。
## 10. TDD 与验收测试
实现必须先添加并运行以下失败测试:
1. 修改同一任务的历史 `path_info` 不改变新规划路径。
2. 删除 `path_info` 后,只要业务输入和完整地图有效,任务仍能规划和完成。
3. 完整地图按 `value` 和坐标生成连边,不能使用历史相邻节点生成边。
4. `tsj` 在 1~3 层正确映射到 `070501/070502/070503`。
5. 三车走廊阻塞场景生成实际清障移动并最终完成,不出现换边或双占。
6. 对向路线按优先级和老化确定方向所有者,低优先级最终通行。
7. 240 条真实任务运行两次均得到完全相同结果。
最终自动验收断言:
```text
inputCount == 240
completedCount == 240
waitingCount == 0
failedCount == 0
archiveCount == 240
wmsDeliveryAttempts == 480
wmsBusinessEffects == 240
deadlocks == 0
totalSafetyViolations == 0
```
此外,现有故障矩阵、60 条安全场景和全部 Maven 测试必须继续通过。
## 11. 报告与证据
生成新的独立证据目录,不覆盖旧运行:
```text
outputs/wcs-history-driven-center-dispatch-<runId>/
summary.json
task-results.csv
tick-events.csv
invariant-results.json
readable-report.xlsx
manifest.sha256
```
报告必须新增:
- 地图快照行数、可通行节点数、地图 SHA 和规划算法版本。
- `path_infoUsedForPlanning=false`。
- 每条任务的业务端点、解析后物理端点、历史路径和中心新规划路径。
- 方向预约、清障任务、HOLD、重试和重新选车明细。
- 240/0/0 状态、每车完成数、耗时分位数和安全不变量。
首页继续标明:真实历史负载驱动纯内存仿真,不是现场 SHADOW/HIL/ACTIVE 验收。
## 12. 明确边界
本设计证明完整静态地图上的中心调度功能、确定性、故障恢复和资源安全;它不证明实时地图与
现场一致、真实 PLC 时序、SQL 事务、WMS 网络交付或生产吞吐能力。完整地图快照发生变化时,
必须生成新版本和新证据,不能沿用旧结论。