#!/usr/bin/env python3 """修复重复的工单管理菜单""" import asyncio from sqlalchemy.ext.asyncio import create_async_engine from sqlalchemy import text DB_CONFIG = { 'host': '123.57.81.127', 'port': 3306, 'user': 'cpy_admin', 'password': 'Tgzz2025+', 'database': 'ruoyi-fastapi' } DATABASE_URL = ( f"mysql+asyncmy://{DB_CONFIG['user']}:{DB_CONFIG['password']}@" f"{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}" ) async def fix_duplicate_menu(): engine = create_async_engine(DATABASE_URL, echo=False) async with engine.connect() as conn: print("=" * 80) print("Fixing Duplicate Work Order Management Menus") print("=" * 80) # 1. 查找所有工单管理相关的菜单 print("\n[1] Finding all work order related menus...") result = await conn.execute(text(""" SELECT menu_id, menu_name, path, parent_id, menu_type, order_num FROM sys_menu WHERE menu_name LIKE '%工单%' OR path LIKE '%workorder%' OR path LIKE '%test_work_order%' ORDER BY menu_id """)) rows = result.fetchall() print(f" Found {len(rows)} work order related menus:") for row in rows: print(f" ID:{row[0]} | {row[1]} | Path:{row[2]} | Parent:{row[3]} | Type:{row[4]} | Order:{row[5]}") # 2. 检查重复的工单管理目录 print("\n[2] Checking for duplicate '工单管理' directories...") result = await conn.execute(text(""" SELECT menu_id, menu_name, path, order_num FROM sys_menu WHERE menu_name = '工单管理' AND menu_type = 'M' AND parent_id = 0 ORDER BY menu_id """)) rows = result.fetchall() if len(rows) > 1: print(f" Found {len(rows)} duplicate '工单管理' directories:") for row in rows: print(f" ID:{row[0]} | Path:{row[2]} | Order:{row[3]}") # 保留第一个,删除其他的 keep_id = rows[0][0] delete_ids = [row[0] for row in rows[1:]] print(f"\n Keeping ID: {keep_id}") print(f" Deleting IDs: {delete_ids}") for delete_id in delete_ids: # 先删除子菜单 await conn.execute(text(f""" DELETE FROM sys_menu WHERE parent_id = {delete_id} """)) await conn.commit() print(f" Deleted children of menu {delete_id}") # 再删除目录 await conn.execute(text(f""" DELETE FROM sys_menu WHERE menu_id = {delete_id} """)) await conn.commit() print(f" Deleted menu {delete_id}") else: print(" No duplicate directories found") # 3. 检查重复的工单管理菜单项 print("\n[3] Checking for duplicate '工单管理' menu items...") result = await conn.execute(text(""" SELECT menu_id, menu_name, path, parent_id, order_num FROM sys_menu WHERE path IN ('/test_work_order', 'test_work_order') AND menu_type = 'C' ORDER BY menu_id """)) rows = result.fetchall() if len(rows) > 1: print(f" Found {len(rows)} duplicate '工单管理' menu items:") for row in rows: print(f" ID:{row[0]} | Path:{row[2]} | Parent:{row[3]}") # 4. 确保工单领取在正确的父级下 print("\n[4] Checking work order claim menu position...") result = await conn.execute(text(""" SELECT m.menu_id, m.menu_name, m.path, m.parent_id, p.menu_name as parent_name FROM sys_menu m LEFT JOIN sys_menu p ON m.parent_id = p.menu_id WHERE m.path = '/workorder/claim' OR m.path = 'workorder/claim' """)) row = result.fetchone() if row: print(f" Work Order Claim: ID:{row[0]} | Path:{row[2]} | Parent:{row[3]} ({row[4]})") # 5. 最终验证 print("\n[5] Final verification:") result = await conn.execute(text(""" SELECT menu_id, menu_name, path, parent_id, menu_type FROM sys_menu WHERE menu_name LIKE '%工单%' OR path LIKE '%workorder%' ORDER BY menu_id """)) rows = result.fetchall() print(f" Remaining work order menus ({len(rows)}):") for row in rows: parent_str = f"Parent:{row[3]}" if row[3] else "Root" print(f" ID:{row[0]} | {row[1]} | Path:{row[2]} | {parent_str} | Type:{row[4]}") print("\n" + "=" * 80) print("Fix Complete") print("=" * 80) print("\nPlease logout and login again to refresh the menu") await engine.dispose() if __name__ == '__main__': asyncio.run(fix_duplicate_menu())