Files
zyt/docs/plans/assistant-revisit-reach-deployment.md
T
2026-10-15 12:00:09 +08:00

5.8 KiB
Raw Blame History

医助复诊跟进(接诊率 / 触达节点 / 到期标红 / 到期弹窗)线上部署步骤

日期:2026-10-15。对应方案:assistant-revisit-reach-reminder-2026-10-12.md。代码在分支 tongji-10-12(工作区尚未提交)。本地 phpstudy 环境已完成 SQL 执行、全量快照初始化与真库交叉验证。

0. 发布前

  1. 提交并推送 tongji-10-12,按团队流程合并到 master。
  2. 本地没有 Node,前端必须在有 Node 的机器或 CI 上构建:
cd admin && npm install && npm run lint && npm run type-check && npm run build

npm run build 会把 dist 复制到 server/public/admin(admin/scripts/release.mjs),生产 API 地址取 admin/.env.production 的 https://admin.zhenyangtang.com.cn/。构建产物随后端代码一起发布。

  1. 确认 server/config/project.php 两个开关的上线取值(文件随代码发布):
    • revisit_reach.toast_enabled:仓库当前为 true(本地测试用)。建议上线首日改为 false,由主管先用诊单列表「复诊到期」chip 清理存量,再改为 true;改配置不需要发版。
    • revisit_reach.wecom_enabled:保持 false,企微推送命令会空跑。
    • revisit_rate.default_inherit_mode:保持 exclude,复诊接诊率页面与自动分配沿用原口径。
  2. 线上 PHP 必须 8.0+,且所有 php-fpm/php-cgi 工作进程都已加载 pdo_mysql(本地曾出现单个 worker 未加载扩展导致接口间歇性报 could not find driver,重启 PHP 进程即可)。

1. 数据库(先于代码执行)

先备份:

mysqldump -u<user> -p zyt zyt_tcm_prescription_order zyt_tcm_diagnosis_assign_log zyt_tcm_diagnosis_auto_assign_log zyt_dev_crontab zyt_system_menu zyt_system_role_menu > backup_before_revisit_reach.sql

按序执行 server/sql/1.9.20261012/01~10(无自动迁移器):

for f in server/sql/1.9.20261012/*.sql; do mysql -u<user> -p --default-character-set=utf8mb4 zyt < "$f" || break; done
文件 内容 幂等
01 zyt_tcm_prescription_order 覆盖索引 idx_diag_del_fs_ct 否,重复执行报 1061 可忽略
02 / 03 快照表 zyt_tcm_diagnosis_revisit_due、流水表 ..._log 是
04 定时任务:全量 08:30、增量 */30 是
05 弹窗 6 个按钮权限,自动授予已有「中医诊单」权限的角色 是
06 zyt_tcm_diagnosis_assign_log 新增 inherit_visit_slot 两列(代码查询依赖,必须先于代码) 否
07 zyt_tcm_diagnosis_auto_assign_log 新增 visit2_rate_new_assign / rate_version(自动分配命令依赖) 否
08 「数据统计 → 复诊到期跟进」页面与流水权限,不自动授权 是
09 定时任务:企微 daily 09:00、tick */30(wecom_enabled=false 时空跑) 是
10 个人业绩页「我的复诊接诊率」权限,自动授予已有个人业绩页的角色 是

本地 MySQL 5.7 已验证 10 个文件全部执行成功。

2. 发布代码

  1. 同步 server/(含 public/admin 构建产物)到服务器;无新增 Composer 依赖。
  2. 重载 php-fpm 刷新 opcache;执行 php think clear 清理运行时缓存。
  3. 后台权限缓存按管理员单独缓存 1 小时,菜单 SQL 执行后最多 1 小时生效,或让相关账号重新登录。

3. 初始化与定时任务

cd /path/to/server
php think tcm:revisit-due-scan --mode=full --dry-run    # 先看耗时与候选数(本地 4721 张诊单约 20 秒)
php think tcm:revisit-due-scan --mode=full              # 正式初始化快照
php think tcm:backfill-inherit-visit-slot --dry-run     # 继承诊次快照回填预览
php think tcm:backfill-inherit-visit-slot               # 正式回填
php think tcm:auto-assign-pending --dry-run             # 两套口径分档对照,确认默认仍为旧口径(v1)

确认系统 cron 每分钟触发 php think crontab(既有约定);后台「系统设置 → 定时任务」应出现 4 条新任务,首次 last_time 为空只登记下次执行时间。

4. 验收清单

  1. 诊单列表「复诊节点」列显示第 N 诊、开药天数与来源、预计复诊日、状态 chip;到期未挂号/过号整行标红;顶部「复诊到期 N」角标与筛选后列表条数一致;只读详情页显示同一信息。
  2. 以持有到期患者的医助登录,右下角出现汇总卡;延迟、已联系、人工关闭、去挂号四个动作可用;挂号成功后卡片与红行同时消失。
  3. 「数据统计 → 复诊到期跟进」主管视图可筛选、导出、看流水;非授权角色打不开。
  4. 「复诊接诊率」页面默认数字与上线前一致(原口径);切换「新口径」后出现继承数等列。
  5. 自动分配 dry-run 的 v1 分档与上线前一致。
  6. 个人业绩页出现「我的复诊接诊率」卡片(二中心医助),非二中心显示「暂无数据」。

5. 回滚

  • 前端:恢复上一版 server/public/admin。
  • 后端:回退代码并重载 php-fpm;新表、新列、新索引保留无害,不需要回滚 SQL。
  • 定时任务:后台把 4 条新任务 status 改为停止,或 UPDATE zyt_dev_crontab SET status=2 WHERE command IN ('tcm:revisit-due-scan','tcm:revisit-due-notify')。
  • 只想关弹窗:revisit_reach.toast_enabled=false,不需要发版。

6. 已知事项

  • server/app/mcp/catalog/generated.php 已重生成,顺带暴露 4 个尚无审核条目的 tcm.followupAudio/* 只读接口(既有缺口,AiMcpUnitTest 只计数不失败)。
  • 首次全量初始化会把历史逾期患者一次性置为到期,弹窗数量会很多,建议先关弹窗清存量。
  • 本地验证中修正了一处口径:下单当天及更早的面诊不算这笔药的复诊(revisit_reach.appointment_min_gap_days,默认 1)。