"""产品 Pydantic Schemas""" from __future__ import annotations import uuid from datetime import datetime from pydantic import BaseModel, Field class ProductCreate(BaseModel): """创建产品""" serial_number: str = Field(..., min_length=16, max_length=16, description="产品序列号(16位)") order_id: uuid.UUID = Field(..., description="所属订单ID") material_id: str | None = Field(None, max_length=64, description="物料ID(逻辑外键→老系统)") parent_product_id: uuid.UUID | None = Field(None, description="父产品ID") model_config = {"from_attributes": True} class ProductUpdate(BaseModel): """更新产品""" serial_number: str | None = Field(None, min_length=16, max_length=16) material_id: str | None = Field(None, max_length=64) status: str | None = Field(None, max_length=50, description="产品状态") parent_product_id: uuid.UUID | None = Field(None) model_config = {"from_attributes": True} class ProductResponse(BaseModel): """产品响应""" id: uuid.UUID serial_number: str order_id: uuid.UUID material_id: str | None parent_product_id: uuid.UUID | None current_location_id: str | None = None status: str created_at: datetime model_config = {"from_attributes": True} class ProductScanResponse(BaseModel): """扫码查询响应 — 产品信息 + 完整任务树(递归嵌套)""" id: uuid.UUID serial_number: str order_id: uuid.UUID order_no: str = "" material_id: str | None parent_product_id: uuid.UUID | None current_location_id: str | None = None status: str created_at: datetime top_level_tasks: list[TaskSummaryResponse] = [] task_tree: list[TaskResponse] = [] model_config = {"from_attributes": True} # 延迟导入,避免循环引用 — TaskSummaryResponse 在 tasks.py 中定义 from app.schemas.task import TaskSummaryResponse # noqa: E402 ProductScanResponse.model_rebuild()