Files
agent-skills/skills/g3fo-db-ops/references/insert_system_menu_procedure.sql
T
2026-02-04 17:19:57 +08:00

288 lines
11 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
-- ===================================================================