inspect-permission.sql 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. -- Menu and button permissions for Store Inspection & Assessment.
  2. -- Run this script in database `eduepos-plat`.
  3. --
  4. -- 结构:独立顶级模块「巡检与考核」(sys_model INSPECT),其下 5 个子菜单:
  5. -- 考核指标配置 /admin/inspect
  6. -- 巡检计划管理 /admin/inspect-plan
  7. -- 巡检任务执行 /admin/inspect-task
  8. -- 整改流程管理 /admin/inspect-rect
  9. -- 考核结果排名 /admin/inspect-assess
  10. -- 说明:侧边栏菜单来自登录时按角色查询的 SYS_USER_MENU_V(基于 sys_role),
  11. -- 必须同时把菜单/按钮授权给角色(sys_role / sys_role_menu_button)才能显示。
  12. -- 脚本幂等,可重复执行。
  13. -- 1. Create the INSPECT model (top-level module group) if not exists.
  14. INSERT INTO sys_model (MODEL_CODE, MODEL_NAME, STATUS, CREATE_DATE, RMK)
  15. SELECT 'INSPECT', '巡检与考核', 1, NOW(), 'el-icon-s-platform'
  16. FROM DUAL
  17. WHERE NOT EXISTS (SELECT 1 FROM sys_model WHERE MODEL_CODE = 'INSPECT');
  18. -- 2. Re-point the existing /admin/inspect menu as the first sub-menu under INSPECT.
  19. UPDATE sys_menu
  20. SET MODEL_CODE = 'INSPECT',
  21. MENU_NAME = '考核指标配置',
  22. LEVEL = 2,
  23. FATHER_ID = NULL,
  24. ORDER_KEY = 1,
  25. STATUS = 1
  26. WHERE URL = '/admin/inspect';
  27. -- 3. Insert the remaining four sub-menus under INSPECT (skip if already exists).
  28. INSERT INTO sys_menu (MODEL_CODE, MENU_NAME, URL, LEVEL, ORDER_KEY, FATHER_ID, STATUS, CREATE_DATE)
  29. SELECT 'INSPECT', '巡检计划管理', '/admin/inspect-plan', 2, 2, NULL, 1, NOW()
  30. FROM DUAL
  31. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE URL = '/admin/inspect-plan');
  32. INSERT INTO sys_menu (MODEL_CODE, MENU_NAME, URL, LEVEL, ORDER_KEY, FATHER_ID, STATUS, CREATE_DATE)
  33. SELECT 'INSPECT', '巡检任务执行', '/admin/inspect-task', 2, 3, NULL, 1, NOW()
  34. FROM DUAL
  35. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE URL = '/admin/inspect-task');
  36. INSERT INTO sys_menu (MODEL_CODE, MENU_NAME, URL, LEVEL, ORDER_KEY, FATHER_ID, STATUS, CREATE_DATE)
  37. SELECT 'INSPECT', '整改流程管理', '/admin/inspect-rect', 2, 4, NULL, 1, NOW()
  38. FROM DUAL
  39. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE URL = '/admin/inspect-rect');
  40. INSERT INTO sys_menu (MODEL_CODE, MENU_NAME, URL, LEVEL, ORDER_KEY, FATHER_ID, STATUS, CREATE_DATE)
  41. SELECT 'INSPECT', '考核结果排名', '/admin/inspect-assess', 2, 5, NULL, 1, NOW()
  42. FROM DUAL
  43. WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE URL = '/admin/inspect-assess');
  44. -- 3.5 Clean up stray buttons left on the re-pointed indicator menu from an earlier broad grant.
  45. DELETE FROM sys_role_menu_button
  46. WHERE MENU_ID = (SELECT MENU_ID FROM sys_menu WHERE URL = '/admin/inspect')
  47. AND BUTTON_CODE NOT IN ('add', 'edit', 'delete', 'weight');
  48. DELETE FROM sys_menu_button
  49. WHERE MENU_ID = (SELECT MENU_ID FROM sys_menu WHERE URL = '/admin/inspect')
  50. AND BUTTON_CODE NOT IN ('add', 'edit', 'delete', 'weight');
  51. -- 4. Register button permissions for each menu.
  52. INSERT INTO sys_menu_button (MENU_ID, BUTTON_CODE)
  53. SELECT m.MENU_ID, b.BUTTON_CODE
  54. FROM sys_menu m
  55. JOIN (
  56. SELECT '/admin/inspect' AS url, 'add' AS button_code
  57. UNION ALL SELECT '/admin/inspect', 'edit'
  58. UNION ALL SELECT '/admin/inspect', 'delete'
  59. UNION ALL SELECT '/admin/inspect', 'weight'
  60. UNION ALL SELECT '/admin/inspect-plan', 'add'
  61. UNION ALL SELECT '/admin/inspect-plan', 'edit'
  62. UNION ALL SELECT '/admin/inspect-plan', 'delete'
  63. UNION ALL SELECT '/admin/inspect-plan', 'publish'
  64. UNION ALL SELECT '/admin/inspect-plan', 'pause'
  65. UNION ALL SELECT '/admin/inspect-plan', 'finish'
  66. UNION ALL SELECT '/admin/inspect-plan', 'generate'
  67. UNION ALL SELECT '/admin/inspect-task', 'execute'
  68. UNION ALL SELECT '/admin/inspect-task', 'submit'
  69. UNION ALL SELECT '/admin/inspect-task', 'cancel'
  70. UNION ALL SELECT '/admin/inspect-rect', 'recheck'
  71. UNION ALL SELECT '/admin/inspect-rect', 'urge'
  72. UNION ALL SELECT '/admin/inspect-rect', 'batch'
  73. UNION ALL SELECT '/admin/inspect-assess', 'export'
  74. UNION ALL SELECT '/admin/inspect-assess', 'trigger'
  75. ) b ON b.url = m.URL
  76. WHERE NOT EXISTS (
  77. SELECT 1 FROM sys_menu_button exists_button
  78. WHERE exists_button.MENU_ID = m.MENU_ID
  79. AND exists_button.BUTTON_CODE = b.BUTTON_CODE
  80. );
  81. -- 5. Grant all five inspect menus to every role that already has the store management menu.
  82. INSERT INTO sys_role (CHARACTOR_ID, MENU_ID)
  83. SELECT
  84. old_role.CHARACTOR_ID,
  85. new_menu.MENU_ID
  86. FROM sys_role old_role
  87. JOIN sys_menu old_menu ON old_menu.MENU_ID = old_role.MENU_ID
  88. JOIN sys_menu new_menu ON new_menu.URL IN ('/admin/inspect', '/admin/inspect-plan', '/admin/inspect-task', '/admin/inspect-rect', '/admin/inspect-assess')
  89. WHERE old_menu.URL = '/admin/storemanage'
  90. AND NOT EXISTS (
  91. SELECT 1 FROM sys_role exists_role
  92. WHERE exists_role.CHARACTOR_ID = old_role.CHARACTOR_ID
  93. AND exists_role.MENU_ID = new_menu.MENU_ID
  94. );
  95. -- 6. Fallback: if NO role has the store management menu, grant the five inspect menus to all roles.
  96. INSERT INTO sys_role (CHARACTOR_ID, MENU_ID)
  97. SELECT
  98. all_role.CHARACTOR_ID,
  99. new_menu.MENU_ID
  100. FROM (SELECT DISTINCT CHARACTOR_ID FROM sys_role) all_role
  101. JOIN sys_menu new_menu ON new_menu.URL IN ('/admin/inspect', '/admin/inspect-plan', '/admin/inspect-task', '/admin/inspect-rect', '/admin/inspect-assess')
  102. WHERE (SELECT COUNT(*) FROM sys_role r JOIN sys_menu m ON m.MENU_ID = r.MENU_ID WHERE m.URL = '/admin/storemanage') = 0
  103. AND NOT EXISTS (
  104. SELECT 1 FROM sys_role exists_role
  105. WHERE exists_role.CHARACTOR_ID = all_role.CHARACTOR_ID
  106. AND exists_role.MENU_ID = new_menu.MENU_ID
  107. );
  108. -- 7. Grant matching button permissions to the roles that got the inspect menus.
  109. INSERT INTO sys_role_menu_button (MENU_ID, ROLE_ID, BUTTON_CODE)
  110. SELECT
  111. new_menu.MENU_ID,
  112. role.CHARACTOR_ID,
  113. button.BUTTON_CODE
  114. FROM sys_role role
  115. JOIN sys_menu new_menu ON new_menu.URL IN ('/admin/inspect', '/admin/inspect-plan', '/admin/inspect-task', '/admin/inspect-rect', '/admin/inspect-assess')
  116. JOIN sys_menu_button button ON button.MENU_ID = new_menu.MENU_ID
  117. WHERE role.MENU_ID = new_menu.MENU_ID
  118. AND NOT EXISTS (
  119. SELECT 1 FROM sys_role_menu_button exists_button
  120. WHERE exists_button.MENU_ID = new_menu.MENU_ID
  121. AND exists_button.ROLE_ID = role.CHARACTOR_ID
  122. AND exists_button.BUTTON_CODE = button.BUTTON_CODE
  123. );
  124. -- 8. Verify model, menus, buttons and granted roles.
  125. SELECT mo.MODEL_CODE, mo.MODEL_NAME, m.MENU_ID, m.MENU_NAME, m.URL, m.ORDER_KEY, b.BUTTON_CODE, r.CHARACTOR_ID
  126. FROM sys_model mo
  127. LEFT JOIN sys_menu m ON m.MODEL_CODE = mo.MODEL_CODE
  128. LEFT JOIN sys_menu_button b ON b.MENU_ID = m.MENU_ID
  129. LEFT JOIN sys_role r ON r.MENU_ID = m.MENU_ID
  130. WHERE mo.MODEL_CODE = 'INSPECT'
  131. ORDER BY m.ORDER_KEY, b.BUTTON_CODE, r.CHARACTOR_ID;