добавил денение на подгруппы для лабораторных работ

This commit is contained in:
Zuev
2026-05-06 22:25:53 +03:00
parent b222f3adac
commit e12a5bcccd
25 changed files with 693 additions and 40 deletions

View File

@@ -101,7 +101,7 @@
## Динамическое расписание
Новая модель расписания строится из правил (`schedule_rules`) и слотов (`schedule_rule_slots`). В правиле отдельно хранятся часы и стартовые недели для лекций, лабораторных и практик. Фактические занятия рендерятся на диапазон дат только для дней, где календарный учебный график группы имеет код, разрешающий обычные пары.
Новая модель расписания строится из правил (`schedule_rules`) и слотов (`schedule_rule_slots`). В правиле отдельно хранятся часы и стартовые недели для лекций, лабораторных и практик. Лабораторные слоты можно назначать на подгруппы, лекции и практики всегда проводятся для всей выбранной группы или потока. Фактические занятия рендерятся на диапазон дат только для дней, где календарный учебный график группы имеет код, разрешающий обычные пары.
### `GET /api/schedule`
@@ -148,6 +148,7 @@ GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
"lessonTypeName": "Лекция",
"lessonFormat": "Очно",
"subgroupId": null,
"subgroupName": null,
"groupIds": [1],
"groupNames": ["ИВТ-21-1"],
"activityType": "Т",
@@ -291,7 +292,7 @@ GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
"dayOfWeek": 1,
"parity": "BOTH",
"timeSlotId": 3,
"subgroupId": null,
"subgroupId": null,
"teacherId": 2,
"classroomId": 1,
"lessonTypeId": 1,
@@ -313,6 +314,8 @@ CRUD доступен по:
`timeSlotId` должен ссылаться на базовый слот (`scopeApplyMode = DEFAULT`). Субботняя и ручные сетки не выбираются в правиле напрямую.
`subgroupId` можно передавать только для лабораторного слота. Подгруппа должна относиться к одной из групп правила. Для лекций и практик поле должно быть `null`, иначе API вернёт ошибку валидации.
Часы и недели начала задаются отдельно для лекций, лабораторных и практик. Если для типа занятий указан ненулевой лимит часов, в правиле должен быть хотя бы один слот этого типа; если слот типа есть, его лимит часов должен быть больше нуля.
### `GET /api/lesson-types`
@@ -323,7 +326,8 @@ CRUD доступен по:
```json
[
{ "id": 1, "name": "Лекция" },
{ "id": 2, "name": "Практика" }
{ "id": 2, "name": "Практика" },
{ "id": 3, "name": "Лабораторная работа" }
]
```
@@ -454,6 +458,37 @@ CRUD доступен по:
Удаление группы.
### Подгруппы группы
Подгруппы используются только для деления лабораторных занятий. Лекции и практики не принимают `subgroupId`.
| Метод | URL | Назначение |
|-------|-----|------------|
| `GET` | `/api/subgroups` | Список всех подгрупп |
| `GET` | `/api/groups/{groupId}/subgroups` | Подгруппы конкретной группы |
| `POST` | `/api/groups/{groupId}/subgroups` | Создать подгруппу |
| `PUT` | `/api/groups/{groupId}/subgroups/{id}` | Обновить подгруппу |
| `DELETE` | `/api/groups/{groupId}/subgroups/{id}` | Удалить подгруппу, если она не используется в расписании |
**Тело создания/обновления:**
```json
{
"name": "Подгруппа 1",
"studentCapacity": 12
}
```
**Ответ:**
```json
{
"id": 1,
"groupId": 1,
"groupName": "ИВТ-21-1",
"name": "Подгруппа 1",
"studentCapacity": 12
}
```
### Календарные графики группы
| Метод | URL | Назначение |