from typing import List, Optional from pydantic import BaseModel, ConfigDict, Field class StorageReleaseReviewListQuery(BaseModel): model_config = ConfigDict(populate_by_name=True) page: int = Field(1, ge=1) pageSize: int = Field(10, ge=1, le=100) keyword: Optional[str] = None receptionSource: Optional[str] = None reviewConclusion: Optional[str] = None reviewSide: Optional[str] = None prodReviewConclusion: Optional[str] = None qcReviewConclusion: Optional[str] = None storageStatus: Optional[str] = None class ReviewSubmitBody(BaseModel): model_config = ConfigDict(populate_by_name=True) reviewSide: str = Field(..., description="production/qc") reviewConclusion: str = Field(..., description="tg/btg") reviewRemark: Optional[str] = None reviewAttachments: Optional[str] = None class BatchReviewBody(BaseModel): model_config = ConfigDict(populate_by_name=True) ids: List[str] = Field(..., min_length=1) reviewSide: str = Field(..., description="production/qc") reviewConclusion: str = Field(..., description="tg/btg") reviewRemark: Optional[str] = None reviewAttachments: Optional[str] = None class BatchStoreBody(BaseModel): model_config = ConfigDict(populate_by_name=True) ids: List[str] = Field(..., min_length=1) class StorageReleaseReviewListItem(BaseModel): model_config = ConfigDict(populate_by_name=True) id: str sampleCode: str receptionSource: str protocolId: Optional[str] = None receptionId: Optional[str] = None protocolNo: Optional[str] = None sampleName: Optional[str] = None reviewConclusion: Optional[str] = None reviewRemark: Optional[str] = None reviewAttachments: Optional[str] = None reviewBy: Optional[str] = None reviewByName: Optional[str] = None reviewTime: Optional[str] = None qcReviewConclusion: Optional[str] = None qcReviewConclusionLabel: Optional[str] = None qcReviewRemark: Optional[str] = None qcReviewAttachments: Optional[str] = None qcReviewBy: Optional[str] = None qcReviewByName: Optional[str] = None qcReviewTime: Optional[str] = None prodReviewConclusion: Optional[str] = None prodReviewConclusionLabel: Optional[str] = None prodReviewRemark: Optional[str] = None prodReviewAttachments: Optional[str] = None prodReviewBy: Optional[str] = None prodReviewByName: Optional[str] = None prodReviewTime: Optional[str] = None storageStatus: str storageBy: Optional[str] = None storageByName: Optional[str] = None storageTime: Optional[str] = None createTime: Optional[str] = None class StorageReleaseReviewDetail(BaseModel): model_config = ConfigDict(populate_by_name=True, extra="allow") review: Optional[dict] = None protocolInfo: Optional[dict] = None transportInfo: Optional[dict] = None receptionInfo: Optional[dict] = None qcInfo: Optional[dict] = None processQcInfoList: Optional[List[dict]] = None productionInfo: Optional[dict] = None