194 lines
8.2 KiB
Markdown
194 lines
8.2 KiB
Markdown
# 消息中枢(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 原型 |
|