diff --git a/docs/sql/migrations/2026-11-12-pl-etc-fuel-recharge-split-menus.sql b/docs/sql/migrations/2026-11-12-pl-etc-fuel-recharge-split-menus.sql new file mode 100644 index 000000000..8b398c303 --- /dev/null +++ b/docs/sql/migrations/2026-11-12-pl-etc-fuel-recharge-split-menus.sql @@ -0,0 +1,210 @@ +-- 油卡充值与 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;