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

273 lines
10 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,最小从7000开始)并插入系统路由记录
-- 2. 当route_type为'ADMIN'时,自动为所有管理员角色模板创建权限记录
-- 3. 当route_type为'USER'时,自动为所有用户角色模板创建权限记录
-- 4. 数据去重检查:
-- - m_system_routes: 检查 route + route_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_route: 路由地址
-- p_title_remark: 标题备注
-- p_route_type: 路由类型('ADMIN' 或 'USER')
-- ===================================================================
DROP PROCEDURE IF EXISTS InsertSystemRoute;
DELIMITER $$
CREATE PROCEDURE InsertSystemRoute(
IN p_remark VARCHAR(50),
IN p_route VARCHAR(255),
IN p_title_remark VARCHAR(50),
IN p_route_type CHAR(8)
)
proc_label: BEGIN
DECLARE v_new_route_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_route_id INT DEFAULT NULL;
DECLARE v_existing_right_count INT DEFAULT 0;
-- 声明游标结束处理器
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE;
-- ============================================================
-- 第一步:检查路由是否已存在(route + route_type 组合去重)
-- ============================================================
SELECT id INTO v_existing_route_id
FROM g3fo_base.m_system_routes
WHERE route = p_route AND route_type = p_route_type
LIMIT 1;
-- 如果路由已存在,直接返回错误信息
IF v_existing_route_id IS NOT NULL THEN
LEAVE proc_label; -- 退出存储过程
END IF;
-- ============================================================
-- 第二步:插入系统路由数据
-- ============================================================
-- 获取当前最大ID并加1
SELECT COALESCE(MAX(id), 6999) + 1 INTO v_new_route_id
FROM g3fo_base.m_system_routes;
-- 如果ID少于7000,从7000开始
IF v_new_route_id < 7000 THEN
SET v_new_route_id = 7000;
END IF;
-- 插入系统路由数据
INSERT INTO g3fo_base.m_system_routes (
id,
remark,
route,
title_remark,
route_type,
active_flag,
create_on,
update_on
) VALUES (
v_new_route_id,
p_remark,
p_route,
p_title_remark,
p_route_type,
1, -- 默认激活状态
NOW(),
NOW()
);
-- ============================================================
-- 第三步:根据route_type创建相应的角色权限记录
-- ============================================================
IF UPPER(p_route_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_route_id
AND user_right_type = 'ROTE';
-- 只有当权限记录不存在时才插入
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_route_id,
'ROTE',
NOW(),
NOW()
);
SET v_rights_count = v_rights_count + 1;
END IF;
END LOOP;
CLOSE admin_cursor;
END;
ELSEIF UPPER(p_route_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_route_id
AND user_right_type = 'ROTE';
-- 只有当权限记录不存在时才插入
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_route_id,
'ROTE',
NOW(),
NOW()
);
SET v_rights_count = v_rights_count + 1;
END IF;
END LOOP;
CLOSE user_cursor;
END;
END IF;
-- ============================================================
-- 返回结果
-- ============================================================
END$$
DELIMITER ;
-- ===================================================================
-- 在这里添加需要插入的路由
-- ===================================================================
CALL InsertSystemRoute('重试订单', '/trade/order/retryOrder', '订单', 'USER');
-- ===================================================================
-- 使用示例:
-- ===================================================================
-- 示例1: 插入管理员路由(会在 m_system_routes 中插入一条记录,
-- 同时在 m_admin_role_rights 中为所有管理员角色模板创建权限记录)
-- CALL InsertSystemRoute('用户管理', '/admin/user/list', '用户管理', 'ADMIN');
-- 示例2: 插入用户路由(会在 m_system_routes 中插入一条记录,
-- 同时在 m_user_role_rights 中为所有用户角色模板(除了id=9)创建权限记录)
-- CALL InsertSystemRoute('订单查询', '/user/order/list', '订单查询', 'USER');
-- ===================================================================
-- 说明:
-- ===================================================================
-- 当 route_type = 'ADMIN' 时:
-- - 在 g3fo_base.m_system_routes 中插入一条路由记录
-- - 自动获取 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: 'ROTE'
--
-- 当 route_type = 'USER' 时:
-- - 在 g3fo_base.m_system_routes 中插入一条路由记录
-- - 自动获取 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: 'ROTE'
--
-- 去重逻辑:
-- 1. 路由去重:如果 route + route_type 组合已存在,返回错误,不插入任何数据
-- 2. 权限去重:对于每个角色模板,检查 user_role_templates_id + user_right_id + user_right_type
-- 组合是否已存在,如果已存在则跳过该条记录,继续处理下一个
--
-- 返回结果:
-- - new_route_id: 新插入的路由ID
-- - route_type: 路由类型
-- - rights_created: 成功创建的权限记录数量
-- - status: 执行状态('Success' 或错误信息)
-- ===================================================================