包含 classes/exams/homework/grades/attendance/scheduling 域、outbox、iam-consumer、redis 配置等完整实现
88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
import {
|
|
mysqlTable,
|
|
varchar,
|
|
timestamp,
|
|
char,
|
|
datetime,
|
|
date,
|
|
int,
|
|
json,
|
|
index,
|
|
} from "drizzle-orm/mysql-core";
|
|
|
|
// 课程表
|
|
export const courses = mysqlTable(
|
|
"core_edu_courses",
|
|
{
|
|
id: char("id", { length: 36 }).notNull().primaryKey(),
|
|
classId: char("class_id", { length: 36 }).notNull(),
|
|
subjectId: char("subject_id", { length: 36 }).notNull(),
|
|
teacherId: char("teacher_id", { length: 36 }).notNull(),
|
|
schoolId: char("school_id", { length: 36 }).notNull(),
|
|
name: varchar("name", { length: 200 }).notNull(),
|
|
startDate: date("start_date").notNull(),
|
|
endDate: date("end_date").notNull(),
|
|
createdAt: timestamp("created_at").notNull().defaultNow(),
|
|
updatedAt: timestamp("updated_at").notNull().defaultNow().onUpdateNow(),
|
|
},
|
|
(table) => ({
|
|
idxCoursesClassId: index("idx_courses_class_id").on(table.classId),
|
|
idxCoursesTeacherId: index("idx_courses_teacher_id").on(table.teacherId),
|
|
}),
|
|
);
|
|
|
|
// 课次表
|
|
export const lessons = mysqlTable(
|
|
"core_edu_lessons",
|
|
{
|
|
id: char("id", { length: 36 }).notNull().primaryKey(),
|
|
courseId: char("course_id", { length: 36 }).notNull(),
|
|
title: varchar("title", { length: 200 }).notNull(),
|
|
order: int("order").notNull(),
|
|
knowledgePointIds: json("knowledge_point_ids"),
|
|
createdAt: timestamp("created_at").notNull().defaultNow(),
|
|
},
|
|
(table) => ({
|
|
idxLessonsCourseId: index("idx_lessons_course_id").on(table.courseId),
|
|
}),
|
|
);
|
|
|
|
// 排课表
|
|
export const schedules = mysqlTable(
|
|
"core_edu_schedules",
|
|
{
|
|
id: char("id", { length: 36 }).notNull().primaryKey(),
|
|
courseId: char("course_id", { length: 36 }).notNull(),
|
|
lessonId: char("lesson_id", { length: 36 }),
|
|
teacherId: char("teacher_id", { length: 36 }).notNull(),
|
|
classId: char("class_id", { length: 36 }).notNull(),
|
|
roomId: char("room_id", { length: 36 }), // P3 仅预留,不校验冲突
|
|
startTime: datetime("start_time").notNull(),
|
|
endTime: datetime("end_time").notNull(),
|
|
status: varchar("status", { length: 20 }).notNull().default("scheduled"),
|
|
schoolId: char("school_id", { length: 36 }).notNull(),
|
|
createdAt: timestamp("created_at").notNull().defaultNow(),
|
|
updatedAt: timestamp("updated_at").notNull().defaultNow().onUpdateNow(),
|
|
},
|
|
(table) => ({
|
|
idxSchedulesTeacherTime: index("idx_schedules_teacher_time").on(
|
|
table.teacherId,
|
|
table.startTime,
|
|
table.endTime,
|
|
),
|
|
idxSchedulesClassTime: index("idx_schedules_class_time").on(
|
|
table.classId,
|
|
table.startTime,
|
|
table.endTime,
|
|
),
|
|
idxSchedulesCourseId: index("idx_schedules_course_id").on(table.courseId),
|
|
}),
|
|
);
|
|
|
|
export type Course = typeof courses.$inferSelect;
|
|
export type NewCourse = typeof courses.$inferInsert;
|
|
export type Lesson = typeof lessons.$inferSelect;
|
|
export type NewLesson = typeof lessons.$inferInsert;
|
|
export type Schedule = typeof schedules.$inferSelect;
|
|
export type NewSchedule = typeof schedules.$inferInsert;
|