7.5 KiB
Реализация динамического расписания
Файл фиксирует текущий результат внедрения динамического расписания и календарных учебных графиков.
Статус
Новая модель является базовой схемой проекта и создаётся в backend/src/main/resources/db/migration/V1__init.sql. Раздельные часы и недели начала по типам занятий уже включены в эту базовую схему; применение рассчитано на полный сброс БД.
Старый ручной слой занятий удалён. Динамическое расписание строится из правил schedule_rules, слотов schedule_rule_slots и календарного учебного графика группы.
База данных
V1__init.sql создаёт и заполняет:
| Таблица | Назначение |
|---|---|
specialties |
Коды и названия специальностей |
specialty_profiles |
Профили обучения внутри специальности |
student_groups |
Группы со ссылками на специальность и профиль |
education_forms |
Общий справочник форм обучения для групп и календарных графиков |
academic_calendar_activity_types |
Коды активностей из Excel-графика |
academic_calendars |
Календарные графики профиля, формы обучения и учебного года |
academic_calendar_days |
Дневная сетка графика по курсу и дате |
student_group_calendar_assignments |
Назначения графиков группам по учебному году |
time_slots |
Настраиваемая сетка пар |
schedule_rules |
Правила проведения дисциплин с отдельными часами и стартовыми неделями лекций, лабораторных и практик |
schedule_rule_groups |
Группы правила |
schedule_rule_slots |
Шаблонные слоты правила |
schedule_rule_slot_subgroups |
Подгруппы лабораторного слота |
Праздничные и неучебные дни больше не хранятся отдельной сущностью: они задаются кодами * и = в дневной сетке.
Backend
Добавлены сущности и репозитории для профилей, календарей, кодов активностей, дневной сетки и назначений группам.
Ключевые сервисы:
| Сервис | Назначение |
|---|---|
AcademicDateService |
Семестр по дате, номер недели, чётность, курс группы, активность дня по назначенному графику |
ScheduleGeneratorService |
Рендер расписания группы или преподавателя на диапазон дат |
ScheduleGeneratorService пропускает день, если код активности не разрешает обычные пары. Для лекций, лабораторных и практик генератор отдельно проверяет стартовую неделю и отдельно списывает академические часы. Лабораторные подгруппы имеют отдельный счётчик лабораторных часов; один лабораторный слот может включать разные подгруппы разных групп. Лекции и практики на подгруппы не делятся. Если у группы нет назначенного графика на учебный год, расписание этой группы возвращается пустым списком.
API
Просмотр расписания:
GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
GET /api/schedule?teacherId=2&startDate=2026-04-27&endDate=2026-05-03
Административные API:
| API | Назначение |
|---|---|
/api/admin/time-slots |
CRUD временных слотов |
/api/admin/calendar/years |
CRUD учебных годов |
/api/admin/calendar/years/{academicYearId}/semesters |
Семестры учебного года |
/api/admin/calendar/semesters/{id} |
Обновление семестра |
/api/admin/calendar/activity-types |
CRUD кодов активностей |
/api/admin/academic-calendars |
CRUD календарных учебных графиков |
/api/admin/academic-calendars/{id}/grid |
Получение и сохранение дневной сетки |
/api/specialties/{id}/profiles |
CRUD профилей специальности |
/api/groups/{id}/calendar-assignments |
Назначения графиков группе |
/api/subgroups, /api/groups/{id}/subgroups |
Управление подгруппами для лабораторных |
/api/admin/schedule-rules |
CRUD правил расписания |
Frontend
Админский экран schedule содержит:
- конструктор правил динамического расписания;
- отдельные поля часов и недель начала для лекций, лабораторных и практик;
- выбор подгрупп только для лабораторного слота;
- управление временными слотами;
- учебные годы и семестры;
- CRUD календарных графиков;
- Excel-подобный редактор дневной сетки по курсам, датам и кодам активностей.
Экран groups создаёт и редактирует группы с профилем обучения, управляет подгруппами для лабораторных и назначает календарный график группе на учебный год.
Экран departments-data управляет кафедрами, специальностями и профилями специальностей.
Проверки
Доступные локальные проверки:
node --check frontend/admin/js/views/schedule.js
node --check frontend/admin/js/views/groups.js
node --check frontend/admin/js/views/departments-data.js
git diff --check
Полная проверка требует окружения с Maven и доступом к Docker:
mvn -DskipTests compile
docker compose down -v
docker compose up -d --build
Следующие этапы
- Добавить интеграционные тесты генерации по кодам
Т,Э,К,*,=. - Добавить строгую backend-валидацию конфликтов преподавателей, аудиторий и групп при сохранении правил.
- Добавить связь пользователя-студента с учебной группой, чтобы кабинет студента не требовал ручного выбора группы.