chore(core-edu): merge core-edu full implementation into main

Merge feat/core-edu-ai08 with complete teaching core service
This commit is contained in:
SpecialX
2026-07-10 19:12:44 +08:00
55 changed files with 4111 additions and 325 deletions

View File

@@ -1,65 +1,265 @@
-- CoreEdu 服务数据库初始化脚本
-- core_edu_exams / core_edu_homework / core_edu_grades / core_edu_outbox
-- 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 VARCHAR(50) NOT NULL,
total_score VARCHAR(10) 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_id (class_id),
INDEX idx_exams_status (status),
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_id (class_id),
INDEX idx_homework_status (status),
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 VARCHAR(10) NOT NULL,
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,
INDEX idx_outbox_status (status),
INDEX idx_outbox_aggregate (aggregate_type, aggregate_id),
INDEX idx_outbox_created_at (created_at)
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;