pool-matrix.tsx
14.1 KB
-
perf(圈人): 圈人侧也改读预存标签 —— 603ms → 57ms,顺带堵上「两侧会漂」的口子 · 7bbe9a1b
上一轮只改了**看**侧(初选矩阵),圈人侧的 `labelExistsSql` / `labelTemperatureExistsSql` 仍在实时回查 `patient_facts` 算标签。
🔴 这不只是慢,是**我上一轮亲手造出的口径不一致**: · 看侧读预存的 potential_labels(回填那一刻的年龄) · 圈人侧实时算(当前年龄) 标签规则里有三条带年龄(K08>18 / K07 3~12 / K07 13~40)⇒ 过生日跨档的人两边不一样。 而 `reason-temperature.sql.ts` 里那段注释早就写过这个坑: 「曾经它们各自带一个 mode 参数,一旦调用方漏传就是主管看到 87 人、 确认单捞出另一批,而且全程不报错(T14)」 我差点原样重演一遍,只是这次漂的原因从"参数"换成了"数据源"。 改动:两处 EXISTS 都换成 `pr.potential_labels @> ARRAY[label]`。 ■ 实测(本地,15,884 条 plan 的诊所,人数逐字未变) 只按治疗 603 ms → 57 ms 2305 人 → 2305 人 治疗 + 温度 971 ms → 82 ms 353 人 → 353 人 这条路一次弹窗要走两遍(整格人数 + 当页明细),还被 propose 复用。 ■⚠ ️ 三条既有断言失败 —— 但它们守的不变量**没有消失,是搬家了** · 「只认未治疗的证据(f.status='active')」 · 「证据必须有日期(COALESCE(occurred_at, planned_for) IS NOT NULL)」 两者现在由回填 SQL 保证。⛔ 没有删断言,而是搬到 plan-label.spec.ts 钉住 —— 删了的话,谁把"治完的诊断"或"没有日期的证据"算进标签都不会有人发现, 而那会直接改变召回谁。⚠ ️ 已做变异校验:拿掉 status 守卫立刻变红。 · 第三条改成断言"锚点仍是末诊",并注明非空守卫搬去了哪。 ■ 新增《看侧与圈人侧同源》一组:三处都读 potential_labels、 三处都不再出现 patient_facts / jsonb_array_elements_text / 按年龄现算。 验证:tsc 通过;jest 86 套 1351 例全过;eslint 无新增错误。luoqi committed