serializers.py 13 KB

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