_probe_module_layouts.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # -*- coding: utf-8 -*-
  2. """盘点各模块 LayoutItem / KpiMaster 状况,评估 S4 样式推广工作量。"""
  3. from __future__ import annotations
  4. import sys
  5. import pymysql
  6. sys.stdout.reconfigure(encoding='utf-8')
  7. CONN = dict(
  8. host='123.60.180.165', port=3306,
  9. user='aidopremote', password='1234567890aiDOP#',
  10. database='aidopdev', charset='utf8mb4', autocommit=True,
  11. )
  12. MODULES = ["S1", "S2", "S3", "S4", "S5", "S6", "S7", "S9"]
  13. TENANTS = [("默认", 1300000000001), ("Demo", 1300000000888)]
  14. def main() -> None:
  15. conn = pymysql.connect(**CONN)
  16. with conn.cursor(pymysql.cursors.DictCursor) as cur:
  17. # 1. KpiMaster 概览
  18. print("=" * 100)
  19. print("【KpiMaster】各模块指标数(按层级)—— 仅默认租户视角")
  20. print("-" * 100)
  21. for m in MODULES:
  22. cur.execute(
  23. """
  24. SELECT MetricLevel, COUNT(*) AS cnt
  25. FROM ado_smart_ops_kpi_master
  26. WHERE TenantId = %s AND ModuleCode = %s AND IsEnabled = 1
  27. GROUP BY MetricLevel
  28. """,
  29. (TENANTS[0][1], m),
  30. )
  31. rows = {r['MetricLevel']: r['cnt'] for r in cur.fetchall()}
  32. print(f" {m:<4} L1={rows.get(1, 0):<3} L2={rows.get(2, 0):<3} L3={rows.get(3, 0):<3}")
  33. # 2. LayoutItem 概览
  34. print("\n" + "=" * 100)
  35. print("【LayoutItem】各模块已配置的布局行数 + PanelZone 分布")
  36. print("-" * 100)
  37. for tname, tid in TENANTS:
  38. print(f"\n --- [{tname}租户 {tid}] ---")
  39. for m in MODULES:
  40. cur.execute(
  41. """
  42. SELECT MetricLevel, PanelZone, COUNT(*) AS cnt
  43. FROM ado_smart_ops_layout_item
  44. WHERE TenantId = %s AND ModuleCode = %s AND IsEnabled = 1
  45. GROUP BY MetricLevel, PanelZone
  46. ORDER BY MetricLevel, PanelZone
  47. """,
  48. (tid, m),
  49. )
  50. rows = cur.fetchall()
  51. total = sum(r['cnt'] for r in rows)
  52. if total == 0:
  53. print(f" {m:<4} (无布局)")
  54. continue
  55. parts = []
  56. for r in rows:
  57. lv = f"L{r['MetricLevel']}"
  58. zone = r['PanelZone'] or "(空)"
  59. parts.append(f"{lv}/{zone}={r['cnt']}")
  60. print(f" {m:<4} total={total:<3} {' '.join(parts)}")
  61. # 3. 每个模块的 L2 指标清单(默认租户)+ PanelZone
  62. print("\n" + "=" * 100)
  63. print("【L2 详情】各模块 L2 指标 + 是否已分配 panel_zone(默认租户)")
  64. print("-" * 100)
  65. for m in MODULES:
  66. cur.execute(
  67. """
  68. SELECT k.MetricCode, k.MetricName, k.Unit,
  69. li.PanelZone, li.SortNo AS LayoutSort
  70. FROM ado_smart_ops_kpi_master k
  71. LEFT JOIN ado_smart_ops_layout_item li
  72. ON li.TenantId = k.TenantId AND li.ModuleCode = k.ModuleCode
  73. AND li.MetricCode = k.MetricCode AND li.MetricLevel = 2
  74. WHERE k.TenantId = %s AND k.ModuleCode = %s AND k.IsEnabled = 1 AND k.MetricLevel = 2
  75. ORDER BY k.SortNo
  76. """,
  77. (TENANTS[0][1], m),
  78. )
  79. rows = cur.fetchall()
  80. print(f"\n [{m}] L2={len(rows)} 条")
  81. for r in rows[:12]:
  82. zone = r['PanelZone'] or "—"
  83. print(f" {r['MetricCode']:<18} {r['MetricName']:<28} 单位={str(r['Unit']):<8} zone={zone}")
  84. if len(rows) > 12:
  85. print(f" ...(还有 {len(rows) - 12} 条省略)")
  86. conn.close()
  87. if __name__ == "__main__":
  88. main()