Files
zkxw/docs/sql/migrations/2026-11-02-project_top_menu.sql
T
zlwu f41e6f60d6 feat(projects): move management pages into a dedicated top-level menu
Add the Project navigation group alongside Market, Production and Quality. Preserve existing leaf IDs and role grants while migrating the menu hierarchy, keep legacy URLs redirecting, and align frontend/backend menus.
2026-11-02 16:22:18 +08:00

52 lines
3.0 KiB
SQL

-- 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;