合并分支:合并课程两步式向导与教学资源关联管理能力

This commit is contained in:
wangzhibiao committed 2026-10-09 21:33:35 +08:00
commit 9030d797f4
22 files changed
+1178 -291

No files matched your search

@@ -3,7 +3,7 @@
-- 适用数据库: KingbaseES V009R003C018 (schema: public)
-- 执行目标:
-- 1. 补齐学员、教师、教室、实训场地、课程主数据新增扩展字段 (11个物理列)
-- 2. 创建统一教学资源表 (train_resource) 及其索引与字典
-- 2. 创建统一教学资源表及课程-资源规范关联表
-- 3. 补齐教学资源管理菜单 (sys_menu) 与培训管理员/超级管理员角色授权 (sys_role_menu)
-- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行
-- 幂等保证: 全部 DDL / DML 均具备 IF NOT EXISTS 或 NOT EXISTS 守卫,可安全重复执行
@@ -45,10 +45,6 @@ ALTER TABLE public.train_training_site ADD COLUMN IF NOT EXISTS seat_arrange VAR
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)
-- =============================================================================
@@ -81,6 +77,9 @@ 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);
-- 步骤 2 结束: 教学资源表创建完成。课程资源多对多关联见增量迁移脚本 012。
-- =============================================================================
-- 步骤 3: 补齐教学资源类型字典 (train_resource_type)
-- =============================================================================
@@ -0,0 +1,91 @@
-- ==============================================================================
-- RailwaySystem 数据库 V2 增量迁移脚本: 012_pilot_20261010_course_resource_relation.sql
-- 适用数据库: KingbaseES V009R003C018 (schema: public)
-- 执行目标: 创建课程与教学资源规范多对多关系表 (train_course_resource),迁移历史关联,保留物理字段兼容
-- 架构方案: 改进 B+ 方案 (唯一权威存储为 train_course_resource;保留 train_course.resource_id 禁止 DROP COLUMN)
-- ==============================================================================
BEGIN;
-- 步骤 1: 创建规范课程资源多对多关联表
CREATE TABLE IF NOT EXISTS public.train_course_resource (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
c_id VARCHAR(32) NOT NULL,
resource_id VARCHAR(32) NOT NULL,
sort_no INTEGER DEFAULT 0,
create_by VARCHAR(64),
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pk_train_course_resource PRIMARY KEY (id)
);
COMMENT ON TABLE public.train_course_resource IS '课程与教学资源关联表 (N:M 唯一权威存储)';
COMMENT ON COLUMN public.train_course_resource.id IS '主键ID';
COMMENT ON COLUMN public.train_course_resource.c_id IS '课程ID';
COMMENT ON COLUMN public.train_course_resource.resource_id IS '教学资源ID';
COMMENT ON COLUMN public.train_course_resource.sort_no IS '课程内资源排序号';
COMMENT ON COLUMN public.train_course_resource.create_by IS '绑定操作人';
COMMENT ON COLUMN public.train_course_resource.create_time IS '绑定时间';
-- 步骤 2: 创建索引与唯一约束 (保证幂等防重复)
CREATE UNIQUE INDEX IF NOT EXISTS uq_course_resource
ON public.train_course_resource (c_id, resource_id);
CREATE INDEX IF NOT EXISTS idx_course_resource_course
ON public.train_course_resource (c_id);
CREATE INDEX IF NOT EXISTS idx_course_resource_resource
ON public.train_course_resource (resource_id);
-- 外键约束 (如果不存在则添加)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_cr_course') THEN
ALTER TABLE public.train_course_resource
ADD CONSTRAINT fk_cr_course FOREIGN KEY (c_id)
REFERENCES public.train_course (c_id);
END IF;
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'fk_cr_resource') THEN
ALTER TABLE public.train_course_resource
ADD CONSTRAINT fk_cr_resource FOREIGN KEY (resource_id)
REFERENCES public.train_resource (resource_id);
END IF;
END $$;
-- 步骤 3: 幂等迁移历史 train_course.resource_id 字段数据
-- 仅当 train_course.resource_id 非空且关联在 train_resource 中有效(del_flag='0')时迁移,
-- 且 ON CONFLICT (c_id, resource_id) DO NOTHING 避免覆盖已存在的关联,亦不破坏已解绑关系。
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'train_course'
AND column_name = 'resource_id'
) THEN
INSERT INTO public.train_course_resource
(c_id, resource_id, sort_no, create_by, create_time)
SELECT legacy.c_id,
legacy.resource_id,
legacy.sort_no,
'migration_012',
CURRENT_TIMESTAMP
FROM (
SELECT c.c_id,
trim(parts.resource_id) AS resource_id,
CAST(parts.ordinality - 1 AS INTEGER) AS sort_no
FROM public.train_course c
CROSS JOIN LATERAL regexp_split_to_table(c.resource_id, ',')
WITH ORDINALITY AS parts(resource_id, ordinality)
WHERE c.resource_id IS NOT NULL
AND trim(c.resource_id) <> ''
) legacy
JOIN public.train_resource r
ON r.resource_id = legacy.resource_id
AND r.del_flag = '0'
WHERE legacy.resource_id <> ''
ON CONFLICT (c_id, resource_id) DO NOTHING;
END IF;
END $$;
-- 注意:根据改进 B+ 方案决策,train_course.resource_id 物理字段必须永久保留(供向下兼容只读/兼容调用),
-- 禁止执行 ALTER TABLE train_course DROP COLUMN resource_id!
COMMIT;
@@ -14,8 +14,8 @@ DELETE FROM public.sys_menu WHERE menu_id IN (2270, 2271, 2272);
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;
-- 3. 删除教学资源表及索引 (无 CASCADE 保护数据安全;train_course_resource 回滚见 012 回滚脚本)
DROP TABLE IF EXISTS public.train_resource;
-- 4. 删除主数据扩展列
ALTER TABLE public.train_student DROP COLUMN IF EXISTS avatar;
@@ -33,6 +33,4 @@ 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;
@@ -0,0 +1,14 @@
-- ==============================================================================
-- RailwaySystem 数据库 V2 回滚脚本: 012_pilot_20261010_course_resource_relation_rollback.sql
-- 适用数据库: KingbaseES V009R003C018 (schema: public)
-- 执行目标: 安全回滚 012_pilot_20261010_course_resource_relation.sql 的变更
-- ==============================================================================
BEGIN;
-- 移除外键约束与关联表(禁止 CASCADE)
ALTER TABLE IF EXISTS public.train_course_resource DROP CONSTRAINT IF EXISTS fk_cr_course;
ALTER TABLE IF EXISTS public.train_course_resource DROP CONSTRAINT IF EXISTS fk_cr_resource;
DROP TABLE IF EXISTS public.train_course_resource;
COMMIT;