from datetime import datetime, timezone from typing import Optional from beanie import Document, PydanticObjectId from pydantic import BaseModel, Field class DataItem(BaseModel): """单个检查指标""" name: str value: str unit: str = "" reference_range: str = "" status: str = "normal" # normal / high / low category: str = "" # 血液检查 / 激素水平 / 尿常规 etc. class Report(Document): user_id: PydanticObjectId report_type: str = "" # 血常规 / B超 / 尿常规 etc. pregnancy_week: Optional[int] = None report_date: Optional[str] = None # 报告日期 YYYY-MM-DD # Images image_urls: list[str] = Field(default_factory=list) # OCR results ocr_raw_text: Optional[str] = None data_items: list[DataItem] = Field(default_factory=list) # User additions symptoms: Optional[list[str]] = None # 自觉症状 notes: Optional[str] = None # 备注 # Privacy fields (auto-masked) patient_name: Optional[str] = None patient_id_masked: Optional[str] = None # Status status: str = "pending" # pending / verified / analyzed overall_status: str = "normal" # normal / attention / warning created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class Settings: name = "reports" indexes = [ "user_id", ]