# -*- coding: utf-8 -*- """盘点各模块 LayoutItem / KpiMaster 状况,评估 S4 样式推广工作量。""" from __future__ import annotations import sys import pymysql sys.stdout.reconfigure(encoding='utf-8') CONN = dict( host='123.60.180.165', port=3306, user='aidopremote', password='1234567890aiDOP#', database='aidopdev', charset='utf8mb4', autocommit=True, ) MODULES = ["S1", "S2", "S3", "S4", "S5", "S6", "S7", "S9"] TENANTS = [("默认", 1300000000001), ("Demo", 1300000000888)] def main() -> None: conn = pymysql.connect(**CONN) with conn.cursor(pymysql.cursors.DictCursor) as cur: # 1. KpiMaster 概览 print("=" * 100) print("【KpiMaster】各模块指标数(按层级)—— 仅默认租户视角") print("-" * 100) for m in MODULES: cur.execute( """ SELECT MetricLevel, COUNT(*) AS cnt FROM ado_smart_ops_kpi_master WHERE TenantId = %s AND ModuleCode = %s AND IsEnabled = 1 GROUP BY MetricLevel """, (TENANTS[0][1], m), ) rows = {r['MetricLevel']: r['cnt'] for r in cur.fetchall()} print(f" {m:<4} L1={rows.get(1, 0):<3} L2={rows.get(2, 0):<3} L3={rows.get(3, 0):<3}") # 2. LayoutItem 概览 print("\n" + "=" * 100) print("【LayoutItem】各模块已配置的布局行数 + PanelZone 分布") print("-" * 100) for tname, tid in TENANTS: print(f"\n --- [{tname}租户 {tid}] ---") for m in MODULES: cur.execute( """ SELECT MetricLevel, PanelZone, COUNT(*) AS cnt FROM ado_smart_ops_layout_item WHERE TenantId = %s AND ModuleCode = %s AND IsEnabled = 1 GROUP BY MetricLevel, PanelZone ORDER BY MetricLevel, PanelZone """, (tid, m), ) rows = cur.fetchall() total = sum(r['cnt'] for r in rows) if total == 0: print(f" {m:<4} (无布局)") continue parts = [] for r in rows: lv = f"L{r['MetricLevel']}" zone = r['PanelZone'] or "(空)" parts.append(f"{lv}/{zone}={r['cnt']}") print(f" {m:<4} total={total:<3} {' '.join(parts)}") # 3. 每个模块的 L2 指标清单(默认租户)+ PanelZone print("\n" + "=" * 100) print("【L2 详情】各模块 L2 指标 + 是否已分配 panel_zone(默认租户)") print("-" * 100) for m in MODULES: cur.execute( """ SELECT k.MetricCode, k.MetricName, k.Unit, li.PanelZone, li.SortNo AS LayoutSort FROM ado_smart_ops_kpi_master k LEFT JOIN ado_smart_ops_layout_item li ON li.TenantId = k.TenantId AND li.ModuleCode = k.ModuleCode AND li.MetricCode = k.MetricCode AND li.MetricLevel = 2 WHERE k.TenantId = %s AND k.ModuleCode = %s AND k.IsEnabled = 1 AND k.MetricLevel = 2 ORDER BY k.SortNo """, (TENANTS[0][1], m), ) rows = cur.fetchall() print(f"\n [{m}] L2={len(rows)} 条") for r in rows[:12]: zone = r['PanelZone'] or "—" print(f" {r['MetricCode']:<18} {r['MetricName']:<28} 单位={str(r['Unit']):<8} zone={zone}") if len(rows) > 12: print(f" ...(还有 {len(rows) - 12} 条省略)") conn.close() if __name__ == "__main__": main()