migration_gas_pipe_point_menu.sql 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. -- 燃气基础数据:新增「管点台账」菜单
  2. --
  3. -- 页面组件:subSystem/gas/gasBasicadata/gasPipePoint
  4. -- 数据来源:app_user.gas_pipe_point(燃气管点专属表)
  5. -- 后端接口 /api/gas-pipe-point/{findByPage|getById|save|updateById|deleteById}
  6. --
  7. -- 父级定位(两路兜底):
  8. -- 1) 用兄弟页面 component='subSystem/gas/gasBasicadata/gasPipelintNet' 反查 parent_id(最可靠)
  9. -- 2) menu_type='M' 且 menu_name='基础数据管理',且父级是燃气目录
  10. --
  11. -- 幂等:菜单按 component 判重,已存在则只更新名称/路径/父级,不改排序;
  12. -- 授权按 (role_id, menu_id) 判重。
  13. -- 主键:menu_id 显式取 max+1 —— 本库由 MySQL 迁移而来,自增计数器可能未推进。
  14. --
  15. -- 执行后请重新登录一次,让前端重新拉取菜单。
  16. -- 前置:结束上一次失败执行遗留的 aborted 事务
  17. ROLLBACK;
  18. BEGIN;
  19. SET search_path TO app_user, public;
  20. DO $$
  21. DECLARE
  22. v_parent bigint;
  23. v_page bigint;
  24. v_role record;
  25. BEGIN
  26. -- 1. 定位「燃气 - 基础数据管理」目录
  27. SELECT parent_id INTO v_parent
  28. FROM sys_menu
  29. WHERE component = 'subSystem/gas/gasBasicadata/gasPipelintNet'
  30. LIMIT 1;
  31. IF v_parent IS NULL THEN
  32. SELECT menu_id INTO v_parent
  33. FROM sys_menu
  34. WHERE menu_type = 'M'
  35. AND menu_name = '基础数据管理'
  36. AND parent_id IN (SELECT menu_id FROM sys_menu WHERE menu_name LIKE '%燃气%')
  37. LIMIT 1;
  38. END IF;
  39. IF v_parent IS NULL THEN
  40. RAISE NOTICE '未找到燃气-基础数据管理目录,请手工确认 parent_id 后重跑';
  41. RETURN;
  42. END IF;
  43. -- 2. 页面菜单
  44. SELECT menu_id INTO v_page
  45. FROM sys_menu
  46. WHERE component = 'subSystem/gas/gasBasicadata/gasPipePoint'
  47. LIMIT 1;
  48. IF v_page IS NULL THEN
  49. SELECT COALESCE(MAX(menu_id), 0) + 1 INTO v_page FROM sys_menu;
  50. INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query,
  51. is_frame, is_cache, menu_type, visible, status, perms, icon,
  52. create_by, create_time, remark)
  53. VALUES (v_page, '管点台账', v_parent, 3, 'gasPipePoint',
  54. 'subSystem/gas/gasBasicadata/gasPipePoint', NULL,
  55. 1, 0, 'C', '0', '0', '', 'list',
  56. 'admin', CURRENT_TIMESTAMP, '燃气管点台账');
  57. RAISE NOTICE '已新增菜单,menu_id=%', v_page;
  58. ELSE
  59. UPDATE sys_menu
  60. SET menu_name = '管点台账',
  61. parent_id = v_parent,
  62. path = 'gasPipePoint',
  63. visible = '0',
  64. status = '0'
  65. WHERE menu_id = v_page;
  66. RAISE NOTICE '菜单已存在,已更新,menu_id=%', v_page;
  67. END IF;
  68. -- 3. 跟随既有授权:原本能进父级目录的角色,一并授予该页面
  69. FOR v_role IN SELECT role_id FROM sys_role_menu WHERE menu_id = v_parent LOOP
  70. IF NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = v_role.role_id AND menu_id = v_page) THEN
  71. INSERT INTO sys_role_menu (role_id, menu_id) VALUES (v_role.role_id, v_page);
  72. END IF;
  73. END LOOP;
  74. END $$;
  75. COMMIT;