Junjie
昨天 1a5e3a734a07866c9a46e1b4e8267bcfbe7c6fe2
docs: add station v5 replace v4 design spec
1个文件已添加
159 ■■■■■ 已修改文件
docs/superpowers/specs/2026-03-24-station-v5-replace-v4-design.md 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/superpowers/specs/2026-03-24-station-v5-replace-v4-design.md
New file
@@ -0,0 +1,159 @@
# 输送站线程版本合并设计
## 1. 目标
本次改动只处理输送站线程版本合并,明确以 `ZyStationV5Thread` 全量替代 `ZyStationV4Thread`。
目标如下:
- 输送站在代码层只保留 `ZyStationV5Thread` 这一条主实现。
- `device_config.thread_impl` 对输送站统一收口到 `ZyStationV5Thread`。
- 保留当前 V5 已具备的分段下发、轨迹记录、`routeVersion` 协同、堵塞重规划与环线识别行为。
- 删除 `ZyStationV4Thread` 及其残留旧逻辑,不保留运行时兼容分支。
## 2. 非目标
以下内容不在本次范围内:
- 不改 `ZyStationV3Thread`。
- 不改 `ZyStationV4RealConnect`、`ZyStationV4FakeSegConnect` 的类名或协议实现。
- 不重构 `StationSegmentExecutor` 现有分段算法与状态流转。
- 不改前端 `deviceConfig` 页面交互形式,除非为编译通过必须联动。
- 不统计数据库里现有多少条 `ZyStationV4Thread` 配置,直接做幂等迁移。
## 3. 现状
当前输送站线程存在以下状态:
- [ServerBootstrap.java](/Users/xiejunjie/IdeaProjects/zy-wcs-master/src/main/java/com/zy/core/ServerBootstrap.java) 同时支持 `ZyStationV4Thread` 和 `ZyStationV5Thread` 两个 Devp 版本分支。
- [ZyStationConnectDriver.java](/Users/xiejunjie/IdeaProjects/zy-wcs-master/src/main/java/com/zy/core/network/ZyStationConnectDriver.java) 真实设备和 fake 设备都把 `ZyStationV4Thread` 与 `ZyStationV5Thread` 视为同一协议族。
- [ZyStationV4Thread.java](/Users/xiejunjie/IdeaProjects/zy-wcs-master/src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java) 已经不再走自有分段主链路,实际通过执行器下发,但类内仍残留旧版分段实现。
- [ZyStationV5Thread.java](/Users/xiejunjie/IdeaProjects/zy-wcs-master/src/main/java/com/zy/core/thread/impl/ZyStationV5Thread.java) 是 V4 的功能超集,除共用的状态读取、建命令、下发日志外,还承担堵塞重规划、环线识别与更完整的会话协同。
基于当前代码,`V5` 已经是更合理的唯一基线,继续保留 `V4` 只会造成版本边界混乱。
## 4. 选择方案
采用“以 V5 为唯一版本”的方案:
- 删除 `ZyStationV4Thread`。
- 启动入口只保留 `ZyStationV5Thread` 作为输送站新版本实现。
- 连接驱动对新版本只识别 `ZyStationV5Thread`。
- 通过 SQL 迁移把旧配置值 `ZyStationV4Thread` 统一改成 `ZyStationV5Thread`。
不采用“运行时兼容 V4/V5 双配置值”的方案,因为这会继续保留双版本假象,与“V5 全量替代 V4”的目标冲突。
## 5. 设计
### 5.1 运行实现
输送站运行链路统一为:
1. `device_config.thread_impl = ZyStationV5Thread`
2. `ServerBootstrap` 为 Devp 创建设备线程时只实例化 `ZyStationV5Thread`
3. `ZyStationV5Thread` 负责:
   - 设备连接与状态读取
   - 从 `MessageQueue` 获取输送站任务
   - 委托分段执行器处理 `MOVE` 命令
   - 通过 `sendCommand` 实际下发命令并记录 `BasStationOpt`
4. `StationSegmentExecutor` 继续负责:
   - 路径切段
   - 首段和后续分段的重试下发
   - 基于当前位置判断提前下发时机
   - 处理中断、超时、堵塞、完成
   - 更新 trace 和 move coordinator
### 5.2 V4 清理
删除 `ZyStationV4Thread` 整个类,而不是只删残留方法。原因是本次目标已从“清理 V4 残留”升级为“V5 全量替代 V4”,保留类文件只会形成错误的可用性暗示。
### 5.3 启动与连接分支收口
需要同步收口以下代码分支:
- [ServerBootstrap.java](/Users/xiejunjie/IdeaProjects/zy-wcs-master/src/main/java/com/zy/core/ServerBootstrap.java)
  - 删除 `ZyStationV4Thread` 分支
  - Devp 版本判断只保留 `ZyStationThread`、`ZyStationV3Thread`、`ZyStationV5Thread`
- [ZyStationConnectDriver.java](/Users/xiejunjie/IdeaProjects/zy-wcs-master/src/main/java/com/zy/core/network/ZyStationConnectDriver.java)
  - 真实设备连接时只对 `ZyStationV5Thread` 走 `ZyStationV4RealConnect`
  - fake 设备连接时只对 `ZyStationV5Thread` 走 `ZyStationV4FakeSegConnect`
  - 错误提示不再提到 `ZyStationV4Thread`
这里协议实现类名仍保持 `V4`,因为它表达的是 PLC/连接协议族,而不是线程版本。线程版本合并不要求同步重命名协议实现。
### 5.4 配置迁移
新增一条幂等 SQL 脚本,把旧 Devp 配置统一迁移到 `ZyStationV5Thread`:
- 条件:`device_type = Devp` 且 `thread_impl = ZyStationV4Thread`
- 动作:更新 `thread_impl = ZyStationV5Thread`
该脚本不依赖事前统计,允许空跑。
## 6. 链路检查
### 6.1 输入
- Devp 设备配置中的 `thread_impl`
- 运行时进入输送站线程的 `StationCommand`
### 6.2 处理流程
- 启动时按统一后的 `thread_impl` 创建 `ZyStationV5Thread`
- 线程读取设备状态、消费任务、构造命令或调用重规划入口
- 分段执行器执行分段下发与状态推进
### 6.3 状态变化
- 代码结构从 V4/V5 双线程版本收口为 V5 单版本
- 数据库配置值从 `ZyStationV4Thread` 收口为 `ZyStationV5Thread`
- `routeVersion`、`traceVersion`、堵塞重规划状态、Redis key 不变
### 6.4 输出
- 输送站运行行为以当前 `ZyStationV5Thread` 为准
- 新任务轨迹中的 `threadImpl` 将稳定显示为 `ZyStationV5Thread`
### 6.5 上下游影响
- 上游 `StationOperateProcessUtils` 继续通过 `StationThread` 接口调用,不需要改接口
- 下游设备连接仍使用现有 `V4` 协议实现类,不增加新的协议分支
- V3、前端轨迹页面、分段轨迹数据结构不需要改动
## 7. 风险与保护
### 7.1 风险
- 如果只删代码分支、不改数据库配置,旧 `thread_impl = ZyStationV4Thread` 会在启动时失效。
- 如果同时改线程版本和协议类名,会扩大范围并提高回归风险。
### 7.2 保护
- 用 SQL 迁移先收口配置值,再删除 V4 启动分支。
- 保持协议实现类不动,限制变更范围。
- 不改 `StationSegmentExecutor` 的既有行为,避免把版本合并和算法调整耦合。
## 8. 验证
至少执行以下验证:
1. 文本检索确认运行时代码不再把 `ZyStationV4Thread` 当成可启动分支。
2. 文本检索确认 `ZyStationConnectDriver` 的新版本识别只保留 `ZyStationV5Thread`。
3. 文本检索确认仓库内不再有业务代码引用 `ZyStationV4Thread`,迁移 SQL 中的旧值引用除外。
4. 执行 `mvn -q -DskipTests compile` 进行编译校验。
5. 如环境允许,补充一次 `mvn -q -DskipTests package` 打包校验。
## 9. 实施清单
- 删除 `src/main/java/com/zy/core/thread/impl/ZyStationV4Thread.java`
- 修改 `src/main/java/com/zy/core/ServerBootstrap.java`
- 修改 `src/main/java/com/zy/core/network/ZyStationConnectDriver.java`
- 新增一条 Devp `thread_impl` 迁移 SQL
## 10. 假设与未验证前提
- 用户确认采用 “V5 全量替代 V4”,不保留运行时兼容。
- 用户确认不需要统计数据库里现有多少条 V4 配置。
- 当前未验证数据库实际数据分布,迁移脚本按幂等方式设计。
- 当前未验证打包环境是否完整,编译和打包结果需在实施阶段实际执行后确认。