Files
biz-api-cloud-zax/db/20261102_add_mch_checkout_relation_menu.sql
T
2026-11-02 18:16:37 +08:00

83 lines
4.3 KiB
SQL

-- 在权限库执行;先在同一会话显式设置以下两个变量,再执行本脚本:
-- SET @checkout_relation_tenant_id = 目标租户ID;
-- SET @checkout_relation_parent_id = 已存在的商户业务父菜单ID;
-- 不自动授予角色;执行后按需分配查看、新增、编辑、删除权限。
-- 沿用当前代码中菜单0、按钮1的持久化协议(历史表注释与实际代码不一致)。
DELIMITER $$
DROP PROCEDURE IF EXISTS `migrate_20261102_mch_checkout_relation_menu`$$
CREATE PROCEDURE `migrate_20261102_mch_checkout_relation_menu`()
BEGIN
DECLARE v_page_id BIGINT;
DECLARE v_count INT;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
IF @checkout_relation_tenant_id IS NULL OR @checkout_relation_tenant_id <= 0
OR @checkout_relation_parent_id IS NULL OR @checkout_relation_parent_id <= 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '请先显式设置目标租户和父菜单ID';
END IF;
START TRANSACTION;
-- 锁定同一父菜单,串行化重复或并发安装,不依赖sys_menu额外唯一索引。
SELECT menu_id INTO v_page_id FROM sys_menu
WHERE menu_id = @checkout_relation_parent_id AND tenant_id = @checkout_relation_tenant_id
AND del_flag = '0' AND menu_type = '0' FOR UPDATE;
IF v_page_id IS NULL THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '父菜单不存在、租户不匹配或不是可用菜单';
END IF;
SELECT COUNT(*), MAX(menu_id) INTO v_count, v_page_id FROM sys_menu
WHERE tenant_id = @checkout_relation_tenant_id AND del_flag = '0'
AND path = '/mch/checkout/setting/index';
IF v_count > 1 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '已存在重复结账关系菜单,请先人工检查';
END IF;
IF v_count = 1 AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE menu_id = v_page_id AND parent_id = @checkout_relation_parent_id
AND menu_type = '0' AND (component IS NULL OR component = 'mch/checkout/setting/index')
) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '已存在菜单位置或组件不符,请先人工检查';
END IF;
IF v_count = 0 THEN
SET v_page_id = UUID_SHORT();
INSERT INTO sys_menu (menu_id, name, path, component, parent_id, icon, visible, sort_order,
keep_alive, menu_type, create_by, create_time, update_by, update_time, del_flag, tenant_id)
VALUES (v_page_id, '商户结账关系', '/mch/checkout/setting/index', 'mch/checkout/setting/index',
@checkout_relation_parent_id, 'ele-Connection', '1', 80, '1', '0',
'admin', NOW(), 'admin', NOW(), '0', @checkout_relation_tenant_id);
END IF;
IF EXISTS (
SELECT 1 FROM sys_menu WHERE tenant_id = @checkout_relation_tenant_id AND del_flag = '0'
AND permission IN ('wallet_mchCheckoutRelation_view', 'wallet_mchCheckoutRelation_add',
'wallet_mchCheckoutRelation_edit', 'wallet_mchCheckoutRelation_del')
AND (parent_id <> v_page_id OR menu_type <> '1')
) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '结账关系权限已被其他菜单占用,请先人工检查';
END IF;
INSERT INTO sys_menu (menu_id, name, permission, parent_id, visible, sort_order, keep_alive,
menu_type, create_by, create_time, update_by, update_time, del_flag, tenant_id)
SELECT UUID_SHORT(), p.name, p.permission, v_page_id, '1', p.sort_order, '0',
'1', 'admin', NOW(), 'admin', NOW(), '0', @checkout_relation_tenant_id
FROM (
SELECT '查看结账关系' name, 'wallet_mchCheckoutRelation_view' permission, 1 sort_order
UNION ALL SELECT '新增结账关系', 'wallet_mchCheckoutRelation_add', 2
UNION ALL SELECT '编辑结账关系', 'wallet_mchCheckoutRelation_edit', 3
UNION ALL SELECT '删除结账关系', 'wallet_mchCheckoutRelation_del', 4
) p
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu m WHERE m.tenant_id = @checkout_relation_tenant_id
AND m.parent_id = v_page_id AND m.permission = p.permission AND m.del_flag = '0'
);
COMMIT;
END$$
CALL `migrate_20261102_mch_checkout_relation_menu`()$$
DROP PROCEDURE `migrate_20261102_mch_checkout_relation_menu`$$
DELIMITER ;