Files
OneOS1.2/docs/superpowers/specs/2026-07-22-message-hub-design.md

194 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 消息中枢Message Hub重构设计
> 日期2026-07-22
> 状态已确认并完成首期原型2026-07-22分支 `feat/message-hub`
> 范围:产品架构规格 + Web 统一消息中心原型(宽首期)
## 1. 背景与问题
当前 OneOS 原型中的「消息/通知」能力偏弱,实质是工作台站内铃铛阅知(`oneos-web-workbench-new` + `oneos-app-shell` 桥),外加若干业务侧短信/邮件演示。缺少:
- 独立消息中心
- Web / iOS / 安卓 / 鸿蒙 / 微信服务号的统一触达与跳转模型
- 多系统消息源OneOS、车辆数据中台、其他系统的接入约定
- 清晰的「详情 → 来源表单/办理页」深链规则(含外部端双 App
本设计定义统一消息中枢,并指导首期 Web 原型落地。
## 2. 已确认产品决策
| 决策点 | 选择 |
|--------|------|
| 本轮交付 | 规格文档 + Web 统一消息中心原型;移动/服务号以路由表与示意为主,不接真推送/服务号 API |
| 产品入口 | 独立「消息中心」菜单页 + 顶栏铃铛作为未读快捷入口(「查看全部」进入消息中心) |
| 首期广度 | 宽首期:五端触达矩阵 + 多系统消息源样例 |
| 跳转解析 | 消息只携带业务键;各端用**本地路由表**解析目标(不下发各端 URL |
| 消息与触达 | 一条业务事件 = 一条 Message多通道站内/推送/服务号)挂在同一条上 |
| 外部双 App | 占位名 `external-app-a` / `external-app-b`,真名后续替换 |
| 落地架构 | 独立消息中枢:`src/common/message-hub/` + 新原型 `message-center`;工作台铃铛改读中枢 |
## 3. 目标用户与核心任务
- **目标用户**OneOS 内部运营/业务人员Web 为主);五端与外部 App 在原型中用「端模拟器」与路由表示意。
- **核心任务**
1. 在统一列表中看到来自多系统的待办/提醒类消息
2. 打开详情理解上下文与通道触达状态
3. 「去处理」按当前端解析并跳到来源办理页(或明确不可跳)
## 4. 范围
### 4.1 本轮做
- 统一 Message 模型、通道触达态、本地 RouteRule 与 `resolve()`
- 新原型 `message-center`:筛选、列表、详情、端模拟器、去处理
- 工作台/外壳铃铛对接同一中枢(旧 notices 迁移或适配)
- 五端 × 多系统种子与路由表样例(含外部 App A/B 占位)
- `.spec` 路由规则全文 + AutoPRD / 导航登记(实现轮)
### 4.2 本轮不做
- 真实推送 SDK、厂商通道、微信服务号模板下发
- 跨端已读强一致、服务端已读同步
- 外部 App 真唤端 / Universal Link 联调
- 车辆中台真实事件流接入(仅占位样例)
- 独立移动端/鸿蒙原生 UI 工程
## 5. 架构
```text
业务系统(OneOS / vehicle-mid / other / external)
│ 产生业务事件(原型内为种子写入)
┌───────────────────┐
│ message-hub │ Message 池 · ChannelDelivery · RouteRule · resolve()
└─────────┬─────────┘
┌─────┴─────┐
▼ ▼
消息中心页 顶栏铃铛 / 外壳 bridge
(完整 IA) (未读摘要 + 快捷)
resolve(client) → 原型内导航 / 深链示意 / 不可跳提示
```
### 5.1 目录约定
| 路径 | 职责 |
|------|------|
| `src/common/message-hub/` | 类型、种子、路由表、resolve、读写状态localStorage 可选用) |
| `src/prototypes/message-center/` | 消息中心主 UI |
| `src/prototypes/message-center/.spec/` | 路由规则、通道矩阵、验收 |
| `src/common/oneos-app-shell/` | 铃铛桥升级为 Message 摘要同步(兼容旧字段可选) |
| `src/prototypes/oneos-web-workbench-new/` | 铃铛数据源改为中枢 |
## 6. 数据模型
### 6.1 Message
| 字段 | 说明 |
|------|------|
| `id` | 稳定 ID |
| `sourceSystem` | `oneos` \| `vehicle-mid` \| `other-system` \| `external` |
| `bizType` | 如 `approval.arrive``urge.remind``contract.expire``fault.overdue``order.action` |
| `bizId` | 来源业务主键 |
| `title` / `summary` / `detail` | 展示文案 |
| `priority` | 如 normal / high催办类可 high |
| `createdAt` | ISO 时间 |
| `readAt` | 可选;本地已读 |
| `audience` | 角色/用户占位(原型可按角色过滤,对齐现工作台习惯) |
| `channels` | `ChannelDelivery[]` |
### 6.2 ChannelDelivery
| 字段 | 说明 |
|------|------|
| `client` | `web` \| `ios` \| `android` \| `harmony` \| `wechat_oa` |
| `status` | `pending` \| `sent` \| `failed` \| `skipped`(原型模拟) |
| `updatedAt` | 可选 |
说明:通道状态表示「是否对该端做过触达尝试」的演示态,不是跳转 URL。
### 6.3 RouteRule
| 字段 | 说明 |
|------|------|
| `sourceSystem` | 与 Message 一致 |
| `bizType` | 与 Message 一致 |
| `client` | 目标端 |
| `targetTemplate` | URI 模板,支持 `{bizId}` 等占位 |
| `externalApp` | 可选:`external-app-a` \| `external-app-b` |
| `label` | 人读说明 |
**解析优先级**
1. 精确匹配 `sourceSystem + bizType + client`
2. 同系统同 `bizType` 的 fallback`harmony``android` 模板,若配置了 fallback
3. 无规则 → 不跳转UI 明确提示「当前端暂无可跳转目标」
**禁止**:根据标题猜路径;无规则时静默跳首页。
## 7. 交互与闭环
### 7.1 铃铛
- 展示未读数与最近 N 条
- 点击单条:标已读并打开详情卡片(含「去处理」);不在列表行上直接跳转,避免未看清上下文就离开
- 「查看全部」→ `/prototypes/message-center`
### 7.2 消息中心页
- 左:筛选(全部/未读/已读、系统源、业务类型)+ **端模拟器**(切换 `client`,影响解析预览与去处理)
- 右:列表 + 详情(正文、通道触达态、解析预览、去处理)
### 7.3 去处理
1. 标记已读(本地)
2. `resolve(message, simulatedClient)`
3. 命中且为 Web 原型 path → 站内导航(直链或外壳 `ONEOS_SHELL_NAV`
4. 命中且为外部/原生 scheme → 展示示意面板(将打开哪一 App/URI不真唤端
5. 未命中 → Toast/详情内错误态,文案固定可验收
## 8. 种子与路由样例(宽首期)
消息源至少覆盖:
- **oneos**:审批到达、催办、合同/证照到期、账单、系统通知(从现有工作台 notices 映射迁入)
- **vehicle-mid**:故障逾期、车辆状态事件各 ≥1
- **other-system**:通用接入槽 ≥1
- **external**:跳转 App A、App B 的操作类各 ≥1
五端:每条关键 `bizType` 在路由表中为 `web/ios/android/harmony/wechat_oa` 提供模板或显式 `skipped` 说明(如纯 Web 办理类在 wechat_oa 可 skipped + 文案)。
## 9. 视觉与设计基底
沿用现有 OneOS Web 管理端语言工作台、vm 列表习惯、外壳顶栏铃铛),不另起营销风或新主题。实现前对照项目 UI 规范;复杂判定写入 `.spec`
## 10. 验收重点
1. 消息中心可按系统源/已读态筛选,列表与详情一致
2. 端模拟器切换后,同一条消息的解析预览随路由表变化
3. 「去处理」仅在命中规则时跳转;未命中有明确提示
4. 外部 App A/B 仅示意,不真唤端
5. 铃铛未读数与中枢一致;「查看全部」进入消息中心
6. 旧工作台通知种子可在中枢中看到对应映射条目
7. 规格中路由优先级表与代码 `resolve()` 行为一致
## 11. 风险与后续
- 真名替换 `external-app-a/b` 时只改路由表与文案,不改模型
- 接真 API 时 Message 写入改为服务端,客户端仍只持业务键 + 本地/下发的路由表副本
- 跨端已读、推送回执可作为下一阶段,不阻塞本轮原型
## 12. 决策快照(对齐记录)
| 问题 | 用户选择 |
|------|----------|
| 交付深度 | 规格 + Web 消息中心原型 |
| 与铃铛关系 | 独立消息中心 + 铃铛快捷 |
| 首期广度 | 宽(五端 + 多系统) |
| 跳转方式 | 业务键 + 本地路由表(由「服务端多 URL」改为此案 |
| 消息与推送 | 一条事件多通道同一条消息 |
| 外部 App | 占位 A/B |
| 架构 | 独立 message-hub + message-center 原型 |