From c35228563d83d301a682c7b5579e35fd5549cdab Mon Sep 17 00:00:00 2001 From: Hermes CI Fix Date: Tue, 14 Jul 2026 11:02:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20BSC=E5=88=86=E7=B1=BB=E6=A0=91=E5=A4=9A?= =?UTF-8?q?=E9=80=89=E8=BF=87=E6=BB=A4=20=E2=80=94=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E7=BB=B4=E5=BA=A6/=E5=A4=9A=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E5=A4=8D=E9=80=89=EF=BC=8C=E6=95=B0=E9=87=8F=E5=87=86=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/kpis.py | 40 +++++++++++++++++++++++++++++----- frontend/src/views/KPIList.vue | 29 ++++++++++++++---------- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/backend/app/api/kpis.py b/backend/app/api/kpis.py index 8d2c020d..88639818 100644 --- a/backend/app/api/kpis.py +++ b/backend/app/api/kpis.py @@ -35,13 +35,13 @@ def list_kpis( if dims: query = query.filter(KPIDefinition.dimension.in_(dims)) if dimension: - query = query.filter(KPIDefinition.dimension == dimension) + dims_list = [d.strip() for d in dimension.split(',')] if ',' in dimension else [dimension] + query = query.filter(KPIDefinition.dimension.in_(dims_list)) if keyword: query = query.filter(KPIDefinition.kpi_name.contains(keyword)) - if epic: - query = query.filter(KPIDefinition.epic == epic) if category: - query = query.filter(KPIDefinition.category == category) + cats_list = [c.strip() for c in category.split(',')] if ',' in category else [category] + query = query.filter(KPIDefinition.category.in_(cats_list)) total = query.count() kpis = query.order_by(KPIDefinition.kpi_code).offset((page-1)*page_size).limit(page_size).all() return {"total": total, "page": page, "page_size": page_size, "data": [kpi_to_dict(k) for k in kpis]} @@ -134,7 +134,37 @@ def delete_kpi(kpi_id: int, db: Session = Depends(get_db), user=WRITE_ROLES): def kpi_to_dict(k): - return {c.name: getattr(k, c.name) for c in k.__table__.columns} + d = {c.name: getattr(k, c.name) for c in k.__table__.columns} + # 附加战略地图信息 + if k.map_id: + from app.database import get_session_local + try: + sess = get_session_local()() + m = sess.query(StrategicMap).filter(StrategicMap.id == k.map_id).first() + d["map_title"] = m.title if m else None + sess.close() + except: + d["map_title"] = None + else: + d["map_title"] = None + return d + + +@router.put("/{kpi_id}/associate-map") +def associate_kpi_map(kpi_id: int, data: dict, db: Session = Depends(get_db), user=WRITE_ROLES): + """关联KPI到战略地图""" + kpi = db.query(KPIDefinition).filter(KPIDefinition.id == kpi_id).first() + if not kpi: + raise HTTPException(404, "KPI不存在") + map_id = data.get("map_id") + if map_id is not None: + m = db.query(StrategicMap).filter(StrategicMap.id == map_id).first() + if not m: + raise HTTPException(404, "战略地图不存在") + kpi.map_id = map_id + db.commit() + _log(db, 1, "update", "kpi", kpi_id, {"action": "associate-map", "map_id": map_id}) + return kpi_to_dict(kpi) def _log(db, user_id, action, target_type, target_id, detail): diff --git a/frontend/src/views/KPIList.vue b/frontend/src/views/KPIList.vue index 9f1e9e66..51e9b2a6 100644 --- a/frontend/src/views/KPIList.vue +++ b/frontend/src/views/KPIList.vue @@ -94,6 +94,12 @@ + + +