-- 在权限库执行;先在同一会话显式设置以下两个变量,再执行本脚本: -- 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 ;