消息 (message)
此模块负责站内信、聊天、未读统计及通知等能力。
1. 架构说明(统一聊天方案 A)
- 消息列表页双轨:顶部为通知中心(
getMessages+digestCategory=order_safety),仅展示订单进度、待确认/发货、即将到期、钱款安全等强相关提醒,且每条须 完整正文(字段见契约NotificationDigestItemView/UserInboxMessageDoc.content);下方为私信对话列表,仅来自getChatList(chats),含租赁私信、平台客服、争议协商、调解会话等,不与站内通知混排。私信列表每项形状见契约ChatListItemView。 - 通知中心与数据源:订单/钱款类提醒主要走
messages集合;租赁与争议相关对话统一走chats+chat_messages,争议协商与调解线程不再依赖独立存储形态(迁移期见docs/api_docs/17-争议.md说明)。 - 序号
seq:每条chat_messages带会话内单调递增seq;客户端发现断档时用syncChatMessages按afterSeq补拉。 - 写入路径(迁移中):
sendChatMessage仅插入chat_messages(含seq);chats的lastSeq/lastMessage/lastMessageTime/unreadCount由云数据库触发器在chat_messages新增后异步更新。迁移步骤:① 控制台为chat_messages配置 INSERT 触发器 → ② 触发器更新chats摘要与 unreadCount → ③ 验证稳定后从sendChatMessage移除同步双写。不再向messages集合写入type: chat摘要行。消息页 私信列表以getChatList为准;markChatAsRead仍会尝试将历史遗留的messages中同chatId未读行标为已读。 - 实时(聊天):聊天页对
chat_messages使用where({ chatId })+watch()(由「拉」变「推」);onError或基础库无watch时回退为约 3s 轮询。若推送中发现 seq 断档,调用syncChatMessages(afterSeq)补拉。 - 实时(通知 + 私信列表):消息列表页通过 双 watch 替代 5s 轮询:①
db.collection('messages').where({ userId }).watch()监听通知变更 → 按digestCategory分拣到顶部或对应 tab;②db.collection('chats').where({ participants: _.in([openid]) }).watch()监听私信摘要变更 → 刷新下方列表的preview/unreadCount/ 排序。onError时回退为轮询。见契约NotificationRealtimeStrategy。 - 场景化顶栏:租赁进行中展示进度条、对方星级、顺丰/京东等物流段 ETA、验收/确认类倒计时;争议调解室支持「和对方 / 和调解员」分线,由
getChatScenarioContext返回锚点与可切换的chatId(见下文 §8.1)。
契约文件:shared/contracts/chat.js(与 shared/contracts/common.js 出参约定一致)
2. 获取消息列表 [GET]
接口描述:分页获取站内 信列表,可按类型筛选。消息列表页顶部通知中心应使用 digestCategory=order_safety 单独请求,与下方 getChatList 分离;该场景下每条返回须带 完整正文(契约 NotificationDigestItemView.bodyFull 或与 content 对齐的完整字段),不得仅返回省略号摘要。
| 项目 | 说明 |
|---|---|
| 云函数名 | message |
| HTTP 路由 | 不适用 |
| 动作类型 (Action) | getMessages |
2.1 请求参数 (Parameters)
| 参数名 | 类型 | 必选 | 默认值 | 描述 | 示例 |
|---|---|---|---|---|---|
| page | Integer | 否 | 1 | 页码 | 1 |
| pageSize | Integer | 否 | 20 | 每页条数 | 20 |
| type | String | 否 | - | 消息类型筛选 | “system” |
| digestCategory | String | 否 | - | order_safety:仅订单/钱款安全类,供顶部栏;general 或其它扩展值见 shared/contracts/chat.js 中 NOTIFICATION_DIGEST_CATEGORY | “order_safety” |
2.2 响应数据 (Response)
成功时 data 含 list、total 等,见 README 2.2 通用约定。当 digestCategory=order_safety 时,list[] 项建议包含 bodyFull(或等价完整 content)、relatedOrderId、read、createdAt,供顶部完整展示与跳转。
2.3 错误码 (Error Codes)
见 通用报错码。
2.4 示例 (Examples)
{
"action": "getMessages",
"data": { "page": 1, "pageSize": 20 }
}
3. 单条标已读 [POST]
接口描述:将指定消息标为已读,传入 messageId。
| 项目 | 说明 |
|---|---|
| 云函数名 | message |
| HTTP 路由 | 不适用 |
| 动作类型 (Action) | markMessageAsRead |
3.1 请求参数 (Parameters)
| 参数名 | 类型 | 必选 | 默认值 | 描述 | 示例 |
|---|---|---|---|---|---|
| messageId | String | 是 | - | 消息 ID | “msg_xxx” |
3.2 响应数据 (Response)
见通用约定。
3.3 错误码 (Error Codes)
见 通用报错码。
3.4 示例 (Examples)
{
"action": "markMessageAsRead",
"data": { "messageId": "msg_xxx" }
}
4. 全部标已读 [POST]
接口描述:将全部或按类型消息标为已读。
| 项目 | 说明 |
|---|---|
| 云函数名 | message |
| HTTP 路由 | 不适用 |
| 动作类型 (Action) | markAllAsRead |
4.1 请求参数 (Parameters)
| 参数名 | 类型 | 必选 | 默认值 | 描述 | 示例 |
|---|---|---|---|---|---|
| type | String | 否 | - |