41 lines
4.7 KiB
Markdown
41 lines
4.7 KiB
Markdown
# 患者聊天记录修复与上线说明
|
||
|
||
本次修改已在本地完成,未连接业务数据库、未修改腾讯控制台、未部署到线上。
|
||
|
||
## 修复内容
|
||
|
||
- 诊单聊天记录按真实 `patient_id` 汇总同患者历次诊单的归档,并再次校验消息两端账号。原来按 `diagnosis_id` 读取,但消息键全表唯一,旧诊单归档过的消息不会在新诊单重复插入,因此新诊单可能一直空白。
|
||
- 页面先显示归档,同时逐页同步;同步过程中及完成后自动刷新,完成后等待 30 秒再次检查。切换患者、隐藏页面、卸载时隔离旧请求。读取或同步失败保留已有记录并显示原因。
|
||
- 修正腾讯历史接口续页的 `MaxTime/LastMsgKey`,单次请求只拉一页。分别完成医生、患者两个视角,避免医生删除自己侧历史造成漏查。只有两侧全部落库才保存完整检查点,失败仍从旧检查点补拉。
|
||
- 回调、漫游和重复请求使用一致消息键,并兼容已有旧键。多元素消息完整保存;再次拉到旧截断记录时补齐内容。写库失败不再被 `INSERT IGNORE` 或假异步成功掩盖。
|
||
- 聊天窗口在会话更新时、打开期间每 15 秒及关闭时触发当前医生会话同步。服务端从登录身份确定医生账号,不接受浏览器上传的聊天正文。
|
||
- 增加经过腾讯签名验证的发送后回调,成功消息即时归档;失败发送不当作成功聊天历史保存。
|
||
- 定时补偿按患者去重、轮转。失败写入任务错误信息,并保留后续执行机会,避免一次网络抖动永久停掉补偿。
|
||
|
||
## 上线操作
|
||
|
||
1. 发布本次 `admin` 与 `server` 代码并按现有流程构建管理端、刷新服务端配置缓存。
|
||
2. 确认已有 `zyt_tcm_im_chat_message` 归档表(首次安装脚本:`server/sql/1.9.20260507/add_tcm_im_chat_message_table.sql`)。本次不增加归档表字段,不需要搬迁或清空历史数据。
|
||
3. 执行 `server/sql/1.9.20260909/fix_im_chat_archive_crontab.sql`,或在后台把现有 `sync_im_chat_archive` 参数改为 `--since-days=0 --limit=200`。保持原任务开启,避免创建重复任务。SQL 中表前缀按实际部署调整。
|
||
4. 按 [callback.md](./callback.md) 配置服务端 `[IM] CALLBACK_TOKEN`、腾讯控制台 HTTPS 地址 `/api/im/messageNotify`、**发单聊消息之后回调**、鉴权及超时重试。这一步是后台未打开时实时归档的必要配置。
|
||
5. 打开患者诊单的“聊天记录”,等待同步完成。首次补历史耗时取决于会话和消息数量,成功归档的记录会先显示。也可在服务端运行 `php think sync_im_chat_archive --diagnosis-id=<实际诊单ID>` 补指定患者历史。
|
||
|
||
上线验收:对一位测试患者分别发送文字、图片和文件;关闭聊天后确认诊单记录自动更新;同患者其他诊单应能看到同样记录;其他患者不得出现这些消息。关闭后台后从患者端发送消息,确认回调归档正常,之后重新打开能看见。
|
||
|
||
## 验证
|
||
|
||
- `node --test admin/tests/im-chat-history.test.cjs admin/tests/im-chat-archive-trigger.test.cjs admin/tests/appointment-call-mode.test.cjs`:27 项通过,涵盖真实组件 setup、组合消息展开、刷新、旧请求隔离、同步失败、聊天触发和前序图文通话限制。
|
||
- `php server/tests/ImChatArchiveTest.php`:实际归档逻辑、真实分页器与状态机通过严格内存模型/SQL替身验证,详见 [archive-tests.md](./archive-tests.md)。
|
||
- `php server/tests/ImChatArchiveCommandTest.php`:真实命令失败向调度器传播,错误可见且可重试。
|
||
- `php server/tests/ImRoamMessagePagerTest.php`、`php server/tests/ImCallbackTest.php`(81 项)、`php server/tests/DiagnosisWorkspaceRowAuthorizationTest.php`:通过。
|
||
- 修改的 PHP 语法检查及 `git diff --check -- admin server`:通过。
|
||
- 管理端 Vite 构建通过;日志 [build.log](./build.log)。全项目 `vue-tsc` 仍有既有错误,日志 [typecheck.log](./typecheck.log);本次 IM 文件和聊天窗口无类型诊断。
|
||
|
||
只读复核提出的多元素截断、单侧历史遗漏和定时失败不可见均已修复并补测;[backend-review.md](./backend-review.md) 保留的是修复前发现记录。
|
||
|
||
## 历史数据边界
|
||
|
||
已归档的消息会继续保存在本地;未归档历史只能补回腾讯云仍保留的部分。云端已过保留期或双方都已删除、且本地从未归档的消息无法凭代码恢复。图片、文件当前保存的是云端链接,链接有效期仍受云端保留策略影响。[腾讯历史消息说明](https://cloud.tencent.cn/document/product/269/42794)
|
||
|
||
本轮不包含真实患者的线上端到端验收,以上测试均使用虚构数据和替身服务。
|