-- Issue #13:在项目管理菜单种子之后执行,可重复执行。 -- 项目与市场使用同一 Web 虚拟根;不创建/改动移动根或移动菜单。 -- 保留四个叶子菜单及按钮 ID,仅迁移父级和路由;已有角色只补新祖先权限。 START TRANSACTION; INSERT INTO sys_menu (id, menu_name, parent_id, menu_type, path, component, perms, is_frame, visible, status, tenant_no, order_num, create_dept_id, create_time, update_time, del_flag) SELECT MD5(CONCAT(market.tenant_no, ':menu:project')), '项目', market.parent_id, 'M', '/project', '/index/index', 'menu:project', 1, '1', '1', market.tenant_no, COALESCE(market.order_num, 1) - 1, '', NOW(), NOW(), 0 FROM sys_menu market WHERE market.perms='menu:market' AND market.del_flag=0 AND NOT EXISTS (SELECT 1 FROM sys_menu existing WHERE existing.tenant_no=market.tenant_no AND existing.perms='menu:project'); UPDATE sys_menu leaf JOIN sys_menu top_menu ON top_menu.tenant_no=leaf.tenant_no AND top_menu.perms='menu:project' AND top_menu.del_flag=0 SET leaf.parent_id=top_menu.id, leaf.path=CASE leaf.perms WHEN 'project:team:list' THEN 'teams' WHEN 'project:project:list' THEN 'projects' WHEN 'project:statistics:list' THEN 'statistics' WHEN 'project:assignment:edit' THEN 'assignments' END, leaf.menu_name=CASE WHEN leaf.perms='project:assignment:edit' THEN '历史归属维护' ELSE leaf.menu_name END, leaf.update_time=NOW() WHERE leaf.del_flag=0 AND leaf.perms IN ( 'project:team:list', 'project:project:list', 'project:statistics:list', 'project:assignment:edit'); -- 仅拥有项目子菜单/按钮的角色补齐“项目”及原 Web 虚拟根,不给仅有市场权限的角色新增业务权限。 INSERT INTO sys_role_menu (id, role_id, menu_id, tenant_no, create_dept_id, create_time, update_time, del_flag) SELECT DISTINCT MD5(CONCAT(grant_row.tenant_no, ':project-ancestor:', grant_row.role_id, ':', ancestor.id)), grant_row.role_id, ancestor.id, grant_row.tenant_no, '', NOW(), NOW(), 0 FROM sys_role_menu grant_row JOIN sys_role role_row ON role_row.id=grant_row.role_id AND role_row.tenant_no=grant_row.tenant_no AND role_row.del_flag=0 JOIN sys_menu leaf ON leaf.id=grant_row.menu_id AND leaf.tenant_no=grant_row.tenant_no AND leaf.del_flag=0 AND leaf.perms IN ('project:team:list', 'project:project:list', 'project:statistics:list', 'project:assignment:edit', 'project:team:edit', 'project:project:edit') JOIN sys_menu top_menu ON top_menu.tenant_no=grant_row.tenant_no AND top_menu.perms='menu:project' AND top_menu.del_flag=0 JOIN sys_menu ancestor ON ancestor.tenant_no=grant_row.tenant_no AND ancestor.del_flag=0 AND (ancestor.id=top_menu.id OR ancestor.id=top_menu.parent_id) WHERE grant_row.del_flag=0 AND NOT EXISTS (SELECT 1 FROM sys_role_menu existing WHERE existing.tenant_no=grant_row.tenant_no AND existing.role_id=grant_row.role_id AND existing.menu_id=ancestor.id AND existing.del_flag=0) ON DUPLICATE KEY UPDATE del_flag=0, update_time=NOW(); COMMIT;