-
feat(persona): 新增 visit_recency 特征 —— 上次到诊分档/医生;筛选项改隐藏而非删除 · c241da85
按 2026-07-29 四点反馈做: 【1】下线的 5 个筛选项改成**隐藏**而非删除。 PersonaTagFilterDim 加 `hidden?: boolean`,面板 `.filter(d => !d.hidden)`。 这样 API / MCP 仍接受这些维度 —— 已保存的筛选链接、机器人调用不会突然失效; persona_features 照常写、偏索引照常在,复活只需删一行。 (上一版直接从字典摘掉,连 API 一起禁了,比"前端隐藏"狠。) 【2】【4】新增画像特征 visit_recency —— 一个特征喂三处: · 列表卡片的「2022-06-19 · 张敏」 · 圈人筛选的「上次时间」(0-3/3-6/6-12/12-18/18+ 月),已接面板 · 「上次医生 / 偏好医生」数据已就位,面板未接(医生是高基数,静态 options 的 chip 面板放不下,需可搜索下拉 —— 已在 persona-tag-filters 注释说明)⭐ 偏好医生用**主治医生**代替(病历里出现频次最高的医生)—— DW fact_client_out.favor_doctor_id 才是真值,PAC 尚未摄入;换成真值时消费方不用改。⭐ 到诊口径用 visitFactsOf(encounter + actual treatment + 挂号),与 rfm / lifecycle / urgency **同一口径**。我上一版卡片是现算 encounter ∪ emr —— 两套口径会算出两个"末诊", 卡片与筛选打架。本次把卡片改成读同一份画像行,fetchLastVisits 删除, 两条查询合并成 fetchCardFeatures 一条(顺带少一次往返)。⭐ lastDoctor 只认**末诊当天**那份病历的医生,跨天不认 —— 否则"日期是A次、医生是B次", 客服照着说就露馅,宁可留空。本地实测填充率:主治医生 1133/1133,上次医生 392/1133(34.6%) —— 因为末诊常落在没有当天病历的到诊上(挂号/治疗)。这是刻意的准确性取舍。⭐ 实现 nextBoundaryAt:纯时间流逝就会跨桶,不报的话水位闸永远不放行、分档停在算的那一刻。 【3】筛选字段加索引:迁移 20260729080000,visit_recency.bucket 的偏索引 (btree(表达式, persona_id),第二列让内层 EXISTS 走 index-only scan)。 这是 persona-tag-filters 顶部那条纪律的兑现 —— 加维度必须同时加索引, 漏了就是 2026-07-29 那个「圈人 20 秒」。新特征建索引时表里还没数据,故无需 CONCURRENTLY。 登记:PersonaFeatureKey / FeatureRegistry / PERSONA_FEATURE_SPECS / PERSONA_FEATURE_META 四处齐全(测试 persona-spec-drift 会卡漏登记,本次就被它卡住两次)。 654 tests / 42 suites 全过;types / service / web typecheck 通过; 本地重算实测特征写入正常。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| dto | Loading commit data... | |
| features | Loading commit data... | |
| persona-coverage-monitor.service.ts | Loading commit data... | |
| persona-diff.ts | Loading commit data... | |
| persona.controller.ts | Loading commit data... | |
| persona.module.ts | Loading commit data... | |
| persona.service.ts | Loading commit data... |