-- 油卡充值与 ETC 充值菜单拆分,并按已有油卡菜单同步角色。 -- MySQL 5.7 / utf8mb4。可重复执行。仅租户 shanxia2.0 的有效菜单。 -- 不移动 PL_VEH_FUEL_CARD,车油卡信息仍挂在油卡分组下。 -- 不改 docs/sql/shanxia2.0.sql 全量快照;快照仍是本迁移之前的数据,不要为这条脚本重导整库。 -- 审批菜单 PL_VEH_RECHARGE_APPROVAL 在快照与迁移中没有 F 按钮,本脚本不为 ETC 审批补按钮。 SET NAMES utf8mb4; START TRANSACTION; -- A. 原「ETC/油卡」分组改为油卡,path 让给下面新建的 ETC 分组。 UPDATE `sys_menu` SET `menu_name` = '油卡充值管理', `path` = 'fuel-recharge', `remark` = '油卡充值分组', `update_time` = NOW() WHERE `id` = 'PL_GROUP_VEH_RECHARGE' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0; UPDATE `sys_menu` SET `menu_name` = '油卡充值申请', `update_time` = NOW() WHERE `id` = 'PL_VEH_RECHARGE_APPLY' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0; UPDATE `sys_menu` SET `menu_name` = '油卡充值审批', `update_time` = NOW() WHERE `id` = 'PL_VEH_RECHARGE_APPROVAL' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0; UPDATE `sys_menu` SET `menu_name` = '油卡充值发放管理', `update_time` = NOW() WHERE `id` = 'PL_VEH_RECHARGE_RECORD' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0; UPDATE `sys_menu` SET `menu_name` = '油卡充值审批人设置', `update_time` = NOW() WHERE `id` = 'PL_VEH_RECHARGE_WF' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0; -- B. ETC 分组插在油卡分组原位置:先记下油卡 order_num,再把车辆管理下 -- order_num >= 该值的有效同级(含油卡本身,以及加油登记、维保等)全部 +1, -- 然后用记下的序号插入 ETC。这样 ETC 紧挨在油卡之前,且不会和油卡同号。 -- MySQL 5.7 的 UPDATE 不能在子查询里再读 sys_menu,所以序号先放进用户变量。 -- 仅当 ETC 分组尚不存在、且车辆管理与油卡分组都有效时才顺延;重复执行不再 +1。 -- 请在同一会话整文件执行,@oil_order 等用户变量不能跨连接。 SET @etc_group_exists := ( SELECT COUNT(*) FROM `sys_menu` WHERE `id` = 'PL_GROUP_VEH_ETC_RECHARGE' ); SET @vehicle_exists := ( SELECT COUNT(*) FROM `sys_menu` WHERE `id` = 'PL_GROUP_VEHICLE' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0 ); SET @oil_order := ( SELECT `order_num` FROM `sys_menu` WHERE `id` = 'PL_GROUP_VEH_RECHARGE' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0 LIMIT 1 ); UPDATE `sys_menu` SET `order_num` = `order_num` + 1, `update_time` = NOW() WHERE `parent_id` = 'PL_GROUP_VEHICLE' AND `tenant_no` = 'shanxia2.0' AND `del_flag` = 0 AND @etc_group_exists = 0 AND @vehicle_exists = 1 AND @oil_order IS NOT NULL AND `order_num` >= @oil_order; INSERT INTO `sys_menu` (`id`,`menu_name`,`parent_id`,`menu_type`,`path`,`component`,`perms`, `is_frame`,`visible`,`status`,`tenant_no`,`order_num`,`remark`,`create_by`,`create_dept_id`) SELECT 'PL_GROUP_VEH_ETC_RECHARGE', 'ETC充值管理', vehicle.id, 'M', 'etc-recharge', NULL, NULL, 1, '1', '1', vehicle.tenant_no, COALESCE(@oil_order, 1), 'ETC充值分组', 'system', '' FROM `sys_menu` vehicle WHERE vehicle.id = 'PL_GROUP_VEHICLE' AND vehicle.tenant_no = 'shanxia2.0' AND vehicle.del_flag = 0 AND NOT EXISTS ( SELECT 1 FROM `sys_menu` existing WHERE existing.id = 'PL_GROUP_VEH_ETC_RECHARGE' ); -- C. 四个页面菜单。审批人设置复用油卡流程权限,因此只按 id 判重,不能按 perms 判重。 INSERT INTO `sys_menu` (`id`,`menu_name`,`parent_id`,`menu_type`,`path`,`component`,`perms`, `is_frame`,`visible`,`status`,`tenant_no`,`order_num`,`create_by`,`create_dept_id`) SELECT item.id, item.menu_name, parent.id, 'C', item.path, item.component, item.perms, 1, '1', '1', parent.tenant_no, item.order_num, 'system', '' FROM `sys_menu` parent JOIN ( SELECT 'PL_ETC_VEH_RECHARGE_APPLY' AS id, 'ETC充值申请' AS menu_name, 'etc-vehicle-recharge-apply' AS path, 'pl/etc-vehicle-recharge-apply/index' AS component, 'pl:etc-vehicle-recharge-apply:list' AS perms, 1 AS order_num UNION ALL SELECT 'PL_ETC_VEH_RECHARGE_APPROVAL', 'ETC充值审批', 'etc-vehicle-recharge-approval', 'pl/etc-vehicle-recharge-approval/index', 'pl:etc-vehicle-recharge-approval:list', 2 UNION ALL SELECT 'PL_ETC_VEH_RECHARGE_RECORD', 'ETC发放管理', 'etc-vehicle-recharge-record', 'pl/etc-vehicle-recharge-record/index', 'pl:etc-vehicle-recharge-record:list', 3 UNION ALL SELECT 'PL_ETC_VEH_RECHARGE_WF', 'ETC充值审批人设置', 'etc-vehicle-recharge-workflow', 'pl/etc-vehicle-recharge-workflow/index', 'pl:vehicle-recharge-workflow:list', 4 ) item WHERE parent.id = 'PL_GROUP_VEH_ETC_RECHARGE' AND parent.tenant_no = 'shanxia2.0' AND parent.del_flag = 0 AND NOT EXISTS ( SELECT 1 FROM `sys_menu` existing WHERE existing.id = item.id ); -- D. 申请按钮,对照 PL_VRA_Q/A/E/R/C。 INSERT INTO `sys_menu` (`id`,`menu_name`,`parent_id`,`menu_type`,`path`,`component`,`perms`, `is_frame`,`visible`,`status`,`tenant_no`,`order_num`,`create_by`,`create_dept_id`) SELECT btn.id, btn.menu_name, parent.id, 'F', '', '', btn.perms, 1, '1', '1', parent.tenant_no, btn.order_num, 'system', '' FROM `sys_menu` parent JOIN ( SELECT 'PL_ETC_VRA_Q' AS id, '查询' AS menu_name, 'pl:etc-vehicle-recharge-apply:query' AS perms, 1 AS order_num UNION ALL SELECT 'PL_ETC_VRA_A', '新增', 'pl:etc-vehicle-recharge-apply:add', 2 UNION ALL SELECT 'PL_ETC_VRA_E', '编辑', 'pl:etc-vehicle-recharge-apply:edit', 3 UNION ALL SELECT 'PL_ETC_VRA_R', '删除', 'pl:etc-vehicle-recharge-apply:remove', 4 UNION ALL SELECT 'PL_ETC_VRA_C', '作废', 'pl:etc-vehicle-recharge-apply:cancel', 5 ) btn WHERE parent.id = 'PL_ETC_VEH_RECHARGE_APPLY' AND parent.tenant_no = 'shanxia2.0' AND parent.del_flag = 0 AND NOT EXISTS ( SELECT 1 FROM `sys_menu` existing WHERE existing.id = btn.id ); -- E. 发放按钮,对照 PL_VRR_Q/A/E/R。审批侧没有对应 F 按钮,这里不补。 INSERT INTO `sys_menu` (`id`,`menu_name`,`parent_id`,`menu_type`,`path`,`component`,`perms`, `is_frame`,`visible`,`status`,`tenant_no`,`order_num`,`create_by`,`create_dept_id`) SELECT btn.id, btn.menu_name, parent.id, 'F', '', '', btn.perms, 1, '1', '1', parent.tenant_no, btn.order_num, 'system', '' FROM `sys_menu` parent JOIN ( SELECT 'PL_ETC_VRR_Q' AS id, '查询' AS menu_name, 'pl:etc-vehicle-recharge-record:query' AS perms, 1 AS order_num UNION ALL SELECT 'PL_ETC_VRR_A', '新增', 'pl:etc-vehicle-recharge-record:add', 2 UNION ALL SELECT 'PL_ETC_VRR_E', '编辑', 'pl:etc-vehicle-recharge-record:edit', 3 UNION ALL SELECT 'PL_ETC_VRR_R', '删除', 'pl:etc-vehicle-recharge-record:remove', 4 ) btn WHERE parent.id = 'PL_ETC_VEH_RECHARGE_RECORD' AND parent.tenant_no = 'shanxia2.0' AND parent.del_flag = 0 AND NOT EXISTS ( SELECT 1 FROM `sys_menu` existing WHERE existing.id = btn.id ); -- G. 角色同步。拥有油卡页面(del_flag=0)且角色仍有效的,授予对等 ETC 页面、 -- 其下 F 按钮,以及最多三层祖先(ETC 分组、车辆管理、Web 根)。 -- 同一条 INSERT 里用 DISTINCT,避免一个角色同时拥有多个油卡页面时把祖先插重。 -- 已有任意 role_menu 行(含 del_flag=1)则跳过:不把软删除改回有效,也不另插一条把授权加回来。 INSERT INTO `sys_role_menu` (`id`,`role_id`,`menu_id`,`tenant_no`,`create_by`,`create_dept_id`) SELECT UUID(), grant_row.role_id, grant_row.menu_id, grant_row.tenant_no, 'system', '' FROM ( SELECT DISTINCT rm.role_id, target.id AS menu_id, rm.tenant_no FROM ( SELECT 'PL_VEH_RECHARGE_APPLY' AS source_id, 'PL_ETC_VEH_RECHARGE_APPLY' AS target_id UNION ALL SELECT 'PL_VEH_RECHARGE_APPROVAL', 'PL_ETC_VEH_RECHARGE_APPROVAL' UNION ALL SELECT 'PL_VEH_RECHARGE_RECORD', 'PL_ETC_VEH_RECHARGE_RECORD' UNION ALL SELECT 'PL_VEH_RECHARGE_WF', 'PL_ETC_VEH_RECHARGE_WF' ) mapping JOIN `sys_role_menu` rm ON rm.menu_id = mapping.source_id AND rm.tenant_no = 'shanxia2.0' AND rm.del_flag = 0 JOIN `sys_role` r ON r.id = rm.role_id AND r.tenant_no = rm.tenant_no AND r.del_flag = 0 AND r.status = '1' JOIN `sys_menu` child ON child.id = mapping.target_id AND child.tenant_no = rm.tenant_no AND child.del_flag = 0 LEFT JOIN `sys_menu` p1 ON p1.id = child.parent_id AND p1.tenant_no = rm.tenant_no AND p1.del_flag = 0 LEFT JOIN `sys_menu` p2 ON p2.id = p1.parent_id AND p2.tenant_no = rm.tenant_no AND p2.del_flag = 0 LEFT JOIN `sys_menu` p3 ON p3.id = p2.parent_id AND p3.tenant_no = rm.tenant_no AND p3.del_flag = 0 LEFT JOIN `sys_menu` btn ON btn.parent_id = child.id AND btn.tenant_no = rm.tenant_no AND btn.del_flag = 0 AND btn.menu_type = 'F' JOIN `sys_menu` target ON target.tenant_no = rm.tenant_no AND target.del_flag = 0 AND target.id IN (child.id, p1.id, p2.id, p3.id, btn.id) ) grant_row WHERE NOT EXISTS ( SELECT 1 FROM `sys_role_menu` existing WHERE existing.role_id = grant_row.role_id AND existing.menu_id = grant_row.menu_id AND existing.tenant_no = grant_row.tenant_no ); COMMIT;