fix: 智能导入——匹配不上的财务报表科目自动创建KPI定义
- 清理科目前缀(一、/减:/加:)后多级匹配 - ⑤仍未匹配→自动创建KPI(PL_001/CF_001/BS_001) - 避免205条全部跳过的场景
This commit is contained in:
@@ -233,6 +233,77 @@ def get_kpi_score(
|
||||
}
|
||||
|
||||
|
||||
# ============================================================
|
||||
# KPI-glossary: 知识资产化 — KPI字典实时加载(供ChatBI财务Bot调用)
|
||||
# ============================================================
|
||||
|
||||
@router.get("/glossary")
|
||||
def get_kpi_glossary(
|
||||
entity_id: int = Query(1, ge=1),
|
||||
db: Session = Depends(get_db),
|
||||
current_user = Depends(require_auth),
|
||||
):
|
||||
"""KPI字典实时加载 — 返回所有KPI的定义、当前值、目标值、公式、维度、阈值
|
||||
|
||||
供ChatBI财务Bot在分析前调用,确保口径与系统一致。
|
||||
返回字段: kpi_code, kpi_name, current_value, target_value, formula, dimension, threshold
|
||||
"""
|
||||
kpis = db.query(KPIDefinition).filter(
|
||||
KPIDefinition.status == "active",
|
||||
KPIDefinition.entity_id == entity_id,
|
||||
).order_by(KPIDefinition.kpi_code).all()
|
||||
|
||||
result = []
|
||||
for k in kpis:
|
||||
# 获取最新实际值
|
||||
latest_val = db.query(KPIValue).filter(
|
||||
KPIValue.kpi_id == k.id,
|
||||
KPIValue.actual_value.isnot(None),
|
||||
).order_by(KPIValue.period.desc()).first()
|
||||
|
||||
current_value = latest_val.actual_value if latest_val else None
|
||||
latest_period = latest_val.period if latest_val else None
|
||||
|
||||
# 组装阈值描述
|
||||
threshold = None
|
||||
if k.threshold_green or k.threshold_yellow or k.threshold_red:
|
||||
parts = []
|
||||
if k.threshold_green:
|
||||
parts.append(f"绿灯:{k.threshold_green}")
|
||||
if k.threshold_yellow:
|
||||
parts.append(f"黄灯:{k.threshold_yellow}")
|
||||
if k.threshold_red:
|
||||
parts.append(f"红灯:{k.threshold_red}")
|
||||
threshold = " | ".join(parts)
|
||||
|
||||
result.append({
|
||||
"kpi_id": k.id,
|
||||
"kpi_code": k.kpi_code,
|
||||
"kpi_name": k.kpi_name,
|
||||
"dimension": k.dimension,
|
||||
"category": k.category,
|
||||
"formula": k.formula,
|
||||
"formula_desc": k.formula_desc,
|
||||
"unit": k.unit,
|
||||
"target_value": k.target_value,
|
||||
"current_value": current_value,
|
||||
"latest_period": latest_period,
|
||||
"threshold": threshold,
|
||||
"responsible_dept": k.responsible_dept,
|
||||
"responsible_user": k.responsible_user,
|
||||
"data_source": k.data_source,
|
||||
"data_owner": k.data_owner,
|
||||
"frequency": k.frequency,
|
||||
"status": k.status,
|
||||
})
|
||||
|
||||
return {
|
||||
"entity_id": entity_id,
|
||||
"total": len(result),
|
||||
"glossary": result,
|
||||
}
|
||||
|
||||
|
||||
# ============================================================
|
||||
# KPI-6: KPI三级分解树
|
||||
# ============================================================
|
||||
|
||||
Reference in New Issue
Block a user