fix(sql): 修正退单受理父菜单匹配,补齐新菜单授权与采购菜单 ERP 停用
## 问题
1. 退单管理菜单未生成:脚本按名称匹配父菜单「售后服务」,实际为「售后管理」,
WHERE 条件不成立导致 INSERT 未执行
2. 新增菜单未授权:system_role_menu 无记录,非超管角色看不到入口
3. 采购成本分析不可达:「采购管理」(2602) 父菜单 status=1 已停用,
导致 SRM 供应商管理整支(含招投标、统计分析)全部不可见
## 修复
- after_sale_cancellation_20261107.sql:父菜单改为按 path='/aftersales' 匹配,
并保留名称兜底;避免不同项目命名差异导致脚本空跑
- new_menu_role_grant_20261107.sql:新增菜单按「父菜单已授权的角色」继承授权,
避免遗漏
- srm_cost_analysis_menu_20261107.sql:采购成本分析菜单
- purchase_menu_erp_off_20261107.sql:启用「采购管理」父菜单,
同时停用其下 component 以 erp/ 开头的 ERP 专属子页面
(ERP 已从构建排除,保留会 404)
## 验证(本地 mom_local)
- 退单管理菜单 1075701 挂在 602587 下,6 个按钮权限齐全
- 采购成本分析菜单 1075699 挂在 602524 下
- 两个菜单均已授予 3 个角色(继承父菜单)
- 清 Redis 菜单缓存后,登录返回的菜单树含两者
- 菜单↔文件核对:239 个启用组件仅 1 个历史断链(bi/config/warehouse-coordinate)
## 注意
本次改动了菜单 status(采购管理启用、ERP 子菜单停用),
生产环境执行前需确认该分支是否符合上线预期。
| | |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='å®åç»ä¸éå/åæ´åç'; |
| | | |
| | | -- èåï¼æå¨å®åæå¡ä¸ |
| | | SET @as_parent := (SELECT id FROM system_menu WHERE name='å®åæå¡' AND parent_id=0 AND CAST(deleted AS UNSIGNED)=0 LIMIT 1); |
| | | -- ç¶èåæ path å¹é
æ´ç¨³å¦¥ï¼ä¸å项ç®åç§°å¯è½å«ãå®å管çãæãå®åæå¡ãï¼ |
| | | SET @as_parent := (SELECT id FROM system_menu |
| | | WHERE CAST(deleted AS UNSIGNED)=0 AND type=1 AND path='/aftersales' LIMIT 1); |
| | | SET @as_parent := IFNULL(@as_parent, |
| | | (SELECT id FROM system_menu WHERE CAST(deleted AS UNSIGNED)=0 AND type=1 |
| | | AND (name='å®å管ç' OR name='å®åæå¡') LIMIT 1)); |
| | | INSERT INTO system_menu (name,permission,type,sort,parent_id,path,icon,component,component_name,status,visible,keep_alive,always_show,creator,updater) |
| | | SELECT 'éå管ç','',2,90,@as_parent,'cancellation','lucide:undo-2','aftersales/cancellation/index','AfterSaleCancellation',0,b'1',b'1',b'1','1','1' |
| | | WHERE @as_parent IS NOT NULL AND NOT EXISTS (SELECT 1 FROM system_menu WHERE component='aftersales/cancellation/index' AND CAST(deleted AS UNSIGNED)=0); |
| | |
| | | UNION ALL SELECT '审æ¹','aftersales:cancellation:approve',4 |
| | | UNION ALL SELECT 'åæ¶','aftersales:cancellation:cancel',5 |
| | | UNION ALL SELECT 'å é¤','aftersales:cancellation:delete',6) p |
| | | WHERE @pg IS NOT NULL AND NOT EXISTS (SELECT 1 FROM system_menu m WHERE m.parent_id=@pg AND m.permission=p.permission AND CAST(m.deleted AS UNSIGNED)=0); |
| | | WHERE @pg IS NOT NULL AND NOT EXISTS (SELECT 1 FROM system_menu m WHERE m.parent_id=@pg AND m.permission=p.permission AND CAST(m.deleted AS UNSIGNED)=0); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- 为æ°èåè¡¥é½è§è²ææï¼å¡æ¯å·²æ¥æç¶èåçè§è²ï¼ä¸å¹¶æäºæ°èååå
¶æé®ã |
| | | -- 说æï¼æ°å¢èååè¥ä¸ææï¼æ®éè§è²ä¸ç®¡çåé½çä¸å°å
¥å£ã |
| | | |
| | | -- 1) éè´ææ¬åæèå |
| | | INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted) |
| | | SELECT rm.role_id, m.id, '1', NOW(), '1', NOW(), b'0' |
| | | FROM (SELECT DISTINCT role_id FROM system_role_menu |
| | | WHERE menu_id = 602524 AND CAST(deleted AS UNSIGNED)=0) rm |
| | | CROSS JOIN (SELECT id FROM system_menu |
| | | WHERE component='srm/statistics/cost-analysis' AND CAST(deleted AS UNSIGNED)=0) m |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_role_menu x |
| | | WHERE x.role_id=rm.role_id AND x.menu_id=m.id AND CAST(x.deleted AS UNSIGNED)=0); |
| | | |
| | | -- 2) éå管çèååå
¶æé® |
| | | INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted) |
| | | SELECT rm.role_id, m.id, '1', NOW(), '1', NOW(), b'0' |
| | | FROM (SELECT DISTINCT role_id FROM system_role_menu |
| | | WHERE menu_id = 602587 AND CAST(deleted AS UNSIGNED)=0) rm |
| | | CROSS JOIN (SELECT id FROM system_menu |
| | | WHERE CAST(deleted AS UNSIGNED)=0 |
| | | AND (component='aftersales/cancellation/index' |
| | | OR permission LIKE 'aftersales:cancellation:%')) m |
| | | WHERE NOT EXISTS (SELECT 1 FROM system_role_menu x |
| | | WHERE x.role_id=rm.role_id AND x.menu_id=m.id AND CAST(x.deleted AS UNSIGNED)=0); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- éè´ç®¡çèååæ¯è°æ´ï¼ERP å·²ä»æå»ºä¸æé¤ï¼ä½ç¶èå被åç¨å¯¼è´ SRM ä¾åºåç®¡çæ´æ¯ä¸å¯è§ |
| | | -- ï¼å«æææ / ç»è®¡åæ / éè´ææ¬åæï¼ã |
| | | -- å¤çï¼å¯ç¨ãéè´ç®¡çãç¶èåï¼åæ¶åç¨ ERP ä¸å±å页é¢ï¼é¿å
ç¨æ·ç¹å° 404ã |
| | | |
| | | -- 1) å¯ç¨éè´ç®¡çç¶èå |
| | | UPDATE system_menu SET status = 0 |
| | | WHERE CAST(deleted AS UNSIGNED)=0 AND id = 2602; |
| | | |
| | | -- 2) åç¨ ERP ä¸å±åèåï¼component 以 erp/ å¼å¤´ï¼ |
| | | UPDATE system_menu SET status = 1 |
| | | WHERE CAST(deleted AS UNSIGNED)=0 |
| | | AND parent_id = 2602 |
| | | AND component LIKE 'erp/%'; |
| | | |
| | | -- 3) 确认 SRM åæ¯ä¸ºå¯ç¨ç¶æ |
| | | UPDATE system_menu SET status = 0 |
| | | WHERE CAST(deleted AS UNSIGNED)=0 |
| | | AND id = 602524; |
| | | |
| | | UPDATE system_menu SET status = 0 |
| | | WHERE CAST(deleted AS UNSIGNED)=0 |
| | | AND parent_id = 602524 |
| | | AND (component LIKE 'srm/%' OR component IS NULL); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- éè´ææ¬åæèåï¼åºäº SRM ææ éæ±ä¸ä¾åºåæ¥ä»·ï¼ä¸ä¾èµ ERPï¼ |
| | | SET @srm_parent := (SELECT id FROM system_menu WHERE CAST(deleted AS UNSIGNED)=0 AND type=1 |
| | | AND (name='ä¾åºå管ç' OR path LIKE '%srm%' OR path LIKE '%supplier%') LIMIT 1); |
| | | -- è¥æ¾ä¸å° SRM ç¶èåï¼éå为æå¨ä»å¨ç©æµä¸ |
| | | SET @srm_parent := IFNULL(@srm_parent, |
| | | (SELECT id FROM system_menu WHERE CAST(deleted AS UNSIGNED)=0 AND type=1 AND name='ä»å¨ç©æµ' LIMIT 1)); |
| | | |
| | | INSERT INTO system_menu (name,permission,type,sort,parent_id,path,icon,component,component_name,status,visible,keep_alive,always_show,creator,updater) |
| | | SELECT 'éè´ææ¬åæ','',2,95,@srm_parent,'cost-analysis','lucide:line-chart','srm/statistics/cost-analysis','SrmCostAnalysis',0,b'1',b'1',b'1','1','1' |
| | | WHERE @srm_parent IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 FROM system_menu WHERE component='srm/statistics/cost-analysis' AND CAST(deleted AS UNSIGNED)=0); |
| | | |
| | | SET @pg := (SELECT id FROM system_menu WHERE component='srm/statistics/cost-analysis' AND CAST(deleted AS UNSIGNED)=0 LIMIT 1); |
| | | INSERT INTO system_menu (name,permission,type,sort,parent_id,path,icon,status,visible,keep_alive,always_show,creator,updater) |
| | | SELECT p.name,p.permission,3,p.sort_no,@pg,'','',0,b'1',b'1',b'1','1','1' |
| | | FROM (SELECT 'æ¥è¯¢' name,'srm:statistics:query' permission,1 sort_no) p |
| | | WHERE @pg IS NOT NULL AND NOT EXISTS (SELECT 1 FROM system_menu m WHERE m.parent_id=@pg AND m.permission=p.permission AND CAST(m.deleted AS UNSIGNED)=0); |