diff --git a/inventory-backend/app/__init__.py b/inventory-backend/app/__init__.py index 6b910f5..8985260 100644 --- a/inventory-backend/app/__init__.py +++ b/inventory-backend/app/__init__.py @@ -157,6 +157,8 @@ def create_app(): try: from app.services.permission_service import PermissionService with app.app_context(): + # 先清理旧版菜单,再初始化新版 + PermissionService.cleanup_legacy_stocktake_menus() PermissionService.init_audit_menu() PermissionService.init_stocktake_menus() except Exception as e: diff --git a/inventory-backend/app/services/permission_service.py b/inventory-backend/app/services/permission_service.py index f92b9f9..16bacf1 100644 --- a/inventory-backend/app/services/permission_service.py +++ b/inventory-backend/app/services/permission_service.py @@ -358,3 +358,33 @@ class PermissionService: db.session.rollback() print(f"❌ 初始化盘点管理菜单失败: {str(e)}") raise e + + @staticmethod + def cleanup_legacy_stocktake_menus(): + """ + 清理残留的旧版库存盘点菜单 + 如果数据库中存在挂在入库管理下的旧版库存盘点菜单,清理掉 + """ + try: + # 查找可能存在的旧版库存盘点菜单(入库管理下的 stocktake) + # 旧版可能在入库管理 (path like '%inventory%stocktake') 或者 code 包含 stocktake 但不是新的 + legacy_menus = SysMenu.query.filter( + SysMenu.code.in_(['stocktake', 'inventory_stocktake_old']) + ).all() + + for menu in legacy_menus: + # 删除关联的权限 + SysRolePermission.query.filter_by(target_code=menu.code).delete() + # 删除关联的元素 + SysElement.query.filter_by(menu_code=menu.code).delete() + # 删除菜单 + db.session.delete(menu) + print(f"🗑️ 已清理旧版库存盘点菜单: {menu.code} ({menu.name})") + + db.session.commit() + return True + + except Exception as e: + db.session.rollback() + print(f"⚠️ 清理旧版菜单失败: {str(e)}") + return False