from datetime import date, datetime from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel from typing import Optional, List class WarehouseSampleModel(BaseModel): """ 样品信息模型 """ model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) sample_id: Optional[int] = Field(default=None, description='样品ID') receipt_id: Optional[int] = Field(default=None, description='入库单ID') receipt_no: Optional[str] = Field(default=None, description='入库单号') sample_model: Optional[str] = Field(default=None, description='样品型号') sample_sn: Optional[str] = Field(default=None, description='样品SN号') hardware_version: Optional[str] = Field(default=None, description='样品硬件版本号') external_status: Optional[str] = Field(default=None, description='样品入库外测状态') test_items: Optional[str] = Field(default=None, description='计划测试项') test_deadline: Optional[date] = Field(default=None, description='计划测试截止日期') actual_test_items: Optional[str] = Field(default=None, description='实际测试项') delivery_date: Optional[date] = Field(default=None, description='出库交样日期') delivery_method: Optional[str] = Field(default=None, description='出库交样方式') delivery_person: Optional[str] = Field(default=None, description='出库交样人') receive_person: Optional[str] = Field(default=None, description='出库接样人') delivery_recorder: Optional[str] = Field(default=None, description='出库记录人') status: Optional[str] = Field(default='0', description='状态') remark: Optional[str] = Field(default=None, description='备注') create_by: Optional[str] = Field(default=None, description='创建者') create_time: Optional[datetime] = Field(default=None, description='创建时间') update_by: Optional[str] = Field(default=None, description='更新者') update_time: Optional[datetime] = Field(default=None, description='更新时间') class WarehouseSamplePageQueryModel(BaseModel): """ 样品分页查询模型 """ model_config = ConfigDict(alias_generator=to_camel) receipt_id: Optional[int] = Field(default=None, description='入库单ID') receipt_no: Optional[str] = Field(default=None, description='入库单号') sample_model: Optional[str] = Field(default=None, description='样品型号') sample_sn: Optional[str] = Field(default=None, description='样品SN号') external_status: Optional[str] = Field(default=None, description='样品入库外测状态') status: Optional[str] = Field(default=None, description='状态') page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') @classmethod def as_query(cls, page_num: int = 1, page_size: int = 10, receiptId: Optional[int] = None, receiptNo: Optional[str] = None, sampleModel: Optional[str] = None, sampleSn: Optional[str] = None, externalStatus: Optional[str] = None, status: Optional[str] = None): return cls(pageNum=page_num, pageSize=page_size, receiptId=receiptId, receiptNo=receiptNo, sampleModel=sampleModel, sampleSn=sampleSn, externalStatus=externalStatus, status=status) class AddWarehouseSampleModel(WarehouseSampleModel): """ 新增样品模型 """ receipt_id: int = Field(description='入库单ID') class EditWarehouseSampleModel(WarehouseSampleModel): """ 编辑样品模型 """ sample_id: int = Field(description='样品ID') class DeleteWarehouseSampleModel(BaseModel): """ 删除样品模型 """ model_config = ConfigDict(alias_generator=to_camel) sample_ids: str = Field(description='样品ID,多个用逗号分隔') class GenerateWorkOrderFromSampleModel(BaseModel): """ 从样品生成工单的请求模型 """ model_config = ConfigDict(alias_generator=to_camel) sample_ids: List[int] = Field(description='样品ID列表') test_flow_id: int = Field(description='测试流程ID') work_order_name: Optional[str] = Field(default=None, description='工单名称') memo: Optional[str] = Field(default=None, description='备注') force: Optional[bool] = Field(default=False, description='是否强制生成(忽略样品状态检查)') class FailedSampleInfo(BaseModel): """ 失败的样品信息 """ model_config = ConfigDict(alias_generator=to_camel) sample_id: int = Field(description='样品ID') sample_sn: Optional[str] = Field(default=None, description='样品SN号') reason: str = Field(description='失败原因') class WorkOrderGenerationResponseModel(BaseModel): """ 工单生成响应模型 """ model_config = ConfigDict(alias_generator=to_camel) success_count: int = Field(description='成功数量') failed_count: int = Field(description='失败数量') work_order_ids: List[int] = Field(default_factory=list, description='生成的工单ID列表') failed_samples: List[FailedSampleInfo] = Field(default_factory=list, description='失败的样品信息')