feat(core-edu): 完整实现 core-edu 教学核心服务
包含 classes/exams/homework/grades/attendance/scheduling 域、outbox、iam-consumer、redis 配置等完整实现
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user