исправление хранения календаря
This commit is contained in:
@@ -143,7 +143,7 @@ Bearer-токен проверяется на backend. Frontend-скрытие
|
||||
| `specialty_profiles` | Профили обучения внутри специальности |
|
||||
| `academic_calendars` | Календарный учебный график профиля, формы обучения и учебного года |
|
||||
| `academic_calendar_activity_types` | Коды Excel-графика: `Т`, `Э`, `К`, `У`, `П`, `Пд`, `Н`, `Г`, `Д`, `ПА`, `С`, `*`, `=` |
|
||||
| `academic_calendar_days` | Дневная сетка по курсу и дате |
|
||||
| `academic_calendar_periods` | Непересекающиеся непрерывные периоды активности по курсу |
|
||||
| `academic_calendar_subjects` | Дисциплины графика по номерам учебных семестров |
|
||||
| `student_group_calendar_assignments` | Назначение конкретного графика группе на учебный год |
|
||||
| `time_slots` | Настраиваемая сетка пар для тенанта |
|
||||
@@ -165,12 +165,15 @@ Bearer-токен проверяется на backend. Frontend-скрытие
|
||||
глобальные конкурентные гонки между разными backend-pod. Благодаря отсутствию пересечений
|
||||
поиск семестра для даты возвращает не более одного результата и не зависит от порядка строк.
|
||||
|
||||
Полная замена `academic_calendar_days` выполняется через транзакционный
|
||||
`AcademicCalendarGridService`. Сервис сначала проверяет и строит весь новый набор, включая
|
||||
Полная замена дневной сетки выполняется через транзакционный
|
||||
`AcademicCalendarGridService`. Сервис сначала проверяет весь дневной payload, включая
|
||||
уникальность `(course, date)`, соответствие даты учебному году, номеру недели и ISO-дню,
|
||||
и разрешает все коды активностей. Только после этого прежняя сетка удаляется и новый набор
|
||||
записывается одной транзакцией. Ошибка любой строки сохраняет прежнюю сетку целиком, а кэш
|
||||
расписания очищается только после commit. Недели дневной сетки выровнены по ISO-неделе
|
||||
и разрешает все коды активностей. Затем соседние даты одного курса с одинаковой активностью
|
||||
объединяются в один включительный период `academic_calendar_periods`. Только после этого
|
||||
прежние периоды удаляются и новый набор записывается одной транзакцией. Ошибка любой строки
|
||||
сохраняет прежнюю сетку целиком, а кэш расписания очищается только после commit. База
|
||||
дополнительно запрещает пересекающиеся периоды одного курса и графика через exclusion
|
||||
constraint. При чтении API разворачивает периоды обратно в дневные ячейки. Недели дневной сетки выровнены по ISO-неделе
|
||||
`понедельник–воскресенье`: неделя 1 содержит первый день учебного года, а позиции до него
|
||||
остаются пустыми. Поэтому при старте года во вторник следующий понедельник относится уже
|
||||
к неделе 2.
|
||||
@@ -189,10 +192,10 @@ Bearer-токен проверяется на backend. Frontend-скрытие
|
||||
11. Применяет точечные изменения из `schedule_overrides` в расширенном поиске и отчётах.
|
||||
|
||||
Перед обходом дат генератор создаёт снимок на один запрос. Семестры диапазона, назначения
|
||||
календарей всех выбранных групп, дневная сетка календарей, правила и эффективные сетки
|
||||
звонков загружаются batch-запросами и индексируются по дате и идентификаторам. Поиск
|
||||
семестра, проверка разрешённого дня и подстановка времени внутри циклов выполняются только
|
||||
по lookup-картам. `ScheduleQueryService` передаёт все группы в один
|
||||
календарей всех выбранных групп, пересекающиеся периоды активности, правила и эффективные
|
||||
сетки звонков загружаются batch-запросами. Периоды группируются по календарю и курсу, а
|
||||
поиск периода для даты выполняется бинарным поиском. Поиск семестра и подстановка времени
|
||||
внутри циклов выполняются только по снимку запроса. `ScheduleQueryService` передаёт все группы в один
|
||||
`buildScheduleForGroups()`, поэтому число запросов не растёт как
|
||||
`дни × группы × правила`; singleton-кэш и общее между запросами состояние не используются.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user