# Отчёт об изменениях по задачам научного руководителя Дата: 2026-05-19 ## Краткий итог Выполнен первый цельный релиз архитектурной основы: - добавлены роли `EDUCATION_OFFICE`, `DEPARTMENT` и `SCHEDULE_VIEWER`; - добавлена backend-проверка bearer-токена и ролей через `AuthorizationInterceptor` и `@RequireRoles`; - добавлен жизненный цикл справочников: `ACTIVE` / `ARCHIVED`; - физическое удаление ключевых сущностей заменено архивированием там, где это влияет на историю; - добавлена история переводов преподавателей между кафедрами; - добавлены точечные изменения расписания: перенос, отмена, замена; - добавлен расширенный read-only поиск расписания по аудитории, преподавателю, кафедре, группе, дисциплине, типу занятия, паре и чётности; - добавлены отчёты загруженности по преподавателям, аудиториям, кафедрам, парам и свободным аудиториям; - просмотр расписаний переведён с плоского списка на совмещённые матричные таблицы чётной/нечётной недели с разрезом по группам, преподавателям или аудиториям; - вкладка загруженности стала общей для аудиторий, преподавателей и кафедр; - интерфейсы кафедры и учебного отдела переведены в общий стиль админ-панели через role-based вкладки; - отдельная миграция `V2` удалена, изменения схемы внесены в `V1__init.sql`; - обновлена документация проекта. ## Backend ### Роли и авторизация Поддерживаются роли: - `ADMIN`; - `EDUCATION_OFFICE`; - `DEPARTMENT`; - `SCHEDULE_VIEWER`; - `TEACHER`; - `STUDENT`. Добавлены: - `AuthSessionService` — in-memory UUID-сессии; - `AuthContext` — текущий пользователь в `ThreadLocal`; - `AuthorizationInterceptor` — проверка `Authorization: Bearer ...`; - `@RequireRoles` — ограничение доступа на уровне контроллеров и методов; - `GET /api/auth/me` — текущий пользователь по токену. Redirect после входа: - `ADMIN` -> `/admin/`; - `EDUCATION_OFFICE` -> `/admin/#schedule-view`; - `DEPARTMENT` -> `/admin/#department-workspace`; - `SCHEDULE_VIEWER` -> `/admin/#schedule-view`; - `TEACHER` -> `/teacher/`; - `STUDENT` -> `/student/`. ### Миграция БД Отдельная миграция `V2__roles_lifecycle_temporal_schedule.sql` удалена по текущему решению проекта. Все изменения схемы внесены в: ```text backend/src/main/resources/db/migration/V1__init.sql ``` `V1__init.sql` теперь сразу создаёт: - lifecycle-поля к справочникам и пользователям; - `teacher_department_assignments`; - `subject_comments`; - version-поля к `schedule_rules`; - lock-поля к `schedule_rule_slots`; - `schedule_overrides`; - стартовых пользователей `учебный_отдел`, `кафедра_иб` и `просмотр_расписаний`. ### Архивирование вместо удаления Архивирование добавлено для пользователей, аудиторий, оборудования, кафедр, специальностей, групп, подгрупп, дисциплин и правил расписания. Архивные аудитории, преподаватели, группы и дисциплины запрещены для новых назначений. Историческое расписание при этом не теряет ссылки. ### История кафедр преподавателя Добавлены endpoint: - `GET /api/users/{id}/department-history`; - `POST /api/users/{id}/department-transfer`; - `GET /api/users/teachers/by-department/{departmentId}?date=YYYY-MM-DD`. При переводе преподавателя старая запись закрывается, новая открывается с `valid_from`, а `users.department_id` обновляется как текущая кафедра. ### Расписание и загруженность Добавлены: - `GET /api/schedule/search`; - `GET /api/workload/teachers`; - `GET /api/workload/classrooms`; - `GET /api/workload/departments`; - `GET /api/workload/time-slots`; - `GET /api/workload/free-classrooms`; - `GET/POST/PUT/DELETE /api/edu-office/schedule/overrides`. `GET /api/schedule` теперь использует общий слой поиска, поэтому учитывает точечные изменения расписания. Роль `SCHEDULE_VIEWER` имеет доступ только к read-only просмотру расписаний и справочникам-фильтрам. ### Кабинет кафедры API Добавлены: - `GET /api/department/subjects`; - `POST /api/department/subjects/import`; - `GET /api/department/subjects/{subjectId}/comments`; - `POST /api/department/subjects/{subjectId}/comments`; - `GET /api/department/teachers`; - `GET /api/department/schedule`. Для роли `DEPARTMENT` кафедра берётся из текущего пользователя. Для администратора можно выбрать кафедру в UI. ## Frontend ### Единая панель по ролям Отдельные интерфейсы `/department/` и `/edu-office/` заменены на redirect в общую админ-панель: - `/department/` -> `/admin/#department-workspace`; - `/edu-office/` -> `/admin/#schedule-view`. В `frontend/admin/js/main.js` добавлена фильтрация вкладок: - `ADMIN` видит все вкладки; - `EDUCATION_OFFICE` видит просмотр расписаний, конструктор расписания, календарный график, загруженность, аудитории и оборудование; - `DEPARTMENT` видит кабинет кафедры и просмотр расписаний; - `SCHEDULE_VIEWER` видит только просмотр расписаний. Backend не опирается только на скрытие вкладок. `AuthorizationInterceptor` проверяет bearer-токен для `/api/**`, а `@RequireRoles` ограничивает операции на контроллерах и методах. Для кафедры дополнительно закрыты обходные пути: - общий `/api/subjects` оставлен для записи только администратору, кафедра загружает дисциплины через scoped `/api/department/subjects/import`; - `/api/teacher-subjects` для роли `DEPARTMENT` проверяет, что и преподаватель, и дисциплина относятся к кафедре текущего пользователя; - `SCHEDULE_VIEWER` имеет только read-only доступ к расписаниям и справочникам-фильтрам. После браузерной проверки исправлено визуальное скрытие недоступных вкладок: `layout.css` теперь принудительно скрывает `.nav-item[hidden]` и скрытые пункты меню настроек, поэтому роли больше не видят чужие вкладки в sidebar. ### Просмотр расписаний Добавлена вкладка: ```text frontend/admin/views/schedule-view.html frontend/admin/js/views/schedule-view.js ``` Возможности: - фильтры по одной дате в периоде, группе, преподавателю, аудитории, кафедре, дисциплине, типу занятия и чётности; - двухнедельный диапазон для таблиц автоматически строится от понедельника выбранной недели; - выбор разреза таблиц: автоматически, по группам, по преподавателям или по аудиториям; - совмещённые матричные таблицы найденных занятий: строки — пары, столбцы — дни недели; - нечётная неделя отображается в верхней половине ячейки, чётная — в нижней, одинаковые занятия в обе недели схлопываются в цельную ячейку; - карточки занятий внутри ячеек с дисциплиной, группами, подгруппами, преподавателем, аудиторией, типом занятия, чётностью и ID слота. ### Загруженность Вкладка `auditorium-workload` оставлена техническим tab id, но в UI называется `Загруженность`. Возможности: - выбор типа загруженности: аудитории, преподаватели или кафедры; - сводная матрица по выбранной дате: строки — выбранные сущности, столбцы — пары; - кафедральная матрица группирует занятия по кафедре преподавателя; - для аудиторий сохранены фильтры корпуса, вместимости и оборудования; - выбор конкретной аудитории, преподавателя или кафедры заменяет обзор двухнедельной таблицей по дням недели и времени; - чётная и нечётная недели показываются в одной ячейке: если состояние одинаковое, ячейка цельная, если отличается — делится вертикально. ### Кабинет кафедры Добавлена вкладка: ```text frontend/admin/views/department-workspace.html frontend/admin/js/views/department-workspace.js ``` Возможности: - просмотр дисциплин кафедры; - загрузка дисциплин из списка `код; название`; - просмотр и добавление комментариев к дисциплинам; - просмотр преподавателей кафедры; - просмотр нагрузки преподавателей кафедры за период. ### Админка Обновлено: - создание пользователей теперь поддерживает роли `DEPARTMENT`, `EDUCATION_OFFICE` и `SCHEDULE_VIEWER`; - удаление пользователей заменено на архивирование; - вкладка аудиторий показывает архивные записи и умеет восстанавливать аудиторию; - удаление аудитории заменено на вывод из эксплуатации; - настройки временных слотов доступны `ADMIN` и `EDUCATION_OFFICE`. ## Документация Обновлены: - `AGENTS.md`; - `docs/README.md`; - `docs/API.md`; - `docs/DATABASE.md`; - `docs/BUSINESS_LOGIC.md`; - `docs/FRONTEND.md`; - `docs/ARCHITECTURE.md`. ## Проверки Статически проверены новые и изменённые JS-файлы: ```bash node --check frontend/admin/js/main.js node --check frontend/admin/js/views/schedule-view.js node --check frontend/admin/js/views/auditorium-workload.js node --check frontend/admin/js/views/department-workspace.js node --check frontend/admin/settings/js/main.js node --check frontend/admin/js/api.js node --check frontend/admin/js/views/users.js node --check frontend/admin/js/views/classrooms.js git diff --check ``` Backend-компиляция проверяется через Docker Maven: ```bash docker run --rm -v /mnt/HDD/magistr/magistr/backend:/app -w /app maven:3.9-eclipse-temurin-17 mvn -q -DskipTests compile ``` Результат: компиляция прошла успешно. Единая `V1__init.sql` проверена на пустой PostgreSQL 16 внутри Docker: SQL применился успешно. Локальный `mvn` в окружении отсутствует, поэтому используется Docker. ## Что осталось следующим этапом Остались задачи, которые требуют отдельного цикла проработки: - UI для просмотра истории переводов преподавателя в админке; - UI для списка и редактирования уже созданных `schedule_overrides`; - более строгая проверка конфликтов перед сохранением переносов; - полноценный импорт XLSX/CSV для кафедры вместо текстовой загрузки; - браузерный smoke-test и проверка ролевых вкладок после запуска `localhost:80`.