serializers.py 12 KB

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