Files
zyt/artifacts/im-chat-history
2026-09-09 15:47:48 +08:00
..
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00
2026-09-09 15:47:48 +08:00

患者聊天记录修复与上线说明

本次修改已在本地完成,未连接业务数据库、未修改腾讯控制台、未部署到线上。

修复内容

  • 诊单聊天记录按真实 patient_id 汇总同患者历次诊单的归档,并再次校验消息两端账号。原来按 diagnosis_id 读取,但消息键全表唯一,旧诊单归档过的消息不会在新诊单重复插入,因此新诊单可能一直空白。
  • 页面先显示归档,同时逐页同步;同步过程中及完成后自动刷新,完成后等待 30 秒再次检查。切换患者、隐藏页面、卸载时隔离旧请求。读取或同步失败保留已有记录并显示原因。
  • 修正腾讯历史接口续页的 MaxTime/LastMsgKey,单次请求只拉一页。分别完成医生、患者两个视角,避免医生删除自己侧历史造成漏查。只有两侧全部落库才保存完整检查点,失败仍从旧检查点补拉。
  • 回调、漫游和重复请求使用一致消息键,并兼容已有旧键。多元素消息完整保存;再次拉到旧截断记录时补齐内容。写库失败不再被 INSERT IGNORE 或假异步成功掩盖。
  • 聊天窗口在会话更新时、打开期间每 15 秒及关闭时触发当前医生会话同步。服务端从登录身份确定医生账号,不接受浏览器上传的聊天正文。
  • 增加经过腾讯签名验证的发送后回调,成功消息即时归档;失败发送不当作成功聊天历史保存。
  • 定时补偿按患者去重、轮转。失败写入任务错误信息,并保留后续执行机会,避免一次网络抖动永久停掉补偿。

上线操作

  1. 发布本次 adminserver 代码并按现有流程构建管理端、刷新服务端配置缓存。
  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 配置服务端 [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
  • php server/tests/ImChatArchiveCommandTest.php:真实命令失败向调度器传播,错误可见且可重试。
  • php server/tests/ImRoamMessagePagerTest.phpphp server/tests/ImCallbackTest.php81 项)、php server/tests/DiagnosisWorkspaceRowAuthorizationTest.php:通过。
  • 修改的 PHP 语法检查及 git diff --check -- admin server:通过。
  • 管理端 Vite 构建通过;日志 build.log。全项目 vue-tsc 仍有既有错误,日志 typecheck.log;本次 IM 文件和聊天窗口无类型诊断。

只读复核提出的多元素截断、单侧历史遗漏和定时失败不可见均已修复并补测;backend-review.md 保留的是修复前发现记录。

历史数据边界

已归档的消息会继续保存在本地;未归档历史只能补回腾讯云仍保留的部分。云端已过保留期或双方都已删除、且本地从未归档的消息无法凭代码恢复。图片、文件当前保存的是云端链接,链接有效期仍受云端保留策略影响。腾讯历史消息说明

本轮不包含真实患者的线上端到端验收,以上测试均使用虚构数据和替身服务。