serializers.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. from rest_framework import serializers
  2. from .models import ContainerListModel,ContainerDetailModel,ContainerOperationModel,TaskModel,ContainerWCSModel,out_batch_detail,ContainerDetailLogModel
  3. from bound.models import BoundBatchModel,BoundDetailModel
  4. from utils import datasolve
  5. from decimal import Decimal
  6. class WCSTaskGetSerializer(serializers.ModelSerializer):
  7. class Meta:
  8. # 指定模型和排除字段
  9. model = ContainerWCSModel
  10. fields= '__all__'
  11. read_only_fields = ['id']
  12. class ContainerDetailLogSerializer(serializers.ModelSerializer):
  13. batch = serializers.SerializerMethodField()
  14. container_code = serializers.SerializerMethodField()
  15. goods_code = serializers.SerializerMethodField()
  16. goods_desc = serializers.SerializerMethodField()
  17. detail_goods_qty = serializers.SerializerMethodField()
  18. goods_qty = serializers.SerializerMethodField()
  19. goods_out_qty = serializers.SerializerMethodField()
  20. batch_goods_qty = serializers.SerializerMethodField() #计划入库数量
  21. batch_goods_in_qty = serializers.SerializerMethodField() #实际入库数量
  22. batch_goods_in_location_qty = serializers.SerializerMethodField() #实际在库数量
  23. batch_goods_out_qty = serializers.SerializerMethodField()
  24. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', required=False)
  25. class Meta:
  26. # 指定模型和排除字段
  27. model = ContainerDetailLogModel
  28. fields= '__all__'
  29. read_only_fields = ['id']
  30. def get_batch(self, obj):
  31. """ 动态序列化关联的批次数据 """
  32. return obj.container_detail.batch.bound_number if obj.container_detail.batch else 'N/A'
  33. def get_container_code(self, obj):
  34. return obj.container_detail.container.container_code if obj.container_detail.container.container_code else 'N/A'
  35. def get_goods_code(self, obj):
  36. return obj.container_detail.goods_code if obj.container_detail.goods_code else 'N/A'
  37. def get_goods_desc(self, obj):
  38. return obj.container_detail.goods_desc if obj.container_detail.goods_desc else 'N/A'
  39. # 获取托盘最小单元detail的入库数量
  40. def get_detail_goods_qty(self, obj):
  41. return obj.container_detail.goods_qty if obj.container_detail.goods_qty else Decimal('0')
  42. # 获取托盘最小单元detail的 入库操作数量
  43. def get_goods_qty(self, obj):
  44. new_goods_qty = obj.new_goods_qty if obj.new_goods_qty else Decimal('0')
  45. old_goods_qty = obj.old_goods_qty if obj.old_goods_qty else Decimal('0')
  46. goods_qty = new_goods_qty - old_goods_qty
  47. return goods_qty if goods_qty else Decimal('0')
  48. # 获取托盘最小单元detail的 出库操作数量
  49. def get_goods_out_qty(self, obj):
  50. new_goods_out_qty = obj.new_goods_out_qty if obj.new_goods_out_qty else Decimal('0')
  51. old_goods_out_qty = obj.old_goods_out_qty if obj.old_goods_out_qty else Decimal('0')
  52. goods_out_qty = new_goods_out_qty - old_goods_out_qty
  53. return goods_out_qty if goods_out_qty else Decimal('0')
  54. # 获取批次的计划入库数量
  55. def get_batch_goods_qty(self, obj):
  56. return obj.container_detail.batch.goods_qty if obj.container_detail.batch.goods_qty else Decimal('0')
  57. # 获取批次的实际入库数量
  58. def get_batch_goods_in_qty(self, obj):
  59. return obj.container_detail.batch.goods_in_qty if obj.container_detail.batch.goods_in_qty else Decimal('0')
  60. # 获取批次的实际在库数量
  61. def get_batch_goods_in_location_qty(self, obj):
  62. return obj.container_detail.batch.goods_in_location_qty if obj.container_detail.batch.goods_in_location_qty else Decimal('0')
  63. # 获取批次的出库数量
  64. def get_batch_goods_out_qty(self, obj):
  65. return obj.container_detail.batch.goods_out_qty if obj.container_detail.batch.goods_out_qty else Decimal('0')
  66. class ContainerListGetSerializer(serializers.ModelSerializer):
  67. # 定义主单列表的序列化器,用于获取操作,字段只读
  68. container_code = serializers.IntegerField(read_only=True, required=False)
  69. current_location = serializers.CharField(read_only=True, required=False)
  70. target_location = serializers.CharField(read_only=True, required=False)
  71. status = serializers.IntegerField(read_only=True, required=False)
  72. last_operation = serializers.DateTimeField(read_only=True, format='%Y-%m-%d', required=False)
  73. class Meta:
  74. # 指定模型和排除字段
  75. model = ContainerListModel
  76. fields= '__all__'
  77. read_only_fields = ['id']
  78. class ContainerListPostSerializer(serializers.ModelSerializer):
  79. # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
  80. container_code = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  81. current_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  82. target_location = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  83. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  84. last_operation = serializers.DateTimeField(read_only=False, format='%Y-%m-%d', required=False, validators=[datasolve.data_validate])
  85. class Meta:
  86. # 指定模型和排除字段
  87. model = ContainerListModel
  88. fields= '__all__'
  89. read_only_fields = ['id' ]
  90. class ContainerDetailSimpleGetSerializer(serializers.ModelSerializer):
  91. batch = serializers.SerializerMethodField()
  92. class Meta:
  93. # 指定模型和排除字段
  94. model = ContainerDetailModel
  95. fields= '__all__'
  96. read_only_fields = ['id']
  97. def get_batch(self, obj):
  98. """ 动态序列化关联的批次数据 """
  99. from bound.models import BoundBatchModel
  100. return BoundBatchModel.objects.get(id=obj.batch_id).bound_number
  101. class ContainerDetailGetSerializer(serializers.ModelSerializer):
  102. # 定义明细单列表的序列化器,用于获取操作,字段只读
  103. month = serializers.IntegerField(read_only=True, required=False)
  104. container = serializers.SerializerMethodField()
  105. batch = serializers.SerializerMethodField()
  106. goods_code = serializers.CharField(read_only=True, required=False)
  107. goods_desc = serializers.CharField(read_only=True, required=False)
  108. goods_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3)
  109. goods_weight = serializers.DecimalField(read_only=True, required=False, max_digits=10, decimal_places=2)
  110. goods_class = serializers.IntegerField(read_only=True, required=False)
  111. status = serializers.IntegerField(read_only=True, required=False)
  112. creater = serializers.CharField(read_only=True, required=False)
  113. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
  114. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
  115. def get_container(self, obj):
  116. """ 动态序列化关联的主单数据 """
  117. from .serializers import ContainerListGetSerializer
  118. return ContainerListGetSerializer(obj.container).data
  119. def get_batch(self, obj):
  120. """ 动态序列化关联的批次数据 """
  121. from bound.serializers import BoundBatchGetSerializer
  122. return BoundBatchGetSerializer(obj.batch).data
  123. class Meta:
  124. # 指定模型和排除字段
  125. model = ContainerDetailModel
  126. exclude = ['id', 'is_delete', ]
  127. read_only_fields = ['id']
  128. class ContainerDetailPostSerializer(serializers.ModelSerializer):
  129. # 定义明细单列表的序列化器,用于创建操作,允许部分字段写入
  130. month = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  131. container = serializers.PrimaryKeyRelatedField(queryset=ContainerListModel.objects.all(),
  132. help_text='关联的主单',
  133. error_messages = {
  134. 'null': '请选择关联的主单',
  135. 'does_not_exist': '关联的主单不存在',
  136. 'incorrect_type': '关联的主单格式错误'
  137. },
  138. required=False, validators=[datasolve.data_validate])
  139. batch = serializers.PrimaryKeyRelatedField(queryset=BoundBatchModel.objects.all(),
  140. help_text='关联的批次',
  141. error_messages = {
  142. 'does_not_exist': '关联的批次不存在',
  143. 'incorrect_type': '关联的批次格式错误'
  144. },
  145. required=False, validators=[datasolve.data_validate])
  146. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  147. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  148. goods_qty = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=3,validators=[datasolve.data_validate])
  149. goods_weight = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=2, validators=[datasolve.data_validate])
  150. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  151. creater = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  152. create_time = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=False, validators=[datasolve.data_validate])
  153. update_time = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=False, validators=[datasolve.data_validate])
  154. class Meta:
  155. # 指定模型和排除字段
  156. model = ContainerDetailModel
  157. fields= '__all__'
  158. read_only_fields = ['id']
  159. class ContainerOperationGetSerializer(serializers.ModelSerializer):
  160. # 定义操作记录的序列化器,用于获取操作,字段只读
  161. month = serializers.IntegerField(read_only=True, required=False)
  162. container = serializers.SerializerMethodField()
  163. operation_type = serializers.CharField(read_only=True, required=False)
  164. batch = serializers.SerializerMethodField()
  165. goods_code = serializers.CharField(read_only=True, required=False)
  166. goods_desc = serializers.CharField(read_only=True, required=False)
  167. goods_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3)
  168. goods_weight = serializers.DecimalField(read_only=True, required=False, max_digits=10, decimal_places=2)
  169. operator = serializers.CharField(read_only=True, required=False)
  170. timestamp = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M', required=False)
  171. from_location = serializers.CharField(read_only=True, required=False)
  172. to_location = serializers.CharField(read_only=True, required=False)
  173. memo = serializers.CharField(read_only=True, required=False)
  174. def get_container(self, obj):
  175. """ 动态序列化关联的主单数据 """
  176. from .serializers import ContainerListGetSerializer
  177. return ContainerListGetSerializer(obj.container).data
  178. def get_batch(self, obj):
  179. """ 动态序列化关联的批次数据 """
  180. from bound.serializers import BoundBatchGetSerializer
  181. return BoundBatchGetSerializer(obj.batch).data
  182. class Meta:
  183. # 指定模型和排除字段
  184. model = ContainerOperationModel
  185. fields= '__all__'
  186. read_only_fields = ['id']
  187. class ContainerOperationPostSerializer(serializers.ModelSerializer):
  188. # 定义操作记录的序列化器,用于创建操作,允许部分字段写入
  189. month = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  190. container = serializers.PrimaryKeyRelatedField(queryset=ContainerListModel.objects.all(),
  191. help_text='关联的主单',
  192. error_messages = {
  193. 'null': '请选择关联的主单',
  194. 'does_not_exist': '关联的主单不存在',
  195. 'incorrect_type': '关联的主单格式错误'
  196. },
  197. required=True, validators=[datasolve.data_validate])
  198. operation_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  199. batch = serializers.PrimaryKeyRelatedField(queryset=BoundBatchModel.objects.all(),
  200. help_text='关联的批次',
  201. error_messages = {
  202. 'null': '请选择关联的批次',
  203. 'does_not_exist': '关联的批次不存在',
  204. 'incorrect_type': '关联的批次格式错误'
  205. },
  206. required=False, validators=[datasolve.data_validate])
  207. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  208. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  209. goods_qty = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=3,validators=[datasolve.data_validate])
  210. goods_weight = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=2, validators=[datasolve.data_validate])
  211. operator = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  212. timestamp = serializers.DateTimeField(read_only=False, format='%Y-%m-%d %H:%M', required=True, validators=[datasolve.data_validate])
  213. from_location = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  214. to_location = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  215. memo = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  216. class Meta:
  217. # 指定模型和排除字段
  218. model = ContainerOperationModel
  219. fields= '__all__'
  220. read_only_fields = ['id']
  221. class TaskGetSerializer(serializers.ModelSerializer):
  222. # 定义任务记录的序列化器,用于获取操作,字段只读
  223. task_wcs = serializers.SerializerMethodField()
  224. container_detail = serializers.SerializerMethodField()
  225. batch_detail = serializers.SerializerMethodField()
  226. def get_task_wcs(self, obj):
  227. """ 动态序列化关联的WCS任务数据 """
  228. from .models import ContainerWCSModel
  229. return ContainerWCSModel.objects.filter(id=obj.task_wcs_id).first().to_dict()
  230. def get_container_detail(self, obj):
  231. """ 动态序列化关联的主单数据 """
  232. from .serializers import ContainerDetailGetSerializer
  233. return ContainerDetailGetSerializer(obj.container_detail).data
  234. def get_batch_detail(self, obj):
  235. """ 动态序列化关联的批次数据 """
  236. from bound.serializers import BoundDetailGetSerializer
  237. return BoundDetailGetSerializer(obj.batch_detail).data
  238. class Meta:
  239. # 指定模型和排除字段
  240. model = TaskModel
  241. fields= '__all__'
  242. read_only_fields = ['id']
  243. class TaskPostSerializer(serializers.ModelSerializer):
  244. # 定义任务记录的序列化器,用于获取操作,字段只读
  245. task_wcs = serializers.PrimaryKeyRelatedField(queryset=ContainerWCSModel.objects.all(),
  246. help_text='关联的WCS任务',
  247. error_messages = {
  248. 'null': '请选择关联的WCS任务',
  249. 'does_not_exist': '关联的WCS任务不存在',
  250. 'incorrect_type': '关联的WCS任务格式错误'
  251. },
  252. required=False, validators=[datasolve.data_validate])
  253. bound_detail = serializers.PrimaryKeyRelatedField(queryset=BoundDetailModel.objects.all(),
  254. help_text='关联的明细单',
  255. error_messages = {
  256. 'null': '请选择关联的明细单',
  257. 'does_not_exist': '关联的明细单不存在',
  258. 'incorrect_type': '关联的明细单格式错误'
  259. },
  260. required=False, validators=[datasolve.data_validate])
  261. class Meta:
  262. # 指定模型和排除字段
  263. model = TaskModel
  264. fields= '__all__'
  265. read_only_fields = ['id']
  266. # serializers.py
  267. class OutBoundDetailSerializer(serializers.ModelSerializer):
  268. """列表用简略序列化器"""
  269. class Meta:
  270. model = out_batch_detail
  271. fields = ['id', 'out_bound', 'container', 'working']
  272. class OutBoundFullDetailSerializer(serializers.ModelSerializer):
  273. container_code = serializers.CharField(source='container.container_code', read_only=True)
  274. batch = serializers.CharField(source='container_detail.batch.bound_number', read_only=True)
  275. goods_code = serializers.CharField(source='container_detail.goods_code', read_only=True)
  276. goods_desc = serializers.CharField(source='container_detail.goods_desc', read_only=True)
  277. goods_qty = serializers.DecimalField(source='container_detail.goods_qty', read_only=True,max_digits=10, decimal_places=3)
  278. class Meta:
  279. model = out_batch_detail
  280. fields = '__all__'
  281. read_only_fields = ['id', 'out_bound', 'container', 'container_detail', 'working']