"""Risk item submission and review contracts.""" from datetime import date, datetime from typing import Any from pydantic import Field from app.schemas.common import ApiSchema class RiskItemCreate(ApiSchema): source_type: str = Field(default="表单", min_length=1, max_length=20) source_file_id: str | None = Field(default=None, max_length=50) occurred_on: date | None = None product_name: str = Field(min_length=1, max_length=200) product_category: str | None = Field(default=None, max_length=100) material_type: str | None = Field(default=None, max_length=200) supplier: str | None = Field(default=None, max_length=300) factory: str | None = Field(default=None, max_length=300) stage_new: str | None = Field(default=None, max_length=100) description: str = Field(min_length=5) defect_level: str | None = Field(default=None, max_length=10) solution: str | None = None photos: list[str] = Field(default_factory=list, max_length=10) recognition_confidence: float | None = Field(default=None, ge=0, le=1) ocr_payload: dict[str, Any] = Field(default_factory=dict) class RiskItemUpdate(ApiSchema): product_name: str | None = Field(default=None, min_length=1, max_length=200) product_category: str | None = Field(default=None, max_length=100) material_type: str | None = Field(default=None, max_length=200) occurred_on: date | None = None supplier: str | None = Field(default=None, max_length=300) factory: str | None = Field(default=None, max_length=300) stage_new: str | None = Field(default=None, max_length=100) description: str | None = Field(default=None, min_length=5) defect_level: str | None = Field(default=None, max_length=10) solution: str | None = None photos: list[str] | None = Field(default=None, max_length=10) recognition_confidence: float | None = Field(default=None, ge=0, le=1) ocr_payload: dict[str, Any] | None = None class RiskItemData(ApiSchema): id: int source_type: str source_file_id: str | None occurred_on: date | None product_name: str | None product_category: str | None material_type: str | None supplier: str | None factory: str | None stage_new: str | None description: str | None defect_level: str | None solution: str | None photos: list[str] recognition_confidence: float | None ocr_payload: dict[str, Any] submitted_by: str | None submitted_at: datetime | None status: str created_at: datetime class ReviewActionRequest(ApiSchema): action: str = Field(pattern="^(通过|驳回)$") note: str = Field(min_length=2, max_length=2000) class ReviewRecordData(ApiSchema): id: int risk_item_id: int pre_review_result: str | None pre_review_note: str | None reviewer: str | None review_action: str | None review_note: str | None reviewed_at: datetime | None case_id: int | None