# StandardScene 插件化拆分 — 会话14 交接摘要 > **用途**:供其他 AI 会话快速读取上下文,继续推进 StandardScene 大改或 SimpleLite 内核改造。 > **工作目录**:`E:\Work\Core\Simple-FR\StandardSence` > **主交付物**:`StandardScene拆分计划.md`(**v2**,已落盘) > **上游设计**:`E:\Work\Core\Simple-FR\配置向导与导航场景插件化设计.md`(第 5 节 StandardScene 拆分、第 11.3 节 Phase C) > **新宿主 API 文档**:`E:\Work\Core\Simple-FR\Simple\SimpleLite\Docs\MIGU-API.md` > **整理时间**:2026-06-09 --- ## 1. 本会话做了什么 | 阶段 | 内容 | 状态 | |---|---|---| | 启动 | 用户要求用 wuxianChat 建立「会话14」 | 曾尝试 MCP,一度因执行后端不可用失败 | | 精读代码 | 对 `StandardSence` 约 110 个 `.cs` 做逐模块走查(车型、Mission、设备、WebApi、VDA5050 等) | ✅ 完成 | | 产出 v1 计划 | 写入 `StandardScene拆分计划.md`:目录规划、功能归属矩阵、抽离清单、技术难点、分阶段路线 | ✅ 完成 | | 用户评审反馈 | 宿主改 SimpleLite、net8.0、设备独立 dll+热插拔、删除 FactoryTest/松灵、WebApi 暂留后期废弃 | ✅ 已纳入 | | 阅读 SimpleLite | 确认 `SimpleLite.csproj` = net8.0 / CycleGUI / EmbedIO;阅读 MIGU-API 做 WebApi 迁移索引 | ✅ 完成 | | 产出 v2 计划 | 全文更新 `StandardScene拆分计划.md` | ✅ 完成 | | 代码改动 | **无**(本会话仅分析与文档,未改业务代码) | — | --- ## 2. 用户原始诉求(按时间) ### 2.1 第一轮 > 整个仓库需要大改。参考 `配置向导与导航场景插件化设计.md` 中关于 StandardScene 的「导航场景插件化」部分;精细化读当前代码,抽离标准功能,做好仓库目录规划与功能规划,**先把 plan 做出来**到 StandardScene 本地 md 文件。 ### 2.2 第二轮(评审反馈,已写入 v2) 1. **设备驱动**需要独立 dll,并且**支持热卸载和加载**。 2. StandardScene 依赖 **`SimpleLite.dll`**,老 **`SimpleComposer` 废弃**(**另一个 AI 对话窗口**正在改相关引用)。 3. **目标框架统一 `net8.0`**(WinForms 场景需 `net8.0-windows` 的说明在评审中被修正:SimpleLite 本身是纯 `net8.0` + CycleGUI,故 StandardScene 应**去 WinForms**)。 4. **`FactoryTest`、松灵残留**不纳入 Core,**直接删除**。 5. **`WebApi.cs`** 是针对老平台的 Nancy 接口:整理后**暂时保留在 Core**,后期废弃,改用 SimpleLite 接口能力(MIGU-API.md);**此版本先保留**。 ### 2.3 第三轮 > 把以上会话整理成 md 文件,分享给另一个会话读取。 > → 即本文档。 --- ## 3. 核心结论(另一会话必须知道的) ### 3.1 架构修正:导航 ≠ 车型 上游设计隐含「按车型/导航整包切 dll」,**与代码事实不符**: - 导航由 **轨道/站点 fields + TrackCoder** 决定,与车型**正交**。 - 例:`Kiva` 同一类上同时挂 **磁导航 coder**、**二维码 coder**、**激光避障 coder**(非 SLAM 定位)。 - **正确拆法**:`StandardScene.Core` 保留车型本体 + 任务/充电/互锁等;导航能力抽到 `Magnetic` / `QrCode` / `Laser` 等 dll,以**可插拔 coder** 形式挂载。 ### 3.2 激光:避障 vs 导航定位 | 能力 | 代表 | 归属 | |---|---|---| | 激光避障 | `LidarArea`、`SwitchLidarArea`、各车型通用 | **Core** | | 激光 SLAM 定位/地图 | `LidarMap`、`getLidarMap`、拉 `127.0.0.1:4321` | **Laser dll** | ### 3.3 三个正交维度 1. **导航**:磁 / 二维码 / 激光(SLAM) 2. **车型**:Kiva、叉车、多舵轮顶升、机械臂、仿真车等 3. **设备驱动**:充电桩(FL/MuXing/PCB)、门(Modbus)、按钮盒(Leeg/Azowie) 设备驱动必须 **独立 `Devices.*` dll + 热插拔**(SimpleLite `/plugins` + collectible ALC)。 ### 3.4 VDA5050 - `CarTypes/VDACar/` 是完整 **MQTT 协议栈**,建议独立 `StandardScene.Protocol.VDA5050` dll。 - 耦合点:`ArmCar` 引用 `VDA5050SiteField`,拆分时需解耦。 ### 3.5 宿主与框架(v2 已定) | 项 | 旧 | 新 | |---|---|---| | 宿主 | `SimpleComposer.exe` (.NET 4.8) | **`SimpleLite`** (net8.0) | | 契约 | `RefSimpleCore.dll` + Composer 程序集 | **`SimpleCore` + SimpleLite** | | UI | WinForms(大量窗体) | **CycleGUI / 平台 Web**(去 WinForms) | | 对外 API | `WebApi.cs` (Nancy 1.4.5) | 暂留 Core;后期 **EmbedIO**(MIGU-API) | **SimpleLite 事实**(来自 `SimpleLite.csproj`):`TargetFramework=net8.0`,`OutputType=Exe`,UI 用 CycleGUI,WebApi 用 EmbedIO,引用 `SimpleCore`。 ### 3.6 老 WebApi 处置 - `WebApi.cs` ~123KB,40+ 端点,**与导航弱相关**(导航相关主要是 `QrMap`、`getLidarMap`)。 - **本版**:整理为 `WebApi.Core.cs` 暂留 Core,标 `[Obsolete]` / deprecated。 - **后期**:按 `StandardScene拆分计划.md` §4.7 映射到 SimpleLite `/api/sl/projection/*`。 - **缺口**:二维码地图下发、激光 SLAM 取图在 MIGU-API **暂无直接对应**,迁移前需在 SimpleLite 或场景插件侧补接口。 ### 3.7 必须删除的文件(不进 Core/Customer) | 文件 | 原因 | |---|---| | `FactoryTest.cs` | 产测专用 | | 根目录 `SongLingDeliveryViewer.Designer.cs` | 松灵客户残留,无主文件、未编入 csproj | | 根目录 `MultiWheelLifterCar.cs` | 与 `CarTypes/MultiWheelLifterCar.cs` 重名死文件,未编入 csproj | | `CarTypes/UselessCar.cs` | `[CarType]` 已注释,测试残留 | --- ## 4. 目标 dll 结构(摘要) ``` StandardScene.Core/ net8.0 基座(alwaysLoad) StandardScene.Magnetic/ 磁导航 StandardScene.QrCode/ 二维码导航 + SyncQrMap StandardScene.Laser/ SLAM / LidarMap StandardScene.Protocol.VDA5050/ VDA5050 MQTT 栈 StandardScene.Devices.Charge/ 充电桩驱动(热插拔) StandardScene.Devices.Door/ 门控驱动(热插拔) StandardScene.Devices.ButtonBox/ 按钮盒驱动(热插拔) ``` 各可激活导航/设备 dll 配 `scene.json`,对接 SimpleLite `POST /api/sl/projection/scenes/apply` 与 `active-scenes.json`。 **详细文件级归属矩阵**见 `StandardScene拆分计划.md` §4,勿在本摘要重复展开。 --- ## 5. 可抽离的重复代码(C0 优先) | 重复项 | 现状位置 | 目标 | |---|---|---| | 磁循迹器 | `Kiva.AllCarMagTrackCoder` + `MultiWheelLifterCar.MagTrackCoder` | 合并为 `Magnetic.MagneticTrackCoder` | | `newReset` / `newTrafficReset` | Kiva、Forklift、MultiWheelLifterCar 各一份 | 上提 `StandardCarBase` | | `SetDisplayInfo`、远程急停/复位 HTTP | 多车型雷同 | Core 基类默认实现 | | `GetCarStatus` | Commons 与 MultiWheelForkLifter 各一份 | 统一 Commons | | 避障/IO/纠偏 coder 模板 | 各车型粘贴 | Core 通用 coder 模板集 | --- ## 6. 技术难点(需与内核会话协同) ### 6.1 TrackCoder 运行期注册(最关键) - **现状**:`[TemplateTrackCoderSettings]` / `[ProgramTrackCoderSettings]` **编译期硬绑定**在车型类上。 - **目标**:导航 dll 加载时为车型**注册** coder,卸载时移除。 - **方案**:优先在 **`SimpleCore` 增加 coder 注册表**;导航 dll 在 `INavigationProfile.OnActivate` 注册。 - **兜底**:Core 暂保留全量 coder,导航 dll 只承载 API/地图/清单(保证不回归)。 ### 6.2 net4.8 → net8.0 + 去 WinForms - 引用从 `SimpleComposer.exe` 切到 `SimpleLite` / `SimpleCore`。 - 命名空间 `SimpleComposer.RCS` → `SimpleLite.RCS` 等(**另一会话进行中**)。 - 所有 WinForms 窗体迁 **CycleGUI** 或平台 Web;`MessageBox` 改 CycleGUI 弹窗。 - 涉及窗体:`DeliveryViewer`、`LoopViewer`、`TrafficInterlockViewer`、`VehicleMonitor`、各 `Charge/*Form`、`DoorMonitor`、`ButtonBoxManager`、`VDACar/TextViewer` 等。 ### 6.3 热插拔清理 设备/导航 dll 卸载前须 `OnDeactivate`:清理 coder 注册、MQTT/TCP 连接、全局回调;配合 collectible ALC,确保无存活 `Car`/`Mission` 实例。 --- ## 7. 分阶段实施(当前均未启动代码) | 阶段 | 内容 | 状态 | |---|---|---| | **C0** | 删除残留 + 去重沉淀 + 命名空间收敛 + 与 SimpleCore 内核对齐 | ⬜ 待启动 | | **C1** | 新建 `StandardScene.Core`(net8.0),换宿主,去 WinForms,整理 WebApi.Core | ⬜ | | **C2** | Magnetic / QrCode / Laser 三导航 dll | ⬜ | | **C3** | Devices.Charge / Door / ButtonBox(热插拔) | ⬜ | | **C4** | Protocol.VDA5050 | ⬜ | | **C5** | 联调 + WebApi 迁 SimpleLite + 文档收尾 | ⬜ | --- ## 8. 待确认项(评审未拍板) 1. **SimpleCore 是否提供 TrackCoder 运行期注册 API**?(决定 C2 用注册表还是兜底方案) 2. **UI 迁移节奏**:一次性迁 CycleGUI,还是按 dll 分批;哪些仅保留平台 Web? 3. **VDA5050** 是否确认独立 dll?(计划推荐独立) 4. **二维码地图下发 / 激光 SLAM 取图** 在 SimpleLite 侧由谁补接口、何时补? 5. 是否存在**车型仅支持单一导航**的硬约束? --- ## 9. 跨会话分工(重要) | 会话/方向 | 负责内容 | 与本计划关系 | |---|---|---| | **本会话(会话14)** | StandardScene 代码精读 + 拆分计划 v1/v2 | 主文档已落盘 | | **另一 AI 会话(用户提及)** | SimpleLite / SimpleCore 引用改造、`SimpleComposer` → `SimpleLite` 命名空间与程序集引用 | StandardScene C1 依赖其进度 | | **平台 / 配置向导** | `WizardController`、`data/config-deployment.json` | 通过 `/scenes/apply` 驱动插件加载 | **协作接口建议**: - StandardScene 侧等待:SimpleCore 的 **coder 注册表**、**插件生命周期**(OnActivate/OnDeactivate)、**Collectible ALC** 约定。 - 内核侧等待:StandardScene 的 **scene.json 清单**、**NavKind 枚举**、各 dll 的 **provides** 字段(见拆分计划 §9)。 --- ## 10. 关键文件索引 | 路径 | 说明 | |---|---| | `E:\Work\Core\Simple-FR\StandardSence\StandardScene拆分计划.md` | **主计划(v2)**,含归属矩阵、§4.7 WebApi 迁移表、分阶段、风险 | | `E:\Work\Core\Simple-FR\StandardSence\StandardScene会话14交接摘要.md` | **本文档**,会话级交接 | | `E:\Work\Core\Simple-FR\配置向导与导航场景插件化设计.md` | 上游框架设计 | | `E:\Work\Core\Simple-FR\Simple\SimpleLite\Docs\MIGU-API.md` | SimpleLite 新 API(WebApi 迁移目标) | | `E:\Work\Core\Simple-FR\Simple\SimpleLite\SimpleLite.csproj` | 宿主:net8.0 / CycleGUI / EmbedIO | | `E:\Work\Core\Simple-FR\StandardSence\StandardScene.csproj` | 现状:net4.8 单体插件 | | `E:\Work\Core\Simple-FR\StandardSence\Commons.cs` | 插件契约、`CustomOperationsBeforeLoading`、`NoReflectionApi` | | `E:\Work\Core\Simple-FR\StandardSence\WebApi.cs` | 老 Nancy API(待 deprecated) | | `E:\Work\Core\Simple-FR\StandardSence\CarTypes\Kiva.cs` | 导航与车型耦合的典型样本 | | `E:\Work\Core\Simple-FR\StandardSence\CarTypes\BasicFields.cs` | `TagValue` 等轨道/站点字段定义 | --- ## 11. 给下一会话的推荐起手式 若继续 **StandardScene 实施**: 1. 先读 `StandardScene拆分计划.md` §0(TL;DR)和 §4(归属矩阵)。 2. 从 **C0** 开始:删除 §3.7 所列文件;合并磁循迹器;提取 `StandardCarBase`;`AMRScene1` 命名空间收敛。 3. 与 **SimpleLite 改造会话**对齐:引用是否已可编译、coder 注册表 API 是否就绪。 4. **不要**在未确认前大规模改 WebApi 或 WinForms——C1 才系统性处理。 若继续 **SimpleLite / SimpleCore 改造**: 1. 优先落实 **TrackCoder 运行期注册**、**插件 OnActivate/OnDeactivate**、**/plugins 热卸载** 与 StandardScene 计划 §7 对齐。 2. 评估 MIGU-API 是否需补 **QrMap**、**getLidarMap** 等价端点。 3. 确认 `SimpleComposer.RCS` → `SimpleLite.RCS` 迁移范围,避免 StandardScene 引用断裂。 --- ## 12. 变更记录 | 版本 | 日期 | 说明 | |---|---|---| | v1 | 2026-06-09 | 初版拆分计划(代码精读结论) | | v2 | 2026-06-09 | 纳入 SimpleLite/net8.0/去 WinForms、设备热插拔、删除项、WebApi 暂留+迁移索引 | | 交接摘要 | 2026-06-09 | 本会话整理,供跨会话阅读 | --- *本文档为会话级摘要;实施细节、完整类级归属与 WebApi 端点映射以 `StandardScene拆分计划.md` 为准。*