1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
-- =====================================================
-- 自建角色「看不到数据」修复:权限节点补齐 + 角色自动继承
-- 日期:2026-09-24
--
-- 背景:
--   框架权限校验(PermissionServiceImpl#hasAnyPermission)为严格模式:
--   控制器 @PreAuthorize 中的权限标识若在 system_menu 中不存在,除超管外一律判定无权限。
--   排查发现全项目有 141 个控制器权限标识在 system_menu 中缺失/命名不匹配,
--   导致自建角色(以及除超管外的所有角色)打开页面后接口 403、列表为空——即"看不到数据"。
--   系统自带「超级管理员」角色因代码直返全部权限而正常,两者对比即用户反馈的现象。
--
-- 本脚本内容:
--   ① 补齐 HRM/MES/ERP/CRM/SRM/BI/BPM 缺失的按钮权限节点(type=3)
--   ② 新增 HRM「薪资结构」页面菜单(type=2,此前前端页面无菜单入口)
--   ③ 新节点自动授权给已持有对应页面菜单的全部角色(同步/继承机制)
--   ④ 修正售后「查看全部」数据权限节点(permission 由 aftersales:admin 改为 aftersales:view-all,
--      与 AfterSalePermissionUtils#hasViewAllPermission 的校验标识一致)
--   ⑤ CRM「查看全部客户」(602583) 继承授权:已持有 crm:customer:query 的角色自动获得
--
-- 配套代码变更:yudao-module-hrm 9 个控制器 @PreAuthorize 权限标识已对齐菜单命名
--   (hrm:attendance:* → hrm:attendance-record/exception/rule/summary:*;
--    hrm:salary:* → hrm:salary-calculation/payment:*;
--    hrm:social-security:* → hrm:employee-social-security/social-security-scheme:*;
--    hrm:tax-rate:* → hrm:tax-rate-config:*),需重新编译并重启后端后生效。
--
-- 幂等:先删后插,可重复执行
-- 执行方式(避免中文乱码):
--   cmd /c "mysql -uroot -p1234 --default-character-set=utf8mb4 ruoyi-vue-pro < docs\sql\role_permission_sync_20260924.sql"
--
-- 执行后生效条件:
--   1. 重启后端(控制器变更 + 菜单缓存)
--   2. 权限缓存刷新:任意角色在「角色管理 → 菜单权限」里保存一次(触发权限缓存清空),
--      或重启 Redis;否则此前 403 请求遗留的"空权限"缓存会继续拦截(新权限标识不受影响)
--   3. 目标用户重新登录(刷新登录态中的权限列表)
-- =====================================================
 
SET NAMES utf8mb4;
 
-- ------------------------------------------------------------
-- ① 清理旧数据(幂等)
-- ------------------------------------------------------------
DELETE FROM `system_role_menu` WHERE `menu_id` BETWEEN 1080001 AND 1080078;
DELETE FROM `system_menu` WHERE `id` BETWEEN 1080001 AND 1080078;
 
-- ------------------------------------------------------------
-- ② 新增按钮权限节点(type=3)
-- ------------------------------------------------------------
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES
-- HRM 考勤记录(6011)
(1080001, '考勤记录查询', 'hrm:attendance-record:query', 3, 10, 6011, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 考勤异常(6012)
(1080002, '考勤异常查询', 'hrm:attendance-exception:query', 3, 10, 6012, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080003, '考勤异常修改', 'hrm:attendance-exception:update', 3, 20, 6012, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080004, '考勤异常删除', 'hrm:attendance-exception:delete', 3, 30, 6012, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 考勤规则(6013)
(1080005, '考勤规则查询', 'hrm:attendance-rule:query', 3, 10, 6013, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 考勤统计(6015)
(1080006, '考勤统计查询', 'hrm:attendance-summary:query', 3, 10, 6015, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 加班申请(1065211)
(1080007, '加班申请查询', 'hrm:overtime:query', 3, 10, 1065211, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080008, '加班管理', 'hrm:overtime:manage', 3, 20, 1065211, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 调岗申请(6004)
(1080009, '调岗申请查询', 'hrm:transfer:query', 3, 10, 6004, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080010, '调岗申请导出', 'hrm:transfer:export', 3, 20, 6004, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 离职申请(6005)
(1080011, '离职申请查询', 'hrm:resignation:query', 3, 10, 6005, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080012, '离职申请导出', 'hrm:resignation:export', 3, 20, 6005, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080013, '离职交接', 'hrm:resignation:handover', 3, 30, 6005, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 请假申请(6003)
(1080014, '请假申请导出', 'hrm:leave:export', 3, 10, 6003, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 薪酬核算(6021)
(1080015, '薪酬核算查询', 'hrm:salary-calculation:query', 3, 10, 6021, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080016, '薪酬核算删除', 'hrm:salary-calculation:delete', 3, 20, 6021, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080017, '薪酬核算保存', 'hrm:salary-calculation:save', 3, 30, 6021, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 薪资发放(6022)
(1080018, '薪资发放查询', 'hrm:salary-payment:query', 3, 10, 6022, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080019, '薪资发放生成', 'hrm:salary-payment:generate', 3, 20, 6022, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080020, '薪资发放删除', 'hrm:salary-payment:delete', 3, 30, 6022, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 员工社保公积金档案(6023)
(1080021, '员工社保查询', 'hrm:employee-social-security:query', 3, 10, 6023, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 社保公积金方案(602445)
(1080022, '社保方案查询', 'hrm:social-security-scheme:query', 3, 10, 602445, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 个税税率配置(6024)
(1080023, '个税税率查询', 'hrm:tax-rate-config:query', 3, 10, 6024, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 员工合同(1063105)
(1080024, '员工合同导入', 'hrm:employee-contract:import', 3, 10, 1063105, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 计量单位(602467)
(1080025, '计量单位查询', 'mes:md-unit-measure:query', 3, 10, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080026, '计量单位新增', 'mes:md-unit-measure:create', 3, 20, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080027, '计量单位修改', 'mes:md-unit-measure:update', 3, 30, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080028, '计量单位删除', 'mes:md-unit-measure:delete', 3, 40, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080029, '计量单位导出', 'mes:md-unit-measure:export', 3, 50, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080030, '计量单位导入', 'mdm:unit:import', 3, 60, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080031, '计量单位数据导出', 'mdm:unit:export', 3, 70, 602467, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 物料分类(5110)
(1080032, '物料分类查询', 'mdm:item-category:query', 3, 10, 5110, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080033, '物料分类新增', 'mdm:item-category:create', 3, 20, 5110, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080034, '物料分类修改', 'mdm:item-category:update', 3, 30, 5110, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080035, '物料分类删除', 'mdm:item-category:delete', 3, 40, 5110, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 车间设置(5160)
(1080036, '车间导出', 'mes:md-workshop:export', 3, 10, 5160, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 基础参数(602474)
(1080037, '基础参数查询', 'mes:pd-process-param:query', 3, 10, 602474, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080038, '基础参数新增', 'mes:pd-process-param:create', 3, 20, 602474, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080039, '基础参数修改', 'mes:pd-process-param:update', 3, 30, 602474, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080040, '基础参数删除', 'mes:pd-process-param:delete', 3, 40, 602474, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080041, '基础参数导出', 'mes:pd-process-param:export', 3, 50, 602474, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 参数模板(602475)
(1080042, '参数模板查询', 'mes:pd-process-param-template:query', 3, 10, 602475, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080043, '参数模板新增', 'mes:pd-process-param-template:create', 3, 20, 602475, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080044, '参数模板修改', 'mes:pd-process-param-template:update', 3, 30, 602475, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080045, '参数模板删除', 'mes:pd-process-param-template:delete', 3, 40, 602475, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080046, '参数模板导出', 'mes:pd-process-param-template:export', 3, 50, 602475, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 生产计划(602504)
(1080047, '生产计划查询', 'mes:pro-mps:query', 3, 10, 602504, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 计量器具(5380)
(1080048, '计量器具导入', 'mes:dv-metering:import', 3, 10, 5380, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 库存现有量(5786)
(1080049, '库存现有量导入', 'mes:wm-material-stock:import', 3, 10, 5786, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 外协发料(5881)
(1080050, '外协发料完成', 'mes:wm-outsource-issue:finish', 3, 10, 5881, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 采购退货(5830)
(1080051, '采购退货完成', 'mes:wm-return-vendor:finish', 3, 10, 5830, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 盘点任务(5957)
(1080052, '盘点任务完成', 'mes:wm-stock-taking-task:finish', 3, 10, 5957, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 产品入库(5819)
(1080053, '产品入库查询', 'mes:wm-product-produce:query', 3, 10, 5819, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 四类检验单完成
(1080054, '来料检验完成', 'mes:qc-iqc:finish', 3, 10, 5640, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080055, '过程检验完成', 'mes:qc-ipqc:finish', 3, 10, 5650, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080056, '出货检验完成', 'mes:qc-oqc:finish', 3, 10, 5660, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080057, '退货检验完成', 'mes:qc-rqc:finish', 3, 10, 5670, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- MES 质检管理(5500):AI 辅助判定(授权范围=四类检验页角色,见 ④)
(1080058, '质检修改', 'mes:qc:update', 3, 50, 5500, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- ERP 采购申请(602498)
(1080059, '采购申请查询', 'erp:purchase-request:query', 3, 10, 602498, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080060, '采购申请提交', 'erp:purchase-request:submit', 3, 20, 602498, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080061, '采购申请生成订单', 'erp:purchase-request:generate-order', 3, 30, 602498, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- ERP 采购订单(2666)
(1080062, '采购订单导入', 'erp:purchase-order:import', 3, 10, 2666, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- ERP 销售订单(2638)
(1080063, '销售订单取消', 'erp:sale-order:cancel', 3, 10, 2638, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080064, '销售订单启用', 'erp:sale-order:enable', 3, 20, 2638, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080065, '销售订单导入', 'erp:sale-order:import', 3, 30, 2638, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- CRM 开票管理(1063093)
(1080066, '开票查询', 'crm:invoice:query', 3, 10, 1063093, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- CRM 销售报价(602512)
(1080067, '报价单查询', 'crm:sale-quotation:query', 3, 10, 602512, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080068, '报价单导出', 'crm:sale-quotation:export', 3, 20, 602512, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080069, '报价单转合同', 'crm:sale-quotation:convert-contract', 3, 30, 602512, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- SRM 招投标管理(602545)
(1080070, '招标配置查询', 'srm:tender-config:query', 3, 10, 602545, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080071, '招标配置修改', 'srm:tender-config:update', 3, 20, 602545, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- BI 决策大屏(1063000,目录;授权范围=各主题大屏页角色,见 ⑤)
(1080072, '大屏查询', 'bi:dashboard:query', 3, 10, 1063000, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- BPM OA 通知公告(602608)
(1080073, 'OA通知公告查询', 'bpm:oa-notice:query', 3, 10, 602608, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 薪资结构页面菜单(type=2,前端页面此前无菜单入口)
(1080074, '薪资结构', '', 2, 70, 6020, 'structure', 'ep:document', 'hrm/salary/structure/index', 'HrmSalaryStructure', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
-- HRM 薪资结构按钮(父级 1080074)
(1080075, '薪资结构查询', 'hrm:salary-structure:query', 3, 10, 1080074, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080076, '薪资结构新增', 'hrm:salary-structure:create', 3, 20, 1080074, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080077, '薪资结构修改', 'hrm:salary-structure:update', 3, 30, 1080074, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'),
(1080078, '薪资结构删除', 'hrm:salary-structure:delete', 3, 40, 1080074, '', '', '', '', 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0');
 
-- ------------------------------------------------------------
-- ③ 自动授权:新节点 → 已持有对应父页面菜单的全部角色(同步/继承机制)
-- ------------------------------------------------------------
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, m.`id`, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
JOIN (
    SELECT 1080001 AS `id`, 6011 AS `parent` UNION ALL SELECT 1080002, 6012 UNION ALL SELECT 1080003, 6012
    UNION ALL SELECT 1080004, 6012 UNION ALL SELECT 1080005, 6013 UNION ALL SELECT 1080006, 6015
    UNION ALL SELECT 1080007, 1065211 UNION ALL SELECT 1080008, 1065211
    UNION ALL SELECT 1080009, 6004 UNION ALL SELECT 1080010, 6004
    UNION ALL SELECT 1080011, 6005 UNION ALL SELECT 1080012, 6005 UNION ALL SELECT 1080013, 6005
    UNION ALL SELECT 1080014, 6003
    UNION ALL SELECT 1080015, 6021 UNION ALL SELECT 1080016, 6021 UNION ALL SELECT 1080017, 6021
    UNION ALL SELECT 1080018, 6022 UNION ALL SELECT 1080019, 6022 UNION ALL SELECT 1080020, 6022
    UNION ALL SELECT 1080021, 6023 UNION ALL SELECT 1080022, 602445 UNION ALL SELECT 1080023, 6024
    UNION ALL SELECT 1080024, 1063105
    UNION ALL SELECT 1080025, 602467 UNION ALL SELECT 1080026, 602467 UNION ALL SELECT 1080027, 602467
    UNION ALL SELECT 1080028, 602467 UNION ALL SELECT 1080029, 602467 UNION ALL SELECT 1080030, 602467
    UNION ALL SELECT 1080031, 602467
    UNION ALL SELECT 1080032, 5110 UNION ALL SELECT 1080033, 5110 UNION ALL SELECT 1080034, 5110
    UNION ALL SELECT 1080035, 5110
    UNION ALL SELECT 1080036, 5160
    UNION ALL SELECT 1080037, 602474 UNION ALL SELECT 1080038, 602474 UNION ALL SELECT 1080039, 602474
    UNION ALL SELECT 1080040, 602474 UNION ALL SELECT 1080041, 602474
    UNION ALL SELECT 1080042, 602475 UNION ALL SELECT 1080043, 602475 UNION ALL SELECT 1080044, 602475
    UNION ALL SELECT 1080045, 602475 UNION ALL SELECT 1080046, 602475
    UNION ALL SELECT 1080047, 602504 UNION ALL SELECT 1080048, 5380 UNION ALL SELECT 1080049, 5786
    UNION ALL SELECT 1080050, 5881 UNION ALL SELECT 1080051, 5830 UNION ALL SELECT 1080052, 5957
    UNION ALL SELECT 1080053, 5819
    UNION ALL SELECT 1080054, 5640 UNION ALL SELECT 1080055, 5650 UNION ALL SELECT 1080056, 5660
    UNION ALL SELECT 1080057, 5670
    UNION ALL SELECT 1080059, 602498 UNION ALL SELECT 1080060, 602498 UNION ALL SELECT 1080061, 602498
    UNION ALL SELECT 1080062, 2666
    UNION ALL SELECT 1080063, 2638 UNION ALL SELECT 1080064, 2638 UNION ALL SELECT 1080065, 2638
    UNION ALL SELECT 1080066, 1063093
    UNION ALL SELECT 1080067, 602512 UNION ALL SELECT 1080068, 602512 UNION ALL SELECT 1080069, 602512
    UNION ALL SELECT 1080070, 602545 UNION ALL SELECT 1080071, 602545
    UNION ALL SELECT 1080073, 602608
) m ON rm.`menu_id` = m.`parent`
WHERE rm.`deleted` = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = m.`id` AND x.`deleted` = b'0');
 
-- 薪资结构页面菜单(1080074):授权给已持有薪酬管理下任一页面的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, 1080074, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` IN (6021, 6022, 6023, 6024, 602445, 602449) AND rm.`deleted` = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = 1080074 AND x.`deleted` = b'0');
 
-- 薪资结构按钮(1080075-1080078):授权给持有薪资结构页面的角色
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, m.`id`, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
JOIN (SELECT 1080075 AS `id` UNION ALL SELECT 1080076 UNION ALL SELECT 1080077 UNION ALL SELECT 1080078) m
WHERE rm.`menu_id` = 1080074 AND rm.`deleted` = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = m.`id` AND x.`deleted` = b'0');
 
-- ------------------------------------------------------------
-- ④ 质检修改(mes:qc:update,1080058):授权给持有四类检验页面的角色
-- ------------------------------------------------------------
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, 1080058, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` IN (5640, 5650, 5660, 5670) AND rm.`deleted` = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = 1080058 AND x.`deleted` = b'0');
 
-- ------------------------------------------------------------
-- ⑤ 大屏查询(bi:dashboard:query,1080072):授权给持有任一主题大屏页面的角色
-- ------------------------------------------------------------
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, 1080072, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
WHERE rm.`menu_id` IN (1063001, 1063002, 1063003, 1063004, 1063005) AND rm.`deleted` = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = 1080072 AND x.`deleted` = b'0');
 
-- ------------------------------------------------------------
-- ⑥ CRM「查看全部客户」数据权限继承:已持有 crm:customer:query 的角色自动获得 602583
-- ------------------------------------------------------------
INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
SELECT DISTINCT rm.`role_id`, 602583, '1', NOW(), '1', NOW(), b'0'
FROM `system_role_menu` rm
JOIN `system_menu` m ON m.`id` = rm.`menu_id` AND m.`deleted` = b'0'
WHERE m.`permission` = 'crm:customer:query' AND rm.`deleted` = b'0'
  AND NOT EXISTS (SELECT 1 FROM `system_role_menu` x WHERE x.`role_id` = rm.`role_id` AND x.`menu_id` = 602583 AND x.`deleted` = b'0');
 
-- ------------------------------------------------------------
-- ⑦ 售后「查看全部」数据权限节点修正:permission 与后端校验标识对齐
-- ------------------------------------------------------------
UPDATE `system_menu`
SET `permission` = 'aftersales:view-all', `updater` = '1', `update_time` = NOW()
WHERE `id` = 602595 AND `deleted` = b'0' AND `permission` <> 'aftersales:view-all';
 
-- ------------------------------------------------------------
-- ⑧ 校验
-- ------------------------------------------------------------
SELECT 'menu_nodes   ' AS item, COUNT(*) AS cnt FROM `system_menu` WHERE `id` BETWEEN 1080001 AND 1080078 AND `deleted` = b'0';
SELECT 'role_menu    ' AS item, COUNT(*) AS cnt FROM `system_role_menu` WHERE `menu_id` BETWEEN 1080001 AND 1080078 AND `deleted` = b'0';
SELECT 'view_all_602595' AS item, `permission` AS cnt FROM `system_menu` WHERE `id` = 602595;
SELECT 'crm_viewall  ' AS item, COUNT(DISTINCT `role_id`) AS cnt FROM `system_role_menu` WHERE `menu_id` = 602583 AND `deleted` = b'0';