pool-matrix.tsx
7.09 KB
-
feat(plan): S2.5 初选矩阵 —— 端点 + 组件 + 点格子直通助手 · 1d1b7636
生产线第一环补齐:主管在矩阵上点一格 = 完成初选,人群随即交给助手出确认单。
⭐ 关键设计:温度边界改存**稳定路径** `data.temperature.<标签>.hotUntil`, 不再塞进 `detail[]` 数组。原因是数组下标因人而异 —— `detail.0.hotUntil` 对谁都不成立, Prisma 的 json 路径过滤(以及任何索引)都用不上,于是**召回池列表永远对不上矩阵**。 挪成稳定路径后:矩阵走原生 SQL、列表走 Prisma,谓词字面等价。 本地实测 **24 格逐格与列表 total 相等**,这是 T14「口径对数」的硬要求 —— 格子里写 44、点进去列表 373,主管对整个功能的信任当场就没了。 后端: · GET /plans/matrix(8×3,去重患者数,PLAN_DISPATCH 门控 ——⛔ 不是 PLAN_VIEW_OWN, 那等于从后门把召回池露给客服,违 T16);路由必须声明在裸 @Get(':id') 之前 · ListPlansQuery 加 temperature + potentialTreatment;单给 temperature 直接 400 (同一个人可能对种植是热、对补牙是冷,脱离治疗项的"热"没有意义) · 「待重算」单独一列,⛔ 不并进「冷」—— 并进去行合计好看但那是假分布(T14) 前端: · pool-matrix.tsx:底色**按列固定**、与数量完全无关(否则「这格橙是因为热还是因为人多」 分不清);热用橙不用红;⛔ 不用 brand-*(品牌蓝比 blue-100 深太多,会让「冷」像选中态) · 矩阵是召回池的**视图模式**(列表 ⇄ 矩阵),不新开路由;初选格子有回显 chip + 一键清除 · 三层动效架构在此得到验证:发射点从「移交助手」按钮换到格子上,只改调用处, pet-events / pet-brain / pet-body 一个字没动(只给 cohort_handoff 加了个温度文案字段) 浏览器实测(主管 康慧捧 / 北京朝阳公园诊所)抓到并修掉两处: · 规划建议的「矩阵模式 rail 加宽到 420px」→ **撤销**,1280px 视口下会把中间 「参考话术」列挤成竖排文字;8×3 在 320px 内完全够用 · 页脚文案里的 markdown `**` 被原样渲染 → 改成 <span>⭐ 另修一句会让助手替系统撒谎的话:候选 44 人时 selectionNote 仍说「排序取前 100 人」, 主管会以为有 56 个人被系统悄悄丢了。改为「这批候选一共就 44 人,全部纳入(未做取舍)」。 它是要求助手**原话转述**的句子,措辞错等于让助手说假话(T14),已加回归。 端到端实测:点「根管治疗·🔥 热」→ 列表 5 人 → 助手直出确认单「确认分配 5 条」, 三句依据原话转述、默认值字样都在;矩阵/列表/chip/按钮四处数字一致。 944 tests passing;service + web typecheck 干净;控制台与服务端零报错。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>luoqi committed