serializers.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #coding=utf-8
  2. from django.conf import settings
  3. from rest_framework import serializers
  4. from apps import base
  5. from apps.base import Formater
  6. from apps.exceptions import CustomError
  7. from apps.foundation.models import BizLog
  8. from apps.serializer_errors import dump_serializer_errors
  9. from libs.booleancharfield import CountShowCharField, PriceShowCharField, AmountShowCharField, EmptyPriceShowCharField, \
  10. EmptyAmountShowCharField
  11. from models import ProductionPlan, SalePlan, ProductionPlanDetail, SalePlanDetail, ProductionDemand, ProductionDemandDetail
  12. class ProductionDemandSerializer(serializers.ModelSerializer):
  13. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  14. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  15. check_status_text = serializers.CharField(source='get_status_display', read_only=True)
  16. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  17. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  18. customer_name = serializers.CharField(source='customer.name', read_only=True)
  19. customer_id = serializers.CharField(source='customer.id', read_only=True)
  20. customer_tel = serializers.CharField(source='customer.mobile', read_only=True)
  21. products = serializers.SerializerMethodField()
  22. count = CountShowCharField(read_only=True)
  23. receive_count = CountShowCharField(read_only=True)
  24. receiveable_count = serializers.SerializerMethodField()
  25. class Meta:
  26. model = ProductionDemand
  27. fields = '__all__'
  28. def get_products(self, obj):
  29. data = []
  30. rows = ProductionDemandDetail.objects.filter(main=obj)
  31. data.extend([s[0] for s in rows.values_list('goods__product_base__name')])
  32. return ','.join(data)
  33. def get_receiveable_count(self, obj):
  34. count = Formater.formatCountShow((obj.count or 0) - (obj.receive_count or 0))
  35. return count
  36. @staticmethod
  37. def factory(user, data,id=None):
  38. if id:
  39. instance = ProductionDemand.getById(id)
  40. else:
  41. instance = None
  42. serializer = ProductionDemandSerializer(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(ProductionDemandSerializer, 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(ProductionDemandSerializer, 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 ProductionDemandDetailSerializer(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. receive_count = CountShowCharField(read_only=True)
  77. price = PriceShowCharField()
  78. amount = AmountShowCharField(read_only=True)
  79. class Meta:
  80. model = ProductionDemandDetail
  81. fields = '__all__'
  82. @staticmethod
  83. def factory(user, data):
  84. instances = None
  85. serializer = ProductionDemandDetailSerializer(instances, data=data)
  86. serializer.user = user
  87. return serializer
  88. def validSave(self):
  89. if self.is_valid():
  90. return self.save()
  91. else:
  92. raise CustomError(dump_serializer_errors(self))
  93. def validate(self, data):
  94. data['price'] = Formater.formatPrice(data['price'])
  95. data['count'] = Formater.formatCount(data['count'])
  96. data['amount'] = data['count'] * data['price']
  97. return data
  98. def create(self, validated_data):
  99. instance = super(ProductionDemandDetailSerializer, self).create(validated_data)
  100. BizLog.objects.addnew(
  101. self.user,
  102. BizLog.INSERT,
  103. u"添加生产需求明细[%s],id=%d" % (instance.main.no, instance.id),
  104. validated_data
  105. )
  106. return instance
  107. class ProductionPlanSerializer(serializers.ModelSerializer):
  108. status = serializers.CharField(read_only=True)
  109. status_text = serializers.CharField(source='get_status_display', read_only=True)
  110. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  111. total_count = CountShowCharField(read_only=True)
  112. department_text = serializers.CharField(source='department.name', read_only=True)
  113. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  114. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  115. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  116. check_user_text2 = serializers.CharField(source='check_user2.name', read_only=True)
  117. check_time2 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  118. check_user_text3 = serializers.CharField(source='check_user3.name', read_only=True)
  119. check_time3 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  120. class Meta:
  121. model = ProductionPlan
  122. fields = '__all__'
  123. @staticmethod
  124. def factory(user,data, id=None):
  125. if id:
  126. instance = ProductionPlan.getById(id)
  127. else:
  128. instance = None
  129. serializer = ProductionPlanSerializer(instance, data=data)
  130. serializer.user = user
  131. return serializer
  132. def create(self, validated_data):
  133. validated_data['create_user'] = self.user
  134. validated_data['department'] = self.user.department
  135. production = ProductionPlan.objects.create(**validated_data)
  136. BizLog.objects.addnew(
  137. self.user,
  138. BizLog.INSERT,
  139. u"添加生产计划[%s],id=%d" % (production.name, production.id),
  140. validated_data
  141. )
  142. return production
  143. def validSave(self):
  144. if self.is_valid():
  145. return self.save()
  146. else:
  147. raise CustomError(dump_serializer_errors(self))
  148. def update(self, instance, validated_data):
  149. instance = super(ProductionPlanSerializer, self).update(instance, validated_data)
  150. BizLog.objects.addnew(
  151. self.user,
  152. BizLog.UPDATE,
  153. u"修改生产计划[%s],id=%d" % (instance.name, instance.id),
  154. validated_data
  155. )
  156. return instance
  157. class SalePlanSerializer(serializers.ModelSerializer):
  158. status = serializers.CharField(read_only=True)
  159. no = serializers.CharField(read_only=True)
  160. status_text = serializers.CharField(source='get_status_display', read_only=True)
  161. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  162. department_text = serializers.CharField(source='department.name', read_only=True)
  163. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  164. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  165. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  166. customer_text = serializers.CharField(source='customer.name', read_only=True)
  167. goods_text = serializers.SerializerMethodField()
  168. total_count = CountShowCharField(read_only=True)
  169. total_amount = EmptyAmountShowCharField(read_only=True)
  170. class Meta:
  171. model = SalePlan
  172. fields = '__all__'
  173. @staticmethod
  174. def factory(user, data, id=None):
  175. if id:
  176. instance = SalePlan.getById(id)
  177. else:
  178. instance = None
  179. serializer = SalePlanSerializer(instance, data=data)
  180. serializer.user = user
  181. return serializer
  182. def create(self, validated_data):
  183. validated_data['create_user'] = self.user
  184. validated_data['department'] = self.user.department
  185. instance = SalePlan.objects.create(**validated_data)
  186. BizLog.objects.addnew(
  187. self.user,
  188. BizLog.INSERT,
  189. u"添加销售计划[%s],id=%d" % (instance.no, instance.id),
  190. validated_data
  191. )
  192. return instance
  193. def validSave(self):
  194. if self.is_valid():
  195. return self.save()
  196. else:
  197. raise CustomError(dump_serializer_errors(self))
  198. def update(self, instance, validated_data):
  199. instance = super(SalePlanSerializer, self).update(instance, validated_data)
  200. BizLog.objects.addnew(
  201. self.user,
  202. BizLog.UPDATE,
  203. u"修改销售计划[%s],id=%d" % (instance.no, instance.id),
  204. validated_data
  205. )
  206. return instance
  207. def get_goods_text(self, obj):
  208. data = []
  209. rows = SalePlanDetail.objects.filter(main=obj)
  210. data.extend([row.goods.product_base.name for row in rows])
  211. return ','.join(data)
  212. class ProductionPlanDetailSerializer(serializers.ModelSerializer):
  213. name = serializers.CharField(source='product.product_base.name', read_only=True)
  214. model = serializers.CharField(source='product.product_base.model', read_only=True)
  215. count = CountShowCharField()
  216. quality_request_text = serializers.CharField(source='quality_request.name', read_only=True)
  217. product_user_id = serializers.CharField(source='product_user.id', read_only=True)
  218. p_department_id = serializers.CharField(source='p_department.id', read_only=True)
  219. department_id = serializers.CharField(source='department.id', read_only=True)
  220. product_user_text = serializers.CharField(source='product_user.name', read_only=True)
  221. p_department_text = serializers.CharField(source='p_department.name', read_only=True)
  222. department_text = serializers.CharField(source='department.name', read_only=True)
  223. class Meta:
  224. model = ProductionPlanDetail
  225. fields = '__all__'
  226. @staticmethod
  227. def factory(user, data, id=None):
  228. if id:
  229. instances = ProductionPlanDetail.getById(id)
  230. else:
  231. instances = None
  232. serializer = ProductionPlanDetailSerializer(instances, data=data)
  233. serializer.user = user
  234. return serializer
  235. def create(self, validated_data):
  236. production = ProductionPlanDetail.objects.create(**validated_data)
  237. BizLog.objects.addnew(
  238. self.user,
  239. BizLog.INSERT,
  240. u"添加生产计划明细[%s],id=%d" % (production.product.product_base.name, production.id),
  241. validated_data
  242. )
  243. return production
  244. def validSave(self):
  245. if self.is_valid():
  246. return self.save()
  247. else:
  248. raise CustomError(dump_serializer_errors(self))
  249. def validate(self, data):
  250. if 'count' in data:
  251. data['count'] = Formater.formatCount(data['count'])
  252. data['department'] = None
  253. if 'product_user' in data and data['product_user']:
  254. data['department'] = data['product_user'].department
  255. return data
  256. def update(self, instance, validated_data):
  257. instance = super(ProductionPlanDetailSerializer, self).update(instance, validated_data)
  258. BizLog.objects.addnew(
  259. self.user,
  260. BizLog.UPDATE,
  261. u"修改生产计划明细[%s],id=%d" % (instance.name, instance.id),
  262. validated_data
  263. )
  264. return instance
  265. class SalePlanDetailSerializer(serializers.ModelSerializer):
  266. status = serializers.CharField(read_only=True)
  267. goods_text = serializers.CharField(source='goods.product_base.name', read_only=True)
  268. goods_model = serializers.CharField(source='goods.product_base.model', read_only=True)
  269. require_time_text = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  270. quality_request_text = serializers.CharField(source='quality_request.name', read_only=True)
  271. quality_request_id = serializers.CharField(source='quality_request.id', read_only=True)
  272. current_count = serializers.CharField(source='goods.product_base.stock_count', read_only=True)
  273. require_production_count = serializers.SerializerMethodField()
  274. require_count = CountShowCharField()
  275. price = EmptyPriceShowCharField(allow_blank=True)
  276. amount = EmptyAmountShowCharField(read_only=True)
  277. class Meta:
  278. model = SalePlanDetail
  279. fields = '__all__'
  280. @staticmethod
  281. def factory(user, data):
  282. instance = None
  283. serializer = SalePlanDetailSerializer(instance, data=data)
  284. serializer.user = user
  285. return serializer
  286. def create(self, validated_data):
  287. instance = SalePlanDetail.objects.create(**validated_data)
  288. BizLog.objects.addnew(
  289. self.user,
  290. BizLog.INSERT,
  291. u"添加销售计划明细[%s],id=%d" % (instance.goods, instance.id),
  292. validated_data
  293. )
  294. return instance
  295. def validSave(self):
  296. if self.is_valid():
  297. return self.save()
  298. else:
  299. raise CustomError(dump_serializer_errors(self))
  300. def get_require_production_count(self, obj):
  301. require_production_count = 0
  302. if obj.require_count > obj.goods.product_base.stock_count:
  303. require_production_count = obj.require_count-obj.goods.product_base.stock_count
  304. return Formater.formatCountShow(require_production_count)
  305. def validate(self, data):
  306. if 'require_count' in data:
  307. data['require_count'] = Formater.formatCount(data['require_count'])
  308. if 'price' in data:
  309. if data['price'] == '':
  310. data['price'] = None
  311. else:
  312. data['price'] = Formater.formatPrice(data['price'])
  313. data['amount'] = data['require_count'] * data['price']
  314. return data