"""OCR recognition and standard-judgment contracts.""" from datetime import date from typing import Literal from pydantic import Field from app.schemas.common import ApiSchema class OcrField(ApiSchema): value: str | None = None confidence: float | None = Field(default=None, ge=0, le=1) needs_review: bool = True class OcrExtractedFields(ApiSchema): product_name: OcrField = Field(default_factory=OcrField) product_category: OcrField = Field(default_factory=OcrField) supplier: OcrField = Field(default_factory=OcrField) factory: OcrField = Field(default_factory=OcrField) material_type: OcrField = Field(default_factory=OcrField) stage_new: OcrField = Field(default_factory=OcrField) description: OcrField = Field(default_factory=OcrField) defect_level: OcrField = Field(default_factory=OcrField) occurred_on: date | None = None class OcrMeasurement(ApiSchema): item: str raw_value: str value: float | None = None unit: str | None = None confidence: float | None = Field(default=None, ge=0, le=1) needs_review: bool = True class OcrStandardJudgment(ApiSchema): measurement_item: str measured_value: str standard_rule_id: int | None = None risk_point: str | None = None standard_value: str | None = None result: Literal["合格", "不合格", "待人工确认", "未匹配标准"] basis: str | None = None reason: str | None = None class OcrFileResult(ApiSchema): file_id: str file_name: str content_type: str engine: Literal["webimage", "paddle-vl-parser"] raw_text: str confidence: float | None = Field(default=None, ge=0, le=1) page_count: int = Field(default=1, ge=1) fields: OcrExtractedFields measurements: list[OcrMeasurement] = Field(default_factory=list) judgments: list[OcrStandardJudgment] = Field(default_factory=list) warnings: list[str] = Field(default_factory=list) requires_review: bool = True class OcrBatchResult(ApiSchema): files: list[OcrFileResult] fields: OcrExtractedFields measurements: list[OcrMeasurement] = Field(default_factory=list) judgments: list[OcrStandardJudgment] = Field(default_factory=list) requires_review: bool = True class OcrJudgmentRequest(ApiSchema): measurements: list[OcrMeasurement] = Field(min_length=1, max_length=50)