02-技术-异常规则引擎三型阈值配置法
> 阶段:02 技术(流程)|版本 v1.0|固化日期 2026-10-16
> 一句话:异常判定分「状态/数值/日期」三型,全部配置驱动;临期窗口一律走 alert_window(),域看板严禁硬编码天数。
一、适用场景
- 新增一个业务域,要定义「什么算异常」。
- 用户在设置页改了阈值(如健康指标)却不生效。
- 域看板显示的「临期」条数与通用临期块对不上。
二、操作步骤
- 三型分治(全部集中在
ledgers.py):
- ① 状态类ANOMALY_STATUS:某状态值即异常(10/10 域已覆盖);
- ② 数值类DOM_THRESHOLDS(ledgers.py:627)+_threshold_hit()(ledgers.py:473,运算符支持> < >= <=);
- ③ 日期类DOM_DATE_RULES(ledgers.py:648,9 域 11 键)+EXPIRY_DATE_COLS(ledgers.py:666)
+EXPIRY_DONE_STATUS(已过期须继续报,不能因状态终态而被排除)。 - 消费点统一:数值型由
app.py:3103-3105遍历DOM_THRESHOLDS产出ntype='anomaly';
显示侧templates.py:4777复用同一个_threshold_hit,保证前后端口径一致。 - 临期窗口只认配置:
ALERT_WINDOWS(ledgers.py:610)={se:90, op_f05:90, da:7},缺省 30;
一律调ledgers.alert_window(key)(ledgers.py:613-615)。 - 健康阈值可配置:
hl_thresholds()(ledgers.py:486)←hl_thresholds_raw()(527)
+hl_thresholds_save()(540)+hl_thresholds_reset()(552);
两个消费点都必须调hl_thresholds(),不得直接读原始常量,否则用户在设置页改了不生效。 - 阈值变更必须广播:设置页保存后调
_cache_ver_bump()(app.py:2788、2804),
否则其他 worker 仍用旧阈值渲染(见02-技术-跨进程页面缓存与SWR陈旧宽容法)。
三、注意边界
- 新增域规则 只改配置不改判定逻辑;真要加运算符才动
_threshold_hit。 - 「已过期」不能当终态排除——
EXPIRY_DONE_STATUS的作用正是防止它被状态过滤掉。 - 域看板的临期筛选与通用临期块必须同一个窗口源,否则同一批数据两处显示不同条数。
- 阈值是业务参数,不是代码常量;凡用户可调的一律走
settings合并。
四、反例避雷
- ✗ 域看板硬编码 30 天 → 与
ALERT_WINDOWS['se']=90(每季度核查)、['op_f05']=90(药箱近效)、
['da']=7(周巡检)全部不一致。2026-10-10 已修三处(templates.py:5092、5124、5275),
修完务必回归另外两处是否还有残留。 - ✗ 直接读 HL 原始阈值常量 → 用户在设置页改了,页面纹丝不动。
- ✗ 改了阈值不
_cache_ver_bump()→ 只有当前 worker 生效,其他进程仍旧。 - ✗ 把「已过期」加进完成态 → 过期项从此不再报警,规则引擎静默失效。
五、代码锚点 / 实战战绩
锚点:
- 程序源代码/ledgers.py:473(_threshold_hit)、486/527/540/552(HL 阈值四件套)、
610-615(ALERT_WINDOWS 与 alert_window)、627(DOM_THRESHOLDS)、
648-666(DOM_DATE_RULES / EXPIRY_DATE_COLS)
- 程序源代码/app.py:3090、3103-3105(数值型遍历)、2788、2804(阈值变更广播)
- 程序源代码/templates.py:4777(显示侧复用)、5092、5124、5275(三处临期窗口修复点)
- 程序源代码/tools/_qa_alldim_full.py:116(DOM_THRESHOLDS 覆盖断言)、347-348(ALERT_WINDOWS 配置驱动断言)
战绩:
- 覆盖面:状态类 10/10 域;日期类 9 域 11 键;数值类按域登记;临期窗口 3 键 + 缺省 30。
- 2026-10-10:一次性修掉三处硬编码 30 天,域看板与通用临期块口径对齐。
- alldim 全维度测评把「阈值配置驱动」与「临期窗口配置驱动」列为 C 类断言,多轮复测保持 PASS。
六、关联笔记
04-开发-中心页预警泛化与年度小结生成法:异常产出后的展示与汇总。04-开发-通知中心与临期中心聚合流程:异常与临期如何进铃铛。02-技术-跨进程页面缓存与SWR陈旧宽容法:阈值变更的广播机制。
七、版本记录
- v1.0(2026-10-16):首版。三型分治 + 临期窗口唯一口径 + HL 阈值可配置 + 变更广播,附四条反例。