serializers.py 11 KB

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