USE g3fo_base; -- =================================================================== -- 存储过程:插入系统菜单数据 -- 功能: -- 1. 自动生成ID(最大ID+1)并插入系统菜单记录 -- 2. 当menu_type为'ADMIN'时,自动为所有管理员角色模板创建权限记录 -- 3. 当menu_type为'USER'时,自动为所有用户角色模板创建权限记录 -- 4. 数据去重检查: -- - m_system_menus: 检查 menu_name + menu_type 组合 -- - m_admin_role_rights: 检查 user_role_templates_id + user_right_id + user_right_type 组合 -- - m_user_role_rights: 检查 user_role_templates_id + user_right_id + user_right_type 组合 -- 参数: -- p_remark: 备注 -- p_menu_name: 菜单名称 -- p_title_remark: 标题备注 -- p_menu_type: 菜单类型('ADMIN' 或 'USER') -- p_description_i18n_id: 描述国际化ID(可选,默认为NULL) -- p_active_flag: 激活标志(可选,默认为1) -- =================================================================== DROP PROCEDURE IF EXISTS InsertSystemMenu; DELIMITER $$ CREATE PROCEDURE InsertSystemMenu( IN p_remark VARCHAR(50), IN p_menu_name VARCHAR(255), IN p_title_remark VARCHAR(50), IN p_menu_type CHAR(8), IN p_description_i18n_id CHAR(32), IN p_active_flag SMALLINT ) proc_label: BEGIN DECLARE v_new_menu_id INT; DECLARE v_done INT DEFAULT FALSE; DECLARE v_template_id BIGINT; DECLARE v_new_right_id INT; DECLARE v_rights_count INT DEFAULT 0; DECLARE v_existing_menu_id INT DEFAULT NULL; DECLARE v_existing_right_count INT DEFAULT 0; -- 声明游标结束处理器 DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; -- ============================================================ -- 第一步:检查菜单是否已存在(menu_name + menu_type 组合去重) -- ============================================================ SELECT id INTO v_existing_menu_id FROM g3fo_base.m_system_menus WHERE menu_name = p_menu_name AND menu_type = p_menu_type LIMIT 1; -- 如果菜单已存在,直接退出存储过程 IF v_existing_menu_id IS NOT NULL THEN LEAVE proc_label; -- 退出存储过程 END IF; -- ============================================================ -- 第二步:插入系统菜单数据 -- ============================================================ -- 获取当前最大ID并加1 SELECT COALESCE(MAX(id), 0) + 1 INTO v_new_menu_id FROM g3fo_base.m_system_menus; -- 设置默认值 IF p_active_flag IS NULL THEN SET p_active_flag = 1; END IF; -- 插入系统菜单数据 INSERT INTO g3fo_base.m_system_menus ( id, remark, menu_name, description_i18n_id, active_flag, title_remark, menu_type, create_by, create_on, update_by, update_on ) VALUES ( v_new_menu_id, p_remark, p_menu_name, p_description_i18n_id, p_active_flag, p_title_remark, p_menu_type, 'sys', NOW(), 'sys', NOW() ); -- ============================================================ -- 第三步:根据menu_type创建相应的角色权限记录 -- ============================================================ IF UPPER(p_menu_type) = 'ADMIN' THEN -- ======================================================== -- 为管理员角色模板创建权限记录 -- ======================================================== BEGIN DECLARE admin_cursor CURSOR FOR SELECT id FROM g3fo_admin.m_admin_role_templates; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SET v_done = FALSE; OPEN admin_cursor; admin_loop: LOOP FETCH admin_cursor INTO v_template_id; IF v_done THEN LEAVE admin_loop; END IF; -- 检查该权限记录是否已存在(去重检查) SET v_existing_right_count = 0; SELECT COUNT(*) INTO v_existing_right_count FROM g3fo_admin.m_admin_role_rights WHERE user_role_templates_id = v_template_id AND user_right_id = v_new_menu_id AND user_right_type = 'MENU'; -- 只有当权限记录不存在时才插入 IF v_existing_right_count = 0 THEN -- 获取当前最大的权限ID并加1 SELECT COALESCE(MAX(id), 0) + 1 INTO v_new_right_id FROM g3fo_admin.m_admin_role_rights; -- 插入管理员角色权限记录 INSERT INTO g3fo_admin.m_admin_role_rights ( id, user_role_templates_id, user_right_id, user_right_type, create_on, update_on ) VALUES ( v_new_right_id, v_template_id, v_new_menu_id, 'MENU', NOW(), NOW() ); SET v_rights_count = v_rights_count + 1; END IF; END LOOP; CLOSE admin_cursor; END; ELSEIF UPPER(p_menu_type) = 'USER' THEN -- ======================================================== -- 为用户角色模板创建权限记录(排除id=9) -- ======================================================== BEGIN DECLARE user_cursor CURSOR FOR SELECT id FROM g3fo_user.m_user_role_templates WHERE id != 9; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SET v_done = FALSE; OPEN user_cursor; user_loop: LOOP FETCH user_cursor INTO v_template_id; IF v_done THEN LEAVE user_loop; END IF; -- 检查该权限记录是否已存在(去重检查) SET v_existing_right_count = 0; SELECT COUNT(*) INTO v_existing_right_count FROM g3fo_user.m_user_role_rights WHERE user_role_templates_id = v_template_id AND user_right_id = v_new_menu_id AND user_right_type = 'MENU'; -- 只有当权限记录不存在时才插入 IF v_existing_right_count = 0 THEN -- 获取当前最大的权限ID并加1 SELECT COALESCE(MAX(id), 0) + 1 INTO v_new_right_id FROM g3fo_user.m_user_role_rights; -- 插入用户角色权限记录 INSERT INTO g3fo_user.m_user_role_rights ( id, user_role_templates_id, user_right_id, user_right_type, create_on, update_on ) VALUES ( v_new_right_id, v_template_id, v_new_menu_id, 'MENU', NOW(), NOW() ); SET v_rights_count = v_rights_count + 1; END IF; END LOOP; CLOSE user_cursor; END; END IF; -- ============================================================ -- 返回结果 -- ============================================================ END$$ DELIMITER ; -- =================================================================== -- 在这里添加需要插入的菜单 -- =================================================================== -- CALL InsertSystemMenu('菜单备注', 'menu-name', 'title_remark', 'ADMIN', NULL, 1); -- CALL InsertSystemMenu('菜单备注', 'menu-name', 'title_remark', 'USER', NULL, 1); -- =================================================================== -- 使用示例: -- =================================================================== -- 示例1: 插入管理员菜单(会在 m_system_menus 中插入一条记录, -- 同时在 m_admin_role_rights 中为所有管理员角色模板创建权限记录) -- CALL InsertSystemMenu('用户管理', 'user-management', 'user', 'ADMIN', NULL, 1); -- 示例2: 插入用户菜单(会在 m_system_menus 中插入一条记录, -- 同时在 m_user_role_rights 中为所有用户角色模板(除了id=9)创建权限记录) -- CALL InsertSystemMenu('订单查询', 'order-query', 'order', 'USER', NULL, 1); -- 示例3: 插入带国际化ID的管理员菜单 -- CALL InsertSystemMenu('报表管理', 'report-management', 'report', 'ADMIN', 'REPORT-0001', 1); -- =================================================================== -- 说明: -- =================================================================== -- 当 menu_type = 'ADMIN' 时: -- - 在 g3fo_base.m_system_menus 中插入一条菜单记录 -- - 自动获取 g3fo_admin.m_admin_role_templates 中所有id -- - 为每个角色模板在 g3fo_admin.m_admin_role_rights 中创建一条权限记录 -- * id: 自动递增(最大ID + 1) -- * user_role_templates_id: 角色模板ID -- * user_right_id: 新插入的菜单ID -- * user_right_type: 'MENU' -- -- 当 menu_type = 'USER' 时: -- - 在 g3fo_base.m_system_menus 中插入一条菜单记录 -- - 自动获取 g3fo_user.m_user_role_templates 中所有id(排除 id=9) -- - 为每个角色模板在 g3fo_user.m_user_role_rights 中创建一条权限记录 -- * id: 自动递增(最大ID + 1) -- * user_role_templates_id: 角色模板ID -- * user_right_id: 新插入的菜单ID -- * user_right_type: 'MENU' -- -- 去重逻辑: -- 1. 菜单去重:如果 menu_name + menu_type 组合已存在,返回错误,不插入任何数据 -- 2. 权限去重:对于每个角色模板,检查 user_role_templates_id + user_right_id + user_right_type -- 组合是否已存在,如果已存在则跳过该条记录,继续处理下一个 -- -- 参数说明: -- p_remark: 菜单备注(varchar(50)) -- p_menu_name: 菜单名称,唯一标识(varchar(255)) -- p_title_remark: 标题备注(varchar(50)) -- p_menu_type: 菜单类型,'ADMIN' 或 'USER'(char(8)) -- p_description_i18n_id: 描述国际化ID,可选(char(32)),默认为NULL -- p_active_flag: 激活标志,可选(smallint),默认为1 -- ===================================================================