131 lines
4.9 KiB
Python
131 lines
4.9 KiB
Python
|
|
#!/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())
|