serializers.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. from rest_framework import serializers
  2. from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel,TaskModel,ContainerWCSModel
  3. from bound.models import BoundBatchModel,BoundDetailModel
  4. from utils import datasolve
  5. class WCSTaskGetSerializer(serializers.ModelSerializer):
  6. class Meta:
  7. # 指定模型和排除字段
  8. model = ContainerWCSModel
  9. fields= '__all__'
  10. read_only_fields = ['id']
  11. class ContainerListGetSerializer(serializers.ModelSerializer):
  12. # 定义主单列表的序列化器,用于获取操作,字段只读
  13. container_code = serializers.IntegerField(read_only=True, required=False)
  14. current_location = serializers.CharField(read_only=True, required=False)
  15. target_location = serializers.CharField(read_only=True, required=False)
  16. status = serializers.IntegerField(read_only=True, required=False)
  17. last_operation = serializers.DateTimeField(read_only=True, format='%Y-%m-%d', required=False)
  18. class Meta:
  19. # 指定模型和排除字段
  20. model = ContainerListModel
  21. fields= '__all__'
  22. read_only_fields = ['id']
  23. class ContainerListPostSerializer(serializers.ModelSerializer):
  24. # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
  25. container_code = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  26. current_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  27. target_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  28. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  29. last_operation = serializers.DateTimeField(read_only=False, format='%Y-%m-%d', required=False, validators=[datasolve.data_validate])
  30. class Meta:
  31. # 指定模型和排除字段
  32. model = ContainerListModel
  33. fields= '__all__'
  34. read_only_fields = ['id' ]
  35. class ContainerDetailGetSerializer(serializers.ModelSerializer):
  36. # 定义明细单列表的序列化器,用于获取操作,字段只读
  37. month = serializers.IntegerField(read_only=True, required=False)
  38. container = serializers.SerializerMethodField()
  39. batch = serializers.SerializerMethodField()
  40. goods_code = serializers.CharField(read_only=True, required=False)
  41. goods_desc = serializers.CharField(read_only=True, required=False)
  42. goods_qty = serializers.IntegerField(read_only=True, required=False)
  43. goods_weight = serializers.DecimalField(read_only=True, required=False, max_digits=10, decimal_places=2)
  44. goods_class = serializers.IntegerField(read_only=True, required=False)
  45. status = serializers.IntegerField(read_only=True, required=False)
  46. creater = serializers.CharField(read_only=True, required=False)
  47. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
  48. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
  49. def get_container(self, obj):
  50. """ 动态序列化关联的主单数据 """
  51. from .serializers import ContainerListGetSerializer
  52. return ContainerListGetSerializer(obj.container).data
  53. def get_batch(self, obj):
  54. """ 动态序列化关联的批次数据 """
  55. from bound.serializers import BoundBatchGetSerializer
  56. return BoundBatchGetSerializer(obj.batch).data
  57. class Meta:
  58. # 指定模型和排除字段
  59. model = ContainerDetailModel
  60. exclude = ['id', 'is_delete', ]
  61. read_only_fields = ['id']
  62. class ContainerDetailPostSerializer(serializers.ModelSerializer):
  63. # 定义明细单列表的序列化器,用于创建操作,允许部分字段写入
  64. month = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  65. container = serializers.PrimaryKeyRelatedField(queryset=ContainerListModel.objects.all(),
  66. help_text='关联的主单',
  67. error_messages = {
  68. 'null': '请选择关联的主单',
  69. 'does_not_exist': '关联的主单不存在',
  70. 'incorrect_type': '关联的主单格式错误'
  71. },
  72. required=False, validators=[datasolve.data_validate])
  73. batch = serializers.PrimaryKeyRelatedField(queryset=BoundBatchModel.objects.all(),
  74. help_text='关联的批次',
  75. error_messages = {
  76. 'does_not_exist': '关联的批次不存在',
  77. 'incorrect_type': '关联的批次格式错误'
  78. },
  79. required=False, validators=[datasolve.data_validate])
  80. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  81. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  82. goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  83. goods_weight = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=2, validators=[datasolve.data_validate])
  84. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  85. creater = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  86. create_time = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=False, validators=[datasolve.data_validate])
  87. update_time = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=False, validators=[datasolve.data_validate])
  88. class Meta:
  89. # 指定模型和排除字段
  90. model = ContainerDetailModel
  91. fields= '__all__'
  92. read_only_fields = ['id']
  93. class ContainerOperationGetSerializer(serializers.ModelSerializer):
  94. # 定义操作记录的序列化器,用于获取操作,字段只读
  95. month = serializers.IntegerField(read_only=True, required=False)
  96. container = serializers.SerializerMethodField()
  97. operation_type = serializers.CharField(read_only=True, required=False)
  98. batch = serializers.SerializerMethodField()
  99. goods_code = serializers.CharField(read_only=True, required=False)
  100. goods_desc = serializers.CharField(read_only=True, required=False)
  101. goods_qty = serializers.IntegerField(read_only=True, required=False)
  102. goods_weight = serializers.DecimalField(read_only=True, required=False, max_digits=10, decimal_places=2)
  103. operator = serializers.CharField(read_only=True, required=False)
  104. timestamp = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
  105. from_location = serializers.CharField(read_only=True, required=False)
  106. to_location = serializers.CharField(read_only=True, required=False)
  107. memo = serializers.CharField(read_only=True, required=False)
  108. def get_container(self, obj):
  109. """ 动态序列化关联的主单数据 """
  110. from .serializers import ContainerListGetSerializer
  111. return ContainerListGetSerializer(obj.container).data
  112. def get_batch(self, obj):
  113. """ 动态序列化关联的批次数据 """
  114. from bound.serializers import BoundBatchGetSerializer
  115. return BoundBatchGetSerializer(obj.batch).data
  116. class Meta:
  117. # 指定模型和排除字段
  118. model = ContainerOperationModel
  119. fields= '__all__'
  120. read_only_fields = ['id']
  121. class ContainerOperationPostSerializer(serializers.ModelSerializer):
  122. # 定义操作记录的序列化器,用于创建操作,允许部分字段写入
  123. month = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  124. container = serializers.PrimaryKeyRelatedField(queryset=ContainerListModel.objects.all(),
  125. help_text='关联的主单',
  126. error_messages = {
  127. 'null': '请选择关联的主单',
  128. 'does_not_exist': '关联的主单不存在',
  129. 'incorrect_type': '关联的主单格式错误'
  130. },
  131. required=True, validators=[datasolve.data_validate])
  132. operation_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  133. batch = serializers.PrimaryKeyRelatedField(queryset=BoundBatchModel.objects.all(),
  134. help_text='关联的批次',
  135. error_messages = {
  136. 'null': '请选择关联的批次',
  137. 'does_not_exist': '关联的批次不存在',
  138. 'incorrect_type': '关联的批次格式错误'
  139. },
  140. required=False, validators=[datasolve.data_validate])
  141. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  142. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  143. goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  144. goods_weight = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=2, validators=[datasolve.data_validate])
  145. operator = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  146. timestamp = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=True, validators=[datasolve.data_validate])
  147. from_location = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  148. to_location = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  149. memo = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  150. class Meta:
  151. # 指定模型和排除字段
  152. model = ContainerOperationModel
  153. fields= '__all__'
  154. read_only_fields = ['id']
  155. class TaskGetSerializer(serializers.ModelSerializer):
  156. # 定义任务记录的序列化器,用于获取操作,字段只读
  157. task_wcs = serializers.SerializerMethodField()
  158. container_detail = serializers.SerializerMethodField()
  159. batch_detail = serializers.SerializerMethodField()
  160. def get_task_wcs(self, obj):
  161. """ 动态序列化关联的WCS任务数据 """
  162. from .models import ContainerWCSModel
  163. return ContainerWCSModel.objects.filter(id=obj.task_wcs_id).first().to_dict()
  164. def get_container_detail(self, obj):
  165. """ 动态序列化关联的主单数据 """
  166. from .serializers import ContainerDetailGetSerializer
  167. return ContainerDetailGetSerializer(obj.container_detail).data
  168. def get_batch_detail(self, obj):
  169. """ 动态序列化关联的批次数据 """
  170. from bound.serializers import BoundDetailGetSerializer
  171. return BoundDetailGetSerializer(obj.batch_detail).data
  172. class Meta:
  173. # 指定模型和排除字段
  174. model = TaskModel
  175. fields= '__all__'
  176. read_only_fields = ['id']
  177. class TaskPostSerializer(serializers.ModelSerializer):
  178. # 定义任务记录的序列化器,用于获取操作,字段只读
  179. task_wcs = serializers.PrimaryKeyRelatedField(queryset=ContainerWCSModel.objects.all(),
  180. help_text='关联的WCS任务',
  181. error_messages = {
  182. 'null': '请选择关联的WCS任务',
  183. 'does_not_exist': '关联的WCS任务不存在',
  184. 'incorrect_type': '关联的WCS任务格式错误'
  185. },
  186. required=False, validators=[datasolve.data_validate])
  187. bound_detail = serializers.PrimaryKeyRelatedField(queryset=BoundDetailModel.objects.all(),
  188. help_text='关联的明细单',
  189. error_messages = {
  190. 'null': '请选择关联的明细单',
  191. 'does_not_exist': '关联的明细单不存在',
  192. 'incorrect_type': '关联的明细单格式错误'
  193. },
  194. required=False, validators=[datasolve.data_validate])
  195. class Meta:
  196. # 指定模型和排除字段
  197. model = TaskModel
  198. fields= '__all__'
  199. read_only_fields = ['id']