-- ============================================================================== -- RailwaySystem 数据库 V2 迁移脚本: 002_create_new_tables.sql -- 适用数据库: KingbaseES V009R003C018 (schema: public) -- 执行目标: 创建数据库 V2 新增的 8 张核心培训业务表 -- 事务边界: 全程在显式事务 BEGIN ... COMMIT 中执行 -- 设计依据: RailwaySystem 数据库 V2 字段设计与 Kingbase DDL 规范 V1.0 及 Round 1 审查要求 -- 规范要求: -- 1. 主键为 bigint GENERATED BY DEFAULT AS IDENTITY 或 varchar(32) -- 2. 时间类型统一使用 timestamp,禁用 DATETIME / ON UPDATE CURRENT_TIMESTAMP -- 3. 状态与布尔统一使用 smallint -- 4. train_lesson.t_id 设为 NOT NULL -- 5. train_student_score.score 设为 NOT NULL (删除 DEFAULT 0) 并增加 score >= 0 CHECK -- 6. train_lesson 增加 venue_type 与教室/场地的单行互斥 CHECK -- 7. 字典语义严格对齐 V2 冻结稿 -- ============================================================================== BEGIN; -- 1. 统一教学资源主表 CREATE TABLE 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 train_resource IS '统一教学资源表 (文档、视频、3D模型、VR资源、外部教学链接、其他)'; COMMENT ON COLUMN train_resource.resource_id IS '资源唯一ID'; COMMENT ON COLUMN train_resource.resource_name IS '资源名称'; COMMENT ON COLUMN train_resource.resource_type IS '资源类型 (1:文档, 2:视频, 3:3D模型, 4:VR资源, 5:外部教学链接, 6:其他)'; COMMENT ON COLUMN train_resource.resource_url IS '资源存储地址/在线链接'; COMMENT ON COLUMN train_resource.description IS '资源描述/使用说明'; COMMENT ON COLUMN train_resource.status IS '状态 (1:正常, 0:停用)'; COMMENT ON COLUMN train_resource.del_flag IS '删除标志 (0:存在, 2:删除)'; -- 2. 课程与资源多对多关联表 CREATE TABLE 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 train_course_resource IS '课程与教学资源关联表 (N:M)'; COMMENT ON COLUMN train_course_resource.id IS '自增主键'; COMMENT ON COLUMN train_course_resource.c_id IS '课程ID'; COMMENT ON COLUMN train_course_resource.resource_id IS '资源ID'; COMMENT ON COLUMN train_course_resource.sort_no IS '排序号'; -- 3. 培训班与课程关联表 CREATE TABLE train_plan_course ( plan_course_id BIGINT GENERATED BY DEFAULT AS IDENTITY, plan_id VARCHAR(32) NOT NULL, c_id VARCHAR(32) NOT NULL, sort_no INTEGER DEFAULT 0, create_by VARCHAR(64), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, remark VARCHAR(500), CONSTRAINT pk_train_plan_course PRIMARY KEY (plan_course_id) ); COMMENT ON TABLE train_plan_course IS '培训班课程关联表 (一期培训包含哪些课程)'; COMMENT ON COLUMN train_plan_course.plan_course_id IS '培训课程实例ID (核心ID之一)'; COMMENT ON COLUMN train_plan_course.plan_id IS '培训班ID'; COMMENT ON COLUMN train_plan_course.c_id IS '课程ID'; COMMENT ON COLUMN train_plan_course.sort_no IS '排课先后顺序号'; -- 4. 参训学员登记表 (系统最核心关系: 谁参加哪个班) CREATE TABLE train_enrollment ( enrollment_id BIGINT GENERATED BY DEFAULT AS IDENTITY, plan_id VARCHAR(32) NOT NULL, student_id VARCHAR(32) NOT NULL, source_type SMALLINT NOT NULL, enrollment_status SMALLINT NOT NULL DEFAULT 0, accommodation_required SMALLINT NOT NULL, join_time TIMESTAMP, complete_time TIMESTAMP, create_by VARCHAR(64), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64), update_time TIMESTAMP, remark VARCHAR(500), CONSTRAINT pk_train_enrollment PRIMARY KEY (enrollment_id) ); COMMENT ON TABLE train_enrollment IS '参训学员登记表 (学员参加培训班全生命周期主表)'; COMMENT ON COLUMN train_enrollment.enrollment_id IS '参训档案ID (核心ID之一)'; COMMENT ON COLUMN train_enrollment.plan_id IS '培训班ID'; COMMENT ON COLUMN train_enrollment.student_id IS '学员长期主档ID引用'; COMMENT ON COLUMN train_enrollment.source_type IS '参训名单来源,具体字典值由 train_enrollment_source 定义'; COMMENT ON COLUMN train_enrollment.enrollment_status IS '参训状态 (0:待报到, 1:已报到, 2:请假, 3:放弃, 4:已完成)'; COMMENT ON COLUMN train_enrollment.accommodation_required IS '是否需要住宿 (0:否, 1:是)'; COMMENT ON COLUMN train_enrollment.join_time IS '入班报到时间'; COMMENT ON COLUMN train_enrollment.complete_time IS '培训完成/结课时间'; -- 5. 教学活动排课表 (排课课次必要包含授课教师,且场地类型与教室/实训场地严格互斥) CREATE TABLE train_lesson ( lesson_id BIGINT GENERATED BY DEFAULT AS IDENTITY, plan_course_id BIGINT NOT NULL, t_id VARCHAR(32) NOT NULL, start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL, venue_type SMALLINT NOT NULL, class_room_id VARCHAR(32), site_id VARCHAR(32), create_by VARCHAR(64), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64), update_time TIMESTAMP, remark VARCHAR(500), CONSTRAINT pk_train_lesson PRIMARY KEY (lesson_id), CONSTRAINT chk_lesson_venue CHECK ( (venue_type = 1 AND class_room_id IS NOT NULL AND site_id IS NULL) OR (venue_type = 2 AND site_id IS NOT NULL AND class_room_id IS NULL) ) ); COMMENT ON TABLE train_lesson IS '课次教学活动表 (具体一次上课/实训安排)'; COMMENT ON COLUMN train_lesson.lesson_id IS '课次ID (核心ID之一)'; COMMENT ON COLUMN train_lesson.plan_course_id IS '所属培训课程实例ID'; COMMENT ON COLUMN train_lesson.t_id IS '授课教师ID (课次必要组成)'; COMMENT ON COLUMN train_lesson.start_time IS '课次开始时间'; COMMENT ON COLUMN train_lesson.end_time IS '课次结束时间'; COMMENT ON COLUMN train_lesson.venue_type IS '场地类型 (1:普通教室, 2:实训场地)'; COMMENT ON COLUMN train_lesson.class_room_id IS '普通教室ID (当场地类型为教室时必填且场地为空)'; COMMENT ON COLUMN train_lesson.site_id IS '实训场地ID (当场地类型为实训场地时必填且教室为空)'; -- 6. 学员住宿安排表 (房间必填 + 床位可选) CREATE TABLE train_accommodation ( accommodation_id BIGINT GENERATED BY DEFAULT AS IDENTITY, enrollment_id BIGINT NOT NULL, dorm_id VARCHAR(32) NOT NULL, bed_no VARCHAR(20), assigned_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, accommodation_status SMALLINT NOT NULL DEFAULT 0, create_by VARCHAR(64), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64), update_time TIMESTAMP, remark VARCHAR(500), CONSTRAINT pk_train_accommodation PRIMARY KEY (accommodation_id) ); COMMENT ON TABLE train_accommodation IS '学员住宿安排表 (本次参训住宿分配)'; COMMENT ON COLUMN train_accommodation.accommodation_id IS '住宿安排ID'; COMMENT ON COLUMN train_accommodation.enrollment_id IS '参训档案ID'; COMMENT ON COLUMN train_accommodation.dorm_id IS '分配宿舍房间ID'; COMMENT ON COLUMN train_accommodation.bed_no IS '分配床位号 (可选)'; COMMENT ON COLUMN train_accommodation.assigned_time IS '分配时间'; COMMENT ON COLUMN train_accommodation.accommodation_status IS '住宿状态 (0:预分配, 1:已入住, 2:已退宿)'; -- 7. 培训班考核成绩项配置表 (用户自由配置分值与权重) CREATE TABLE train_score_item ( score_item_id BIGINT GENERATED BY DEFAULT AS IDENTITY, plan_id VARCHAR(32) NOT NULL, plan_course_id BIGINT, item_name VARCHAR(100) NOT NULL, item_type SMALLINT NOT NULL DEFAULT 1, weight NUMERIC(5,2) NOT NULL DEFAULT 0.00, full_score NUMERIC(5,2) NOT NULL DEFAULT 100.00, sort_no INTEGER DEFAULT 0, create_by VARCHAR(64), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64), update_time TIMESTAMP, remark VARCHAR(500), CONSTRAINT pk_train_score_item PRIMARY KEY (score_item_id) ); COMMENT ON TABLE train_score_item IS '考核成绩项配置表 (某培训班的成绩构成规则)'; COMMENT ON COLUMN train_score_item.score_item_id IS '成绩项ID'; COMMENT ON COLUMN train_score_item.plan_id IS '培训班ID'; COMMENT ON COLUMN train_score_item.plan_course_id IS '关联培训课程ID (为空表示全班综合项)'; COMMENT ON COLUMN train_score_item.item_name IS '考核项目名称'; COMMENT ON COLUMN train_score_item.item_type IS '项目类型 (1:理论考试, 2:实操演练, 3:出勤考核, 4:综合评价)'; COMMENT ON COLUMN train_score_item.weight IS '所占综合权重百分比 (0~100)'; COMMENT ON COLUMN train_score_item.full_score IS '满分设定 (默认 100)'; COMMENT ON COLUMN train_score_item.sort_no IS '展示顺序'; -- 8. 学员单项得分明细表 (参训学员在某考核项上的实际成绩,无默认0,有行即有分且非负) CREATE TABLE train_student_score ( score_id BIGINT GENERATED BY DEFAULT AS IDENTITY, enrollment_id BIGINT NOT NULL, score_item_id BIGINT NOT NULL, score NUMERIC(7,2) NOT NULL, source_type SMALLINT NOT NULL, source_system VARCHAR(100), source_event_id VARCHAR(100), import_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, create_by VARCHAR(64), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, update_by VARCHAR(64), update_time TIMESTAMP, remark VARCHAR(500), CONSTRAINT pk_train_student_score PRIMARY KEY (score_id), CONSTRAINT chk_student_score_nonneg CHECK (score >= 0.00) ); COMMENT ON TABLE train_student_score IS '学员成绩明细表 (某学员某成绩项得分,未录入成绩不生成记录)'; COMMENT ON COLUMN train_student_score.score_id IS '成绩明细ID'; COMMENT ON COLUMN train_student_score.enrollment_id IS '参训档案ID'; COMMENT ON COLUMN train_student_score.score_item_id IS '关联成绩项ID'; COMMENT ON COLUMN train_student_score.score IS '实际得分 (非负,未录成绩不建行,0为真实0分)'; COMMENT ON COLUMN train_student_score.source_type IS '录入来源类型 (1:人工录入, 2:理论考试系统, 3:实操设备, 4:外部导入)'; COMMENT ON COLUMN train_student_score.source_system IS '来源外部系统名称'; COMMENT ON COLUMN train_student_score.source_event_id IS '来源外部事件/单号ID (用于幂等)'; COMMENT ON COLUMN train_student_score.import_time IS '成绩写入/同步时间'; COMMIT;