From 09fb11d86f1c78534cf7a30e6f7e2dc83a9e23d7 Mon Sep 17 00:00:00 2001 From: Hermes CI Fix Date: Wed, 16 Sep 2026 14:44:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(cma):=20NP-001=20verdict=20=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E7=BB=9F=E4=B8=80(block=E2=86=92blocked)=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=91=BD=E4=B8=AD=E5=8D=B3=E7=BD=AE=20check=5Fresult?= =?UTF-8?q?=3Dblocked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _eval_np001 原将 verdict 直取 severity('block'),而 check_result 汇总只认 'blocked' → e1 命中不生效、check_result 恒 pass,T4 豁免级联失败。改为 severity=='block'→'blocked'。 Ref: 0-P0-project-20260915-cma-treasury-stage1 自验电池 T3/T3b/T4 --- backend/app/api/treasury.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/app/api/treasury.py b/backend/app/api/treasury.py index 2944f72e..bd7d9eff 100644 --- a/backend/app/api/treasury.py +++ b/backend/app/api/treasury.py @@ -159,7 +159,8 @@ def _eval_np001(db, entity_id, payment, rule) -> dict: budget_value, scope = bp.budget_value, f"kpi:{bp.kpi_id}@{period}" this_amt = _r(payment.amount) if budget_value is None: - return {"rule_code": "NP-001", "verdict": severity, "severity": severity, + return {"rule_code": "NP-001", "verdict": ("blocked" if severity == "block" else severity), + "severity": severity, "detail": _hit_detail("NP-001", rule.rule_version, "none", None, this_amt, (params.get("unmatched") or "specify_budget_flow") + "(未匹配到预算:走指定/补录预算流程并留痕,不直接卡死)")} @@ -175,7 +176,7 @@ def _eval_np001(db, entity_id, payment, rule) -> dict: prev = float(q.scalar() or 0) cumulative = _r(prev + this_amt) ok = cumulative <= float(budget_value) + TOL - verdict = "pass" if ok else severity + verdict = "pass" if ok else ("blocked" if severity == "block" else severity) basis = ("占用口径 %s;占用=已支付+已审批未支付+本单" % (params.get("occupancy") or "paid+approved+pending_approval+this")) if not ok: basis += f";占用 {cumulative} 超过预算 {_r(budget_value)}"