fix(alerts): enforce caliber rulings R1-R4 for alert generation
R1: exclude status=demo entities from alert traversal (alert_generator / deviation_engine / kpi_bep_deriver / alert_rules / cash engine) R2: only generate alerts within the last 6 calendar months (incl. current) R3: only regular month periods (YYYY-MM) participate R4: decouple generation from push - empty notification_channels never blocks Single source of truth: app/utils/alert_entity_scope.py
This commit is contained in:
@@ -38,6 +38,8 @@ import re
|
||||
from sqlalchemy import func
|
||||
from app.database import get_session_local
|
||||
from app.models import KPIValue, KPIDefinition, VoucherDetail, KPIAlert
|
||||
# 裁定 R1(2026-09-19 财务口径):demo 账套不产生业务预警(派生值仍落库,仅跳过预警同步)
|
||||
from app.utils.alert_entity_scope import is_excluded_entity
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
|
||||
logger = logging.getLogger("cma.bep_deriver")
|
||||
@@ -320,7 +322,11 @@ def run_derive(db, entity_id: int, period: str, rebate_rate_pct: float,
|
||||
# 5. 同步预警: 仅对本派生KPI评估 threshold(green=正常不落 pending,yellow/red 落 pending)。
|
||||
# 幂等规则:同一 KPIValue 已有同级别 pending → 保持不动(值未变不重建);
|
||||
# 其它/旧级别 pending → resolve;最新派生行永远只留一条当前级别。
|
||||
for code, _ in TARGET_KPIS:
|
||||
# R1(裁定 2026-09-19):demo 账套不产生业务预警 → 整段预警同步跳过(派生值照落库)。
|
||||
target_sync = [] if is_excluded_entity(db, entity_id) else TARGET_KPIS
|
||||
if not target_sync:
|
||||
logger.info("demo 账套(entity=%s)跳过预警同步(R1,裁定 2026-09-19)", entity_id)
|
||||
for code, _ in target_sync:
|
||||
kpi = kpis[code]
|
||||
kpi_value = value_rows.get(kpi.id)
|
||||
if not kpi_value:
|
||||
|
||||
Reference in New Issue
Block a user