serializers.py 13 KB

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