docs: add next-steps plan after PlatformContext completion

Four remaining improvements for the dual-app split:
1. Migrate platform handlers (tag/page/source/point/equipment) to core
2. Add event namespace prefixes (platform.*/feeder.*/ops.*)
3. Register platform routes in ops app
4. Ops business logic (pending requirements)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-04-21 09:22:26 +08:00
parent 429c2d0b17
commit 093fc5035b
1 changed files with 195 additions and 0 deletions

View File

@ -0,0 +1,195 @@
# 拆分后续改进计划
日期2026-04-21
## 背景
截至本文档编写时,双应用拆分已完成以下里程碑:
| 里程碑 | 状态 | 关键 commit |
|--------|------|-------------|
| Workspace 结构(三个 crate | 已完成 | — |
| 平台模块迁入 plc_platform_core | 已完成 | config/db/model/connection/telemetry/event/websocket/service/util/control |
| Web 目录拆分core/feeder/ops + ServeDir fallback | 已完成 | — |
| 三面板 UI运维/应用配置/平台配置) | 已完成 | — |
| Log/Doc handler 迁入 core | 已完成 | — |
| PlatformContext 填充pool/connection_manager/ws_manager | 已完成 | 429c2d0 |
| WebSocket 类型去重feeder 改为从 core 重导出) | 已完成 | 429c2d0 |
| PlatformBuilder 模式(消除 unsafe 初始化) | 已完成 | 429c2d0 |
| 旧 root src/ 删除 | 已完成 | — |
| Ops 应用拥有真实 PlatformContext含数据库连接 | 已完成 | 429c2d0 |
以下四项改进是 spec`docs/superpowers/specs/2026-04-14-dual-app-shared-core-design.md`)中明确要求但尚未完成的工作。
---
## 改进 1平台 Handler 迁入 Core中优先级
### 目标
将不依赖业务状态的 handler 从 `app_feeder_distributor` 迁入 `plc_platform_core::handler`,使 ops 也能注册同一套平台 API。
### 前置条件
- PlatformContext 已包含 pool/connection_manager/ws_manager**已满足**
- Handler 函数签名需改为从 `PlatformContext` 提取状态,而非 feeder 的 `AppState`
### 待迁移 Handler
| 文件 | 行数 | 依赖分析 | 迁移难度 |
|------|------|----------|----------|
| `handler/source.rs` | 626 | pool, connection_manager, event_manager | 中 — event_manager 是 feeder 特有的,需拆分或抽象 |
| `handler/point.rs` | 693 | pool, connection_manager, event_manager | 中 — 同上 |
| `handler/equipment.rs` | 335 | pool, event_manager | 中 — 同上 |
| `handler/tag.rs` | 126 | pool | 低 — 纯数据库操作,可直接迁移 |
| `handler/page.rs` | 169 | pool | 低 — 纯数据库操作,可直接迁移 |
### 不迁移的 Handler
| 文件 | 行数 | 原因 |
|------|------|------|
| `handler/control.rs` | 750 | 完全是投煤器/布料机业务逻辑unit CRUD、自动控制启停、故障确认 |
### 建议实施步骤
1. **先迁 tag.rs 和 page.rs**:只依赖 pool无 event_manager 依赖,最简单
- Core 的 handler 签名使用 `State<PlatformContext>` 或提取 pool 的 extractor
- Feeder 和 ops 的 router 都注册这些路由
2. **定义平台事件发送 trait**:在 core 中定义 `PlatformEventSink` traitfeeder 的 `EventManager` 实现它
- 这样 source/point/equipment handler 可以依赖 trait 而非具体的 `EventManager`
3. **迁移 source.rs、equipment.rs、point.rs**:改为依赖 `PlatformContext` + `PlatformEventSink`
4. **Ops 注册平台路由**ops router 中注册 source/point/equipment/tag/page 路由
### 关键设计决策
Handler 迁移后,两个 app 的 router 有两种注册方式:
- **方案 A**Core 提供 `pub fn platform_routes() -> Router<PlatformContext>`,每个 app merge 进来
- **方案 B**Core 只导出 handler 函数,每个 app 自己 `.route()` 注册
推荐方案 B更灵活允许 app 按需选择注册哪些路由。
---
## 改进 2事件命名空间中优先级
### 目标
给所有事件类型加上命名空间前缀spec §6 要求),使不同业务的事件在同一张 event 表中可按前缀区分。
### 当前状态
Feeder 的 `event.rs` 中的事件类型已使用了点分隔命名(如 `source.created`、`unit.auto_control_started`),但缺少顶层业务前缀。
### 目标命名规范
| 前缀 | 含义 | 示例 |
|------|------|------|
| `platform.*` | 平台级通用事件 | `platform.source.created`, `platform.point.batch_created` |
| `feeder.*` | 投煤器布料机业务事件 | `feeder.unit.auto_control_started`, `feeder.unit.fault_locked` |
| `ops.*` | 运转系统业务事件 | `ops.unit.started`, `ops.interlock.triggered` |
### 建议实施步骤
1. 梳理 `app_feeder_distributor/src/event.rs``persist_event_if_needed` 的所有 event_type 字符串
2. 将平台通用事件source.*, point.batch_*)改为 `platform.` 前缀
3. 将业务事件unit.*, equipment.start/stop_command_sent改为 `feeder.` 前缀
4. 前端 JS 中若有事件类型过滤逻辑,同步更新
5. 数据库中已有的历史事件不做回填(向前兼容)
---
## 改进 3Ops 注册平台 Handler中优先级
### 目标
让 ops 应用能提供与 feeder 相同的平台配置能力(数据源、点位、设备、标签、页面管理)。
### 前置条件
- 改进 1平台 handler 迁入 core完成
- PlatformContext 已包含 pool**已满足**
### 当前 Ops Router
```
/api/health — health check
/api/logs — 日志查询(已从 core 注册)
/api/logs/stream — 日志 SSE 推送(已从 core 注册)
/api/docs/api-md — API 文档
/api/docs/readme-md — README
/ui — 静态页面web/ops fallback web/core
```
### 目标 Ops Router改进 1 完成后)
```
/api/health
/api/logs, /api/logs/stream
/api/docs/api-md, /api/docs/readme-md
/api/source, /api/source/{source_id}, ... — 新增
/api/point, /api/point/{point_id}, ... — 新增
/api/equipment, /api/equipment/{id}, ... — 新增
/api/tag, /api/tag/{tag_id}, ... — 新增
/api/page, /api/page/{page_id}, ... — 新增
/ws/public — 新增WebSocket 推送)
/ui
```
### 注意事项
- Ops 不注册 `/api/unit``/api/control` 路由(那是 feeder 业务)
- Ops 的 event_manager 需要独立实现(或先不实现事件广播,只做 CRUD
- Ops 的 WebSocket handler 可以复用 core 的 WsMessage 类型
---
## 改进 4Ops 业务逻辑(低优先级)
### 目标
为运转系统应用添加独立的业务能力。
### 前置条件
- 运转系统业务需求明确
- 改进 1-3 完成
### 待实现模块
根据 spec §5.2`app_operation_system` 需要:
- 运转系统控制逻辑(`control/engine.rs`
- 运转系统业务接口(`handler/control.rs`
- 运转系统业务页面(`web/ops/` 扩充)
- 业务事件定义(`event.rs`,使用 `ops.*` 前缀)
- 业务运行时状态(`OperationRuntimeStore`
### Ops 业务事件示例(来自 spec §6.3
- `ops.unit.started`
- `ops.unit.stopped`
- `ops.phase.changed`
- `ops.interlock.triggered`
- `ops.interlock.released`
### 当前不做的事
- 不把两套业务的控制引擎抽象为通用状态机spec §12.2 明确约束)
- 不做业务插件化spec §3 方案 C 已排除)
---
## 建议执行顺序
```
改进 1handler 迁移)
├── 1a: 迁移 tag.rs + page.rs纯 pool 依赖)
├── 1b: 定义 PlatformEventSink trait
└── 1c: 迁移 source.rs + equipment.rs + point.rs
改进 2事件命名空间── 可与改进 1 并行
改进 3ops 注册平台路由)── 依赖改进 1 完成
改进 4ops 业务逻辑)── 依赖改进 3 + 业务需求
```
改进 1a 和改进 2 可以并行推进,是当前最优先的两个切入点。