production_task.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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. model_config = ConfigDict(populate_by_name=True)
  48. process_id: Optional[str] = None
  49. process_code: Optional[str] = None
  50. category_id: Optional[str] = None
  51. process_name: Optional[str] = None
  52. description: Optional[str] = None
  53. equipment_ids: Optional[List[str]] = Field(None, alias="equipmentIds")
  54. estimated_duration: Optional[str] = None
  55. sop_ids: Optional[str] = None
  56. sop_content: Optional[str] = Field(None, alias="sopContent")
  57. class TaskStepUpdate(BaseModel):
  58. model_config = ConfigDict(populate_by_name=True)
  59. process_name: Optional[str] = None
  60. description: Optional[str] = None
  61. equipment_ids: Optional[List[str]] = Field(None, alias="equipmentIds")
  62. estimated_duration: Optional[str] = None
  63. actual_duration: Optional[str] = None
  64. sop_ids: Optional[str] = None
  65. sop_content: Optional[str] = Field(None, alias="sopContent")
  66. step_status: Optional[str] = None
  67. class TaskStepMaterialItem(BaseModel):
  68. model_config = ConfigDict(populate_by_name=True)
  69. material_code: Optional[str] = None
  70. material_name: Optional[str] = None
  71. spec: Optional[str] = None
  72. spec_model: Optional[str] = None
  73. standard_usage: Optional[str] = None
  74. actual_usage: Optional[str] = None
  75. unit: Optional[str] = None
  76. requisition_usage_id: Optional[str] = Field(None, alias="requisitionUsageId")
  77. is_key_material: Optional[str] = '0'
  78. is_required: Optional[str] = '1'
  79. remark: Optional[str] = None
  80. class TaskStepOutputItem(BaseModel):
  81. output_type_id: Optional[str] = None
  82. output_name: Optional[str] = None
  83. output_barcode: Optional[str] = None
  84. remark: Optional[str] = None
  85. class TaskStepDataCollectionItem(BaseModel):
  86. collection_name: Optional[str] = None
  87. unit: Optional[str] = None
  88. collection_value: Optional[str] = None
  89. remark: Optional[str] = None
  90. class TaskInputItem(BaseModel):
  91. model_config = ConfigDict(populate_by_name=True)
  92. input_type: str = Field(..., alias="inputType")
  93. input_id: Optional[str] = Field(None, alias="inputId")
  94. input_code: Optional[str] = Field(None, alias="inputCode")
  95. input_name: Optional[str] = Field(None, alias="inputName")
  96. remark: Optional[str] = None
  97. class TaskOutputItem(BaseModel):
  98. model_config = ConfigDict(populate_by_name=True)
  99. # 关联字段
  100. cell_product_id: Optional[str] = Field(None, alias="cellProductId")
  101. # 细胞产品完整字段
  102. product_code: Optional[str] = Field(None, alias="productCode")
  103. product_name: Optional[str] = Field(None, alias="productName")
  104. product_type_id: Optional[str] = Field(None, alias="productTypeId")
  105. spec_id: Optional[str] = Field(None, alias="specId")
  106. spec_name: Optional[str] = Field(None, alias="specName")
  107. passage: Optional[str] = None
  108. batch_no: Optional[str] = Field(None, alias="batchNo")
  109. storage_slot_id: Optional[str] = Field(None, alias="storageSlotId")
  110. expected_cell_count: Optional[float] = Field(None, alias="expectedCellCount")
  111. viability: Optional[float] = None
  112. freeze_date: Optional[str] = Field(None, alias="freezeDate")
  113. quantity: Optional[float] = None
  114. unit: Optional[str] = None
  115. expiry_date: Optional[str] = Field(None, alias="expiryDate")
  116. product_images: Optional[str] = Field(None, alias="productImages")
  117. product_status: Optional[str] = Field(None, alias="productStatus")
  118. source_type: Optional[str] = Field(None, alias="sourceType")
  119. # 兼容旧字段
  120. output_name: Optional[str] = Field(None, alias="outputName")
  121. output_barcode: Optional[str] = Field(None, alias="outputBarcode")
  122. remark: Optional[str] = None
  123. attachments: Optional[str] = None
  124. class TaskStepReorderBody(BaseModel):
  125. model_config = ConfigDict(populate_by_name=True)
  126. task_id: str = Field(..., alias="taskId")
  127. step_ids: List[str] = Field(..., alias="stepIds")
  128. class ProductionTaskStepDispatchItem(BaseModel):
  129. model_config = ConfigDict(populate_by_name=True)
  130. step_id: str = Field(..., alias="stepId")
  131. assignee_user_ids: List[str] = Field(default_factory=list, alias="assigneeUserIds")
  132. planned_start_time: Optional[str] = Field(None, alias="plannedStartTime")
  133. class ProductionTaskStepDispatchBody(BaseModel):
  134. model_config = ConfigDict(populate_by_name=True)
  135. steps: List[ProductionTaskStepDispatchItem] = Field(..., min_length=1)
  136. class SpawnTemporaryWorkOrderBody(BaseModel):
  137. model_config = ConfigDict(populate_by_name=True)
  138. remark: Optional[str] = None