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

9.4 KiB
Raw Blame History

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 快照,至少保留:

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. 中心调度数据流

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 条真实任务运行两次均得到完全相同结果。

最终自动验收断言:

inputCount == 240
completedCount == 240
waitingCount == 0
failedCount == 0
archiveCount == 240
wmsDeliveryAttempts == 480
wmsBusinessEffects == 240
deadlocks == 0
totalSafetyViolations == 0

此外,现有故障矩阵、60 条安全场景和全部 Maven 测试必须继续通过。

11. 报告与证据

生成新的独立证据目录,不覆盖旧运行:

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 网络交付或生产吞吐能力。完整地图快照发生变化时, 必须生成新版本和新证据,不能沿用旧结论。