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

90 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 医助复诊跟进(接诊率 / 触达节点 / 到期标红 / 到期弹窗)线上部署步骤
日期: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 上构建:
```bash
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/`。构建产物随后端代码一起发布。
3. 确认 `server/config/project.php` 两个开关的上线取值(文件随代码发布):
- `revisit_reach.toast_enabled`:仓库当前为 `true`(本地测试用)。建议上线首日改为 `false`,由主管先用诊单列表「复诊到期」chip 清理存量,再改为 `true`;改配置不需要发版。
- `revisit_reach.wecom_enabled`:保持 `false`,企微推送命令会空跑。
- `revisit_rate.default_inherit_mode`:保持 `exclude`,复诊接诊率页面与自动分配沿用原口径。
4. 线上 PHP 必须 8.0+,且所有 php-fpm/php-cgi 工作进程都已加载 `pdo_mysql`(本地曾出现单个 worker 未加载扩展导致接口间歇性报 could not find driver,重启 PHP 进程即可)。
## 1. 数据库(先于代码执行)
先备份:
```bash
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`(无自动迁移器):
```bash
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. 初始化与定时任务
```bash
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)。