ролевая моделю доступа + загруженность по кафедрам и преподавателям + просморт расписания
This commit is contained in:
116
docs/DATABASE.md
116
docs/DATABASE.md
@@ -41,6 +41,10 @@ erDiagram
|
||||
VARCHAR full_name
|
||||
VARCHAR job_title
|
||||
BIGINT department_id FK
|
||||
VARCHAR status
|
||||
DATE active_from
|
||||
DATE active_to
|
||||
TIMESTAMP archived_at
|
||||
TIMESTAMP created_at
|
||||
TIMESTAMP updated_at
|
||||
}
|
||||
@@ -101,6 +105,10 @@ erDiagram
|
||||
VARCHAR building
|
||||
INT floor
|
||||
BOOLEAN is_available
|
||||
VARCHAR status
|
||||
DATE active_from
|
||||
DATE active_to
|
||||
TIMESTAMP archived_at
|
||||
TEXT description
|
||||
TIMESTAMP created_at
|
||||
}
|
||||
@@ -118,6 +126,24 @@ erDiagram
|
||||
VARCHAR qualification_level
|
||||
INT experience_years
|
||||
}
|
||||
|
||||
teacher_department_assignments {
|
||||
BIGSERIAL id PK
|
||||
BIGINT teacher_id FK
|
||||
BIGINT department_id FK
|
||||
DATE valid_from
|
||||
DATE valid_to
|
||||
BOOLEAN is_primary
|
||||
TEXT comment
|
||||
}
|
||||
|
||||
subject_comments {
|
||||
BIGSERIAL id PK
|
||||
BIGINT subject_id FK
|
||||
BIGINT author_id FK
|
||||
TEXT comment
|
||||
TIMESTAMP created_at
|
||||
}
|
||||
|
||||
teacher_lesson_types {
|
||||
BIGINT user_id FK,PK
|
||||
@@ -207,6 +233,9 @@ erDiagram
|
||||
BIGSERIAL id PK
|
||||
BIGINT subject_id FK
|
||||
BIGINT semester_id FK
|
||||
VARCHAR status
|
||||
DATE valid_from
|
||||
DATE valid_to
|
||||
INT lecture_academic_hours
|
||||
INT laboratory_academic_hours
|
||||
INT practice_academic_hours
|
||||
@@ -230,6 +259,21 @@ erDiagram
|
||||
BIGINT classroom_id FK
|
||||
BIGINT lesson_type_id FK
|
||||
VARCHAR lesson_format
|
||||
BOOLEAN time_locked
|
||||
BOOLEAN classroom_locked
|
||||
BOOLEAN teacher_locked
|
||||
}
|
||||
|
||||
schedule_overrides {
|
||||
BIGSERIAL id PK
|
||||
BIGINT base_rule_slot_id FK
|
||||
DATE lesson_date
|
||||
VARCHAR action
|
||||
BIGINT new_time_slot_id FK
|
||||
BIGINT new_classroom_id FK
|
||||
BIGINT new_teacher_id FK
|
||||
VARCHAR new_lesson_format
|
||||
TEXT comment
|
||||
}
|
||||
|
||||
schedule_rule_slot_subgroups {
|
||||
@@ -248,8 +292,12 @@ erDiagram
|
||||
student_groups ||--o{ schedule_rule_groups : "group_id"
|
||||
student_groups ||--o{ student_group_calendar_assignments : "group_id"
|
||||
users ||--o{ teacher_subjects : "user_id"
|
||||
users ||--o{ teacher_department_assignments : "teacher_id"
|
||||
departments ||--o{ teacher_department_assignments : "department_id"
|
||||
users ||--o{ teacher_lesson_types : "user_id"
|
||||
users ||--o{ subject_comments : "author_id"
|
||||
subjects ||--o{ teacher_subjects : "subject_id"
|
||||
subjects ||--o{ subject_comments : "subject_id"
|
||||
subjects ||--o{ teacher_lesson_types : "subject_id"
|
||||
subjects ||--o{ schedule_rules : "subject_id"
|
||||
lesson_types ||--o{ teacher_lesson_types : "lesson_type_id"
|
||||
@@ -270,6 +318,10 @@ erDiagram
|
||||
schedule_rules ||--o{ schedule_rule_groups : "schedule_rule_id"
|
||||
schedule_rules ||--o{ schedule_rule_slots : "schedule_rule_id"
|
||||
schedule_rule_slots ||--o{ schedule_rule_slot_subgroups : "schedule_rule_slot_id"
|
||||
schedule_rule_slots ||--o{ schedule_overrides : "base_rule_slot_id"
|
||||
time_slots ||--o{ schedule_overrides : "new_time_slot_id"
|
||||
classrooms ||--o{ schedule_overrides : "new_classroom_id"
|
||||
users ||--o{ schedule_overrides : "new_teacher_id"
|
||||
time_slot_scopes ||--o{ time_slots : "time_slot_scope_id"
|
||||
time_slot_scopes ||--o{ time_slot_date_assignments : "time_slot_scope_id"
|
||||
time_slots ||--o{ schedule_rule_slots : "time_slot_id"
|
||||
@@ -317,6 +369,11 @@ erDiagram
|
||||
| `full_name` | VARCHAR(255) | ФИО |
|
||||
| `job_title` | VARCHAR(255) | Должность |
|
||||
| `department_id` | BIGINT FK → departments | Кафедра |
|
||||
| `status` | VARCHAR(20) | `ACTIVE` или `ARCHIVED`; архивный пользователь не может войти |
|
||||
| `active_from` | DATE | Дата начала действия записи |
|
||||
| `active_to` | DATE | Дата окончания действия записи |
|
||||
| `archived_at` | TIMESTAMP | Когда пользователь архивирован |
|
||||
| `archive_reason` | TEXT | Причина архивирования |
|
||||
| `created_at` | TIMESTAMP | Дата создания |
|
||||
| `updated_at` | TIMESTAMP | Дата обновления (авто-триггер) |
|
||||
|
||||
@@ -375,6 +432,11 @@ erDiagram
|
||||
| `building` | VARCHAR(50) | Корпус |
|
||||
| `floor` | INT | Этаж |
|
||||
| `is_available` | BOOLEAN | Доступна для назначения пар |
|
||||
| `status` | VARCHAR(20) | `ACTIVE` или `ARCHIVED`; архивные аудитории не выбираются в новых назначениях |
|
||||
| `active_from` | DATE | Дата начала действия записи |
|
||||
| `active_to` | DATE | Дата окончания действия записи |
|
||||
| `archived_at` | TIMESTAMP | Когда аудитория выведена из эксплуатации |
|
||||
| `archive_reason` | TEXT | Причина архивирования |
|
||||
| `description` | TEXT | Описание |
|
||||
|
||||
#### `equipments` — Оборудование
|
||||
@@ -420,6 +482,30 @@ erDiagram
|
||||
| `subject_id` | BIGINT PK, FK → subjects (CASCADE) | Дисциплина |
|
||||
| `lesson_type_id` | BIGINT PK, FK → lesson_types (CASCADE) | Тип занятия |
|
||||
|
||||
#### `teacher_department_assignments` — История кафедр преподавателя
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID исторической записи |
|
||||
| `teacher_id` | BIGINT FK → users | Преподаватель |
|
||||
| `department_id` | BIGINT FK → departments | Кафедра |
|
||||
| `valid_from` | DATE | Дата начала принадлежности |
|
||||
| `valid_to` | DATE | Дата окончания принадлежности, `NULL` для текущей кафедры |
|
||||
| `is_primary` | BOOLEAN | Основная кафедра преподавателя |
|
||||
| `comment` | TEXT | Комментарий к переводу |
|
||||
| `created_at` | TIMESTAMP | Дата создания записи |
|
||||
| `created_by` | BIGINT FK → users | Кто оформил перевод |
|
||||
|
||||
Индекс `uq_teacher_department_open_primary` гарантирует не больше одной открытой основной кафедры у преподавателя.
|
||||
|
||||
#### `subject_comments` — Комментарии к дисциплинам
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID комментария |
|
||||
| `subject_id` | BIGINT FK → subjects | Дисциплина |
|
||||
| `author_id` | BIGINT FK → users | Автор комментария |
|
||||
| `comment` | TEXT | Текст комментария |
|
||||
| `created_at` | TIMESTAMP | Дата создания |
|
||||
|
||||
#### `time_slot_scopes` — Сетки времени
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
@@ -524,6 +610,11 @@ Seed создаёт `Базовая сетка` (`DEFAULT`) и `Субботня
|
||||
| `lecture_start_week` | INT | Неделя семестра, с которой начинаются лекции |
|
||||
| `laboratory_start_week` | INT | Неделя семестра, с которой начинаются лабораторные |
|
||||
| `practice_start_week` | INT | Неделя семестра, с которой начинаются практики |
|
||||
| `status` | VARCHAR(20) | `ACTIVE` или `ARCHIVED` |
|
||||
| `valid_from` | DATE | Начало действия версии правила |
|
||||
| `valid_to` | DATE | Окончание действия версии правила |
|
||||
| `version_group_id` | BIGINT | Группа версий одного правила |
|
||||
| `change_reason` | TEXT | Причина изменения |
|
||||
|
||||
#### `schedule_rule_groups` — Группы правила
|
||||
| Колонка | Тип | Описание |
|
||||
@@ -543,6 +634,12 @@ Seed создаёт `Базовая сетка` (`DEFAULT`) и `Субботня
|
||||
| `classroom_id` | BIGINT FK → classrooms | Аудитория |
|
||||
| `lesson_type_id` | BIGINT FK → lesson_types | Тип занятия |
|
||||
| `lesson_format` | VARCHAR(30) | `Очно` или `Онлайн` |
|
||||
| `time_locked` | BOOLEAN | Время закреплено учебным отделом |
|
||||
| `classroom_locked` | BOOLEAN | Аудитория закреплена учебным отделом |
|
||||
| `teacher_locked` | BOOLEAN | Преподаватель закреплён учебным отделом |
|
||||
| `locked_by` | BIGINT FK → users | Кто выполнил закрепление |
|
||||
| `locked_at` | TIMESTAMP | Когда выполнено закрепление |
|
||||
| `lock_comment` | TEXT | Комментарий к закреплению |
|
||||
|
||||
#### `schedule_rule_slot_subgroups` — Подгруппы лабораторного слота
|
||||
| Колонка | Тип | Описание |
|
||||
@@ -552,6 +649,23 @@ Seed создаёт `Базовая сетка` (`DEFAULT`) и `Субботня
|
||||
|
||||
Связь заполняется только для лабораторных слотов. Для потоковой лабораторной можно выбрать разные подгруппы разных групп в одном слоте. Лекции и практики не делятся на подгруппы и не имеют записей в этой таблице. Триггер `validate_schedule_rule_slot_subgroups` проверяет тип занятия, принадлежность подгруппы к группам правила и запрет на две подгруппы одной группы в одном слоте; для быстрых выборок есть индекс `idx_schedule_rule_slot_subgroups_subgroup`.
|
||||
|
||||
#### `schedule_overrides` — Точечные изменения пар
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID изменения |
|
||||
| `base_rule_slot_id` | BIGINT FK → schedule_rule_slots | Базовый слот правила |
|
||||
| `lesson_date` | DATE | Дата конкретной пары |
|
||||
| `action` | VARCHAR(20) | `MOVE`, `CANCEL`, `REPLACE` |
|
||||
| `new_time_slot_id` | BIGINT FK → time_slots | Новый временной слот |
|
||||
| `new_classroom_id` | BIGINT FK → classrooms | Новая аудитория |
|
||||
| `new_teacher_id` | BIGINT FK → users | Новый преподаватель |
|
||||
| `new_lesson_format` | VARCHAR(30) | Новый формат занятия |
|
||||
| `comment` | TEXT | Причина изменения |
|
||||
| `created_by` | BIGINT FK → users | Автор изменения |
|
||||
| `created_at` | TIMESTAMP | Дата создания |
|
||||
|
||||
Ограничение `uq_schedule_overrides_slot_date` не позволяет создать две разные правки для одной и той же пары.
|
||||
|
||||
---
|
||||
|
||||
## Flyway миграции
|
||||
@@ -570,7 +684,7 @@ Seed создаёт `Базовая сетка` (`DEFAULT`) и `Субботня
|
||||
|
||||
| Файл | Описание |
|
||||
|------|----------|
|
||||
| `V1__init.sql` | Инициализация: справочники, профили специальностей, календарные учебные графики, динамическое расписание с раздельными часами и стартовыми неделями по типам занятий, тестовые правила, триггеры, комментарии |
|
||||
| `V1__init.sql` | Инициализация: справочники, роли, lifecycle-поля, история кафедр преподавателей, комментарии дисциплин, календарные учебные графики, динамическое расписание, версии/закрепления правил, точечные изменения расписания, тестовые правила, триггеры, комментарии |
|
||||
|
||||
### Накатывание на существующих тенантов
|
||||
|
||||
|
||||
Reference in New Issue
Block a user