-
fix(plan): 医生名单缓存改 10 分钟 + 重算收尾主动清;客服也能自助返池 · 729a7709
## ① 医生名单搜不到(测试服实证) 「上次医生 / 偏好医生」的候选名单缓存 6 小时,**且没有失效钩子**。三个派生列刚上线 全是 NULL,第一次打开筛选面板就把 `[]` 缓存了 6 小时;之后重算把值填上了,客服那边 照旧「暂无医生名单」,输入框搜谁都搜不到 —— 表现成"这个医生搜不到",没人会想到是 Redis。 缓存久的真实代价不是"名单旧几小时",是**排查成本**。两处改: · TTL 6h → 10min(仍挡得住"每开一次面板跑一次 DISTINCT",44 万行有索引,不贵) · recompute-persona 收尾主动删该 host 各 tenant 的 key → 刚跑完就能搜到,不用等 10 分钟 key 拼法导出成 doctorOptionsCacheKey,CLI 不再手写字符串(写歪了是静默删空)。 ## ② staff 自助返池 认错人 / 打不通 / 不该由我跟,客服自己就该能退回池,否则只能挂着占位,或者硬走 「关闭机会」—— 那会污染放弃原因统计。
⚠ ️ 光给权限是有洞的:客服 A 能把客服 B 手里的单退回池再自己认领,认领闸挡的是 "没认领就作业",挡不住"先把别人的单退了"。所以配套加了归属闸 assertCanRecycle: · 有 PLAN_VIEW_ALL(leader/admin)→ 可退任意人的单,这是"组长回收"的原义 · 没有(staff)→ 只能退自己认领的,否则 PLAN_CLAIMED_BY_OTHER(带占用人,前端能提示是谁) 判据取权限不取角色字符串 —— 权限模型的真理源是 ROLE_PERMISSIONS,service 不该再认一次角色。 顺带订正 recycle-scheduler 里"staff 无返池权限所以自动回收是唯一释放路径"的注释(已不成立)。 663 tests / 42 suites 通过(新增 6 条:归属闸四态 + 权限矩阵两条)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed