Files
Edu/scripts/core-edu-init.sql
SpecialX 58c0ba1bd9 feat(core-edu): 完整实现 core-edu 教学核心服务
包含 classes/exams/homework/grades/attendance/scheduling 域、outbox、iam-consumer、redis 配置等完整实现
2026-07-10 19:08:56 +08:00

266 lines
10 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- CoreEdu 服务数据库初始化脚本P3 完整版)
-- 共 14 表:考试域 3 + 作业域 3 + 成绩域 2 + 排课考勤域 4 + Outbox 1 + 教师关联 1
-- 仲裁依据02-architecture-design.md §3.1 + president-final-rulings §2.5
-- ============================================================================
-- 考试域
-- ============================================================================
CREATE TABLE IF NOT EXISTS core_edu_exams (
id CHAR(36) NOT NULL PRIMARY KEY,
class_id CHAR(36) NOT NULL,
subject_id CHAR(36) NOT NULL,
title VARCHAR(200) NOT NULL,
description TEXT,
exam_date DATETIME NOT NULL,
duration INT NOT NULL,
total_score DECIMAL(6,2) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'draft',
status_changed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
status_changed_by CHAR(36),
school_id CHAR(36) NOT NULL,
created_by CHAR(36) NOT NULL,
archived_at DATETIME NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_exams_class_status (class_id, status),
INDEX idx_exams_school_date (school_id, exam_date),
INDEX idx_exams_created_by (created_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_exam_questions (
id CHAR(36) NOT NULL PRIMARY KEY,
exam_id CHAR(36) NOT NULL,
question_id CHAR(36) NOT NULL,
`order` INT NOT NULL,
score DECIMAL(6,2) NOT NULL,
question_type VARCHAR(30) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_exam_questions_exam_id (exam_id),
INDEX idx_exam_questions_question_id (question_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_exam_submissions (
id CHAR(36) NOT NULL PRIMARY KEY,
exam_id CHAR(36) NOT NULL,
student_id CHAR(36) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'not_submitted',
submitted_at DATETIME NULL,
graded_at DATETIME NULL,
graded_by CHAR(36),
total_score DECIMAL(6,2) NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uniq_exam_student (exam_id, student_id),
INDEX idx_exam_submissions_exam_id (exam_id),
INDEX idx_exam_submissions_student_id (student_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================================
-- 作业域
-- ============================================================================
CREATE TABLE IF NOT EXISTS core_edu_homework (
id CHAR(36) NOT NULL PRIMARY KEY,
class_id CHAR(36) NOT NULL,
subject_id CHAR(36) NOT NULL,
title VARCHAR(200) NOT NULL,
description TEXT,
due_date DATETIME NOT NULL,
grace_period INT NOT NULL DEFAULT 300,
status VARCHAR(20) NOT NULL DEFAULT 'assigned',
school_id CHAR(36) NOT NULL,
created_by CHAR(36) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_homework_class_status (class_id, status),
INDEX idx_homework_created_by (created_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_homework_submissions (
id CHAR(36) NOT NULL PRIMARY KEY,
homework_id CHAR(36) NOT NULL,
student_id CHAR(36) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'not_submitted',
submitted_at DATETIME NULL,
graded_at DATETIME NULL,
graded_by CHAR(36),
total_score DECIMAL(6,2) NULL,
feedback TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uniq_hw_student (homework_id, student_id),
INDEX idx_hw_submissions_homework_id (homework_id),
INDEX idx_hw_submissions_student_id (student_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_homework_answers (
id CHAR(36) NOT NULL PRIMARY KEY,
submission_id CHAR(36) NOT NULL,
question_id CHAR(36) NOT NULL,
answer TEXT,
score DECIMAL(6,2) NULL,
teacher_comment TEXT,
is_correct BOOLEAN NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_hw_answers_submission_id (submission_id),
INDEX idx_hw_answers_question_id (question_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================================
-- 成绩域
-- ============================================================================
CREATE TABLE IF NOT EXISTS core_edu_grades (
id CHAR(36) NOT NULL PRIMARY KEY,
student_id CHAR(36) NOT NULL,
exam_id CHAR(36),
homework_id CHAR(36),
score DECIMAL(6,2) NOT NULL,
total_score DECIMAL(6,2) NOT NULL,
feedback TEXT,
graded_by CHAR(36) NOT NULL,
school_id CHAR(36) NOT NULL,
idempotency_key VARCHAR(128),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uniq_student_exam (student_id, exam_id),
UNIQUE KEY uniq_student_hw (student_id, homework_id),
UNIQUE KEY uniq_idempotency (idempotency_key),
INDEX idx_grades_student_id (student_id),
INDEX idx_grades_exam_id (exam_id),
INDEX idx_grades_homework_id (homework_id),
INDEX idx_grades_graded_by (graded_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_grade_formulas (
id CHAR(36) NOT NULL PRIMARY KEY,
scope VARCHAR(20) NOT NULL,
scope_id CHAR(36) NOT NULL,
formula_type VARCHAR(20) NOT NULL,
weights JSON,
custom_expression TEXT,
effective_from DATETIME NOT NULL,
effective_to DATETIME NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_grade_formulas_scope (scope, scope_id),
INDEX idx_grade_formulas_effective (effective_from, effective_to)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================================
-- 排课考勤域
-- ============================================================================
CREATE TABLE IF NOT EXISTS core_edu_courses (
id CHAR(36) NOT NULL PRIMARY KEY,
class_id CHAR(36) NOT NULL,
subject_id CHAR(36) NOT NULL,
teacher_id CHAR(36) NOT NULL,
school_id CHAR(36) NOT NULL,
name VARCHAR(200) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_courses_class_id (class_id),
INDEX idx_courses_teacher_id (teacher_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_lessons (
id CHAR(36) NOT NULL PRIMARY KEY,
course_id CHAR(36) NOT NULL,
title VARCHAR(200) NOT NULL,
`order` INT NOT NULL,
knowledge_point_ids JSON,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_lessons_course_id (course_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_schedules (
id CHAR(36) NOT NULL PRIMARY KEY,
course_id CHAR(36) NOT NULL,
lesson_id CHAR(36),
teacher_id CHAR(36) NOT NULL,
class_id CHAR(36) NOT NULL,
room_id CHAR(36),
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'scheduled',
school_id CHAR(36) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_schedules_teacher_time (teacher_id, start_time, end_time),
INDEX idx_schedules_class_time (class_id, start_time, end_time),
INDEX idx_schedules_course_id (course_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS core_edu_attendance (
id CHAR(36) NOT NULL PRIMARY KEY,
schedule_id CHAR(36) NOT NULL,
student_id CHAR(36) NOT NULL,
status VARCHAR(20) NOT NULL,
remark TEXT,
recorded_by CHAR(36) NOT NULL,
school_id CHAR(36) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uniq_sched_student (schedule_id, student_id),
INDEX idx_attendance_student_id (student_id),
INDEX idx_attendance_schedule_id (schedule_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================================
-- Outbox事务性发件箱
-- ============================================================================
CREATE TABLE IF NOT EXISTS core_edu_outbox (
id CHAR(36) NOT NULL PRIMARY KEY,
event_id CHAR(36) NOT NULL,
aggregate_id CHAR(36) NOT NULL,
aggregate_type VARCHAR(50) NOT NULL,
event_type VARCHAR(100) NOT NULL,
occurred_at DATETIME NOT NULL,
payload TEXT NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'pending',
retry_count BIGINT NOT NULL DEFAULT 0,
next_retry_at DATETIME NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
processed_at TIMESTAMP NULL,
UNIQUE KEY uniq_event_id (event_id),
INDEX idx_outbox_status_retry (status, next_retry_at),
INDEX idx_outbox_aggregate (aggregate_type, aggregate_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================================
-- 教师关联IAM 事件消费幂等)
-- ============================================================================
CREATE TABLE IF NOT EXISTS core_edu_teacher_associations (
id CHAR(36) NOT NULL PRIMARY KEY,
teacher_id CHAR(36) NOT NULL,
class_id CHAR(36) NOT NULL,
subject_id CHAR(36),
school_id CHAR(36) NOT NULL,
source VARCHAR(20) NOT NULL DEFAULT 'iam_event',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uniq_teacher_class_subject (teacher_id, class_id, subject_id),
INDEX idx_teacher_assoc_teacher_id (teacher_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ============================================================================
-- 班级表(从 classes 服务合并,保留原表名兼容 CDC
-- ============================================================================
CREATE TABLE IF NOT EXISTS classes (
id CHAR(36) NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
grade_id CHAR(36) NOT NULL,
head_teacher_id CHAR(36),
description TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_classes_grade_id (grade_id),
INDEX idx_classes_head_teacher (head_teacher_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;