111 lines
7.5 KiB
Markdown
111 lines
7.5 KiB
Markdown
# Реализация динамического расписания
|
||
|
||
Файл фиксирует текущий результат внедрения динамического расписания и календарных учебных графиков.
|
||
|
||
## Статус
|
||
|
||
Новая модель является базовой схемой проекта и создаётся в `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
|
||
|
||
Просмотр расписания:
|
||
|
||
```http
|
||
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` управляет кафедрами, специальностями и профилями специальностей.
|
||
|
||
## Проверки
|
||
|
||
Доступные локальные проверки:
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
mvn -DskipTests compile
|
||
docker compose down -v
|
||
docker compose up -d --build
|
||
```
|
||
|
||
## Следующие этапы
|
||
|
||
- Добавить интеграционные тесты генерации по кодам `Т`, `Э`, `К`, `*`, `=`.
|
||
- Добавить строгую backend-валидацию конфликтов преподавателей, аудиторий и групп при сохранении правил.
|
||
- Добавить связь пользователя-студента с учебной группой, чтобы кабинет студента не требовал ручного выбора группы.
|