From a8de53a4c26a8eeb9151a9ec42ded040fffebfdb Mon Sep 17 00:00:00 2001 From: Hermes CI Fix Date: Thu, 3 Sep 2026 17:52:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(zone):=20=E4=B8=89=E5=8C=BA=E6=A0=87?= =?UTF-8?q?=E8=AE=B0M3=E5=90=8E=E7=AB=AF=E2=80=94=E2=80=94KPI=20values/bot?= =?UTF-8?q?-kpis=E5=93=8D=E5=BA=94=E8=A1=A5calculated=5Fat=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=AD=97=E6=AE=B5(updated=5Fat/value=5Fupdated=5Fat/s?= =?UTF-8?q?ource=5Fbatch)=EF=BC=8C=E4=BE=9BBotSourceTag=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=20(three-zone=20P0-=E2=91=A0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/bot_kpis.py | 3 +++ backend/app/api/kpis.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/backend/app/api/bot_kpis.py b/backend/app/api/bot_kpis.py index f95446fa..8a982bd8 100644 --- a/backend/app/api/bot_kpis.py +++ b/backend/app/api/bot_kpis.py @@ -97,6 +97,9 @@ def list_bot_kpis( "score": score, "status": status, "period": latest_val.period if latest_val else None, + # P0-① 三区标注: Bot KPI值最近回填时间/批次(UI BotSourceTag 消费) + "value_updated_at": latest_val.calculated_at.strftime("%Y-%m-%d %H:%M") if latest_val and latest_val.calculated_at else None, + "value_source_batch": latest_val.source_batch if latest_val else None, "frequency": k.frequency or "monthly", }) diff --git a/backend/app/api/kpis.py b/backend/app/api/kpis.py index e978426f..8885656b 100644 --- a/backend/app/api/kpis.py +++ b/backend/app/api/kpis.py @@ -548,6 +548,8 @@ def list_kpi_values( "source_batch": v.source_batch or "", "data_status": v.data_status, "remark": v.remark or "", + # P0-① 三区标注: C区Bot回填时间 + "updated_at": v.calculated_at.strftime("%Y-%m-%d %H:%M") if v.calculated_at else None, } for v in vals] } @@ -608,6 +610,8 @@ def get_kpi(kpi_id: int, db: Session = Depends(get_db), entity_id: int = Depends "source_type": v.source_type, "data_status": v.data_status, "source_batch": v.source_batch, + # P0-① 三区标注: C区Bot回填时间(UI BotSourceTag 消费) + "updated_at": v.calculated_at.strftime("%Y-%m-%d %H:%M") if v.calculated_at else None, }) return result