_fix_uat_dp_menus.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # -*- coding: utf-8 -*-
  2. """补齐 UAT 库缺失的 2 个数据平台菜单(业务动作日志/出站回写队列)+ 租户链接。
  3. 等价于 AidopMenuLinkSync.EnsureDataPlatformSeedMenus + 租户链接同步的启动效果。
  4. 用法:python _fix_uat_dp_menus.py check | fix | revoke
  5. """
  6. from __future__ import annotations
  7. import sys
  8. from datetime import datetime
  9. import pymysql
  10. CONN = dict(host="123.60.180.165", port=3306, user="aidopremote", password="1234567890aiDOP#",
  11. database="aidopdev", charset="utf8mb4", connect_timeout=15)
  12. PID = 1320990000400
  13. CREATE_TIME = datetime(2022, 2, 10)
  14. MENUS = [
  15. dict(Id=1320990000407, Pid=PID, Type=2, Name="aidopDataPlatformActionRunLogs",
  16. Path="/aidop/data-platform/action-run-logs", Component="/aidop/data-platform/actionRunLogs",
  17. Title="业务动作日志", Icon="ele-Document", OrderNo=55,
  18. Remark="订单评审、排程、下达、采购闭环等动作运行日志"),
  19. dict(Id=1320990000408, Pid=PID, Type=2, Name="aidopDataPlatformOutbox",
  20. Path="/aidop/data-platform/outbox", Component="/aidop/data-platform/outbox",
  21. Title="出站回写队列", Icon="ele-Upload", OrderNo=57,
  22. Remark="Outbox 死信监控与手工重推"),
  23. ]
  24. TM_ID_BASE = 8382990001000 # SysTenantMenu 本次插入 Id 段
  25. def main():
  26. mode = sys.argv[1] if len(sys.argv) > 1 else "check"
  27. conn = pymysql.connect(**CONN)
  28. try:
  29. cur = conn.cursor()
  30. marks = ",".join(str(m["Id"]) for m in MENUS)
  31. cur.execute(f"SELECT Id, Title, Status FROM SysMenu WHERE Id IN ({marks})")
  32. print("SYSMENU", cur.fetchall())
  33. cur.execute("SHOW COLUMNS FROM SysTenantMenu")
  34. tm_cols = [r[0] for r in cur.fetchall()]
  35. print("TM COLUMNS", tm_cols)
  36. cur.execute("SELECT Id FROM SysTenant")
  37. tenants = [(r[0], None) for r in cur.fetchall()]
  38. print("TENANTS", tenants)
  39. if mode == "fix":
  40. for m in MENUS:
  41. cur.execute(
  42. "INSERT INTO SysMenu (Id, Pid, Type, Name, Path, Component, Redirect, Permission, Title, Icon,"
  43. " IsIframe, OutLink, IsHide, IsKeepAlive, IsAffix, OrderNo, Status, Remark, CreateTime)"
  44. " VALUES (%s,%s,%s,%s,%s,%s,NULL,NULL,%s,%s,0,NULL,0,1,0,%s,1,%s,%s)",
  45. (m["Id"], m["Pid"], m["Type"], m["Name"], m["Path"], m["Component"], m["Title"],
  46. m["Icon"], m["OrderNo"], m["Remark"], CREATE_TIME),
  47. )
  48. i = 0
  49. for (tid, _ttype) in tenants:
  50. for m in MENUS:
  51. cur.execute("SELECT COUNT(*) FROM SysTenantMenu WHERE TenantId=%s AND MenuId=%s",
  52. (tid, m["Id"]))
  53. if cur.fetchone()[0]:
  54. continue
  55. cur.execute("INSERT INTO SysTenantMenu (Id, TenantId, MenuId) VALUES (%s,%s,%s)",
  56. (TM_ID_BASE + i, tid, m["Id"]))
  57. i += 1
  58. conn.commit()
  59. print("FIX DONE, tenant links inserted:", i)
  60. elif mode == "revoke":
  61. cur.execute(f"DELETE FROM SysTenantMenu WHERE Id BETWEEN {TM_ID_BASE} AND {TM_ID_BASE + 999}")
  62. cur.execute(f"DELETE FROM SysMenu WHERE Id IN ({marks})")
  63. conn.commit()
  64. print("REVOKE DONE")
  65. finally:
  66. conn.close()
  67. if __name__ == "__main__":
  68. main()