Files
vector/backend/models_new.py
T
2026-06-06 18:31:55 +00:00

90 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from sqlalchemy import Column, String, Float, Boolean, DateTime, Text, ARRAY
from sqlalchemy.dialects.postgresql import UUID, JSONB
from sqlalchemy.sql import func
import uuid
from database import Base
class Case(Base):
"""Unified case model - combines search case and result"""
__tablename__ = "cases"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
created_at = Column(DateTime, server_default=func.now())
status = Column(String(20), default='active') # active/closed/archived
# Ребёнок
child_name = Column(String(255))
age_years = Column(Integer, nullable=False)
gender = Column(String(1)) # М / Ж
clothes_description = Column(Text)
special_marks = Column(Text)
phone_status = Column(String(20)) # answers/silent/none
# Здоровье
has_diagnosis = Column(Boolean, default=False)
diagnosis_type = Column(ARRAY(String)) # РАС, эпилепсия, СДВГ, ЗПР...
fitness_level = Column(String(20)) # low/medium/high
has_transport = Column(String(20), default='none') # none/bike/scooter/other
cant_swim = Column(Boolean, default=False)
# Психотип
psychotype = Column(String(50)) # dominant/harmonic/anxious/...
psychotype_answers = Column(JSONB) # сырые ответы на 4 вопроса
# Обстоятельства
loss_reason = Column(String(100))
loss_time = Column(DateTime)
elapsed_hours = Column(Float)
last_seen_direction = Column(String(10))
last_seen_reliability = Column(String(20)) # exact/approx/unknown
last_seen_description = Column(Text)
behavior_description = Column(Text)
familiar_places = Column(Text)
lost_before = Column(String(20)) # yes/no/unknown
# Среда
season = Column(String(20))
temperature_c = Column(Float)
precipitation = Column(String(20))
visibility = Column(String(20))
wind = Column(String(20))
terrain = Column(ARRAY(String))
# GPS
tnp_lat = Column(Float)
tnp_lon = Column(Float)
tnp_address = Column(Text)
# Ресурсы
teams_count = Column(Integer)
team_size = Column(Integer)
has_dog = Column(Boolean, default=False)
extra_resources = Column(ARRAY(String)) # drone/helicopter/boat/thermal
# Исход (заполняется после завершения)
found_alive = Column(Boolean)
found_distance_km = Column(Float)
found_direction = Column(String(10))
found_location_type = Column(String(50)) # forest/road/building/water/field
found_lat = Column(Float)
found_lon = Column(Float)
search_duration_hours = Column(Float)
who_found = Column(String(50)) # mchs/mvd/volunteers/self
# Мета
confidence_avg = Column(Float)
raw_text = Column(Text)
analysis_log = Column(JSONB)
class RawDocument(Base):
"""Raw document storage for parsed reports"""
__tablename__ = "raw_documents"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
filename = Column(String(255), nullable=False)
raw_text = Column(Text)
extracted_json = Column(JSONB)
created_at = Column(DateTime, server_default=func.now())