# message-center Specification ## Purpose 提供普瑞互联网医院智慧医院小程序 V2.0 的消息列表、分类筛选、消息详情、已读/删除、未读徽标和动态跳转白名单能力。 ## Requirements ### Requirement: 消息列表与未读 系统 MUST 提供 `pages/tabBar/message/message` 一级 tab,支持: - 调用 `03100201` 获取消息列表与未读数;请求参数至少包含 `receiveUser`, `receiveTypeCode`, `hospCode`, `messageTypeCode`,分页参数 `pageNo / pageSize`。 - 响应字段归一:`messageList`, `unreadNmber`, `unreadObj`, `remainingQty`。 - 列表卡片显示图标(按类型 4 色)、标题、摘要单行省略、时间、未读红点;已读态透明度 0.72、标题字重 600。 - 分类筛选 chip:全部 / 就诊 / 缴费 / 系统,按 `messageTypeCode` 关键词归一,未命中归入"其他"。 - 下拉刷新 / 触底加载下一页;分页数据 `remainingQty === 0` 时停止触底。 - 失败/空/未登录/未选医院/跳转越界五种状态全部覆盖。 #### Scenario: 拉取首页未读 - Given 用户已登录且 `appReady=true`, `hospitalReady=true` - When 消息页 `onShow` 触发 - Then 顺序执行 `fetchMessageList({ messageTypeCode: '' })` 与 `fetchHomeUnreadCount()`;未读数写入 `tabBarSettings.messageUnreadCount` 并 `getTabBar().refresh()`。 #### Scenario: 分类筛选 - Given 列表已加载 - When 用户点击"缴费" chip - Then 重新调用 `fetchMessageList({ messageTypeCode: <缴费 code> })`,列表与 chip 选中态同步更新,未读徽标按 `categorizeMessageType` 重算。 ### Requirement: 消息详情 / 分类详情 系统 MUST 提供 `pages/message/messageDetail/messageDetail` 二级页: - 路由参数:`messageID`(单条)/ `messageTypeCode`(分类),可附带 `jumpPages`。 - 单条详情进入即调用 `03100098` 标记已读;失败保留未读态并展示重试。 - 分类详情复用消息卡渲染逻辑,渲染该分类下消息列表。 - 底部"查看原文"按钮:调用 `messageJumpRouter.resolveJumpTarget(jumpPages)`;命中走白名单,未命中走兜底。 - 右上角"更多":删除(带二次确认)。 #### Scenario: 进入单条详情 - Given 消息有 `messageID` - When 页面 `onLoad` - Then 调 `markMessageRead({ messageID })`,同时渲染消息体;若 `jumpPages` 存在则底部展示"查看原文"。 #### Scenario: 进入分类详情 - Given 仅有 `messageTypeCode`,无 `messageID` - When 页面 `onLoad` - Then 调 `fetchMessageList({ messageTypeCode })` 渲染分类列表;底部不展示"查看原文"。 ### Requirement: 已读 / 已处理 - 系统 MUST 通过接口 `03100098` 支持消息已读/已处理。 - 系统 MUST 在详情页 `onLoad` 自动调用;列表长按菜单也可手动调用。 - 系统 MUST 在失败时 toast 提示,保留未读态,不删除消息项。 #### Scenario: 标记消息已读 - Given 用户打开未读消息详情 - When `markMessageRead({ messageID })` 调用成功 - Then 系统 MUST 将该消息视为已读并同步未读徽标。 ### Requirement: 删除消息 - 系统 MUST 通过接口 `03100212` 支持删除消息。 - 系统 MUST 在列表删除操作和详情页右上角更多菜单提供删除入口。 - 系统 MUST 使用 `wx.showModal` 二次确认,标题"确认删除",内容"删除后将不再展示该消息"。 - 系统 MUST 在失败时 toast 提示,并保留或恢复消息项。 #### Scenario: 删除消息 - Given 用户在列表或详情页点击删除消息 - When 用户确认删除且接口成功 - Then 系统 MUST 从当前列表中移除该消息并刷新未读徽标。 ### Requirement: 动态跳转白名单 - 所有 `jumpPages` MUST 经过 `utils/messageJumpRouter.js` 的 `resolveJumpTarget(jumpPages)`。 - 命中规则:优先匹配 `eventCode === '2004'` → `/pages/tabBar/order/order`;否则 `routePath` 必须在 `utils/homeRoute.js` 的白名单内。 - 非法路径:toast 提示"暂不支持打开该消息",不跳转,不暴露原始路径。 - `01030009` 菜单:仅渲染 `routePath` 在白名单内的项;其余项隐藏。 #### Scenario: eventCode 2004 命中订单 tab - Given 后端返回 `{ eventCode: '2004', params: { ... } }` - When 用户点击消息 - Then `resolveJumpTarget` 返回 `{ kind: 'tab', path: '/pages/tabBar/order/order', params }`,调用 `navigateToRoute` 走 `wx.switchTab`。 #### Scenario: 非法 routePath 兜底 - Given 后端返回 `{ routePath: '/pages/unknown/page' }` - When 用户点击消息 - Then `resolveJumpTarget` 返回 `null`;调用方展示 `wx.showToast({ title: '暂不支持打开该消息', icon: 'none' })`。 ### Requirement: tabBar 徽标 - 系统 MUST 使用 `unreadBadge.syncMessageUnread(count)` 写入 `getApp().globalData.tabBarSettings.messageUnreadCount`。 - 系统 MUST 触发 `getTabBar().refresh()` 刷新徽标。 - 系统 MUST 在列表加载完成、详情已读回调、删除成功后同步未读数。 #### Scenario: 同步 tabBar 未读徽标 - Given 消息列表加载完成并返回未读数 - When 系统调用 `syncMessageUnread(count)` - Then tabBar MUST 展示最新消息未读徽标。