diff --git a/RuoYi-Vue/sql/train/v2/011_pilot_20261010_master_data_and_resource.sql b/RuoYi-Vue/sql/train/v2/011_pilot_20261010_master_data_and_resource.sql new file mode 100644 index 000000000..d8db478e6 --- /dev/null +++ b/RuoYi-Vue/sql/train/v2/011_pilot_20261010_master_data_and_resource.sql @@ -0,0 +1,168 @@ +-- ============================================================================== +-- RailwaySystem 数据库 V2 迁移脚本: 011_pilot_20261010_master_data_and_resource.sql +-- 适用数据库: KingbaseES V009R003C018 (schema: public) +-- 执行目标: +-- 1. 补齐学员、教师、教室、实训场地、课程主数据新增扩展字段 (11个物理列) +-- 2. 创建统一教学资源表 (train_resource) 及其索引与字典 +-- 3. 补齐教学资源管理菜单 (sys_menu) 与培训管理员/超级管理员角色授权 (sys_role_menu) +-- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行 +-- 幂等保证: 全部 DDL / DML 均具备 IF NOT EXISTS 或 NOT EXISTS 守卫,可安全重复执行 +-- ============================================================================== + +BEGIN; + +-- ============================================================================= +-- 步骤 1: 主数据表扩展字段补齐 (11个物理列) +-- ============================================================================= + +-- 1.1 学员表 train_student 增加 头像 与 岗位级别 +ALTER TABLE public.train_student ADD COLUMN IF NOT EXISTS avatar VARCHAR(255); +ALTER TABLE public.train_student ADD COLUMN IF NOT EXISTS duty_level VARCHAR(64); +COMMENT ON COLUMN public.train_student.avatar IS '学员头像图片相对路径'; +COMMENT ON COLUMN public.train_student.duty_level IS '学员岗位级别'; + +-- 1.2 教师表 train_teacher 增加 头像、所属专业、主讲课程、从教时间 +ALTER TABLE public.train_teacher ADD COLUMN IF NOT EXISTS avatar VARCHAR(255); +ALTER TABLE public.train_teacher ADD COLUMN IF NOT EXISTS major VARCHAR(100); +ALTER TABLE public.train_teacher ADD COLUMN IF NOT EXISTS courses VARCHAR(255); +ALTER TABLE public.train_teacher ADD COLUMN IF NOT EXISTS start_teaching DATE; +COMMENT ON COLUMN public.train_teacher.avatar IS '教师头像图片相对路径'; +COMMENT ON COLUMN public.train_teacher.major IS '所属专业/研究方向'; +COMMENT ON COLUMN public.train_teacher.courses IS '主讲课程描述'; +COMMENT ON COLUMN public.train_teacher.start_teaching IS '从教时间/起教日期'; + +-- 1.3 教室表 train_classroom_info 增加 多媒体、投影、工位/座位布局 +ALTER TABLE public.train_classroom_info ADD COLUMN IF NOT EXISTS multimedia SMALLINT DEFAULT 0; +ALTER TABLE public.train_classroom_info ADD COLUMN IF NOT EXISTS projector SMALLINT DEFAULT 0; +ALTER TABLE public.train_classroom_info ADD COLUMN IF NOT EXISTS seat_arrange VARCHAR(100); +COMMENT ON COLUMN public.train_classroom_info.multimedia IS '是否具备多媒体设备 (0:无, 1:有)'; +COMMENT ON COLUMN public.train_classroom_info.projector IS '是否具备投影仪 (0:无, 1:有)'; +COMMENT ON COLUMN public.train_classroom_info.seat_arrange IS '座位布局形式'; + +-- 1.4 实训场地表 train_training_site 增加 适用专业 与 工位布局 +ALTER TABLE public.train_training_site ADD COLUMN IF NOT EXISTS major VARCHAR(100); +ALTER TABLE public.train_training_site ADD COLUMN IF NOT EXISTS seat_arrange VARCHAR(100); +COMMENT ON COLUMN public.train_training_site.major IS '适用专业/实训工种'; +COMMENT ON COLUMN public.train_training_site.seat_arrange IS '工位布局形式'; + +-- 1.5 课程表 train_course 增加 资源ID关联串 (逗号分隔资源ID) +ALTER TABLE public.train_course ADD COLUMN IF NOT EXISTS resource_id VARCHAR(500); +COMMENT ON COLUMN public.train_course.resource_id IS '关联教学资源ID集合 (逗号分隔)'; + +-- ============================================================================= +-- 步骤 2: 创建统一教学资源表 (train_resource) +-- ============================================================================= + +CREATE TABLE IF NOT EXISTS public.train_resource ( + resource_id VARCHAR(32) NOT NULL, + resource_name VARCHAR(150) NOT NULL, + resource_type SMALLINT NOT NULL, + resource_url TEXT NOT NULL, + description TEXT, + status SMALLINT NOT NULL DEFAULT 1, + create_by VARCHAR(64), + create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_by VARCHAR(64), + update_time TIMESTAMP, + remark VARCHAR(500), + del_flag CHAR(1) NOT NULL DEFAULT '0', + CONSTRAINT pk_train_resource PRIMARY KEY (resource_id) +); + +COMMENT ON TABLE public.train_resource IS '统一教学资源表 (文档、视频、3D模型、VR资源、外部教学链接、其他)'; +COMMENT ON COLUMN public.train_resource.resource_id IS '资源唯一ID (32位UUID)'; +COMMENT ON COLUMN public.train_resource.resource_name IS '资源名称'; +COMMENT ON COLUMN public.train_resource.resource_type IS '资源类型 (1:文档, 2:视频, 3:3D模型, 4:VR资源, 5:外部教学链接, 6:其他)'; +COMMENT ON COLUMN public.train_resource.resource_url IS '资源存储地址/在线链接'; +COMMENT ON COLUMN public.train_resource.description IS '资源描述/使用说明'; +COMMENT ON COLUMN public.train_resource.status IS '状态 (1:正常, 0:停用)'; +COMMENT ON COLUMN public.train_resource.del_flag IS '删除标志 (0:存在, 2:删除)'; + +CREATE INDEX IF NOT EXISTS idx_train_resource_type ON public.train_resource (resource_type); +CREATE INDEX IF NOT EXISTS idx_train_resource_status ON public.train_resource (status); + +-- ============================================================================= +-- 步骤 3: 补齐教学资源类型字典 (train_resource_type) +-- ============================================================================= + +INSERT INTO public.sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark) +SELECT 105, '教学资源类型', 'train_resource_type', '0', 'admin', CURRENT_TIMESTAMP, '资源载体分类 (1:文档, 2:视频, 3:3D模型, 4:VR资源, 5:外部教学链接, 6:其他)' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_type WHERE dict_type = 'train_resource_type'); + +INSERT INTO public.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) +SELECT 310, 1, '文档', '1', 'train_resource_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, 'PDF/Word/PPT等电子课件' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_data WHERE dict_type = 'train_resource_type' AND dict_value = '1'); + +INSERT INTO public.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) +SELECT 311, 2, '视频', '2', 'train_resource_type', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'MP4录播视频' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_data WHERE dict_type = 'train_resource_type' AND dict_value = '2'); + +INSERT INTO public.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) +SELECT 312, 3, '3D模型', '3', 'train_resource_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '3D数字化实物机车/工务模型' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_data WHERE dict_type = 'train_resource_type' AND dict_value = '3'); + +INSERT INTO public.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) +SELECT 313, 4, 'VR资源', '4', 'train_resource_type', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, '虚拟仿真头盔或交互式实训课件' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_data WHERE dict_type = 'train_resource_type' AND dict_value = '4'); + +INSERT INTO public.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) +SELECT 314, 5, '外部教学链接', '5', 'train_resource_type', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, '第三方外部实训/考试网址URL' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_data WHERE dict_type = 'train_resource_type' AND dict_value = '5'); + +INSERT INTO public.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) +SELECT 315, 6, '其他', '6', 'train_resource_type', '', 'default', 'N', '0', 'admin', CURRENT_TIMESTAMP, '其他类型教学资料' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_dict_data WHERE dict_type = 'train_resource_type' AND dict_value = '6'); + +-- ============================================================================= +-- 步骤 4: 补齐教学资源管理菜单与按钮权限 (挂载在课程管理 parent_id = 2162 下) +-- ============================================================================= + +-- 4.1 教学资源菜单 (menu_id = 2165) +INSERT INTO public.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) +SELECT 2165, '教学资源', 2162, 3, 'resource', 'train/resource/index', '', '1', '0', 'C', '0', '0', 'train:resource:list', 'documentation', 'admin', CURRENT_TIMESTAMP, '教学资源管理菜单' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2165 OR path = 'resource'); + +-- 4.2 教学资源查询按钮权限 (menu_id = 2271) +INSERT INTO public.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) +SELECT 2271, '教学资源查询', 2165, 1, '#', '', '', 1, 0, 'F', '0', '0', 'train:resource:list', '#', 'admin', CURRENT_TIMESTAMP, '教学资源查询' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2271 OR perms = 'train:resource:list'); + +-- 4.3 教学资源编辑按钮权限 (menu_id = 2272) +INSERT INTO public.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) +SELECT 2272, '教学资源编辑', 2165, 2, '#', '', '', 1, 0, 'F', '0', '0', 'train:resource:edit', '#', 'admin', CURRENT_TIMESTAMP, '教学资源新增/修改/删除' +WHERE NOT EXISTS (SELECT 1 FROM public.sys_menu WHERE menu_id = 2272 OR perms = 'train:resource:edit'); + +-- ============================================================================= +-- 步骤 5: 角色授权 (培训管理员 role_id = 3 与 超级管理员 role_id = 1) +-- ============================================================================= + +-- 培训管理员授权教学资源菜单与按钮 +INSERT INTO public.sys_role_menu (role_id, menu_id) +SELECT 3, 2165 +WHERE NOT EXISTS (SELECT 1 FROM public.sys_role_menu WHERE role_id = 3 AND menu_id = 2165); + +INSERT INTO public.sys_role_menu (role_id, menu_id) +SELECT 3, 2271 +WHERE NOT EXISTS (SELECT 1 FROM public.sys_role_menu WHERE role_id = 3 AND menu_id = 2271); + +INSERT INTO public.sys_role_menu (role_id, menu_id) +SELECT 3, 2272 +WHERE NOT EXISTS (SELECT 1 FROM public.sys_role_menu WHERE role_id = 3 AND menu_id = 2272); + +-- 超级管理员授权 +INSERT INTO public.sys_role_menu (role_id, menu_id) +SELECT 1, 2165 +WHERE NOT EXISTS (SELECT 1 FROM public.sys_role_menu WHERE role_id = 1 AND menu_id = 2165); + +INSERT INTO public.sys_role_menu (role_id, menu_id) +SELECT 1, 2271 +WHERE NOT EXISTS (SELECT 1 FROM public.sys_role_menu WHERE role_id = 1 AND menu_id = 2271); + +INSERT INTO public.sys_role_menu (role_id, menu_id) +SELECT 1, 2272 +WHERE NOT EXISTS (SELECT 1 FROM public.sys_role_menu WHERE role_id = 1 AND menu_id = 2272); + +COMMIT; diff --git a/RuoYi-Vue/sql/train/v2/rollback/011_pilot_20261010_master_data_and_resource_rollback.sql b/RuoYi-Vue/sql/train/v2/rollback/011_pilot_20261010_master_data_and_resource_rollback.sql new file mode 100644 index 000000000..fbef51ac2 --- /dev/null +++ b/RuoYi-Vue/sql/train/v2/rollback/011_pilot_20261010_master_data_and_resource_rollback.sql @@ -0,0 +1,38 @@ +-- ============================================================================== +-- RailwaySystem 数据库 V2 回滚脚本: 011_pilot_20261010_master_data_and_resource_rollback.sql +-- 适用数据库: KingbaseES V009R003C018 (schema: public) +-- 执行目标: 回滚 011_pilot_20261010_master_data_and_resource.sql 的变更 +-- ============================================================================== + +BEGIN; + +-- 1. 回滚角色菜单权限 +DELETE FROM public.sys_role_menu WHERE menu_id IN (2165, 2271, 2272); +DELETE FROM public.sys_menu WHERE menu_id IN (2165, 2271, 2272); + +-- 2. 回滚字典 +DELETE FROM public.sys_dict_data WHERE dict_type = 'train_resource_type'; +DELETE FROM public.sys_dict_type WHERE dict_type = 'train_resource_type'; + +-- 3. 删除教学资源表及索引 +DROP TABLE IF EXISTS public.train_resource CASCADE; + +-- 4. 删除主数据扩展列 +ALTER TABLE public.train_student DROP COLUMN IF EXISTS avatar; +ALTER TABLE public.train_student DROP COLUMN IF EXISTS duty_level; + +ALTER TABLE public.train_teacher DROP COLUMN IF EXISTS avatar; +ALTER TABLE public.train_teacher DROP COLUMN IF EXISTS major; +ALTER TABLE public.train_teacher DROP COLUMN IF EXISTS courses; +ALTER TABLE public.train_teacher DROP COLUMN IF EXISTS start_teaching; + +ALTER TABLE public.train_classroom_info DROP COLUMN IF EXISTS multimedia; +ALTER TABLE public.train_classroom_info DROP COLUMN IF EXISTS projector; +ALTER TABLE public.train_classroom_info DROP COLUMN IF EXISTS seat_arrange; + +ALTER TABLE public.train_training_site DROP COLUMN IF EXISTS major; +ALTER TABLE public.train_training_site DROP COLUMN IF EXISTS seat_arrange; + +ALTER TABLE public.train_course DROP COLUMN IF EXISTS resource_id; + +COMMIT;