gaoluyang
17 小时以前 0100e530e07f11a98f25292a625f6fe0a9f20db6
fix(hrm): 补齐 HRM 后端校验的权限码菜单脚本

非超管角色打开考勤/薪酬/社保/调岗/离职/加班页面报「没有该操作权限」:
菜单里登记的是前端细粒度权限码(hrm:attendance-holiday:*、hrm:salary-calculation:*),
后端 Controller 的 @PreAuthorize 校验的是粗粒度码(hrm:attendance:*、hrm:salary:*),
而角色权限只从菜单表派生,导致后端要的码在角色树里根本勾不到。

脚本按 permission 判重补齐 34 个权限码按钮菜单,并授予「人资专员」角色;
另将 system:dept:query 一并授予(员工管理等页面的部门下拉走 /system/dept/list)。
幂等,可重复执行。已在九鸿生产库执行并验证。

Co-Authored-By: Claude Code <noreply@anthropic.com>
已添加1个文件
253 ■■■■■ 文件已修改
sql/mysql/hrm_permission_code_align.sql 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/hrm_permission_code_align.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,253 @@
-- ============================================================================
-- HRM æƒé™ç å¯¹é½ï¼šè¡¥é½åŽç«¯ @PreAuthorize å®žé™…校验的权限码菜单,并授予「人资专员」
--
-- é—®é¢˜ï¼š2026-08-12 ç”Ÿäº§åº“把 system_menu é‡Œ HRM æŒ‰é’®çš„æƒé™ç æ”¹æˆäº†å‰ç«¯ç»†ç²’度码
--       ï¼ˆhrm:attendance-holiday:query、hrm:salary-calculation:calculate ç­‰ï¼‰ï¼Œ
--       ä½†åŽç«¯ Controller æ ¡éªŒçš„æ˜¯ç²—粒度码(hrm:attendance:query、hrm:salary:query ç­‰ï¼‰ï¼Œ
--       è§’色权限只从菜单表派生 â†’ éžè¶…管角色打开考勤/薪酬/社保/调岗/离职/加班页面
--       ä¸€å¾‹ 403「没有该操作权限」。超管走绕过校验,所以一直没暴露。
--
-- åšæ³•:不动前端细粒度码,补一套后端实际使用的权限码按钮菜单(type=3),
--       å†æŠŠè¿™äº›èœå•授予「人资专员」角色。幂等,可重复执行。
--       å¦å¤– HRM å„页面的「部门」下拉调用 /system/dept/list(校验 system:dept:query),
--       HR è§’色默认没有系统管理权限,一并授予已有的「部门查询」按钮(菜单 1017)。
--
-- å·²äºŽ 2026-10-30 åœ¨ä¹é¸¿ç”Ÿäº§åº“(42.63.70.90:9002/ruoyi-vue-pro)执行并验证。
-- ============================================================================
SET NAMES utf8mb4;
-- ---------------------------------------------------------------------------
-- ä¸€ã€æ–°å¢žæƒé™ç èœå•(不写死 id,按 permission åˆ¤é‡ï¼‰
-- ---------------------------------------------------------------------------
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤查询', 'hrm:attendance:query', 3, 10, 6011, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤导出', 'hrm:attendance:export', 3, 11, 6011, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:export' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '打卡(接口)', 'hrm:attendance:clock', 3, 12, 6011, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:clock' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤异常提交', 'hrm:attendance:submit', 3, 10, 6012, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:submit' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤新增', 'hrm:attendance:create', 3, 10, 6013, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:create' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤修改', 'hrm:attendance:update', 3, 11, 6013, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:update' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤删除', 'hrm:attendance:delete', 3, 12, 6013, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:delete' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '考勤统计生成(接口)', 'hrm:attendance:calculate', 3, 10, 6015, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:attendance:calculate' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '请假导出', 'hrm:leave:export', 3, 10, 6003, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:leave:export' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '调岗查询', 'hrm:transfer:query', 3, 10, 6004, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:transfer:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '调岗导出', 'hrm:transfer:export', 3, 11, 6004, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:transfer:export' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '离职查询', 'hrm:resignation:query', 3, 10, 6005, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:resignation:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '离职导出', 'hrm:resignation:export', 3, 11, 6005, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:resignation:export' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '加班查询', 'hrm:overtime:query', 3, 10, 1065211, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:overtime:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '合同导入', 'hrm:employee-contract:import', 3, 10, 1063105, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:employee-contract:import' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资查询', 'hrm:salary:query', 3, 10, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资核算执行', 'hrm:salary:calculate', 3, 11, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:calculate' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资核算确认', 'hrm:salary:confirm', 3, 12, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:confirm' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资删除', 'hrm:salary:delete', 3, 13, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:delete' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资导出', 'hrm:salary:export', 3, 14, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:export' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资结构查询', 'hrm:salary-structure:query', 3, 15, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary-structure:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资结构新增', 'hrm:salary-structure:create', 3, 16, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary-structure:create' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资结构修改', 'hrm:salary-structure:update', 3, 17, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary-structure:update' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '薪资结构删除', 'hrm:salary-structure:delete', 3, 18, 6021, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary-structure:delete' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '发放生成', 'hrm:salary:generate', 3, 10, 6022, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:generate' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '发放(接口)', 'hrm:salary:pay', 3, 11, 6022, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:salary:pay' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '社保查询', 'hrm:social-security:query', 3, 10, 6023, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:social-security:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '社保新增', 'hrm:social-security:create', 3, 11, 6023, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:social-security:create' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '社保修改', 'hrm:social-security:update', 3, 12, 6023, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:social-security:update' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '社保删除', 'hrm:social-security:delete', 3, 13, 6023, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:social-security:delete' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '个税查询', 'hrm:tax-rate:query', 3, 10, 6024, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:tax-rate:query' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '个税新增', 'hrm:tax-rate:create', 3, 11, 6024, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:tax-rate:create' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '个税修改', 'hrm:tax-rate:update', 3, 12, 6024, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:tax-rate:update' AND deleted = b'0');
INSERT INTO system_menu (name, permission, type, sort, parent_id, status, visible, keep_alive, always_show, creator, create_time, updater, update_time, deleted)
SELECT '个税删除', 'hrm:tax-rate:delete', 3, 13, 6024, 0, b'1', b'1', b'1', '1', NOW(), '1', NOW(), b'0'
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM system_menu WHERE permission = 'hrm:tax-rate:delete' AND deleted = b'0');
-- ---------------------------------------------------------------------------
-- äºŒã€æŽˆäºˆè§’色(按角色名匹配,避免不同库 role_id ä¸ä¸€è‡´ï¼‰
-- ---------------------------------------------------------------------------
INSERT INTO system_role_menu (role_id, menu_id, creator, create_time, updater, update_time, deleted)
SELECT r.id, m.id, '1', NOW(), '1', NOW(), b'0'
FROM system_role r
JOIN system_menu m ON m.permission IN (
    'hrm:attendance:query',
    'hrm:attendance:export',
    'hrm:attendance:clock',
    'hrm:attendance:submit',
    'hrm:attendance:create',
    'hrm:attendance:update',
    'hrm:attendance:delete',
    'hrm:attendance:calculate',
    'hrm:leave:export',
    'hrm:transfer:query',
    'hrm:transfer:export',
    'hrm:resignation:query',
    'hrm:resignation:export',
    'hrm:overtime:query',
    'hrm:employee-contract:import',
    'hrm:salary:query',
    'hrm:salary:calculate',
    'hrm:salary:confirm',
    'hrm:salary:delete',
    'hrm:salary:export',
    'hrm:salary-structure:query',
    'hrm:salary-structure:create',
    'hrm:salary-structure:update',
    'hrm:salary-structure:delete',
    'hrm:salary:generate',
    'hrm:salary:pay',
    'hrm:social-security:query',
    'hrm:social-security:create',
    'hrm:social-security:update',
    'hrm:social-security:delete',
    'hrm:tax-rate:query',
    'hrm:tax-rate:create',
    'hrm:tax-rate:update',
    'hrm:tax-rate:delete',
    -- å‘˜å·¥ç®¡ç†/考勤/排班/社保/薪酬等页面的「部门」下拉调用 /system/dept/list,
    -- è¯¥æŽ¥å£æ ¡éªŒ system:dept:query(菜单 1017「部门查询」,前端菜单树不展示按钮,不会多出菜单)
    'system:dept:query'
  )
WHERE r.name = '人资专员'
  AND r.deleted = b'0'
  AND m.deleted = b'0'
  AND NOT EXISTS (
    SELECT 1 FROM system_role_menu rm
    WHERE rm.role_id = r.id AND rm.menu_id = m.id AND rm.deleted = b'0'
  );
-- ---------------------------------------------------------------------------
-- ä¸‰ã€æ ¡éªŒï¼šåº”能查出 34 æ¡
-- ---------------------------------------------------------------------------
-- SELECT m.id, m.name, m.permission, m.parent_id
-- FROM system_menu m
-- WHERE m.permission IN (
--     'hrm:attendance:query',
--         'hrm:attendance:export',
--         'hrm:attendance:clock',
--         'hrm:attendance:submit',
--         'hrm:attendance:create',
--         'hrm:attendance:update',
--         'hrm:attendance:delete',
--         'hrm:attendance:calculate',
--         'hrm:leave:export',
--         'hrm:transfer:query',
--         'hrm:transfer:export',
--         'hrm:resignation:query',
--         'hrm:resignation:export',
--         'hrm:overtime:query',
--         'hrm:employee-contract:import',
--         'hrm:salary:query',
--         'hrm:salary:calculate',
--         'hrm:salary:confirm',
--         'hrm:salary:delete',
--         'hrm:salary:export',
--         'hrm:salary-structure:query',
--         'hrm:salary-structure:create',
--         'hrm:salary-structure:update',
--         'hrm:salary-structure:delete',
--         'hrm:salary:generate',
--         'hrm:salary:pay',
--         'hrm:social-security:query',
--         'hrm:social-security:create',
--         'hrm:social-security:update',
--         'hrm:social-security:delete',
--         'hrm:tax-rate:query',
--         'hrm:tax-rate:create',
--         'hrm:tax-rate:update',
--         'hrm:tax-rate:delete'
--   ) AND m.deleted = b'0'
-- ORDER BY m.parent_id, m.id;