"""API 请求模型""" from pydantic import BaseModel, Field from typing import Optional from datetime import datetime class CollectionCreate(BaseModel): """创建藏品请求""" name: str = Field(..., description="藏品名称", min_length=1, max_length=255) category: Optional[str] = Field(None, description="品类(龙钞/蛇钞/马钞等)") serial_number: Optional[str] = Field(None, description="号码(唯一标识)", max_length=100) rarity: str = Field("通货", description="珍惜度(通货/标十/标百/狮子号)") ownership_type: str = Field("自持", description="持仓类型(自持/代存)") is_graded: bool = Field(False, description="是否评级") grading_company: Optional[str] = Field(None, description="评级公司(PCGS/NGC/爱藏)") grading_score: Optional[str] = Field(None, description="评级分数(如68/69/70)") cost_price: Optional[float] = Field(None, description="成本价(元)") current_price: Optional[float] = Field(None, description="当前市场价(元)") status: str = Field("in_collection", description="状态(in_collection/sold/lost)") remark: Optional[str] = Field(None, description="备注") class CollectionUpdate(BaseModel): """更新藏品请求""" name: Optional[str] = Field(None, description="藏品名称") category: Optional[str] = Field(None, description="品类") serial_number: Optional[str] = Field(None, description="号码") rarity: Optional[str] = Field(None, description="珍惜度") ownership_type: Optional[str] = Field(None, description="持仓类型") is_graded: Optional[bool] = Field(None, description="是否评级") grading_company: Optional[str] = Field(None, description="评级公司") grading_score: Optional[str] = Field(None, description="评级分数") cost_price: Optional[float] = Field(None, description="成本价") current_price: Optional[float] = Field(None, description="当前市场价") status: Optional[str] = Field(None, description="状态") remark: Optional[str] = Field(None, description="备注") class PriceQuery(BaseModel): """价格查询参数""" collection_id: Optional[int] = Field(None, description="藏品ID") source: Optional[str] = Field(None, description="数据来源(yichens/aicang/douyin)") start_date: Optional[datetime] = Field(None, description="开始时间") end_date: Optional[datetime] = Field(None, description="结束时间") page: int = Field(1, ge=1, description="页码") page_size: int = Field(20, ge=1, le=100, description="每页数量")