hyerimmy 910bd902b1
Some checks failed
HealthSync Intelligence CI / build-and-push (push) Has been cancelled
feat : initial commit
2025-06-20 05:28:30 +00:00

134 lines
7.4 KiB
Python

"""
HealthSync AI 건강 관련 모델 (Health Service)
"""
from pydantic import BaseModel, Field
from datetime import datetime, date
from typing import Optional, List, Dict, Any
from enum import Enum
from decimal import Decimal
class RiskLevel(str, Enum):
"""위험도 레벨"""
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
CRITICAL = "critical"
class RangeStatus(str, Enum):
"""정상치 범위 상태"""
NORMAL = "normal"
WARNING = "warning"
DANGER = "danger"
class UploadStatus(str, Enum):
"""업로드 상태"""
PENDING = "pending"
SUCCESS = "success"
FAILED = "failed"
class HealthCheckupRaw(BaseModel):
"""건강검진 원천 데이터"""
raw_id: int = Field(..., description="원본 ID")
reference_year: int = Field(..., description="기준 년도")
birth_date: date = Field(..., description="생년월일")
name: str = Field(..., max_length=50, description="이름")
region_code: Optional[int] = Field(None, description="지역 코드")
gender_code: Optional[int] = Field(None, description="성별 코드")
age: Optional[int] = Field(None, description="나이")
height: Optional[int] = Field(None, description="신장(cm)")
weight: Optional[int] = Field(None, description="체중(kg)")
waist_circumference: Optional[int] = Field(None, description="허리둘레(cm)")
visual_acuity_left: Optional[Decimal] = Field(None, description="좌측 시력")
visual_acuity_right: Optional[Decimal] = Field(None, description="우측 시력")
hearing_left: Optional[int] = Field(None, description="좌측 청력")
hearing_right: Optional[int] = Field(None, description="우측 청력")
systolic_bp: Optional[int] = Field(None, description="수축기 혈압")
diastolic_bp: Optional[int] = Field(None, description="이완기 혈압")
fasting_glucose: Optional[int] = Field(None, description="공복혈당")
total_cholesterol: Optional[int] = Field(None, description="총 콜레스테롤")
triglyceride: Optional[int] = Field(None, description="중성지방")
hdl_cholesterol: Optional[int] = Field(None, description="HDL 콜레스테롤")
ldl_cholesterol: Optional[int] = Field(None, description="LDL 콜레스테롤")
hemoglobin: Optional[Decimal] = Field(None, description="혈색소")
urine_protein: Optional[int] = Field(None, description="요단백")
serum_creatinine: Optional[Decimal] = Field(None, description="혈청크레아티닌")
ast: Optional[int] = Field(None, description="AST")
alt: Optional[int] = Field(None, description="ALT")
gamma_gtp: Optional[int] = Field(None, description="감마지티피")
smoking_status: Optional[int] = Field(None, description="흡연 상태")
drinking_status: Optional[int] = Field(None, description="음주 상태")
created_at: datetime = Field(default_factory=datetime.now, description="생성일시")
class HealthCheckup(BaseModel):
"""처리된 건강검진 데이터"""
checkup_id: int = Field(..., description="건강검진 ID")
member_serial_number: int = Field(..., description="회원 일련번호")
raw_id: int = Field(..., description="원본 데이터 ID")
reference_year: int = Field(..., description="기준 년도")
age: Optional[int] = Field(None, description="나이")
height: Optional[int] = Field(None, description="신장(cm)")
weight: Optional[int] = Field(None, description="체중(kg)")
bmi: Optional[Decimal] = Field(None, description="BMI")
waist_circumference: Optional[int] = Field(None, description="허리둘레(cm)")
visual_acuity_left: Optional[Decimal] = Field(None, description="좌측 시력")
visual_acuity_right: Optional[Decimal] = Field(None, description="우측 시력")
hearing_left: Optional[int] = Field(None, description="좌측 청력")
hearing_right: Optional[int] = Field(None, description="우측 청력")
systolic_bp: Optional[int] = Field(None, description="수축기 혈압")
diastolic_bp: Optional[int] = Field(None, description="이완기 혈압")
fasting_glucose: Optional[int] = Field(None, description="공복혈당")
total_cholesterol: Optional[int] = Field(None, description="총 콜레스테롤")
triglyceride: Optional[int] = Field(None, description="중성지방")
hdl_cholesterol: Optional[int] = Field(None, description="HDL 콜레스테롤")
ldl_cholesterol: Optional[int] = Field(None, description="LDL 콜레스테롤")
hemoglobin: Optional[Decimal] = Field(None, description="혈색소")
urine_protein: Optional[int] = Field(None, description="요단백")
serum_creatinine: Optional[Decimal] = Field(None, description="혈청크레아티닌")
ast: Optional[int] = Field(None, description="AST")
alt: Optional[int] = Field(None, description="ALT")
gamma_gtp: Optional[int] = Field(None, description="감마지티피")
smoking_status: Optional[int] = Field(None, description="흡연 상태")
drinking_status: Optional[int] = Field(None, description="음주 상태")
processed_at: Optional[datetime] = Field(None, description="처리일시")
created_at: datetime = Field(default_factory=datetime.now, description="생성일시")
class HealthNormalRange(BaseModel):
"""건강 정상치 기준"""
range_id: int = Field(..., description="범위 ID")
health_item_code: Optional[str] = Field(None, max_length=25, description="건강항목 코드")
health_item_name: Optional[str] = Field(None, max_length=30, description="건강항목명")
gender_code: Optional[int] = Field(None, description="성별 코드 (0:공통, 1:남성, 2:여성)")
unit: Optional[str] = Field(None, max_length=10, description="단위")
normal_range: Optional[str] = Field(None, max_length=15, description="정상 범위")
warning_range: Optional[str] = Field(None, max_length=15, description="주의 범위")
danger_range: Optional[str] = Field(None, max_length=15, description="위험 범위")
note: Optional[str] = Field(None, max_length=50, description="비고")
created_at: datetime = Field(default_factory=datetime.now, description="생성일시")
class HealthSyncResponse(BaseModel):
"""건강검진 연동 응답"""
sync_status: str = Field(..., description="동기화 상태")
message: str = Field(..., description="응답 메시지")
is_ready_for_analysis: bool = Field(..., description="분석 준비 여부")
synced_at: datetime = Field(..., description="동기화 일시")
class HealthHistoryResponse(BaseModel):
"""건강검진 이력 응답"""
user_info: Dict[str, Any] = Field(..., description="사용자 정보")
checkup_records: List[Dict[str, Any]] = Field(..., description="건강검진 기록")
chart_data: Optional[Dict[str, Any]] = Field(None, description="차트 데이터")
normal_range_reference: Optional[Dict[str, Any]] = Field(None, description="정상치 기준")
class CheckupFileRequest(BaseModel):
"""건강검진 파일 업로드 요청"""
user_id: int = Field(..., description="사용자 ID")
file_name: str = Field(..., description="파일명")
file_type: str = Field(..., description="파일 형식")
file_content: str = Field(..., description="파일 내용")
class FileUploadResponse(BaseModel):
"""파일 업로드 응답"""
file_id: str = Field(..., description="파일 ID")
upload_url: str = Field(..., description="업로드 URL")
status: str = Field(..., description="업로드 상태")
message: str = Field(..., description="응답 메시지")