5.3 KiB
5.3 KiB
11. Отчёт этапа 1: identity
Дата: 2026-10-23. Статус: этап 1 выполнен; этап 2 (academic) — следующий.
1. Что сделано
Роли и аккаунты
- Добавлена роль
TEACHERвLmsRole; БД уже допускает её миграциейV4. Accountполучилstatus(ACTIVE/ARCHIVED) иarchivedAt.- Вход запрещён для архивных аккаунтов и студентов в статусах
EXPELLED/GRADUATED/ARCHIVED.
Группы-когорты
GroupEntity:stream,course,number,degree,enrollmentYear,status(ACTIVE/GRADUATED/ARCHIVED).nameбольше не уникально; уникальность — по кортежу когорты.GroupNameParserразбираетПИ-11БО,ИВТ-ТОП-12БОи т.п.GroupCohortResolverвалидирует степень, курс, номер и год набора, вычисляет год набора по умолчанию.- Создание группы через админку — по полям, имя собирается автоматически.
Студенты и история
Student:statusиenrollmentYear.MembershipHistory:ENROLL,TRANSFER,IMPORT,EXPELLи остальные действия; записи создаются при зачислении, переводе, импорте и отчислении.- При отчислении студент получает
EXPELLED, аккаунт и данные сохраняются. - Повторное зачисление возвращает
ACTIVEи пишетTRANSFER.
Импорт Excel/CSV v2
Шаблон:
поток | курс | номер | степень | год набора | ФИО | № | база
- Поддерживаются
.xls,.xlsx,.csv, разделители;,,, tab. - ФИО можно одной колонкой или отдельными
Фамилия/Имя/Отчество. - Все строки должны быть одной группой.
- Проверяются степень, диапазон курса, год набора, пустые поля,
дубли
№внутри файла. - Импорт атомарный: при ошибках данные не меняются, возвращается отчёт с номерами строк.
- Ключ слияния —
student_no; группа ищется по кортежу, при отсутствии создаётся. - Новые студенты получают временный пароль; пароли показываются один раз.
UI
- Страница групп: год набора, статус, создание по полям, описание нового импорта.
- Страница группы: год набора, статус группы, статус студента.
- Страница пользователей: статус студента.
- При ошибке импорта показывается таблица «строка — ошибка».
2. Тесты
Добавлены:
GroupNameParserTest— разбор имени, диапазоны курсов;StudentImportParserTest— валидный шаблон, дубли, разные группы, недопустимый курс, неизвестная шапка;GroupServiceIntegrationTest— создание когорты, дубликат, импорт, атомарность ошибок, перевод, отчисление, запрет входа после отчисления.
Проверки:
./gradlew :services:identity-service:test :web:test— успешно;ktlintCheckиdetektдля identity/web — успешно.
3. Ограничения этапа
- Импорт поддерживает одну группу на файл; мультигрупповой файл — позже.
- Номер группы числовой (
01и1— одно значение). Отдельный строковый номер и различиеПИ-11БО/ПИ-101БОкак разных когорт не требуются; имя группы по-прежнему строится из полей. - Роль
TEACHERуже есть в домене, но кабинет преподавателя и назначения на курс — этапы 2–3. ACADEMIC_LEAVEпока может входить; режим «только чтение» — этап 3.- Отчисление пока простое; причины, подтверждение и аудит — этап 4.
- Старый формат импорта (только студенческие колонки) больше не поддерживается.
4. Следующий этап
Этап 2 — academic:
- курсы,
course_teachers,course_groups; course_noи/learn/course/{course_no}/...;labs.course_idи перенос лаб в курс C;chapters.course_id/audience, перенос материалов;- активы и копирование лабораторных;
- админ-UI курсов.