-- backend/scripts/migrate_20260815_duty_menu_portal_fix.sql -- 修复:值班菜单改为一级目录 /duty + 叶子 schedule,才能出现在门户首页启动器 -- 可重复执行(幂等) -- 1) 一级目录「值班管理」 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`, `create_time`, `update_by`, `update_time`, `del_flag` ) VALUES ( 'DUTY000000000000000000000000000', '值班管理', '2', 'M', '/duty', '/index/index', NULL, 1, '1', '1', 'shanxia2.0', 85, '值班一级模块(门户首页分区)', 'system', '', NOW(), NULL, NOW(), 0 ) ON DUPLICATE KEY UPDATE `menu_name`=VALUES(`menu_name`), `parent_id`=VALUES(`parent_id`), `menu_type`=VALUES(`menu_type`), `path`=VALUES(`path`), `component`=VALUES(`component`), `visible`=VALUES(`visible`), `status`=VALUES(`status`); -- 2) 叶子「值班排班」挂到值班管理下 UPDATE `sys_menu` SET `parent_id` = 'DUTY000000000000000000000000000', `menu_type` = 'C', `path` = 'schedule', `component` = '/duty/schedule/index', `perms` = 'duty:schedule:list', `visible` = '1', `status` = '1', `order_num` = 1, `update_time` = NOW() WHERE `id` = 'DUTY000000000000000000000000001'; -- 3) 给「超级管理员」「管理员」授权(若已有则忽略) -- 注意:INSERT…SELECT 中 UUID() 在 MySQL 5.7 可能对多行算出相同值导致主键冲突, -- 故用 role_id+menu_id 派生确定性主键,保证幂等可重跑。 INSERT INTO `sys_role_menu` ( `id`, `role_id`, `menu_id`, `tenant_no`, `order_num`, `remark`, `create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag` ) SELECT CONCAT('DUTYRM', LEFT(MD5(CONCAT(r.id, '|', m.menu_id)), 26)), r.id, m.menu_id, 'shanxia2.0', NULL, 'duty portal', 'system', '', NOW(), NULL, NOW(), 0 FROM `sys_role` r JOIN ( SELECT 'DUTY000000000000000000000000000' AS menu_id UNION ALL SELECT 'DUTY000000000000000000000000001' ) m WHERE r.del_flag = 0 AND r.role_name IN ('超级管理员', '管理员') AND NOT EXISTS ( SELECT 1 FROM `sys_role_menu` rm WHERE rm.role_id = r.id AND rm.menu_id = m.menu_id AND IFNULL(rm.del_flag, 0) = 0 ) ON DUPLICATE KEY UPDATE `del_flag` = 0, `update_time` = NOW(), `remark` = VALUES(`remark`);