Commit 53467054 by luoqi

test(recall): verify-recall 加 §C4 可疑漏召层(独立临床检查,补差分测试盲区)

差分测试盲区:scanner 与生产用同一套排除规则 → 规则本身太粗(如已废的 ⑤d 按科目误排)会被
'互相印证'成已解释、静默放过(沈静芳 34;43 当年即此)。§C4 换独立视角:
  '该牙有结构诊断 + 本牙零治疗 + 无任何牙位级硬层(废用/乳牙/§E/更晚诊断)挡',
  却仅因患者级代理(⑤b 未来预约 / ⑤f 近期到诊,均不看牙位)而没召 → 列出人审。
- 本地 905:可疑漏召 61(57 ⑤b + 4 ⑤f),多为 K01 阻生/K02 龋齿(有未来预约,患者要来当面处理)/
  K00 先天 → 合理但不再静默;真出现'被代理豁免又没人来管'的会现形。
- FP 硬闸 0/0、FP=0、真·无法解释 FN=0 不变。
- ⑤b/⑤f 是可辩护的粗代理(物理到诊=全口机会);⑤d(科目≠牙位)才是坏的,已移除。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
parent c9435b74
...@@ -147,6 +147,32 @@ SELECT bucket, count(*) FROM vt_fn GROUP BY bucket ORDER BY bucket; ...@@ -147,6 +147,32 @@ SELECT bucket, count(*) FROM vt_fn GROUP BY bucket ORDER BY bucket;
SELECT code, substr(patient_id::text,1,8) pid, tooth, dx_at::date, name_zh SELECT code, substr(patient_id::text,1,8) pid, tooth, dx_at::date, name_zh
FROM vt_fn WHERE bucket='9_真·无法解释' ORDER BY code LIMIT 30; FROM vt_fn WHERE bucket='9_真·无法解释' ORDER BY code LIMIT 30;
-- ════════════════════════════════════════════════════════════════════════
-- §C4 可疑漏召(独立临床检查 — 不信任代码自身的排除规则)
-- 差分测试盲区:scanner 与生产用同一套排除规则 → 规则本身太粗(如已废的 ⑤d 按科目误排)会被
-- "互相印证"成"已解释",静默放过(沈静芳 34;43 当初即此)。本层换个视角独立判:
-- 凡"该牙有结构诊断 + 本牙从没做过对应治疗 + 没有任何【牙位级硬层】(废用/乳牙/§E/更晚诊断)挡",
-- 却仅因【患者级代理】(⑤b 未来预约 / ⑤f 近期到诊,均不看牙位)而没召 → 列出来【人审】:
-- 该次就诊/未来预约是否真会处理这颗牙?是→合理;否→真漏召(就像 34;43 当年被科目级 ⑤d 误排)。
-- ════════════════════════════════════════════════════════════════════════
\echo '════════ §C4 可疑漏召(本牙零治疗+无硬层排除,仅患者级代理豁免 → 需人审)════════'
SELECT
count(*) FILTER (WHERE x_future) AS 仅未来预约豁免,
count(*) FILTER (WHERE x_recent AND NOT x_future) AS 仅近期到诊豁免,
count(*) AS 可疑漏召合计
FROM vt_final
WHERE NOT resolved AND NOT recalled
AND (x_future OR x_recent)
AND NOT (x_inelig OR x_decid OR x_thirdmolar OR x_congenital OR x_orthoextract OR x_superseded);
\echo '---- 可疑漏召样例(人审:这颗牙的诊断,该次到诊/未来预约是否真处理?)----'
SELECT code, sub, substr(patient_id::text,1,8) pid, tooth, dx_at::date, name_zh,
CASE WHEN x_future THEN '未来预约⑤b' ELSE '近期到诊⑤f' END AS 豁免来源
FROM vt_final
WHERE NOT resolved AND NOT recalled
AND (x_future OR x_recent)
AND NOT (x_inelig OR x_decid OR x_thirdmolar OR x_congenital OR x_orthoextract OR x_superseded)
ORDER BY code, tooth LIMIT 30;
\echo '════════ §D 全口码 治疗后复发被压(excludeIfEverTreated)════════' \echo '════════ §D 全口码 治疗后复发被压(excludeIfEverTreated)════════'
WITH tx AS (SELECT patient_id, content->>'category' cat, max(occurred_at) last_tx FROM patient_facts WITH tx AS (SELECT patient_id, content->>'category' cat, max(occurred_at) last_tx FROM patient_facts
WHERE type='treatment_record' AND kind='actual' AND status IN('active','fulfilled') AND content->>'category' IN('periodontic','orthodontic') GROUP BY 1,2), WHERE type='treatment_record' AND kind='actual' AND status IN('active','fulfilled') AND content->>'category' IN('periodontic','orthodontic') GROUP BY 1,2),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment