2025-12-19 10:12:59 +08:00
|
|
|
|
from datetime import date, datetime
|
|
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
from pydantic.alias_generators import to_camel
|
2026-01-07 01:10:51 +08:00
|
|
|
|
from typing import Optional, List
|
2025-12-19 10:12:59 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2026-01-04 16:16:03 +08:00
|
|
|
|
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)
|
2025-12-19 10:12:59 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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,多个用逗号分隔')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-01-07 01:10:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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='失败的样品信息')
|