57 lines
2.5 KiB
TypeScript
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),
|
|
}));
|