fix: adapt init.sql lessons table to match Create-Lesson branch entity
This commit is contained in:
121
db/init/init.sql
121
db/init/init.sql
@@ -184,118 +184,13 @@ CREATE TABLE IF NOT EXISTS teacher_lesson_types (
|
|||||||
CREATE TABLE IF NOT EXISTS lessons (
|
CREATE TABLE IF NOT EXISTS lessons (
|
||||||
id BIGSERIAL PRIMARY KEY,
|
id BIGSERIAL PRIMARY KEY,
|
||||||
teacher_id BIGINT NOT NULL REFERENCES users(id),
|
teacher_id BIGINT NOT NULL REFERENCES users(id),
|
||||||
subject_id BIGINT NOT NULL REFERENCES subjects(id),
|
|
||||||
lesson_type_id BIGINT NOT NULL REFERENCES lesson_types(id),
|
|
||||||
classroom_id BIGINT NOT NULL REFERENCES classrooms(id),
|
|
||||||
group_id BIGINT NOT NULL REFERENCES student_groups(id),
|
group_id BIGINT NOT NULL REFERENCES student_groups(id),
|
||||||
subgroup_id BIGINT REFERENCES subgroups(id),
|
lesson_type_id BIGINT NOT NULL REFERENCES lesson_types(id),
|
||||||
|
day VARCHAR(255) NOT NULL,
|
||||||
day_of_week INT NOT NULL CHECK (day_of_week BETWEEN 1 AND 7),
|
week VARCHAR(255) NOT NULL,
|
||||||
is_even_week BOOLEAN NOT NULL,
|
time VARCHAR(255) NOT NULL
|
||||||
start_time TIME NOT NULL,
|
|
||||||
end_time TIME NOT NULL,
|
|
||||||
|
|
||||||
-- Дополнительные поля
|
|
||||||
semester INT CHECK (semester BETWEEN 1 AND 12),
|
|
||||||
academic_year VARCHAR(9), -- например: '2023-2024'
|
|
||||||
is_active BOOLEAN DEFAULT TRUE,
|
|
||||||
notes TEXT,
|
|
||||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
|
|
||||||
-- Проверки
|
|
||||||
CHECK (end_time > start_time),
|
|
||||||
CHECK (end_time <= start_time + INTERVAL '4 hours') -- Максимальная длина занятия 4 часа
|
|
||||||
);
|
);
|
||||||
|
|
||||||
-- Индексы для эффективного поиска
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_lessons_teacher ON lessons(teacher_id, day_of_week, is_even_week);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_lessons_group ON lessons(group_id, day_of_week, is_even_week);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_lessons_classroom ON lessons(classroom_id, day_of_week, is_even_week, start_time);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_lessons_datetime ON lessons(day_of_week, start_time, end_time);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_lessons_active ON lessons(is_active);
|
|
||||||
|
|
||||||
-- ==========================================
|
|
||||||
-- Таблица для отслеживания замен и изменений в расписании
|
|
||||||
-- ==========================================
|
|
||||||
CREATE TABLE IF NOT EXISTS schedule_changes (
|
|
||||||
id BIGSERIAL PRIMARY KEY,
|
|
||||||
original_lesson_id BIGINT REFERENCES lessons(id) ON DELETE SET NULL,
|
|
||||||
new_teacher_id BIGINT REFERENCES users(id),
|
|
||||||
new_classroom_id BIGINT REFERENCES classrooms(id),
|
|
||||||
new_start_time TIME,
|
|
||||||
new_end_time TIME,
|
|
||||||
change_reason TEXT NOT NULL,
|
|
||||||
changed_by BIGINT REFERENCES users(id),
|
|
||||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
||||||
effective_date DATE NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
-- ==========================================
|
|
||||||
-- Функция для проверки пересечений расписания
|
|
||||||
-- ==========================================
|
|
||||||
CREATE OR REPLACE FUNCTION check_schedule_conflict()
|
|
||||||
RETURNS TRIGGER AS $$
|
|
||||||
BEGIN
|
|
||||||
-- Проверка пересечений для преподавателя
|
|
||||||
IF EXISTS (
|
|
||||||
SELECT 1 FROM lessons
|
|
||||||
WHERE teacher_id = NEW.teacher_id
|
|
||||||
AND day_of_week = NEW.day_of_week
|
|
||||||
AND is_even_week = NEW.is_even_week
|
|
||||||
AND id != COALESCE(NEW.id, -1)
|
|
||||||
AND (
|
|
||||||
(start_time <= NEW.start_time AND end_time > NEW.start_time)
|
|
||||||
OR (start_time < NEW.end_time AND end_time >= NEW.end_time)
|
|
||||||
OR (start_time >= NEW.start_time AND end_time <= NEW.end_time)
|
|
||||||
)
|
|
||||||
) THEN
|
|
||||||
RAISE EXCEPTION 'Конфликт расписания для преподавателя';
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
-- Проверка пересечений для аудитории
|
|
||||||
IF EXISTS (
|
|
||||||
SELECT 1 FROM lessons
|
|
||||||
WHERE classroom_id = NEW.classroom_id
|
|
||||||
AND day_of_week = NEW.day_of_week
|
|
||||||
AND is_even_week = NEW.is_even_week
|
|
||||||
AND id != COALESCE(NEW.id, -1)
|
|
||||||
AND (
|
|
||||||
(start_time <= NEW.start_time AND end_time > NEW.start_time)
|
|
||||||
OR (start_time < NEW.end_time AND end_time >= NEW.end_time)
|
|
||||||
OR (start_time >= NEW.start_time AND end_time <= NEW.end_time)
|
|
||||||
)
|
|
||||||
) THEN
|
|
||||||
RAISE EXCEPTION 'Конфликт расписания для аудитории';
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
-- Проверка пересечений для группы
|
|
||||||
IF EXISTS (
|
|
||||||
SELECT 1 FROM lessons
|
|
||||||
WHERE group_id = NEW.group_id
|
|
||||||
AND day_of_week = NEW.day_of_week
|
|
||||||
AND is_even_week = NEW.is_even_week
|
|
||||||
AND id != COALESCE(NEW.id, -1)
|
|
||||||
AND (
|
|
||||||
(start_time <= NEW.start_time AND end_time > NEW.start_time)
|
|
||||||
OR (start_time < NEW.end_time AND end_time >= NEW.end_time)
|
|
||||||
OR (start_time >= NEW.start_time AND end_time <= NEW.end_time)
|
|
||||||
)
|
|
||||||
) THEN
|
|
||||||
RAISE EXCEPTION 'Конфликт расписания для группы';
|
|
||||||
END IF;
|
|
||||||
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$ LANGUAGE plpgsql;
|
|
||||||
|
|
||||||
-- Триггер для проверки конфликтов при вставке/обновлении
|
|
||||||
DROP TRIGGER IF EXISTS check_lesson_conflict ON lessons;
|
|
||||||
CREATE TRIGGER check_lesson_conflict
|
|
||||||
BEFORE INSERT OR UPDATE ON lessons
|
|
||||||
FOR EACH ROW
|
|
||||||
EXECUTE FUNCTION check_schedule_conflict();
|
|
||||||
|
|
||||||
-- ==========================================
|
-- ==========================================
|
||||||
-- Функция обновления timestamp
|
-- Функция обновления timestamp
|
||||||
-- ==========================================
|
-- ==========================================
|
||||||
@@ -313,16 +208,8 @@ CREATE TRIGGER update_users_updated_at
|
|||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
EXECUTE FUNCTION update_updated_at_column();
|
EXECUTE FUNCTION update_updated_at_column();
|
||||||
|
|
||||||
CREATE TRIGGER update_lessons_updated_at
|
|
||||||
BEFORE UPDATE ON lessons
|
|
||||||
FOR EACH ROW
|
|
||||||
EXECUTE FUNCTION update_updated_at_column();
|
|
||||||
|
|
||||||
-- ==========================================
|
-- ==========================================
|
||||||
-- Комментарии к таблицам и полям (для документации)
|
-- Комментарии к таблицам и полям (для документации)
|
||||||
-- ==========================================
|
-- ==========================================
|
||||||
COMMENT ON TABLE users IS 'Пользователи системы (студенты, преподаватели, администраторы)';
|
COMMENT ON TABLE users IS 'Пользователи системы (студенты, преподаватели, администраторы)';
|
||||||
COMMENT ON TABLE lessons IS 'Основное расписание занятий';
|
COMMENT ON TABLE lessons IS 'Основное расписание занятий';
|
||||||
COMMENT ON COLUMN lessons.day_of_week IS 'День недели (1-Пн, 2-Вт, 3-Ср, 4-Чт, 5-Пт, 6-Сб, 7-Вс)';
|
|
||||||
COMMENT ON COLUMN lessons.is_even_week IS 'true - четная неделя, false - нечетная';
|
|
||||||
COMMENT ON TABLE schedule_changes IS 'История изменений и замен в расписании';
|
|
||||||
Reference in New Issue
Block a user