сделал настройку временных слотов
This commit is contained in:
@@ -236,20 +236,55 @@ CREATE TABLE IF NOT EXISTS teacher_lesson_types (
|
||||
-- Динамическое расписание: календарь, слоты и правила
|
||||
-- ==========================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS time_slot_scopes (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
code VARCHAR(50) NOT NULL UNIQUE,
|
||||
name VARCHAR(120) NOT NULL,
|
||||
apply_mode VARCHAR(20) NOT NULL,
|
||||
day_of_week INT NULL,
|
||||
system_scope BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
display_order INT NOT NULL DEFAULT 100,
|
||||
CONSTRAINT chk_time_slot_scopes_mode CHECK (apply_mode IN ('DEFAULT', 'WEEKDAY', 'MANUAL')),
|
||||
CONSTRAINT chk_time_slot_scopes_day CHECK (day_of_week IS NULL OR day_of_week BETWEEN 1 AND 7),
|
||||
CONSTRAINT chk_time_slot_scopes_weekday CHECK (
|
||||
(apply_mode = 'WEEKDAY' AND day_of_week IS NOT NULL)
|
||||
OR (apply_mode <> 'WEEKDAY' AND day_of_week IS NULL)
|
||||
)
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_time_slot_scopes_default
|
||||
ON time_slot_scopes(apply_mode)
|
||||
WHERE apply_mode = 'DEFAULT';
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_time_slot_scopes_weekday
|
||||
ON time_slot_scopes(day_of_week)
|
||||
WHERE apply_mode = 'WEEKDAY';
|
||||
|
||||
INSERT INTO time_slot_scopes (code, name, apply_mode, day_of_week, system_scope, display_order) VALUES
|
||||
('default', 'Базовая сетка', 'DEFAULT', NULL, TRUE, 10),
|
||||
('saturday', 'Субботняя сетка', 'WEEKDAY', 6, TRUE, 20)
|
||||
ON CONFLICT (code) DO NOTHING;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS time_slots (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
time_slot_scope_id BIGINT NOT NULL REFERENCES time_slot_scopes(id) ON DELETE CASCADE,
|
||||
order_number INT NOT NULL,
|
||||
start_time TIME NOT NULL,
|
||||
end_time TIME NOT NULL,
|
||||
duration_minutes INT NOT NULL,
|
||||
CONSTRAINT chk_time_slots_order_positive CHECK (order_number > 0),
|
||||
CONSTRAINT chk_time_slots_time_range CHECK (start_time < end_time),
|
||||
CONSTRAINT chk_time_slots_duration_positive CHECK (duration_minutes > 0),
|
||||
CONSTRAINT uq_time_slots_order UNIQUE (order_number),
|
||||
CONSTRAINT uq_time_slots_range UNIQUE (start_time, end_time)
|
||||
CONSTRAINT chk_time_slots_duration_positive CHECK (duration_minutes > 0)
|
||||
);
|
||||
|
||||
INSERT INTO time_slots (order_number, start_time, end_time, duration_minutes) VALUES
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS uq_time_slots_scope_order
|
||||
ON time_slots(time_slot_scope_id, order_number);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_time_slots_scope ON time_slots(time_slot_scope_id, order_number);
|
||||
|
||||
INSERT INTO time_slots (time_slot_scope_id, order_number, start_time, end_time, duration_minutes)
|
||||
SELECT scope.id, data.order_number, data.start_time::TIME, data.end_time::TIME, data.duration_minutes
|
||||
FROM (VALUES
|
||||
(1, '08:00', '09:30', 90),
|
||||
(2, '09:40', '11:10', 90),
|
||||
(3, '11:40', '13:10', 90),
|
||||
@@ -257,7 +292,19 @@ INSERT INTO time_slots (order_number, start_time, end_time, duration_minutes) VA
|
||||
(5, '15:00', '16:30', 90),
|
||||
(6, '16:50', '18:20', 90),
|
||||
(7, '18:30', '20:00', 90)
|
||||
ON CONFLICT (start_time, end_time) DO NOTHING;
|
||||
) AS data(order_number, start_time, end_time, duration_minutes)
|
||||
CROSS JOIN time_slot_scopes scope
|
||||
WHERE scope.code IN ('default', 'saturday')
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS time_slot_date_assignments (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
assignment_date DATE NOT NULL UNIQUE,
|
||||
time_slot_scope_id BIGINT NOT NULL REFERENCES time_slot_scopes(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_time_slot_date_assignments_scope
|
||||
ON time_slot_date_assignments(time_slot_scope_id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS academic_years (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
@@ -522,7 +569,8 @@ FROM (VALUES
|
||||
('ib_philosophy', 2, 'ODD', 2, 'Тестовый преподаватель', '101 Ленинская', 'Лекция', 'Онлайн')
|
||||
) AS data(rule_key, day_of_week, parity, time_slot_order, teacher_username, classroom_name, lesson_type_name, lesson_format)
|
||||
JOIN tmp_default_rules rules ON rules.rule_key = data.rule_key
|
||||
JOIN time_slots ts ON ts.order_number = data.time_slot_order
|
||||
JOIN time_slot_scopes scope ON scope.code = 'default'
|
||||
JOIN time_slots ts ON ts.time_slot_scope_id = scope.id AND ts.order_number = data.time_slot_order
|
||||
JOIN users teacher ON teacher.username = data.teacher_username
|
||||
JOIN classrooms classroom ON classroom.name = data.classroom_name
|
||||
JOIN lesson_types lt ON lt.name = data.lesson_type_name;
|
||||
@@ -555,7 +603,9 @@ COMMENT ON TABLE users IS 'Пользователи системы (студен
|
||||
COMMENT ON TABLE departments IS 'Кафедры';
|
||||
COMMENT ON TABLE specialties IS 'Специальности';
|
||||
COMMENT ON TABLE specialty_profiles IS 'Профили обучения внутри специальности';
|
||||
COMMENT ON TABLE time_slot_scopes IS 'Именованные сетки времени: базовая, автоматическая субботняя и ручные сетки';
|
||||
COMMENT ON TABLE time_slots IS 'Настраиваемая сетка временных слотов занятий';
|
||||
COMMENT ON TABLE time_slot_date_assignments IS 'Ручное назначение сетки времени на конкретную дату';
|
||||
COMMENT ON TABLE academic_years IS 'Учебные годы';
|
||||
COMMENT ON TABLE semesters IS 'Семестры учебного года';
|
||||
COMMENT ON TABLE academic_calendar_activity_types IS 'Коды активностей календарного учебного графика';
|
||||
|
||||
Reference in New Issue
Block a user