# 订单详情推送记录 - 新增接口 - 管理后台 > 日期:2026-07-15 > 端类型:管理后台 > 服务:`hl-order-service-v3` > 关联 Issue:`#4997` > 关联 PR:`#4998` > 关联提交:`edd1d26da` ## 1. 接口背景 订单详情页新增“推送记录”Tab,用于查看当前订单关联的短信、内部推送、企业微信、小程序订阅、公众号等通知发送记录。前端只调用订单服务的管理端接口,不直接调用用户中心内部通知日志接口。 ## 2. 变更清单 | 类型 | 方法 | 路径 | 说明 | |---|---|---|---| | 新增接口 | `GET` | `/v3/admin/order/{id}/push-records` | 按订单 ID 聚合返回订单相关通知发送记录和渠道统计。 | 本次没有新增前端必传字段,也没有调整已有接口字段。 ## 3. 接口详情 | 项 | 值 | |---|---| | 接口 | `GET /v3/admin/order/{id}/push-records` | | 认证 | 管理后台 JWT | | 权限边界 | 房务角色不可查看订单详情推送记录 | | 幂等性 | 只读接口,重复调用不改变订单或通知日志状态 | | 请求体 | 无 | | 查询参数 | 无 | | 返回结构 | `Result` | ## 4. 入参 ### Path 参数 | 字段 | 类型 | 必填 | 说明 | |---|---|---|---| | `id` | `string` | 是 | 订单 ID,雪花 ID。前端按字符串透传,避免 JS 数字精度丢失。 | ### Query 参数 无。 ### Body 参数 无。 ## 5. 出参 ### Result 包装 | 字段 | 类型 | 说明 | |---|---|---| | `code` | `number` | 业务状态码,成功为 `200`。 | | `message` | `string` | 业务提示。 | | `data` | `object` | 推送记录聚合数据。 | | `traceId` | `string \| null` | 链路 ID,按网关实际返回。 | | `success` | `boolean` | 是否成功。 | ### `data` 字段 | 字段 | 类型 | 说明 | |---|---|---| | `total` | `number` | 聚合后记录总数。 | | `records` | `array` | 推送记录列表,按 `sentAt` 倒序,同时间按 `id` 倒序。 | | `summary` | `object` | 渠道和失败数量统计。 | ### `records[]` 字段 | 字段 | 类型 | 说明 | |---|---|---| | `id` | `string` | 通知发送日志 ID,雪花 ID,前端按字符串处理。 | | `eventCode` | `string \| null` | 通知事件编码,例如 `CONTRACT_SIGN_SMS`。 | | `channel` | `string \| null` | 原始渠道编码,展示和筛选优先使用 `channelGroup` / `kind`。 | | `channelName` | `string` | 渠道展示名。 | | `channelGroup` | `string` | 归一化渠道分组,见枚举。 | | `channelGroupName` | `string` | 渠道分组展示名。 | | `kind` | `string` | 前端原型兼容分类,见枚举。 | | `target` | `string \| null` | 接收人展示文本,通常为“接收人类型 + 接收人姓名/账号”。 | | `recipientName` | `string \| null` | 接收人名称。 | | `recipientType` | `string \| null` | 接收人类型。 | | `recipient` | `string \| null` | 原始接收标识,例如手机号、openId、用户 ID 等。 | | `content` | `string \| null` | 通知内容摘要或渲染后的消息内容。 | | `status` | `string` | 归一化状态,见枚举。 | | `statusName` | `string` | 状态展示名。 | | `rawStatus` | `number \| null` | 通知日志原始状态码,见枚举。 | | `failReason` | `string \| null` | 失败原因,成功或未失败时为空。 | | `bizId` | `string \| null` | 关联业务 ID。可能是订单 ID,也可能是合同编号等关联业务号。 | | `bizType` | `string \| null` | 关联业务类型,例如 `ORDER`、`CONTRACT`、`INSURANCE`、`HOUSE`。 | | `serviceName` | `string \| null` | 记录来源服务。 | | `sentAt` | `string \| null` | 发送日志创建时间,格式 `yyyy-MM-dd HH:mm:ss`。 | ### `summary` 字段 | 字段 | 类型 | 说明 | |---|---|---| | `all` | `number` | 全部记录数。 | | `sms` | `number` | 短信记录数。 | | `miniapp` | `number` | 小程序订阅记录数。 | | `officialAccount` | `number` | 公众号记录数。 | | `inapp` | `number` | C 端站内信记录数。 | | `internal` | `number` | 管理后台内部推送记录数。 | | `wework` | `number` | 企业微信记录数。 | | `other` | `number` | 其他渠道记录数。 | | `failed` | `number` | `status = FAILED` 的记录数。 | ## 6. 枚举 / 数据字典 ### `channelGroup` | 值 | 展示名 | 说明 | |---|---|---| | `SMS` | 短信 | 原始渠道 `SMS`。 | | `MINIAPP` | 小程序订阅 | 原始渠道 `MINIAPP`。 | | `OFFICIAL_ACCOUNT` | 公众号 | 原始渠道 `OA` 或 `OFFICIAL_ACCOUNT`。 | | `INAPP` | 站内信 | 原始渠道 `INAPP`。 | | `INTERNAL` | 内部推送 | 原始渠道 `ADMIN_INAPP`。 | | `WEWORK` | 企业微信 | 原始渠道 `WEWORK` 或 `WECHAT_WORK`。 | | `OTHER` | 其他 | 不能归入上述渠道的记录。 | ### `kind` | 值 | 建议展示分类 | |---|---| | `sms` | 短信 | | `miniapp` | 小程序 | | `wechat` | 微信/公众号 | | `inapp` | 站内信 | | `system` | 内部推送 | | `wework` | 企业微信 | | `other` | 其他 | ### `status` / `rawStatus` | `rawStatus` | `status` | `statusName` | |---:|---|---| | `0` | `DELIVERED` | 已送达 | | `1` | `FAILED` | 失败 | | `2` | `FILTERED` | 已过滤 | | `3` | `SKIPPED` | 已跳过 | | `null` 或其他值 | `UNKNOWN` | 未知 | ### `bizType` | 值 | 说明 | |---|---| | `ORDER` | 订单相关通知。 | | `CONTRACT` | 合同相关通知。 | | `INSURANCE` | 保险相关通知。 | | `HOUSE` | 房务相关通知。 | ## 7. 错误码 | `code` | `message` | 场景 | |---:|---|---| | `200` | 成功 | 查询成功。没有记录时仍返回成功,`total=0`、`records=[]`。 | | `581007` | 订单不存在 | Path 中的订单 ID 不存在。 | | `581045` | 房务角色无权查看订单详情,房务仅可配房 | 当前账号为房务角色。 | | 平台通用鉴权错误码 | 按接口实际返回 | 未登录、Token 失效、无管理端权限等网关或安全框架错误。 | ## 8. 示例 ### 8.1 典型成功响应 请求: ```http GET /v3/admin/order/2076936583562285058/push-records ``` 响应: ```json { "code": 200, "message": "成功", "data": { "total": 1, "records": [ { "id": "2076951776115793921", "eventCode": "CONTRACT_SIGN_SMS", "channel": "SMS", "channelName": "短信", "channelGroup": "SMS", "channelGroupName": "短信", "kind": "sms", "target": "其它 155****2307", "recipientName": "155****2307", "recipientType": "其它", "recipient": "155****2307", "content": "合同签署短信(创建首发)", "status": "DELIVERED", "statusName": "已送达", "rawStatus": 0, "failReason": null, "bizId": "MOCK-2076951776057044993", "bizType": "CONTRACT", "serviceName": "hl-order-service-v3", "sentAt": "2026-07-14 16:47:46" } ], "summary": { "all": 1, "sms": 1, "miniapp": 0, "officialAccount": 0, "inapp": 0, "internal": 0, "wework": 0, "other": 0, "failed": 0 } }, "traceId": null, "success": true } ``` ### 8.2 无推送记录响应 ```json { "code": 200, "message": "成功", "data": { "total": 0, "records": [], "summary": { "all": 0, "sms": 0, "miniapp": 0, "officialAccount": 0, "inapp": 0, "internal": 0, "wework": 0, "other": 0, "failed": 0 } }, "traceId": null, "success": true } ``` ### 8.3 订单不存在 ```json { "code": 581007, "message": "订单不存在", "data": null, "traceId": null, "success": false } ``` ## 9. 业务边界 1. 这是订单详情只读接口,不推进订单状态,不触发补发通知。 2. 当前聚合范围为订单相关通知:`ORDER`、`CONTRACT`、`INSURANCE`、`HOUSE`,并兼容合同编号作为 `CONTRACT` 的 `bizId`。 3. `records` 已由后端按通知日志 ID 去重,前端不需要再按 `id` 合并。 4. `records` 为空是正常业务结果,前端展示空态即可。 5. `target`、`recipientName`、`recipient` 可能包含手机号、openId 或内部用户标识,前端日志和埋点不要输出完整敏感信息。 6. `bizId` 不保证等于订单 ID,合同通知可能返回合同编号或合同相关业务号。 7. 原始渠道 `channel` 可能扩展,前端展示和筛选优先使用稳定字段 `channelGroup`、`channelGroupName`、`kind`。 ## 10. 修改前后对比 | 项 | 修改前 | 修改后 | |---|---|---| | 订单详情推送记录 | 无统一管理端查询接口,前端不能直接调内部通知日志接口 | 新增 `GET /v3/admin/order/{id}/push-records`,由订单服务聚合返回。 | | 渠道分类 | 无统一前端字段 | 返回 `channelGroup`、`channelGroupName`、`kind`。 | | 统计 | 前端无数据来源 | 返回 `summary`,可直接用于 Tab 数量或筛选统计展示。 | ## 11. 影响评估 / 回滚 | 项 | 说明 | |---|---| | 兼容性 | 新增接口,不影响已有订单详情接口。 | | 前端影响 | 订单详情“推送记录”Tab 可接入该接口;旧页面不接入则无影响。 | | 后端影响 | 只读聚合用户中心通知日志,不写订单表和通知表。 | | 回滚方式 | 回滚 `hl-order-service-v3` 对应 PR 后,该新增接口不可用;前端需要隐藏或降级推送记录 Tab。 | ## 12. 注意事项 1. 前端请求路径中的订单 ID 按字符串传递。 2. `id`、`bizId` 等雪花 ID 或业务号按字符串处理,不转 JS `Number`。 3. `summary.failed` 只统计 `status=FAILED` 的记录,`FILTERED`、`SKIPPED`、`UNKNOWN` 不算失败。 4. 不要依赖 `channel` 原始值做页面分组,后续原始渠道可能继续扩展。 5. 当前接口不支持分页、筛选和补发;如页面需要筛选,建议先基于返回的 `records` 做本地筛选。 ## 13. 关联 / 联系人 | 项 | 链接 | |---|---| | Issue | `https://git.1814.love:8443/wx/HL/issues/4997` | | PR | `https://git.1814.love:8443/wx/HL/pulls/4998` | | 后端提交 | `https://git.1814.love:8443/wx/HL/commit/edd1d26da` | | 负责人 | 腰苏图 |