Files
shanxia2.0/docs/sql/migrations/2026-11-12-pl-etc-fuel-recharge-split-menus.sql
T

211 lines
9.2 KiB
SQL

-- 油卡充值与 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;