plc_control/docs/superpowers/plans/2026-04-21-next-steps-after...

7.2 KiB
Raw Blame History

拆分后续改进计划

日期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

以下四项改进是 specdocs/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 有两种注册方式:

  • 方案 ACore 提供 pub fn platform_routes() -> Router<PlatformContext>,每个 app merge 进来
  • 方案 BCore 只导出 handler 函数,每个 app 自己 .route() 注册

推荐方案 B更灵活允许 app 按需选择注册哪些路由。


改进 2事件命名空间中优先级

目标

给所有事件类型加上命名空间前缀spec §6 要求),使不同业务的事件在同一张 event 表中可按前缀区分。

当前状态

Feeder 的 event.rs 中的事件类型已使用了点分隔命名(如 source.createdunit.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.rspersist_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.2app_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 可以并行推进,是当前最优先的两个切入点。