Files
NextEdu/src/shared/db/schema/scheduling.ts

57 lines
2.5 KiB
TypeScript

import {
mysqlTable,
varchar,
text,
timestamp,
int,
index,
date,
mysqlEnum,
boolean,
} from "drizzle-orm/mysql-core";
import { id } from "./_helpers";
// --- 20. Scheduling Rules & Schedule Changes (排课规则与调课) ---
export const schedulingRules = mysqlTable("scheduling_rules", {
id: id("id").primaryKey(),
classId: varchar("class_id", { length: 128 }), // null=全局规则
maxDailyHours: int("max_daily_hours").default(8),
maxContinuousHours: int("max_continuous_hours").default(2),
lunchBreakStart: varchar("lunch_break_start", { length: 10 }).default("12:00"),
lunchBreakEnd: varchar("lunch_break_end", { length: 10 }).default("13:00"),
morningStart: varchar("morning_start", { length: 10 }).default("08:00"),
afternoonEnd: varchar("afternoon_end", { length: 10 }).default("17:00"),
avoidBackToBack: boolean("avoid_back_to_back").default(false),
balancedSubjects: boolean("balanced_subjects").default(true),
createdAt: timestamp("created_at").defaultNow().notNull(),
updatedAt: timestamp("updated_at").defaultNow().onUpdateNow().notNull(),
}, (table) => ({
classIdx: index("scheduling_rules_class_idx").on(table.classId),
}));
export const scheduleChangeStatusEnum = mysqlEnum("status", ["pending", "approved", "rejected", "completed"]);
export const scheduleChanges = mysqlTable("schedule_changes", {
id: id("id").primaryKey(),
originalScheduleId: varchar("original_schedule_id", { length: 128 }),
classId: varchar("class_id", { length: 128 }).notNull(),
originalTeacherId: varchar("original_teacher_id", { length: 128 }),
substituteTeacherId: varchar("substitute_teacher_id", { length: 128 }),
originalDate: date("original_date"),
newDate: date("new_date"),
newStartTime: varchar("new_start_time", { length: 10 }),
newEndTime: varchar("new_end_time", { length: 10 }),
reason: text("reason"),
status: scheduleChangeStatusEnum.default("pending").notNull(),
requestedBy: varchar("requested_by", { length: 128 }).notNull(),
approvedBy: varchar("approved_by", { length: 128 }),
createdAt: timestamp("created_at").defaultNow().notNull(),
updatedAt: timestamp("updated_at").defaultNow().onUpdateNow().notNull(),
}, (table) => ({
classIdx: index("schedule_changes_class_idx").on(table.classId),
statusIdx: index("schedule_changes_status_idx").on(table.status),
requestedByIdx: index("schedule_changes_requested_by_idx").on(table.requestedBy),
originalScheduleIdx: index("schedule_changes_original_schedule_idx").on(table.originalScheduleId),
}));