Import Vector lab project

This commit is contained in:
root
2026-06-06 18:31:55 +00:00
commit fcc22063ed
105 changed files with 31639 additions and 0 deletions
@@ -0,0 +1,78 @@
-- Миграция: создание таблицы cases согласно §10 контекста
DROP TABLE IF EXISTS search_results CASCADE;
DROP TABLE IF EXISTS search_cases CASCADE;
CREATE TABLE IF NOT EXISTS cases (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
created_at TIMESTAMP DEFAULT NOW(),
status VARCHAR(20) DEFAULT 'active',
child_name VARCHAR(255),
age_years INTEGER NOT NULL,
gender CHAR(1),
clothes_description TEXT,
special_marks TEXT,
phone_status VARCHAR(20),
has_diagnosis BOOLEAN DEFAULT FALSE,
diagnosis_type VARCHAR[],
fitness_level VARCHAR(20),
has_transport VARCHAR(20) DEFAULT 'none',
cant_swim BOOLEAN DEFAULT FALSE,
psychotype VARCHAR(50),
psychotype_answers JSONB,
loss_reason VARCHAR(100),
loss_time TIMESTAMP,
elapsed_hours FLOAT,
last_seen_direction VARCHAR(10),
last_seen_reliability VARCHAR(20),
last_seen_description TEXT,
behavior_description TEXT,
familiar_places TEXT,
lost_before VARCHAR(20),
season VARCHAR(20),
temperature_c FLOAT,
precipitation VARCHAR(20),
visibility VARCHAR(20),
wind VARCHAR(20),
terrain VARCHAR[],
tnp_lat FLOAT,
tnp_lon FLOAT,
tnp_address TEXT,
teams_count INTEGER,
team_size INTEGER,
has_dog BOOLEAN DEFAULT FALSE,
extra_resources VARCHAR[],
found_alive BOOLEAN,
found_distance_km FLOAT,
found_direction VARCHAR(10),
found_location_type VARCHAR(50),
found_lat FLOAT,
found_lon FLOAT,
search_duration_hours FLOAT,
who_found VARCHAR(50),
confidence_avg FLOAT,
raw_text TEXT,
analysis_log JSONB
);
CREATE INDEX IF NOT EXISTS idx_cases_coords ON cases (found_lat, found_lon);
CREATE INDEX IF NOT EXISTS idx_cases_age_season ON cases (age_years, season);
CREATE INDEX IF NOT EXISTS idx_cases_status ON cases (status);
DROP TABLE IF EXISTS raw_documents CASCADE;
CREATE TABLE IF NOT EXISTS raw_documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
filename VARCHAR(255) NOT NULL,
raw_text TEXT,
extracted_json JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
@@ -0,0 +1,12 @@
-- Миграция: добавление детализированных полей одежды и телосложения
-- Дата: 2026-05-04
ALTER TABLE cases ADD COLUMN IF NOT EXISTS height_build TEXT;
ALTER TABLE cases ADD COLUMN IF NOT EXISTS clothes_upper TEXT;
ALTER TABLE cases ADD COLUMN IF NOT EXISTS clothes_lower TEXT;
ALTER TABLE cases ADD COLUMN IF NOT EXISTS shoes TEXT;
COMMENT ON COLUMN cases.height_build IS 'Рост / телосложение (Шаг 1)';
COMMENT ON COLUMN cases.clothes_upper IS 'Одежда: верх (цвет, тип) (Шаг 1)';
COMMENT ON COLUMN cases.clothes_lower IS 'Одежда: низ (цвет, тип) (Шаг 1)';
COMMENT ON COLUMN cases.shoes IS 'Обувь (тип, цвет) (Шаг 1)';
@@ -0,0 +1,41 @@
-- Миграция: создание таблиц users и analysis_log
-- Дата: 2026-05-04
-- Таблица пользователей для аутентификации
CREATE TABLE IF NOT EXISTS users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
username VARCHAR(100) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
hashed_password VARCHAR(255) NOT NULL,
full_name VARCHAR(255),
role VARCHAR(20) NOT NULL DEFAULT 'operator', -- operator/field/admin
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW(),
last_login TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_users_username ON users (username);
CREATE INDEX IF NOT EXISTS idx_users_email ON users (email);
CREATE INDEX IF NOT EXISTS idx_users_role ON users (role);
-- Таблица логов анализа
CREATE TABLE IF NOT EXISTS analysis_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
case_id UUID NOT NULL REFERENCES cases(id) ON DELETE CASCADE,
user_id UUID REFERENCES users(id) ON DELETE SET NULL,
analysis_type VARCHAR(50) NOT NULL, -- scoring/claude/geo/psychotype
input_data JSONB,
output_data JSONB,
execution_time FLOAT, -- в секундах
status VARCHAR(20) DEFAULT 'success', -- success/error/partial
error_message TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_analysis_log_case_id ON analysis_log (case_id);
CREATE INDEX IF NOT EXISTS idx_analysis_log_user_id ON analysis_log (user_id);
CREATE INDEX IF NOT EXISTS idx_analysis_log_created_at ON analysis_log (created_at);
CREATE INDEX IF NOT EXISTS idx_analysis_log_type ON analysis_log (analysis_type);
COMMENT ON TABLE users IS 'Пользователи системы с ролями operator/field/admin';
COMMENT ON TABLE analysis_log IS 'Лог всех анализов случаев для аудита и отладки';
+16
View File
@@ -0,0 +1,16 @@
-- Seed: создание тестовых пользователей
-- Пароль для всех: pass123
-- Удаляем существующих пользователей (если есть)
TRUNCATE TABLE users CASCADE;
-- Создаём трёх тестовых пользователей
-- Хеш для пароля "pass123" (bcrypt)
INSERT INTO users (id, username, email, hashed_password, full_name, role, is_active, created_at)
VALUES
(gen_random_uuid(), 'operator', 'operator@mchs.by', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5GyYqVr/1jrYK', 'Оператор ЦОУ', 'operator', true, NOW()),
(gen_random_uuid(), 'field', 'field@mchs.by', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5GyYqVr/1jrYK', 'Полевой работник', 'field', true, NOW()),
(gen_random_uuid(), 'admin', 'admin@mchs.by', '$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewY5GyYqVr/1jrYK', 'Администратор', 'admin', true, NOW());
-- Проверка
SELECT username, email, role, is_active FROM users ORDER BY role;
@@ -0,0 +1,9 @@
-- Обновление хешей паролей для тестовых пользователей
-- Новый хеш для пароля "pass123" через bcrypt напрямую
UPDATE users
SET hashed_password = '$2b$12$gldqRRQhjH6yx3ymbZXxbOGfKYwd27cnzf6gQAKP7rho4PDSXT2Oy'
WHERE username IN ('operator', 'field', 'admin');
-- Проверка
SELECT username, role, substring(hashed_password, 1, 20) as hash_prefix FROM users;