4.5 KiB
Концепция динамической генерации расписания
Документ фиксирует актуальную концепцию после внедрения календарных учебных графиков. Подробная продуктовая модель описана в docs/ACADEMIC_CALENDAR.md, REST API — в docs/API.md, схема БД — в docs/DATABASE.md.
Базовая идея
Фактические занятия не хранятся отдельными строками на каждую дату. Система хранит:
- календарный учебный график по специальности, профилю, форме обучения и учебному году;
- правила расписания дисциплин;
- слоты правил: день недели, чётность, пара, преподаватель, аудитория, тип занятия и формат;
- назначение конкретного календарного графика учебной группе на учебный год.
При запросе GET /api/schedule backend рендерит расписание на диапазон дат. Если дата не является днём теоретического обучения по назначенному группе графику, обычные пары не выводятся и академические часы не списываются.
Слои модели
Календарный слой
academic_yearsиsemestersзадают границы учебного года и семестров.specialtiesиspecialty_profilesопределяют образовательную программу группы.academic_calendarsхранит график профиля и формы обучения.academic_calendar_activity_typesхранит коды из Excel-графика:Т,Э,К,У,П,Пд,Н,Г,Д,ПА,С,*,=.academic_calendar_daysхранит дневную сетку по курсу и дате.student_group_calendar_assignmentsвыбирает график для группы на учебный год.
Слой правил расписания
time_slotsзадаёт сетку пар для тенанта.schedule_rulesхранит дисциплину, семестр, отдельные лимиты часов и стартовые недели для лекций, лабораторных и практик.schedule_rule_groupsсвязывает правило с одной или несколькими группами.schedule_rule_slotsхранит шаблонные занятия правила.
Алгоритм генерации
- Для даты определяется семестр.
- Для группы находится назначенный календарный учебный график.
- По году начала обучения вычисляется текущий курс группы.
- По курсу и дате находится код активности.
- Обычные пары генерируются только для кода, где
allow_schedule = true; в seed-данных этоТ. - Для разрешённого дня выбираются активные правила и слоты.
- Лимит часов считается только по реально проведённым занятиям.
Если назначение графика отсутствует, расписание группы возвращается пустым списком без ошибки.
Административный сценарий
Администратор создаёт специальность и профиль, затем создаёт группу с этой связкой. В разделе расписания он создаёт учебный год, семестры и календарный график, заполняет дневную сетку кодами активностей и назначает график группе. После сохранения графика или назначения кэш генератора очищается, поэтому следующие запросы расписания используют новые правила сразу.