-- Apply after the Admin and UI versions containing the full-sync monitor are deployed. -- In System Management > Roles, grant both the parent System Monitor menu -- and the Full Sync child menu to ops roles. Grant Start/Failure Details -- separately as needed. This script does not change any role assignments. INSERT INTO sys_menu (menu_name, parent_id, level, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, remark) SELECT '全量同步', parent.menu_id, 1, 7, 'full-sync', 'monitor/full-sync/index', '', 1, 0, 'C', '0', '0', 'iot:fullSyncRuns:view', 'lucide:refresh-cw', '全量同步结果与手动启动' FROM sys_menu AS parent WHERE parent.path = 'monitor' AND parent.parent_id = 0 AND NOT EXISTS ( SELECT 1 FROM sys_menu AS existing WHERE existing.parent_id = parent.menu_id AND existing.path = 'full-sync' ); INSERT INTO sys_menu (menu_name, parent_id, level, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, remark) SELECT permissions.name, menu.menu_id, 2, permissions.order_num, '', '', '', 1, 0, 'F', '0', '0', permissions.perms, '#', '' FROM sys_menu AS menu JOIN sys_menu AS parent ON menu.parent_id = parent.menu_id AND parent.path = 'monitor' AND parent.parent_id = 0 JOIN ( SELECT '查看失败明细' AS name, 1 AS order_num, 'iot:fullSyncRuns:failures' AS perms UNION ALL SELECT '手动启动全量同步', 2, 'iot:fullSyncRuns:start' ) AS permissions WHERE menu.path = 'full-sync' AND NOT EXISTS ( SELECT 1 FROM sys_menu AS existing WHERE existing.parent_id = menu.menu_id AND existing.perms = permissions.perms );