production_task.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from pydantic import BaseModel, ConfigDict, Field
  2. from typing import Optional, List
  3. from datetime import datetime
  4. class ProductionTaskCreate(BaseModel):
  5. model_config = ConfigDict(populate_by_name=True)
  6. work_order_id: str
  7. assignee_user_id: Optional[str] = Field(None, alias="assigneeUserId")
  8. task_type: Optional[str] = 'cell_storage'
  9. task_name: Optional[str] = None
  10. route_id: Optional[str] = None
  11. description: Optional[str] = None
  12. remark: Optional[str] = None
  13. class ProductionTaskForwardBody(BaseModel):
  14. model_config = ConfigDict(populate_by_name=True)
  15. to_user_id: str = Field(..., alias="toUserId")
  16. remark: Optional[str] = None
  17. class ProductionTaskAssigneeUpdate(BaseModel):
  18. model_config = ConfigDict(populate_by_name=True)
  19. assignee_user_id: str = Field(..., alias="assigneeUserId")
  20. remark: Optional[str] = None
  21. class ProductionTaskListQuery(BaseModel):
  22. page: int = 1
  23. page_size: int = 20
  24. keyword: Optional[str] = None
  25. work_order_id: Optional[str] = None
  26. task_no: Optional[str] = None
  27. task_status: Optional[str] = None
  28. class ProductionTaskListByWorkOrdersBody(BaseModel):
  29. """按多个工单 ID 批量查询生产任务(POST body,避免 GET URL 过长)"""
  30. model_config = ConfigDict(populate_by_name=True)
  31. work_order_ids: List[str] = Field(..., alias="workOrderIds", min_length=1)
  32. include_step_summary: bool = Field(True, alias="includeStepSummary")
  33. page_size: int = Field(100, alias="pageSize", ge=1, le=500)
  34. class ProductionTaskUpdate(BaseModel):
  35. model_config = ConfigDict(populate_by_name=True)
  36. task_name: Optional[str] = None
  37. description: Optional[str] = None
  38. remark: Optional[str] = None
  39. attachments: Optional[str] = None
  40. equipment_ids: Optional[List[str]] = Field(None, alias="equipmentIds")
  41. class ProductionTaskStatusUpdate(BaseModel):
  42. model_config = ConfigDict(populate_by_name=True)
  43. task_status: str = Field(..., alias="taskStatus")
  44. conclusion: Optional[str] = Field(None, description="生产结论 cg=成功 sb=失败(完成时必填)")
  45. remark: Optional[str] = Field(None, description="备注(完成时可选)")
  46. class TaskStepAdd(BaseModel):
  47. process_id: Optional[str] = None
  48. process_code: Optional[str] = None
  49. category_id: Optional[str] = None
  50. process_name: Optional[str] = None
  51. description: Optional[str] = None
  52. equipment_ids: Optional[List[str]] = Field(None, alias="equipmentIds")
  53. estimated_duration: Optional[str] = None
  54. sop_ids: Optional[str] = None
  55. class TaskStepUpdate(BaseModel):
  56. process_name: Optional[str] = None
  57. description: Optional[str] = None
  58. equipment_ids: Optional[List[str]] = Field(None, alias="equipmentIds")
  59. estimated_duration: Optional[str] = None
  60. actual_duration: Optional[str] = None
  61. sop_ids: Optional[str] = None
  62. step_status: Optional[str] = None
  63. class TaskStepMaterialItem(BaseModel):
  64. model_config = ConfigDict(populate_by_name=True)
  65. material_code: Optional[str] = None
  66. material_name: Optional[str] = None
  67. spec: Optional[str] = None
  68. spec_model: Optional[str] = None
  69. standard_usage: Optional[str] = None
  70. actual_usage: Optional[str] = None
  71. unit: Optional[str] = None
  72. requisition_usage_id: Optional[str] = Field(None, alias="requisitionUsageId")
  73. is_key_material: Optional[str] = '0'
  74. is_required: Optional[str] = '1'
  75. remark: Optional[str] = None
  76. class TaskStepOutputItem(BaseModel):
  77. output_type_id: Optional[str] = None
  78. output_name: Optional[str] = None
  79. output_barcode: Optional[str] = None
  80. remark: Optional[str] = None
  81. class TaskStepDataCollectionItem(BaseModel):
  82. collection_name: Optional[str] = None
  83. unit: Optional[str] = None
  84. collection_value: Optional[str] = None
  85. remark: Optional[str] = None
  86. class TaskInputItem(BaseModel):
  87. model_config = ConfigDict(populate_by_name=True)
  88. input_type: str = Field(..., alias="inputType")
  89. input_id: Optional[str] = Field(None, alias="inputId")
  90. input_code: Optional[str] = Field(None, alias="inputCode")
  91. input_name: Optional[str] = Field(None, alias="inputName")
  92. remark: Optional[str] = None
  93. class TaskOutputItem(BaseModel):
  94. model_config = ConfigDict(populate_by_name=True)
  95. # 关联字段
  96. cell_product_id: Optional[str] = Field(None, alias="cellProductId")
  97. # 细胞产品完整字段
  98. product_code: Optional[str] = Field(None, alias="productCode")
  99. product_name: Optional[str] = Field(None, alias="productName")
  100. product_type_id: Optional[str] = Field(None, alias="productTypeId")
  101. spec_id: Optional[str] = Field(None, alias="specId")
  102. spec_name: Optional[str] = Field(None, alias="specName")
  103. passage: Optional[str] = None
  104. batch_no: Optional[str] = Field(None, alias="batchNo")
  105. storage_slot_id: Optional[str] = Field(None, alias="storageSlotId")
  106. expected_cell_count: Optional[float] = Field(None, alias="expectedCellCount")
  107. viability: Optional[float] = None
  108. freeze_date: Optional[str] = Field(None, alias="freezeDate")
  109. quantity: Optional[float] = None
  110. unit: Optional[str] = None
  111. expiry_date: Optional[str] = Field(None, alias="expiryDate")
  112. product_images: Optional[str] = Field(None, alias="productImages")
  113. product_status: Optional[str] = Field(None, alias="productStatus")
  114. source_type: Optional[str] = Field(None, alias="sourceType")
  115. # 兼容旧字段
  116. output_name: Optional[str] = Field(None, alias="outputName")
  117. output_barcode: Optional[str] = Field(None, alias="outputBarcode")
  118. remark: Optional[str] = None
  119. attachments: Optional[str] = None
  120. class TaskStepReorderBody(BaseModel):
  121. model_config = ConfigDict(populate_by_name=True)
  122. task_id: str = Field(..., alias="taskId")
  123. step_ids: List[str] = Field(..., alias="stepIds")
  124. class ProductionTaskStepDispatchItem(BaseModel):
  125. model_config = ConfigDict(populate_by_name=True)
  126. step_id: str = Field(..., alias="stepId")
  127. assignee_user_ids: List[str] = Field(default_factory=list, alias="assigneeUserIds")
  128. planned_start_time: Optional[str] = Field(None, alias="plannedStartTime")
  129. class ProductionTaskStepDispatchBody(BaseModel):
  130. model_config = ConfigDict(populate_by_name=True)
  131. steps: List[ProductionTaskStepDispatchItem] = Field(..., min_length=1)
  132. class SpawnTemporaryWorkOrderBody(BaseModel):
  133. model_config = ConfigDict(populate_by_name=True)
  134. remark: Optional[str] = None