serializers.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. #coding=utf-8
  2. from rest_framework import serializers
  3. from apps.base import Formater
  4. from apps.exceptions import CustomError
  5. from apps.foundation.models import BizLog
  6. from apps.goods.models import GoodsGodownEntryDetail
  7. from apps.purchase.models import GodownEntryDetail
  8. from apps.serializer_errors import dump_serializer_errors
  9. from apps.warehouse.biz import BizWarehouse
  10. from apps.warehouse.models import WarehouseStock, InventoryDetail
  11. from models import SaleOrder, SaleOrderDetail, GoodsDeliver, GoodsDeliverDetail, GoodsDeliverReturn, \
  12. GoodsDeliverReturnDetail
  13. from libs.booleancharfield import BooleanCharField, PriceShowCharField
  14. from apps import base
  15. from libs.booleancharfield import CountShowCharField, PriceShowCharField, AmountShowCharField
  16. class SaleOrderSerializer(serializers.ModelSerializer):
  17. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  18. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  19. check_status_text = serializers.CharField(source='get_status_display', read_only=True)
  20. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  21. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  22. customer_name = serializers.CharField(source='customer.name', read_only=True)
  23. customer_id = serializers.CharField(source='customer.id', read_only=True)
  24. customer_tel = serializers.CharField(source='customer.mobile', read_only=True)
  25. products = serializers.SerializerMethodField()
  26. count = CountShowCharField(read_only=True)
  27. amount = AmountShowCharField(read_only=True)
  28. class Meta:
  29. model = SaleOrder
  30. fields = '__all__'
  31. def get_products(self, obj):
  32. data = []
  33. rows = SaleOrderDetail.objects.filter(main=obj)
  34. data.extend([s[0] for s in rows.values_list('goods__product_base__name')])
  35. return ','.join(data)
  36. @staticmethod
  37. def factory(user, data,id=None):
  38. if id:
  39. instance = SaleOrder.getById(id)
  40. else:
  41. instance = None
  42. serializer = SaleOrderSerializer(instance, data=data)
  43. serializer.user = user
  44. return serializer
  45. def validSave(self):
  46. if self.is_valid():
  47. return self.save()
  48. else:
  49. raise CustomError(dump_serializer_errors(self))
  50. def create(self, validated_data):
  51. validated_data['create_user'] = self.user
  52. validated_data['department'] = self.user.department
  53. instance = super(SaleOrderSerializer, self).create(validated_data)
  54. BizLog.objects.addnew(
  55. self.user,
  56. BizLog.INSERT,
  57. u"添加订单[%s],id=%d" % (instance.no, instance.id),
  58. validated_data
  59. )
  60. return instance
  61. def update(self, instance, validated_data):
  62. instance = super(SaleOrderSerializer, self).update(instance, validated_data)
  63. BizLog.objects.addnew(
  64. self.user,
  65. BizLog.UPDATE,
  66. u"修改订单[%s],id=%d" % (instance.no, instance.id),
  67. validated_data
  68. )
  69. return instance
  70. class SaleOrderDetailSerializer(serializers.ModelSerializer):
  71. name = serializers.CharField(source='goods.product_base.name', read_only=True)
  72. model = serializers.CharField(source='goods.product_base.model', read_only=True)
  73. quality_request_text = serializers.CharField(source='quality_request.name', read_only=True)
  74. quality_request_id = serializers.CharField(source='quality_request.id', read_only=True)
  75. count = CountShowCharField()
  76. price = PriceShowCharField()
  77. amount = AmountShowCharField(read_only=True)
  78. class Meta:
  79. model = SaleOrderDetail
  80. fields = '__all__'
  81. @staticmethod
  82. def factory(user, data):
  83. instances = None
  84. serializer = SaleOrderDetailSerializer(instances, data=data)
  85. serializer.user = user
  86. return serializer
  87. def validSave(self):
  88. if self.is_valid():
  89. return self.save()
  90. else:
  91. raise CustomError(dump_serializer_errors(self))
  92. def validate(self, data):
  93. data['price'] = Formater.formatPrice(data['price'])
  94. data['count'] = Formater.formatCount(data['count'])
  95. data['amount'] = data['count'] * data['price']
  96. return data
  97. def create(self, validated_data):
  98. instance = super(SaleOrderDetailSerializer, self).create(validated_data)
  99. BizLog.objects.addnew(
  100. self.user,
  101. BizLog.INSERT,
  102. u"添加订单明细[%s],id=%d" % (instance.main.no, instance.id),
  103. validated_data
  104. )
  105. return instance
  106. class GoodsDeliverSerializer(serializers.ModelSerializer):
  107. customer_id = serializers.CharField(source='customer.id', read_only=True)
  108. customer_name = serializers.CharField(source='customer.name', read_only=True)
  109. customer_tel = serializers.CharField(source='customer.mobile', read_only=True)
  110. agent_user_text = serializers.CharField(source='agent_user.name', read_only=True)
  111. agent_department_text = serializers.CharField(source='agent_department.name', read_only=True)
  112. sale_order_no = serializers.CharField(source='sale_order.no', read_only=True)
  113. status = serializers.CharField(read_only=True)
  114. status_text = serializers.CharField(source='get_status_display', read_only=True)
  115. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  116. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  117. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  118. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  119. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  120. total_count = CountShowCharField(read_only=True)
  121. total_cost = AmountShowCharField(read_only=True)
  122. total_amount = AmountShowCharField(read_only=True)
  123. class Meta:
  124. model = GoodsDeliver
  125. fields = '__all__'
  126. @staticmethod
  127. def factory(user, data, id=None):
  128. if id:
  129. instance = GoodsDeliver.getById(id)
  130. else:
  131. instance = None
  132. serializer =GoodsDeliverSerializer(instance, data=data)
  133. serializer.user = user
  134. return serializer
  135. def create(self, validated_data):
  136. validated_data['create_user'] = self.user
  137. validated_data['department'] = self.user.department
  138. deliver = GoodsDeliver.objects.create(**validated_data)
  139. BizLog.objects.addnew(
  140. self.user,
  141. BizLog.INSERT,
  142. u"添加成品出库记录[%s],id=%d" % (deliver.no, deliver.id),
  143. validated_data
  144. )
  145. return deliver
  146. def update(self, instance, validated_data):
  147. instance = super(GoodsDeliverSerializer, self).update(instance, validated_data)
  148. BizLog.objects.addnew(
  149. self.user,
  150. BizLog.UPDATE,
  151. u"修改成品出库记录[%s],id=%d" % (instance.no, instance.id),
  152. validated_data
  153. )
  154. return instance
  155. def validate(self, data):
  156. data['agent_department'] = data['agent_user'].department
  157. return data
  158. def validSave(self):
  159. if self.is_valid():
  160. return self.save()
  161. else:
  162. raise CustomError(dump_serializer_errors(self))
  163. class GoodsDeliverDetailSerializer(serializers.ModelSerializer):
  164. name = serializers.CharField(source='product_base.product_base.name', read_only=True)
  165. model = serializers.CharField(source='product_base.product_base.model', read_only=True)
  166. unit_text = serializers.CharField(source='product_base.product_base.unit', read_only=True)
  167. count = CountShowCharField()
  168. price = PriceShowCharField()
  169. no = serializers.SerializerMethodField()
  170. warehouse_stock_count = serializers.CharField(source='warehouse_stock.count', read_only=True)
  171. total_cost = AmountShowCharField()
  172. total_amount = AmountShowCharField(read_only=True)
  173. class Meta:
  174. model = GoodsDeliverDetail
  175. fields = '__all__'
  176. @staticmethod
  177. def factory(user, data):
  178. serializer = GoodsDeliverDetailSerializer(None, data=data)
  179. serializer.user = user
  180. return serializer
  181. def get_no(self, obj):
  182. instance = GoodsGodownEntryDetail.objects.filter(stock_record=obj.warehouse_stockrecord).first()
  183. if instance:
  184. no = instance.main.no
  185. else:
  186. no = InventoryDetail.objects.filter(warehouse_stock_record=obj.warehouse_stockrecord).first().main.no
  187. return no
  188. def create(self, validated_data):
  189. instance = GoodsDeliverDetail.objects.create(**validated_data)
  190. BizLog.objects.addnew(
  191. self.user,
  192. BizLog.INSERT,
  193. u"添加成品出库明细[%s],id=%d" % (instance.product_base.product_base.name, instance.id),
  194. validated_data
  195. )
  196. return instance
  197. def validSave(self):
  198. if self.is_valid():
  199. return self.save()
  200. else:
  201. raise CustomError(dump_serializer_errors(self))
  202. def validate(self, data):
  203. data['count'] = Formater.formatCount(data['count'])
  204. data['price'] = Formater.formatPrice(data['price'])
  205. data['total_amount'] = data['count'] * data['price']
  206. data['total_cost'] = Formater.formatAmount(data['total_cost'])
  207. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['main'].warehouse, data['product_base'].product_base)
  208. data['warehouse_stock'] = warehouse_stock
  209. return data
  210. class GoodsDeliverReturnViewSerializer(serializers.ModelSerializer):
  211. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  212. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  213. customer_name = serializers.CharField(source='customer.name', read_only=True)
  214. customer_tel = serializers.CharField(source='customer.mobile', read_only=True)
  215. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  216. total_count = CountShowCharField(read_only=True)
  217. total_cost = AmountShowCharField(read_only=True)
  218. total_amount = AmountShowCharField(read_only=True)
  219. return_count = CountShowCharField(read_only=True)
  220. return_cost = AmountShowCharField(read_only=True)
  221. class Meta:
  222. model = GoodsDeliver
  223. fields = '__all__'
  224. class GoodsDeliverReturnSerializer(serializers.ModelSerializer):
  225. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  226. class Meta:
  227. model = GoodsDeliverReturn
  228. fields = '__all__'
  229. @staticmethod
  230. def factory(user, data):
  231. serializer = GoodsDeliverReturnSerializer(data=data)
  232. serializer.user = user
  233. return serializer
  234. def create(self, validated_data):
  235. validated_data['create_user'] = self.user
  236. validated_data['department'] = self.user.department
  237. deliver_return = GoodsDeliverReturn.objects.create(**validated_data)
  238. BizLog.objects.addnew(
  239. self.user,
  240. BizLog.INSERT,
  241. u"添加成品退库记录[%s],id=%d" % (deliver_return.no, deliver_return.id),
  242. validated_data
  243. )
  244. return deliver_return
  245. def validSave(self):
  246. if self.is_valid():
  247. return self.save()
  248. else:
  249. raise CustomError(dump_serializer_errors(self))
  250. class GoodsDeliverReturnDetailSerializer(serializers.ModelSerializer):
  251. class Meta:
  252. model = GoodsDeliverReturnDetail
  253. fields = '__all__'
  254. @staticmethod
  255. def factory(user, data):
  256. serializer = GoodsDeliverReturnDetailSerializer(data=data)
  257. serializer.user = user
  258. return serializer
  259. def create(self, validated_data):
  260. deliver_return_detail = GoodsDeliverReturnDetail.objects.create(**validated_data)
  261. BizLog.objects.addnew(
  262. self.user,
  263. BizLog.INSERT,
  264. u"添加成品退库明细记录[%s],id=%d" % (deliver_return_detail.main.no, deliver_return_detail.id),
  265. validated_data
  266. )
  267. return deliver_return_detail
  268. def validSave(self):
  269. if self.is_valid():
  270. return self.save()
  271. else:
  272. raise CustomError(dump_serializer_errors(self))
  273. def validate(self, data):
  274. data['return_count'] = Formater.formatCount(data['return_count'])
  275. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['deliver_detail'].main.warehouse, data['product_base'].product_base)
  276. data['warehouse_stock'] = warehouse_stock
  277. data['warehouse_record'] = BizWarehouse.deliveredBack(data['deliver_detail'].warehouse_record, data['return_count'])
  278. data['return_cost'] = data['warehouse_record'].amount
  279. return data