начало работы построения динамического расписания и документация
This commit is contained in:
@@ -41,7 +41,8 @@
|
||||
|
||||
### Учебные группы (Student Groups)
|
||||
|
||||
- **Поля:** Название (уникальное), численность, форма обучения, кафедра, курс (1–6)
|
||||
- **Поля:** Название (уникальное), численность, форма обучения, кафедра, специальность, год начала обучения
|
||||
- **Курс:** вычисляется относительно учебного года: `год начала учебного года - year_start_study + 1`
|
||||
- **Подгруппы:** Возможно деление группы на подгруппы (таблица `subgroups`)
|
||||
|
||||
### Аудитории (Classrooms)
|
||||
@@ -66,7 +67,33 @@
|
||||
|
||||
## Логика расписания
|
||||
|
||||
### Сущность «Занятие» (Lesson)
|
||||
### Динамическая модель расписания
|
||||
|
||||
Основная модель расписания строится из правил, а не из отдельных статических пар.
|
||||
|
||||
| Компонент | Назначение |
|
||||
|-----------|------------|
|
||||
| `academic_years` / `semesters` | Учебные годы и семестры. Неделя 1 считается от `semesters.start_date` |
|
||||
| `holidays` | Даты, когда занятия не проводятся и часы не списываются |
|
||||
| `academic_calendar_matrix` | Тип недели для курса и специальности: теория, сессия, каникулы, практика |
|
||||
| `time_slots` | Настраиваемая сетка пар для тенанта |
|
||||
| `schedule_rules` | Лимит часов дисциплины в семестре |
|
||||
| `schedule_rule_groups` | Группы правила, включая потоковые лекции |
|
||||
| `schedule_rule_slots` | День, чётность, слот, преподаватель, аудитория, тип и формат занятия |
|
||||
|
||||
Генератор `ScheduleGeneratorService` рендерит расписание по запросу:
|
||||
1. Определяет семестр для каждой даты диапазона.
|
||||
2. Вычисляет номер недели и чётность.
|
||||
3. Проверяет праздники и матрицу учебного графика.
|
||||
4. Загружает правила группы или преподавателя.
|
||||
5. Симулирует уже проведённые занятия от `active_from_date`.
|
||||
6. Останавливает вывод правила, когда достигнут `total_academic_hours`.
|
||||
|
||||
Праздник считается пропуском: занятие не переносится и не списывает академические часы.
|
||||
|
||||
### Временная старая сущность «Занятие» (Lesson)
|
||||
|
||||
`lessons` пока физически остаётся в схеме до удаления старого кода, но базовая миграция больше не заполняет её тестовыми данными. Новые экраны просмотра используют `GET /api/schedule`.
|
||||
|
||||
Каждая запись в расписании содержит:
|
||||
|
||||
@@ -84,7 +111,7 @@
|
||||
|
||||
### Временны́е слоты
|
||||
|
||||
Система использует 7 фиксированных слотов по 90 минут:
|
||||
Сетка пар хранится в `time_slots` и настраивается для каждого тенанта. При миграции создаются базовые слоты:
|
||||
|
||||
| № | Время |
|
||||
|---|-------|
|
||||
@@ -104,9 +131,9 @@
|
||||
- **Тип:** только `Лекция`, `Практическая работа`, `Лабораторная работа`
|
||||
- Все ID (преподаватель, группа, дисциплина, аудитория) обязательны и не могут быть 0
|
||||
|
||||
### Данные к составлению расписания (Schedule Data)
|
||||
### Временные старые данные к составлению расписания (Schedule Data)
|
||||
|
||||
Таблица `schedule_data` хранит **плановую нагрузку** для составления расписания:
|
||||
Таблица `schedule_data` пока физически остаётся в схеме до удаления старого кода. Новая базовая миграция создаёт `schedule_rules` и `schedule_rule_groups` напрямую, без ETL из `schedule_data`.
|
||||
|
||||
| Поле | Описание |
|
||||
|------|----------|
|
||||
|
||||
Reference in New Issue
Block a user