From b375cbfe25b246a09e42241d389051dcae18d53f Mon Sep 17 00:00:00 2001 From: DXC Date: Fri, 20 Mar 2026 09:31:33 +0800 Subject: [PATCH] fix: add stocktake and adjustment modules to role permission assignment UI --- inventory-backend/app/__init__.py | 3 +- .../app/services/permission_service.py | 159 +++++++++++++++++- 2 files changed, 160 insertions(+), 2 deletions(-) diff --git a/inventory-backend/app/__init__.py b/inventory-backend/app/__init__.py index 8606da7..6b910f5 100644 --- a/inventory-backend/app/__init__.py +++ b/inventory-backend/app/__init__.py @@ -158,8 +158,9 @@ def create_app(): from app.services.permission_service import PermissionService with app.app_context(): PermissionService.init_audit_menu() + PermissionService.init_stocktake_menus() except Exception as e: - print(f"⚠️ 审计日志菜单初始化跳过: {e}") + print(f"⚠️ 菜单初始化跳过: {e}") # ----------------------------------------------------- # 2.10 注册盘盈盘亏管理模块 (Stock Adjustment) diff --git a/inventory-backend/app/services/permission_service.py b/inventory-backend/app/services/permission_service.py index 884299f..f92b9f9 100644 --- a/inventory-backend/app/services/permission_service.py +++ b/inventory-backend/app/services/permission_service.py @@ -159,7 +159,7 @@ class PermissionService: # 1. 检查并创建审计日志菜单 menu_code = 'system_audit' existing_menu = SysMenu.query.filter_by(code=menu_code).first() - + if not existing_menu: new_menu = SysMenu( parent_id=0, @@ -201,3 +201,160 @@ class PermissionService: db.session.rollback() print(f"❌ 初始化审计日志菜单失败: {str(e)}") raise e + + @staticmethod + def init_stocktake_menus(): + """ + 初始化盘点管理菜单和权限 + 包括:顶级菜单、盲盘作业、盈亏调整、以及操作权限元素 + """ + try: + role_code = 'SUPER_ADMIN' + + # 1. 创建顶级菜单:盘点管理 + stocktake_mgmt_code = 'stocktake_mgmt' + stocktake_menu = SysMenu.query.filter_by(code=stocktake_mgmt_code).first() + if not stocktake_menu: + stocktake_menu = SysMenu( + parent_id=0, + name='盘点管理', + code=stocktake_mgmt_code, + path='/stocktake', + sort_order=30, + is_visible=True + ) + db.session.add(stocktake_menu) + db.session.flush() + print(f"✅ 盘点管理顶级菜单已创建") + else: + print(f"ℹ️ 盘点管理顶级菜单已存在") + + # 2. 创建子菜单:盲盘作业 + stocktake_op_code = 'inventory_stocktake' + stocktake_op_menu = SysMenu.query.filter_by(code=stocktake_op_code).first() + if not stocktake_op_menu: + stocktake_op_menu = SysMenu( + parent_id=stocktake_menu.id, + name='盲盘作业', + code=stocktake_op_code, + path='/stocktake/operation', + sort_order=1, + is_visible=True + ) + db.session.add(stocktake_op_menu) + db.session.flush() + print(f"✅ 盲盘作业菜单已创建") + else: + print(f"ℹ️ 盲盘作业菜单已存在") + + # 3. 为盲盘作业添加操作权限元素 + stocktake_op_element = SysElement.query.filter_by( + menu_code=stocktake_op_code, + code='inventory_stocktake:operation' + ).first() + if not stocktake_op_element: + stocktake_op_element = SysElement( + menu_code=stocktake_op_code, + name='盲盘操作', + code='inventory_stocktake:operation', + element_type='operation' + ) + db.session.add(stocktake_op_element) + print(f"✅ 盲盘作业操作权限已创建") + else: + print(f"ℹ️ 盲盘作业操作权限已存在") + + # 4. 创建子菜单:盈亏调整 + adjustment_code = 'stock_adjustment' + adjustment_menu = SysMenu.query.filter_by(code=adjustment_code).first() + if not adjustment_menu: + adjustment_menu = SysMenu( + parent_id=stocktake_menu.id, + name='盈亏调整', + code=adjustment_code, + path='/stocktake/adjustment', + sort_order=2, + is_visible=True + ) + db.session.add(adjustment_menu) + db.session.flush() + print(f"✅ 盈亏调整菜单已创建") + else: + print(f"ℹ️ 盈亏调整菜单已存在") + + # 5. 为盈亏调整添加列表权限元素 (stock_adjustment:list) + adjustment_list_element = SysElement.query.filter_by( + menu_code=adjustment_code, + code='stock_adjustment:list' + ).first() + if not adjustment_list_element: + adjustment_list_element = SysElement( + menu_code=adjustment_code, + name='盈亏列表', + code='stock_adjustment:list', + element_type='element' + ) + db.session.add(adjustment_list_element) + print(f"✅ 盈亏调整列表权限已创建") + else: + print(f"ℹ️ 盈亏调整列表权限已存在") + + # 6. 为盈亏调整添加操作权限元素 (stock_adjustment:operation) + adjustment_op_element = SysElement.query.filter_by( + menu_code=adjustment_code, + code='stock_adjustment:operation' + ).first() + if not adjustment_op_element: + adjustment_op_element = SysElement( + menu_code=adjustment_code, + name='盈亏操作', + code='stock_adjustment:operation', + element_type='operation' + ) + db.session.add(adjustment_op_element) + print(f"✅ 盈亏调整操作权限已创建") + else: + print(f"ℹ️ 盈亏调整操作权限已存在") + + # 7. 为超级管理员分配所有盘点相关权限 + menu_codes = [stocktake_mgmt_code, stocktake_op_code, adjustment_code] + for mc in menu_codes: + existing_perm = SysRolePermission.query.filter_by( + role_code=role_code, + target_code=mc, + type='menu' + ).first() + if not existing_perm: + new_perm = SysRolePermission( + role_code=role_code, + target_code=mc, + type='menu' + ) + db.session.add(new_perm) + print(f"✅ 超级管理员已赋予 {mc} 菜单权限") + + # 8. 分配操作权限 + op_codes = ['inventory_stocktake:operation', 'stock_adjustment:list', 'stock_adjustment:operation'] + for oc in op_codes: + existing_perm = SysRolePermission.query.filter_by( + role_code=role_code, + target_code=oc, + type='element' + ).first() + if not existing_perm: + new_perm = SysRolePermission( + role_code=role_code, + target_code=oc, + type='element' + ) + db.session.add(new_perm) + print(f"✅ 超级管理员已赋予 {oc} 操作权限") + + # 9. 提交 + db.session.commit() + return True + + except Exception as e: + db.session.rollback() + print(f"❌ 初始化盘点管理菜单失败: {str(e)}") + raise e