serializers.py 12 KB

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