-- ------------------------------------------------------------
-- 学生选课管理系统 - 业务数据结构初始化脚本
-- 依赖基础库：RuoYi-Vue 3.9.0（ry_20250522.sql）
-- ------------------------------------------------------------

-- 1. 学期信息表
DROP TABLE IF EXISTS edu_semester;
CREATE TABLE edu_semester (
  semester_id        BIGINT(20)      NOT NULL AUTO_INCREMENT COMMENT '学期ID',
  semester_code      VARCHAR(20)     NOT NULL                COMMENT '学期编码，例如 2024-2025-1',
  semester_name      VARCHAR(50)     NOT NULL                COMMENT '学期名称',
  start_date         DATE            NOT NULL                COMMENT '教学开始日期',
  end_date           DATE            NOT NULL                COMMENT '教学结束日期',
  enroll_start_time  DATETIME        NOT NULL                COMMENT '统一选课开始时间',
  enroll_end_time    DATETIME        NOT NULL                COMMENT '统一选课结束时间',
  status             CHAR(1)         DEFAULT '0'             COMMENT '状态（0草稿 1进行中 2已归档）',
  remark             VARCHAR(255)    DEFAULT NULL            COMMENT '备注',
  create_by          VARCHAR(64)     DEFAULT ''              COMMENT '创建者',
  create_time        DATETIME                                 COMMENT '创建时间',
  update_by          VARCHAR(64)     DEFAULT ''              COMMENT '更新者',
  update_time        DATETIME                                 COMMENT '更新时间',
  PRIMARY KEY (semester_id),
  UNIQUE KEY uk_semester_code (semester_code)
) ENGINE=InnoDB COMMENT='学期信息表';

-- 2. 学生档案表
DROP TABLE IF EXISTS edu_student;
CREATE TABLE edu_student (
  student_id      BIGINT(20)      NOT NULL AUTO_INCREMENT COMMENT '学生ID',
  user_id         BIGINT(20)      NOT NULL                COMMENT '关联系统用户ID',
  student_no      VARCHAR(30)     NOT NULL                COMMENT '学号',
  real_name       VARCHAR(50)     NOT NULL                COMMENT '姓名',
  gender          CHAR(1)         DEFAULT '0'             COMMENT '性别（0男 1女 2未知）',
  dept_id         BIGINT(20)      DEFAULT NULL            COMMENT '院系部门ID（关联sys_dept）',
  major           VARCHAR(100)    DEFAULT NULL            COMMENT '专业名称',
  grade           VARCHAR(20)     DEFAULT NULL            COMMENT '年级，例如2022',
  class_name      VARCHAR(50)     DEFAULT NULL            COMMENT '行政班',
  enroll_year     VARCHAR(10)     DEFAULT NULL            COMMENT '入学年份',
  contact_phone   VARCHAR(20)     DEFAULT NULL            COMMENT '联系方式',
  contact_email   VARCHAR(50)     DEFAULT NULL            COMMENT '联系邮箱',
  status          CHAR(1)         DEFAULT '0'             COMMENT '学籍状态（0在籍 1休学 2退学）',
  remark          VARCHAR(255)    DEFAULT NULL            COMMENT '备注',
  create_by       VARCHAR(64)     DEFAULT ''              COMMENT '创建者',
  create_time     DATETIME                                 COMMENT '创建时间',
  update_by       VARCHAR(64)     DEFAULT ''              COMMENT '更新者',
  update_time     DATETIME                                 COMMENT '更新时间',
  PRIMARY KEY (student_id),
  UNIQUE KEY uk_student_no (student_no),
  UNIQUE KEY uk_student_user (user_id)
) ENGINE=InnoDB COMMENT='学生档案表';

-- 3. 教师档案表
DROP TABLE IF EXISTS edu_teacher;
CREATE TABLE edu_teacher (
  teacher_id      BIGINT(20)      NOT NULL AUTO_INCREMENT COMMENT '教师ID',
  user_id         BIGINT(20)      NOT NULL                COMMENT '关联系统用户ID',
  teacher_no      VARCHAR(30)     NOT NULL                COMMENT '工号',
  real_name       VARCHAR(50)     NOT NULL                COMMENT '姓名',
  gender          CHAR(1)         DEFAULT '0'             COMMENT '性别（0男 1女 2未知）',
  dept_id         BIGINT(20)      DEFAULT NULL            COMMENT '所属院系（关联sys_dept）',
  title           VARCHAR(50)     DEFAULT NULL            COMMENT '职称',
  contact_phone   VARCHAR(20)     DEFAULT NULL            COMMENT '联系方式',
  contact_email   VARCHAR(50)     DEFAULT NULL            COMMENT '联系邮箱',
  entry_date      DATE            DEFAULT NULL            COMMENT '入职日期',
  status          CHAR(1)         DEFAULT '0'             COMMENT '任职状态（0在职 1离职 2停职）',
  remark          VARCHAR(255)    DEFAULT NULL            COMMENT '备注',
  create_by       VARCHAR(64)     DEFAULT ''              COMMENT '创建者',
  create_time     DATETIME                                 COMMENT '创建时间',
  update_by       VARCHAR(64)     DEFAULT ''              COMMENT '更新者',
  update_time     DATETIME                                 COMMENT '更新时间',
  PRIMARY KEY (teacher_id),
  UNIQUE KEY uk_teacher_no (teacher_no),
  UNIQUE KEY uk_teacher_user (user_id)
) ENGINE=InnoDB COMMENT='教师档案表';

-- 4. 教室信息表
DROP TABLE IF EXISTS edu_classroom;
CREATE TABLE edu_classroom (
  classroom_id    BIGINT(20)      NOT NULL AUTO_INCREMENT COMMENT '教室ID',
  building        VARCHAR(100)    DEFAULT ''              COMMENT '楼宇',
  room_no         VARCHAR(30)     NOT NULL                COMMENT '教室编号',
  capacity        INT(6)          DEFAULT 0               COMMENT '容量',
  room_type       VARCHAR(20)     DEFAULT 'theory'        COMMENT '教室类型（theory理论 lab实验 multi多媒体）',
  status          CHAR(1)         DEFAULT '0'             COMMENT '状态（0可用 1停用）',
  remark          VARCHAR(255)    DEFAULT NULL            COMMENT '备注',
  create_by       VARCHAR(64)     DEFAULT ''              COMMENT '创建者',
  create_time     DATETIME                                 COMMENT '创建时间',
  update_by       VARCHAR(64)     DEFAULT ''              COMMENT '更新者',
  update_time     DATETIME                                 COMMENT '更新时间',
  PRIMARY KEY (classroom_id),
  UNIQUE KEY uk_room (building, room_no)
) ENGINE=InnoDB COMMENT='教室信息表';

-- 5. 课程信息表
DROP TABLE IF EXISTS edu_course;
CREATE TABLE edu_course (
  course_id       BIGINT(20)      NOT NULL AUTO_INCREMENT COMMENT '课程ID',
  course_code     VARCHAR(30)     NOT NULL                COMMENT '课程编码',
  course_name     VARCHAR(100)    NOT NULL                COMMENT '课程名称',
  course_type     VARCHAR(20)     DEFAULT 'elective'      COMMENT '课程类型（字典：edu_course_type）',
  credit          DECIMAL(4,1)    DEFAULT 0               COMMENT '学分',
  total_hours     INT(4)          DEFAULT 0               COMMENT '总学时',
  theory_hours    INT(4)          DEFAULT 0               COMMENT '理论学时',
  practice_hours  INT(4)          DEFAULT 0               COMMENT '实验学时',
  dept_id         BIGINT(20)      DEFAULT NULL            COMMENT '开课院系（关联sys_dept）',
  status          CHAR(1)         DEFAULT '0'             COMMENT '状态（0启用 1停用）',
  description     VARCHAR(500)    DEFAULT NULL            COMMENT '课程简介',
  create_by       VARCHAR(64)     DEFAULT ''              COMMENT '创建者',
  create_time     DATETIME                                 COMMENT '创建时间',
  update_by       VARCHAR(64)     DEFAULT ''              COMMENT '更新者',
  update_time     DATETIME                                 COMMENT '更新时间',
  PRIMARY KEY (course_id),
  UNIQUE KEY uk_course_code (course_code)
) ENGINE=InnoDB COMMENT='课程信息表';

-- 6. 开课计划表
DROP TABLE IF EXISTS edu_course_class;
CREATE TABLE edu_course_class (
  class_id          BIGINT(20)     NOT NULL AUTO_INCREMENT COMMENT '开课ID',
  course_id         BIGINT(20)     NOT NULL                COMMENT '课程ID',
  semester_id       BIGINT(20)     NOT NULL                COMMENT '学期ID',
  teacher_id        BIGINT(20)     NOT NULL                COMMENT '授课教师ID',
  class_code        VARCHAR(30)    NOT NULL                COMMENT '班级编号',
  capacity          INT(4)         NOT NULL DEFAULT 50     COMMENT '容量上限',
  enroll_limit      INT(4)         DEFAULT 0               COMMENT '选课人数上限，0表示同容量',
  enrolled_count    INT(4)         DEFAULT 0               COMMENT '已选人数',
  classroom_id      BIGINT(20)     DEFAULT NULL            COMMENT '授课教室',
  enroll_start_time DATETIME       DEFAULT NULL            COMMENT '选课开始时间',
  enroll_end_time   DATETIME       DEFAULT NULL            COMMENT '选课结束时间',
  teach_start_date  DATE           DEFAULT NULL            COMMENT '开课日期',
  teach_end_date    DATE           DEFAULT NULL            COMMENT '结课日期',
  weekday           VARCHAR(20)    DEFAULT NULL            COMMENT '上课星期描述，例如 周一',
  time_slot         VARCHAR(50)    DEFAULT NULL            COMMENT '上课节次描述，例如 第1-2节',
  status            CHAR(1)        DEFAULT '0'             COMMENT '状态（0待发布 1可选课 2已满额 3已结课）',
  remark            VARCHAR(255)   DEFAULT NULL            COMMENT '备注',
  create_by         VARCHAR(64)    DEFAULT ''              COMMENT '创建者',
  create_time       DATETIME                                COMMENT '创建时间',
  update_by         VARCHAR(64)    DEFAULT ''              COMMENT '更新者',
  update_time       DATETIME                                COMMENT '更新时间',
  PRIMARY KEY (class_id),
  UNIQUE KEY uk_class_code (class_code),
  KEY idx_class_course (course_id),
  KEY idx_class_semester (semester_id),
  KEY idx_class_teacher (teacher_id)
) ENGINE=InnoDB COMMENT='开课计划表';

-- 7. 节次安排表
DROP TABLE IF EXISTS edu_course_schedule;
CREATE TABLE edu_course_schedule (
  schedule_id    BIGINT(20)     NOT NULL AUTO_INCREMENT COMMENT '节次ID',
  class_id       BIGINT(20)     NOT NULL                COMMENT '开课ID',
  weekday        TINYINT(2)     NOT NULL                COMMENT '周几（1-7）',
  period_start   TINYINT(2)     NOT NULL                COMMENT '开始节次',
  period_end     TINYINT(2)     NOT NULL                COMMENT '结束节次',
  weeks          VARCHAR(100)   DEFAULT NULL            COMMENT '上课周次，例如 1-16',
  classroom_id   BIGINT(20)     DEFAULT NULL            COMMENT '教室ID',
  remark         VARCHAR(255)   DEFAULT NULL            COMMENT '备注',
  create_by      VARCHAR(64)    DEFAULT ''              COMMENT '创建者',
  create_time    DATETIME                               COMMENT '创建时间',
  update_by      VARCHAR(64)    DEFAULT ''              COMMENT '更新者',
  update_time    DATETIME                               COMMENT '更新时间',
  PRIMARY KEY (schedule_id),
  KEY idx_schedule_class (class_id)
) ENGINE=InnoDB COMMENT='开课节次安排表';

-- 8. 选课记录表
DROP TABLE IF EXISTS edu_enrollment;
CREATE TABLE edu_enrollment (
  enrollment_id   BIGINT(20)     NOT NULL AUTO_INCREMENT COMMENT '选课记录ID',
  class_id        BIGINT(20)     NOT NULL                COMMENT '开课ID',
  student_id      BIGINT(20)     NOT NULL                COMMENT '学生ID',
  select_time     DATETIME       NOT NULL                COMMENT '选课时间',
  status          CHAR(1)        DEFAULT '0'             COMMENT '记录状态（0已选 1已退）',
  drop_time       DATETIME       DEFAULT NULL            COMMENT '退课时间',
  score           DECIMAL(5,2)   DEFAULT NULL            COMMENT '课程成绩',
  eval_status     CHAR(1)        DEFAULT '0'             COMMENT '评价状态（0未评 1已评）',
  remark          VARCHAR(255)   DEFAULT NULL            COMMENT '备注',
  create_by       VARCHAR(64)    DEFAULT ''              COMMENT '创建者',
  create_time     DATETIME                               COMMENT '创建时间',
  update_by       VARCHAR(64)    DEFAULT ''              COMMENT '更新者',
  update_time     DATETIME                               COMMENT '更新时间',
  PRIMARY KEY (enrollment_id),
  UNIQUE KEY uk_enrollment (class_id, student_id),
  KEY idx_enroll_student (student_id),
  KEY idx_enroll_status (status)
) ENGINE=InnoDB COMMENT='选课记录表';

-- 9. 字典类型扩展
INSERT INTO sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark) VALUES
  (11, '学期状态', 'edu_semester_status', '0', 'admin', SYSDATE(), '学期状态字典'),
  (12, '课程类型', 'edu_course_type', '0', 'admin', SYSDATE(), '课程类型字典'),
  (13, '开课状态', 'edu_course_class_status', '0', 'admin', SYSDATE(), '开课计划状态字典'),
  (14, '学籍状态', 'edu_student_status', '0', 'admin', SYSDATE(), '学生状态字典'),
  (15, '教师状态', 'edu_teacher_status', '0', 'admin', SYSDATE(), '教师状态字典'),
  (16, '选课记录状态', 'edu_enrollment_status', '0', 'admin', SYSDATE(), '选课记录状态字典'),
  (17, '教室类型', 'edu_classroom_type', '0', 'admin', SYSDATE(), '教室类型字典');

-- 10. 字典数据扩展
INSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) VALUES
  (30, 1, '草稿', '0', 'edu_semester_status', 'Y', '0', 'admin', SYSDATE(), '未发布'),
  (31, 2, '进行中', '1', 'edu_semester_status', 'N', '0', 'admin', SYSDATE(), '当前学期'),
  (32, 3, '已归档', '2', 'edu_semester_status', 'N', '0', 'admin', SYSDATE(), '历史学期'),
  (33, 1, '必修课', 'required', 'edu_course_type', 'Y', '0', 'admin', SYSDATE(), ''),
  (34, 2, '选修课', 'elective', 'edu_course_type', 'N', '0', 'admin', SYSDATE(), ''),
  (35, 3, '公选课', 'public', 'edu_course_type', 'N', '0', 'admin', SYSDATE(), ''),
  (36, 1, '待发布', '0', 'edu_course_class_status', 'Y', '0', 'admin', SYSDATE(), ''),
  (37, 2, '可选课', '1', 'edu_course_class_status', 'N', '0', 'admin', SYSDATE(), ''),
  (38, 3, '已满额', '2', 'edu_course_class_status', 'N', '0', 'admin', SYSDATE(), ''),
  (39, 4, '已结课', '3', 'edu_course_class_status', 'N', '0', 'admin', SYSDATE(), ''),
  (40, 1, '在籍', '0', 'edu_student_status', 'Y', '0', 'admin', SYSDATE(), ''),
  (41, 2, '休学', '1', 'edu_student_status', 'N', '0', 'admin', SYSDATE(), ''),
  (42, 3, '退学', '2', 'edu_student_status', 'N', '0', 'admin', SYSDATE(), ''),
  (43, 1, '在职', '0', 'edu_teacher_status', 'Y', '0', 'admin', SYSDATE(), ''),
  (44, 2, '离职', '1', 'edu_teacher_status', 'N', '0', 'admin', SYSDATE(), ''),
  (45, 3, '停职', '2', 'edu_teacher_status', 'N', '0', 'admin', SYSDATE(), ''),
  (46, 1, '已选', '0', 'edu_enrollment_status', 'Y', '0', 'admin', SYSDATE(), ''),
  (47, 2, '已退', '1', 'edu_enrollment_status', 'N', '0', 'admin', SYSDATE(), ''),
  (48, 1, '理论课', 'theory', 'edu_classroom_type', 'Y', '0', 'admin', SYSDATE(), ''),
  (49, 2, '实验室', 'lab', 'edu_classroom_type', 'N', '0', 'admin', SYSDATE(), ''),
  (50, 3, '多媒体', 'multi', 'edu_classroom_type', 'N', '0', 'admin', SYSDATE(), '');
