fix(kpi): single source of truth for REVERSE_INDICATORS + drop F_FACTORY_REBATE_RATE from reverse set
P-6 (M2 gate 2, FIN-CE-REVIEW-20260915-01): kpis.REVERSE_INDICATORS is now the only authoritative direction definition; dashboard.py imports it instead of carrying a literal copy; bot_kpis.py derives REVERSE_BOT_INDICATORS from it (dead import removed). F_FACTORY_REBATE_RATE (upstream factory rebate rate, higher=better) was wrongly treated as reverse: 278.7% vs target 80 scored 1/danger, now 5/success and workbench three-color red -> green. No DB write, no scoring-engine logic change, no data_level/frontend touch.
This commit is contained in:
@@ -10,6 +10,9 @@ from app.deps import get_entity_id
|
||||
from app.models import KPIDefinition, KPIValue, KPIAlert, User, VoucherDetail
|
||||
from app.utils.cache import get as cache_get, set as cache_set
|
||||
from app.utils.voucher_guard import apply_voucher_guard
|
||||
# 指标方向(反向/正向)唯一权威源 = app.api.kpis.REVERSE_INDICATORS(2026-09-15 M2 准入2 收口)。
|
||||
# 本文件原自带一份字面量副本,与 kpis.py 漂移后会与「能力评分」判定相反,故改为导入。
|
||||
from app.api.kpis import REVERSE_INDICATORS
|
||||
import json
|
||||
import logging
|
||||
|
||||
@@ -619,12 +622,8 @@ def my_dashboard(
|
||||
target = kpi_target_by_frequency(k)
|
||||
level = "gray"
|
||||
if actual is not None and target:
|
||||
# 反向指标(越低越好):费用率/渠补率/应收天数/返利率/成本率/存货天数
|
||||
REVERSE_INDICATORS = {
|
||||
"F_COST_RATIO", "C_REBATE_RATE", "F_AR_DAYS",
|
||||
"F_REBATE_RATE", "F_FACTORY_REBATE_RATE", "F_COST_CONTROL_RATE",
|
||||
"F_INV_DAYS", "F_DEBT_RATIO", "P_BUG_RATE", "P_REWORK_PCT",
|
||||
}
|
||||
# 反向指标(越低越好)集合 = 单一权威源 app.api.kpis.REVERSE_INDICATORS
|
||||
# (2026-09-15 M2 准入2:删本文件原字面量副本,避免与能力评分引擎方向漂移)
|
||||
if k.kpi_code in REVERSE_INDICATORS:
|
||||
# 反向:实际≤目标=绿;实际≤目标*1.1=黄;否则红
|
||||
level = "green" if actual <= target else (
|
||||
|
||||
Reference in New Issue
Block a user