feat: улучшить учебные периоды и просмотр расписаний

This commit is contained in:
Zuev
2026-08-15 00:20:00 +03:00
parent 855d191517
commit 52d516dd8f
22 changed files with 1107 additions and 250 deletions

View File

@@ -365,10 +365,9 @@ Refresh-токен ротируется при каждом успешном о
| `startDate` | Да | Начало периода в формате `YYYY-MM-DD` |
| `endDate` | Да | Конец периода в формате `YYYY-MM-DD` |
Передаётся ровно один параметр: `groupId` или `teacherId`. Максимальный диапазон — 120
календарных дат с учётом обеих границ: например, период с 1 января по 30 апреля
невисокосного года содержит ровно 120 дат и разрешён, а по 1 мая — уже 121 дата и
отклоняется. Если у группы нет назначения календарного графика на учебный год даты,
Передаётся ровно один параметр: `groupId` или `teacherId`. Максимальный диапазон — 200
календарных дат с учётом обеих границ: 200 дат разрешены, 201 дата отклоняется. Если у
группы нет назначения календарного графика на учебный год даты,
расписание для неё возвращается пустым списком. Время пары берётся из базового слота
правила, но для конкретной даты может быть заменено субботней или ручной сеткой времени из
`/api/admin/time-slots`.
@@ -508,12 +507,30 @@ GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
**Тело учебного года:**
```json
{
"title": "2026-2027",
"startDate": "2026-09-01",
"endDate": "2027-06-30"
"semesters": [
{
"semesterType": "autumn",
"startDate": "2026-09-01",
"endDate": "2027-01-31"
},
{
"semesterType": "spring",
"startDate": "2027-02-01",
"endDate": "2027-06-30"
}
]
}
```
Название и дата окончания учебного года вычисляются backend автоматически по дате начала:
для `2026-09-01` будут сохранены название `2026-2027` и окончание `2027-06-30`.
В административной форме пользователь вводит только год `2026`; frontend преобразует его
в `startDate: 2026-09-01` и сразу показывает вычисленный год окончания `2027`.
При создании требуется хотя бы один семестр; учебный год и все переданные семестры
сохраняются одной транзакцией. Поля `title` и `endDate`, переданные старым клиентом,
не влияют на вычисленные значения.
**Тело семестра:**
```json
{
@@ -526,10 +543,11 @@ GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
Границы учебных периодов включительны. Учебные годы не могут пересекаться, семестры одного
года также не могут пересекаться и должны полностью находиться внутри его границ. Следующий
период разрешено начать на следующий календарный день после окончания предыдущего.
Повторное название года, повторный тип семестра или пересечение возвращаются как
Повторный тип семестра или пересечение возвращаются как
`409 Conflict`; неверный порядок дат и выход семестра за границы года — как `400 Bad Request`.
При сужении учебного года все существующие семестры должны оставаться внутри новых границ.
Создание семестра также создаёт для него пустую версию 1 со статусом `PUBLISHED` и названием
Создание учебного года или отдельного семестра также создаёт для каждого нового семестра
пустую версию 1 со статусом `PUBLISHED` и названием
`Основное расписание`, поэтому конструктор сразу может работать в обычном режиме.
**Тело создания/обновления кода активности:**
@@ -752,6 +770,9 @@ ID существующих слотов сохраняются; удалени
| `timeSlotId` | Временной слот |
| `parity` | `BOTH`, `ODD`, `EVEN` |
Диапазон включает обе границы и не может превышать 200 календарных дней. Этого достаточно,
чтобы запросить осенний или весенний семестр целиком одним обращением.
Если указан только `teacherId` без `groupId` и `departmentId`, базовое расписание
преподавателя строится напрямую. Затем поиск учитывает точечные изменения, где преподаватель
назначен через `newTeacherId`: для каждой уникальной даты такой замены один раз строится
@@ -798,7 +819,7 @@ GET /api/schedule/search?classroomId=1&startDate=2026-05-20&endDate=2026-05-27
| `DELETE` | `/api/edu-office/schedule/overrides/{id}` | Удалить изменение и вернуть актуальный вариант из правила |
`startDate` и `endDate` у списка передаются только парой, включительно; максимальный
диапазон — 120 дней. Ответ реестра содержит исходные дату, время, преподавателя,
диапазон — 200 дней. Ответ реестра содержит исходные дату, время, преподавателя,
аудиторию, формат, дисциплину, тип занятия, группы и границы семестра, поэтому отменённую
или перенесённую пару можно открыть без присутствия в текущей выдаче расписания.