serializers.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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
  12. class ProductionPlanSerializer(serializers.ModelSerializer):
  13. status = serializers.CharField(read_only=True)
  14. status_text = serializers.CharField(source='get_status_display', read_only=True)
  15. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  16. total_count = CountShowCharField(read_only=True)
  17. department_text = serializers.CharField(source='department.name', read_only=True)
  18. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  19. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  20. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  21. check_user_text2 = serializers.CharField(source='check_user2.name', read_only=True)
  22. check_time2 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  23. check_user_text3 = serializers.CharField(source='check_user3.name', read_only=True)
  24. check_time3 = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  25. class Meta:
  26. model = ProductionPlan
  27. fields = '__all__'
  28. @staticmethod
  29. def factory(user,data, id=None):
  30. if id:
  31. instance = ProductionPlan.getById(id)
  32. else:
  33. instance = None
  34. serializer = ProductionPlanSerializer(instance, data=data)
  35. serializer.user = user
  36. return serializer
  37. def create(self, validated_data):
  38. validated_data['create_user'] = self.user
  39. validated_data['department'] = self.user.department
  40. production = ProductionPlan.objects.create(**validated_data)
  41. BizLog.objects.addnew(
  42. self.user,
  43. BizLog.INSERT,
  44. u"添加生产计划[%s],id=%d" % (production.name, production.id),
  45. validated_data
  46. )
  47. return production
  48. def validSave(self):
  49. if self.is_valid():
  50. return self.save()
  51. else:
  52. raise CustomError(dump_serializer_errors(self))
  53. def update(self, instance, validated_data):
  54. instance = super(ProductionPlanSerializer, self).update(instance, validated_data)
  55. BizLog.objects.addnew(
  56. self.user,
  57. BizLog.UPDATE,
  58. u"修改生产计划[%s],id=%d" % (instance.name, instance.id),
  59. validated_data
  60. )
  61. return instance
  62. class SalePlanSerializer(serializers.ModelSerializer):
  63. status = serializers.CharField(read_only=True)
  64. no = serializers.CharField(read_only=True)
  65. status_text = serializers.CharField(source='get_status_display', read_only=True)
  66. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  67. department_text = serializers.CharField(source='department.name', read_only=True)
  68. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  69. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  70. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  71. customer_text = serializers.CharField(source='customer.name', read_only=True)
  72. goods_text = serializers.SerializerMethodField()
  73. total_count = CountShowCharField(read_only=True)
  74. total_amount = EmptyAmountShowCharField(read_only=True)
  75. class Meta:
  76. model = SalePlan
  77. fields = '__all__'
  78. @staticmethod
  79. def factory(user, data, id=None):
  80. if id:
  81. instance = SalePlan.getById(id)
  82. else:
  83. instance = None
  84. serializer = SalePlanSerializer(instance, data=data)
  85. serializer.user = user
  86. return serializer
  87. def create(self, validated_data):
  88. validated_data['create_user'] = self.user
  89. validated_data['department'] = self.user.department
  90. instance = SalePlan.objects.create(**validated_data)
  91. BizLog.objects.addnew(
  92. self.user,
  93. BizLog.INSERT,
  94. u"添加销售计划[%s],id=%d" % (instance.no, instance.id),
  95. validated_data
  96. )
  97. return instance
  98. def validSave(self):
  99. if self.is_valid():
  100. return self.save()
  101. else:
  102. raise CustomError(dump_serializer_errors(self))
  103. def update(self, instance, validated_data):
  104. instance = super(SalePlanSerializer, self).update(instance, validated_data)
  105. BizLog.objects.addnew(
  106. self.user,
  107. BizLog.UPDATE,
  108. u"修改销售计划[%s],id=%d" % (instance.no, instance.id),
  109. validated_data
  110. )
  111. return instance
  112. def get_goods_text(self, obj):
  113. data = []
  114. rows = SalePlanDetail.objects.filter(main=obj)
  115. data.extend([row.goods.product_base.name for row in rows])
  116. return ','.join(data)
  117. class ProductionPlanDetailSerializer(serializers.ModelSerializer):
  118. name = serializers.CharField(source='product.product_base.name', read_only=True)
  119. model = serializers.CharField(source='product.product_base.model', read_only=True)
  120. count = CountShowCharField()
  121. quality_request_text = serializers.CharField(source='quality_request.name', read_only=True)
  122. product_user_id = serializers.CharField(source='product_user.id', read_only=True)
  123. p_department_id = serializers.CharField(source='p_department.id', read_only=True)
  124. department_id = serializers.CharField(source='department.id', read_only=True)
  125. product_user_text = serializers.CharField(source='product_user.name', read_only=True)
  126. p_department_text = serializers.CharField(source='p_department.name', read_only=True)
  127. department_text = serializers.CharField(source='department.name', read_only=True)
  128. class Meta:
  129. model = ProductionPlanDetail
  130. fields = '__all__'
  131. @staticmethod
  132. def factory(user, data, id=None):
  133. if id:
  134. instances = ProductionPlanDetail.getById(id)
  135. else:
  136. instances = None
  137. serializer = ProductionPlanDetailSerializer(instances, data=data)
  138. serializer.user = user
  139. return serializer
  140. def create(self, validated_data):
  141. production = ProductionPlanDetail.objects.create(**validated_data)
  142. BizLog.objects.addnew(
  143. self.user,
  144. BizLog.INSERT,
  145. u"添加生产计划明细[%s],id=%d" % (production.product.product_base.name, production.id),
  146. validated_data
  147. )
  148. return production
  149. def validSave(self):
  150. if self.is_valid():
  151. return self.save()
  152. else:
  153. raise CustomError(dump_serializer_errors(self))
  154. def validate(self, data):
  155. if 'count' in data:
  156. data['count'] = Formater.formatCount(data['count'])
  157. data['department'] = None
  158. if 'product_user' in data and data['product_user']:
  159. data['department'] = data['product_user'].department
  160. return data
  161. def update(self, instance, validated_data):
  162. instance = super(ProductionPlanDetailSerializer, self).update(instance, validated_data)
  163. BizLog.objects.addnew(
  164. self.user,
  165. BizLog.UPDATE,
  166. u"修改生产计划明细[%s],id=%d" % (instance.name, instance.id),
  167. validated_data
  168. )
  169. return instance
  170. class SalePlanDetailSerializer(serializers.ModelSerializer):
  171. status = serializers.CharField(read_only=True)
  172. goods_text = serializers.CharField(source='goods.product_base.name', read_only=True)
  173. goods_model = serializers.CharField(source='goods.product_base.model', read_only=True)
  174. require_time_text = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  175. quality_request_text = serializers.CharField(source='quality_request.name', read_only=True)
  176. quality_request_id = serializers.CharField(source='quality_request.id', read_only=True)
  177. current_count = serializers.CharField(source='goods.product_base.stock_count', read_only=True)
  178. require_production_count = serializers.SerializerMethodField()
  179. require_count = CountShowCharField()
  180. price = EmptyPriceShowCharField(allow_blank=True)
  181. amount = EmptyAmountShowCharField(read_only=True)
  182. class Meta:
  183. model = SalePlanDetail
  184. fields = '__all__'
  185. @staticmethod
  186. def factory(user, data):
  187. instance = None
  188. serializer = SalePlanDetailSerializer(instance, data=data)
  189. serializer.user = user
  190. return serializer
  191. def create(self, validated_data):
  192. instance = SalePlanDetail.objects.create(**validated_data)
  193. BizLog.objects.addnew(
  194. self.user,
  195. BizLog.INSERT,
  196. u"添加销售计划明细[%s],id=%d" % (instance.goods, instance.id),
  197. validated_data
  198. )
  199. return instance
  200. def validSave(self):
  201. if self.is_valid():
  202. return self.save()
  203. else:
  204. raise CustomError(dump_serializer_errors(self))
  205. def get_require_production_count(self, obj):
  206. require_production_count = 0
  207. if obj.require_count > obj.goods.product_base.stock_count:
  208. require_production_count = obj.require_count-obj.goods.product_base.stock_count
  209. return Formater.formatCountShow(require_production_count)
  210. def validate(self, data):
  211. if 'require_count' in data:
  212. data['require_count'] = Formater.formatCount(data['require_count'])
  213. if 'price' in data:
  214. if data['price'] == '':
  215. data['price'] = None
  216. else:
  217. data['price'] = Formater.formatPrice(data['price'])
  218. data['amount'] = data['require_count'] * data['price']
  219. return data