211 lines
9.2 KiB
SQL
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;
|