from pydantic import BaseModel, ConfigDict, Field from typing import Optional class OutboundQcDetailApplication(BaseModel): """出库质检查看 - 申请单信息""" model_config = ConfigDict(populate_by_name=True) application_no: Optional[str] = Field(None, alias="applicationNo") application_name: Optional[str] = Field(None, alias="applicationName") application_status: Optional[str] = Field(None, alias="applicationStatus") channel_name: Optional[str] = Field(None, alias="channelName") class OutboundQcDetailPatient(BaseModel): """出库质检查看 - 患者信息""" model_config = ConfigDict(populate_by_name=True) patient_name: Optional[str] = Field(None, alias="patientName") sex: Optional[str] = Field(None) age: Optional[str] = Field(None) phone_no: Optional[str] = Field(None, alias="phoneNo") id_card_no: Optional[str] = Field(None, alias="idCardNo") emergency_contact: Optional[str] = Field(None, alias="emergencyContact") emergency_phone: Optional[str] = Field(None, alias="emergencyPhone") clinical_diagnosis: Optional[str] = Field(None, alias="clinicalDiagnosis") diagnosis_attachments: Optional[str] = Field(None, alias="diagnosisAttachments") class OutboundQcDetailInfusionPlan(BaseModel): """出库质检查看 - 输注方案信息""" model_config = ConfigDict(populate_by_name=True) cell_type: Optional[str] = Field(None, alias="cellType") spec_text: Optional[str] = Field(None, alias="specText") total_course_count: Optional[int] = Field(None, alias="totalCourseCount") course_interval: Optional[str] = Field(None, alias="courseInterval") infusion_route: Optional[str] = Field(None, alias="infusionRoute") infusion_start_date: Optional[str] = Field(None, alias="infusionStartDate") class OutboundQcDetailInfusionSchedule(BaseModel): """出库质检查看 - 输注计划信息""" model_config = ConfigDict(populate_by_name=True) infusion_time: Optional[str] = Field(None, alias="infusionTime") infusion_location: Optional[str] = Field(None, alias="infusionLocation") infusion_method: Optional[str] = Field(None, alias="infusionMethod") schedule_status: Optional[str] = Field(None, alias="scheduleStatus") infusion_status: Optional[str] = Field(None, alias="infusionStatus") qc_status: Optional[str] = Field(None, alias="qcStatus") cancel_reason: Optional[str] = Field(None, alias="cancelReason") class OutboundQcDetailProduct(BaseModel): """出库质检查看 - 产品明细""" model_config = ConfigDict(populate_by_name=True) project_code: Optional[str] = Field(None, alias="projectCode") project_name: Optional[str] = Field(None, alias="projectName") cell_type_name: Optional[str] = Field(None, alias="cellTypeName") spec_text: Optional[str] = Field(None, alias="specText") agreement_price: Optional[float] = Field(None, alias="agreementPrice") actual_price: Optional[float] = Field(None, alias="actualPrice") quantity: Optional[int] = Field(None) product_status: Optional[str] = Field(None, alias="productStatus") class OutboundQcDetailResponse(BaseModel): """出库质检聚合详情""" model_config = ConfigDict(populate_by_name=True) work_order: Optional[dict] = Field(None, alias="workOrder") application: Optional[OutboundQcDetailApplication] = Field(None, alias="application") patient: Optional[OutboundQcDetailPatient] = Field(None, alias="patient") infusion_plan: Optional[OutboundQcDetailInfusionPlan] = Field(None, alias="infusionPlan") infusion_schedule: Optional[OutboundQcDetailInfusionSchedule] = Field(None, alias="infusionSchedule") products: Optional[list[OutboundQcDetailProduct]] = Field(None, alias="products") tasks: Optional[list[dict]] = Field(None, alias="tasks") class QcWorkOrderCreateBody(BaseModel): """手动创建质检工单""" model_config = ConfigDict(populate_by_name=True) work_order_type: Optional[str] = Field("inbound", alias="workOrderType", description="工单类型 inbound/temporary") protocol_no: Optional[str] = Field(None, alias="protocolNo", description="协议号") sample_code: Optional[str] = Field(None, alias="sampleCode", description="样本编码") reception_source: Optional[str] = Field("cell_storage", alias="receptionSource", description="来源类型") qc_biz_type: Optional[str] = Field("inbound", alias="qcBizType", description="质检业务类型") cell_product_id: Optional[str] = Field(None, alias="cellProductId", description="质检对象-细胞产品ID") remark: Optional[str] = Field(None, description="备注") class ProductionQcWorkOrderCreateBody(BaseModel): """生产过程派发质检工单""" model_config = ConfigDict(populate_by_name=True) production_step_output_id: str = Field( ..., alias="productionStepOutputId", description="步骤产出物ID" ) remark: Optional[str] = Field(None, description="备注") class QcWorkOrderUpdateBody(BaseModel): """编辑质检工单(入库/出库可改备注、状态与质检结论;临时可含质检对象)""" model_config = ConfigDict(populate_by_name=True) cell_product_id: Optional[str] = Field(None, alias="cellProductId", description="质检对象-细胞产品ID") work_order_status: Optional[str] = Field(None, alias="workOrderStatus", description="工单状态") qc_conclusion: Optional[str] = Field( None, alias="qcConclusion", description="质检结论 tg合格 btg不合格,空串清空" ) remark: Optional[str] = Field(None, description="备注")