-- ============================================ -- 演示环境种子数据:sys_menu 与生产全量对齐(2026-10-27) -- -- 背景:演示库 sys_menu 420 条,生产 459 条,缺 27 条增量(生产有、演示无), -- 反向差异 0 条(演示无多余菜单)。缺的包括: -- · 达量断网 4 个按钮权限(excel:template / excel:submit / range:submit / input:submit) -- —— 这是"达量断网页面按钮点了 403 / 看不到功能"的直接原因 -- · 全量同步页(fullSyncRuns:view/failures/start/replay/replay:view)5 条 -- · 订单模块(订单目录 + 管理员订单 + 销售订单列表)3 条 -- · 文档中心(含 Web 手册 / OpenAPI 文档)3 条 -- · 财务/流量池/通道/销户等按钮权限 12 条 -- -- 方法:以 perms 为语义键做比对(perms 为空时用 menu_type+menu_name), -- 生产 ID 与演示 ID 体系不同,故新建菜单占用演示 421-447 段, -- 父级按语义递归解析到演示现有菜单(0 个悬空)。 -- -- 结果:演示 447 条;与生产逐条比对 —— 缺 0 条、多余 0 条。 -- 数量差 12 = 演示独有的 5 条租户按钮(system:tenant:*) -- + 生产侧 7 条同 perms 的重复菜单(语义键去重后合并) -- -- 角色绑定:演示仅 5 个角色,新菜单绑到 2/82/88(原有的全量绑定角色), -- 与它们各自 190 条的绑定模式一致;role 3/4 是限定角色,不绑。 -- -- 前置知识:超管(role 1) 的菜单可见性走代码分支直接返回全部 status=0 菜单; -- 但接口鉴权的 accessCodeList 仍需 sys_role_menu 里有该菜单, -- 否则 normalizeMenuAccessCodes 拿不到 perms → 按钮/功能 403。 -- -- 幂等:先删后插,可重复执行。执行顺序:10 之后(11-)。 -- ============================================ SET NAMES utf8mb4; USE `db_iotlcm`; DELETE FROM `sys_menu` WHERE `menu_id` BETWEEN 421 AND 447; INSERT INTO `sys_menu` (`menu_id`,`menu_name`,`parent_id`,`order_num`,`path`,`component`,`is_frame`,`is_cache`,`menu_type`,`visible`,`status`,`perms`,`icon`,`created_dept`,`created_by`,`created_at`,`remark`) VALUES (421,'全量同步',2,7,'full-sync','monitor/full-sync/index','1','0','C','0','0','cpm:iot:fullSyncRuns:view','lucide:refresh-cw',100,1,NOW(),'全量同步结果与手动启动'), (422,'查看失败明细',421,1,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:failures','#',100,1,NOW(),NULL), (423,'手动启动同步',421,2,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:start','#',100,1,NOW(),NULL), (424,'重投失败卡',421,3,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:replay','#',100,1,NOW(),NULL), (425,'查看重投状态',421,4,'',NULL,'1','0','F','0','0','cpm:iot:fullSyncRuns:replay:view','#',100,1,NOW(),NULL), (426,'订单',196,10,'TOrder',NULL,'1','0','M','0','0',NULL,NULL,100,1,NOW(),NULL), (427,'管理员订单',426,11,'indexTwo','iotlcm/tOrder/indexTwo','1','0','C','0','0',NULL,'ant-design:appstore-outlined',100,1,NOW(),NULL), (428,'获取财务审核记录表列表',354,10,'',NULL,'1','0','F','0','0','gen:tFinanceAuditRecord:list',NULL,100,1,NOW(),NULL), (429,'获取财务申请表列表',349,10,'',NULL,'1','0','F','0','0','gen:tFinanceApply:list',NULL,100,1,NOW(),NULL), (430,'获取分层分润概览',334,10,'',NULL,'1','0','F','0','0','common:tFinCommissionDetail:getCommissionOverview',NULL,100,1,NOW(),NULL), (431,'获取SIM流量池套餐配置表列表',411,10,'',NULL,'1','0','F','0','0','iot:tFlowPackageConfig:list',NULL,100,1,NOW(),NULL), (432,'敏感定价查看',135,15,'',NULL,'1','0','F','0','0','iot:tSimFlowPackagePrice:sensitive:view',NULL,100,1,NOW(),NULL), (433,'敏感定价维护',135,15,'',NULL,'1','0','F','0','0','iot:tSimFlowPackagePrice:sensitive:edit',NULL,100,1,NOW(),NULL), (434,'下载批量卡销户Excel模板',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardCancel:excel:template',NULL,100,1,NOW(),NULL), (435,'提交Excel批量卡销户',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardCancel:excel:submit',NULL,100,1,NOW(),NULL), (436,'通道测试',119,10,'',NULL,'1','0','F','0','0','iot:tSimChannels:test',NULL,100,1,NOW(),NULL), (437,'提交批量输入达量断网配置',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:input:submit',NULL,100,1,NOW(),NULL), (438,'单卡加油包',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardBindPkg:addPackage',NULL,100,1,NOW(),NULL), (439,'流量池加油包',257,10,'',NULL,'1','0','F','0','0','iot:tSimPoolBindPackage:addPackage',NULL,100,1,NOW(),NULL), (440,'看订购表/套餐详情',257,10,'',NULL,'1','0','F','0','0','iot:tSimCardBindPkg:view',NULL,100,1,NOW(),NULL), (441,'下载达量断网配置Excel模板',416,1,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:excel:template',NULL,100,1,NOW(),NULL), (442,'提交Excel批量达量断网配置',416,1,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:excel:submit',NULL,100,1,NOW(),NULL), (443,'提交连号达量断网配置',416,1,'',NULL,'1','0','F','0','0','iot:tSimCardTrafficCutoff:range:submit',NULL,100,1,NOW(),NULL), (444,'文档中心',0,33,'','/','1','0','C','0','0',NULL,NULL,100,1,NOW(),NULL), (445,'Web 使用手册',444,1,'/docs/manual/web/',NULL,'0','0','C','0','0',NULL,NULL,100,1,NOW(),NULL), (446,'OpenAPI 文档',444,2,'/docs/openapi/v3/',NULL,'0','0','C','0','0',NULL,NULL,100,1,NOW(),NULL), (447,'获取销售订单列表',427,10,'',NULL,'1','0','F','0','0','iot:tOrder:sellList',NULL,100,1,NOW(),NULL); DELETE FROM sys_role_menu WHERE menu_id BETWEEN 421 AND 447; INSERT INTO sys_role_menu (tenant_id, role_id, menu_id, data_scope) SELECT '000000', r.role_id, m.menu_id, '0' FROM (SELECT 2 AS role_id UNION ALL SELECT 82 UNION ALL SELECT 88) r CROSS JOIN (SELECT menu_id FROM sys_menu WHERE menu_id BETWEEN 421 AND 447) m; -- 自检:菜单总数应为 447,新增绑定 81 条 SELECT COUNT(*) AS menu_total FROM `sys_menu`; SELECT role_id, COUNT(*) AS menus FROM `sys_role_menu` GROUP BY role_id ORDER BY role_id;