serializers.py 18 KB

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