-- 燃气基础数据:新增「管点台账」菜单 -- -- 页面组件:subSystem/gas/gasBasicadata/gasPipePoint -- 数据来源:app_user.gas_pipe_point(燃气管点专属表) -- 后端接口 /api/gas-pipe-point/{findByPage|getById|save|updateById|deleteById} -- -- 父级定位(两路兜底): -- 1) 用兄弟页面 component='subSystem/gas/gasBasicadata/gasPipelintNet' 反查 parent_id(最可靠) -- 2) menu_type='M' 且 menu_name='基础数据管理',且父级是燃气目录 -- -- 幂等:菜单按 component 判重,已存在则只更新名称/路径/父级,不改排序; -- 授权按 (role_id, menu_id) 判重。 -- 主键:menu_id 显式取 max+1 —— 本库由 MySQL 迁移而来,自增计数器可能未推进。 -- -- 执行后请重新登录一次,让前端重新拉取菜单。 -- 前置:结束上一次失败执行遗留的 aborted 事务 ROLLBACK; BEGIN; SET search_path TO app_user, public; DO $$ DECLARE v_parent bigint; v_page bigint; v_role record; BEGIN -- 1. 定位「燃气 - 基础数据管理」目录 SELECT parent_id INTO v_parent FROM sys_menu WHERE component = 'subSystem/gas/gasBasicadata/gasPipelintNet' LIMIT 1; IF v_parent IS NULL THEN SELECT menu_id INTO v_parent FROM sys_menu WHERE menu_type = 'M' AND menu_name = '基础数据管理' AND parent_id IN (SELECT menu_id FROM sys_menu WHERE menu_name LIKE '%燃气%') LIMIT 1; END IF; IF v_parent IS NULL THEN RAISE NOTICE '未找到燃气-基础数据管理目录,请手工确认 parent_id 后重跑'; RETURN; END IF; -- 2. 页面菜单 SELECT menu_id INTO v_page FROM sys_menu WHERE component = 'subSystem/gas/gasBasicadata/gasPipePoint' LIMIT 1; IF v_page IS NULL THEN SELECT COALESCE(MAX(menu_id), 0) + 1 INTO v_page FROM sys_menu; INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) VALUES (v_page, '管点台账', v_parent, 3, 'gasPipePoint', 'subSystem/gas/gasBasicadata/gasPipePoint', NULL, 1, 0, 'C', '0', '0', '', 'list', 'admin', CURRENT_TIMESTAMP, '燃气管点台账'); RAISE NOTICE '已新增菜单,menu_id=%', v_page; ELSE UPDATE sys_menu SET menu_name = '管点台账', parent_id = v_parent, path = 'gasPipePoint', visible = '0', status = '0' WHERE menu_id = v_page; RAISE NOTICE '菜单已存在,已更新,menu_id=%', v_page; END IF; -- 3. 跟随既有授权:原本能进父级目录的角色,一并授予该页面 FOR v_role IN SELECT role_id FROM sys_role_menu WHERE menu_id = v_parent LOOP IF NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = v_role.role_id AND menu_id = v_page) THEN INSERT INTO sys_role_menu (role_id, menu_id) VALUES (v_role.role_id, v_page); END IF; END LOOP; END $$; COMMIT;