serializers.py 19 KB

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