25 lines
2.7 KiB
Markdown
25 lines
2.7 KiB
Markdown
# IM 漫游消息分页交付
|
|
|
|
## 官方契约
|
|
|
|
已核对[腾讯云拉取单聊历史消息文档](https://cloud.tencent.cn/document/product/269/42794)(文档更新时间 2026-05-22):续页必须把响应 `LastMsgTime` 作为下一次请求的 `MaxTime`,同时传递 `LastMsgKey`。`LastMsgTime` 不是请求字段。单页返回 `Complete = 0` 时仍需续拉。
|
|
|
|
## 实现和调用约定
|
|
|
|
- `server/app/common/service/TencentImService.php` 保留 `adminGetRoamMsg` 原七参签名;第七参非空时覆盖请求 `MaxTime`,不再发送 `LastMsgTime`。漫游单页 timeout 为 15 秒,其他请求的 timeout 默认值和行为未改。
|
|
- 服务失败返回 `success = false`、`complete = 0`,并保留 `error` 和 `rawErrorCode`。即使 `ActionStatus = OK`,非零错误码也按失败处理;非法列表、分页字段和消息计数不会回退成空列表并成功完成。
|
|
- 新增 `app\common\service\ImRoamMessagePager::nextPage(TencentImService $svc, string $operator, string $peer, array $cursor = []): array`。每次最多请求一页,不 sleep、不内部重试。
|
|
- 成功返回 `msgList`(未经转换的消息数组)、`completed`(布尔值)及 `cursor`。游标字段为 `max_time`、`last_key`、`min_time`、`seen_keys`。首次 `min_time = 0`、`max_time = 4294967295`;不使用本地归档最大时间作为扫描下界。
|
|
- `seen_keys` 保存当前 `max_time` 这一秒已经使用的游标键,下一页时间降低后重置。因此同秒多页可以继续,同秒 A→B→A 循环和直接重复会明确失败。上层应保存完整游标,并且仅在本页消息持久化成功后提交新游标。
|
|
- 请求账号、消息双方账号、消息键/时间/内容类型、响应游标均校验;跨患者消息立即抛错。`Complete = 0` 却缺失有效时间/键、游标倒退到更新时刻或游标重复均不返回完成。
|
|
- Pager 失败抛出 `RuntimeException`,云端 `error` 保留为异常消息,`rawErrorCode` 保留为异常 `getCode()`。上层保留本轮游标,并在后续步骤或下一轮重试。
|
|
|
|
## 验证
|
|
|
|
- `php server/tests/ImRoamMessagePagerTest.php`:通过,覆盖同秒多页、参数兼容、请求字段、15 秒 timeout、云端错误/错误码、网络错误、非法响应、缺失/重复/循环游标、跨患者消息、非法消息、请求游标和空会话完成。
|
|
- 三个改动/新增 PHP 文件均通过 `php -l`。
|
|
- 本子任务文件通过 `git diff --check`。
|
|
- 测试不初始化应用环境,采用虚构配置、NullLogger 和覆盖 `httpPost` 的替身。未读取业务数据库、未真实请求腾讯云或其他外部服务。
|
|
|
|
本子任务没有修改 `DiagnosisLogic.php`、没有提交;接口集成由主代理负责。
|