serializers.py 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #coding=utf-8
  2. from rest_framework import serializers
  3. from apps import base
  4. from apps.account.models import User
  5. from apps.base import Formater
  6. from apps.exceptions import CustomError
  7. from apps.foundation.models import BizLog
  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 models import Material, Consumable, Deliver, DeliverDetail, DeliverReturn, DeliverReturnDetail
  12. from libs.booleancharfield import BooleanCharField, CountShowCharField, AmountShowCharField, PriceShowCharField
  13. from apps.warehouse.models import Inventory, InventoryDetail, WarehouseStock
  14. from apps import base
  15. from apps.goods.models import GoodsGodownEntryDetail
  16. from apps.purchase.models import GodownEntryDetail
  17. from apps.product.models import ProductBase
  18. class MaterialSerializer(serializers.ModelSerializer):
  19. name = serializers.CharField(source='product_base.name', read_only=True)
  20. model = serializers.CharField(source='product_base.model', read_only=True)
  21. option_type = serializers.CharField(source='product_base.option_type.id', read_only=True)
  22. option_type_text = serializers.CharField(source='product_base.option_type.name', read_only=True)
  23. unit = serializers.CharField(source='product_base.unit', read_only=True)
  24. standard = serializers.CharField(source='product_base.standard', read_only=True)
  25. warehouse_place = serializers.CharField(source='product_base.warehouse_place', read_only=True)
  26. purchase_suggest_text = serializers.CharField(source='get_purchase_suggest_display', read_only=True)
  27. stock_upper_limit = CountShowCharField()
  28. stock_lower_limit = CountShowCharField()
  29. enabled_text = BooleanCharField(source='product_base.enabled', read_only=True)
  30. enabled = serializers.BooleanField(source='product_base.enabled', read_only=True)
  31. notes = serializers.CharField(source='product_base.notes', read_only=True)
  32. class Meta:
  33. model = Material
  34. fields = '__all__'
  35. @staticmethod
  36. def factory(user, data, id=None):
  37. if id:
  38. instance = Material.getById(id)
  39. else:
  40. instance = None
  41. serializer = MaterialSerializer(instance, data=data)
  42. serializer.user = user
  43. return serializer
  44. def create(self, validated_data):
  45. product = Material.objects.create(**validated_data)
  46. BizLog.objects.addnew(
  47. self.user,
  48. BizLog.INSERT,
  49. u"添加原料[%s],id=%d" % (product.product_base.name, product.id),
  50. validated_data
  51. )
  52. return product
  53. def update(self, instance, validated_data):
  54. instance = super(MaterialSerializer, self).update(instance, validated_data)
  55. BizLog.objects.addnew(
  56. self.user,
  57. BizLog.UPDATE,
  58. u"修改原料[%s],id=%d" % (instance.product_base.name, instance.id),
  59. validated_data
  60. )
  61. return instance
  62. def validSave(self):
  63. if self.is_valid():
  64. return self.save()
  65. else:
  66. raise CustomError(dump_serializer_errors(self))
  67. def validate(self, data):
  68. if 'stock_upper_limit' in data:
  69. data['stock_upper_limit'] = Formater.formatCount(data['stock_upper_limit'])
  70. if 'stock_lower_limit' in data:
  71. data['stock_lower_limit'] = Formater.formatCount(data['stock_lower_limit'])
  72. return data
  73. class ConsumableSerializer(serializers.ModelSerializer):
  74. name = serializers.CharField(source='product_base.name', read_only=True)
  75. model = serializers.CharField(source='product_base.model', read_only=True)
  76. option_type = serializers.CharField(source='product_base.option_type.id', read_only=True)
  77. option_type_text = serializers.CharField(source='product_base.option_type.name', read_only=True)
  78. unit = serializers.CharField(source='product_base.unit', read_only=True)
  79. standard = serializers.CharField(source='product_base.standard', read_only=True)
  80. warehouse_place = serializers.CharField(source='product_base.warehouse_place', read_only=True)
  81. purchase_suggest_text = serializers.CharField(source='get_purchase_suggest_display', read_only=True)
  82. stock_upper_limit = CountShowCharField()
  83. stock_lower_limit = CountShowCharField()
  84. enabled_text = BooleanCharField(source='product_base.enabled', read_only=True)
  85. enabled = serializers.BooleanField(source='product_base.enabled', read_only=True)
  86. notes = serializers.CharField(source='product_base.notes', read_only=True)
  87. class Meta:
  88. model = Consumable
  89. fields = '__all__'
  90. @staticmethod
  91. def factory(user, data, id=None):
  92. if id:
  93. instance = Consumable.getById(id)
  94. else:
  95. instance = None
  96. serializer = ConsumableSerializer(instance, data=data)
  97. serializer.user = user
  98. return serializer
  99. def create(self, validated_data):
  100. product = Consumable.objects.create(**validated_data)
  101. BizLog.objects.addnew(
  102. self.user,
  103. BizLog.INSERT,
  104. u"添加耗材[%s],id=%d" % (product.product_base.name, product.id),
  105. validated_data
  106. )
  107. return product
  108. def update(self, instance, validated_data):
  109. instance = super(ConsumableSerializer, self).update(instance, validated_data)
  110. BizLog.objects.addnew(
  111. self.user,
  112. BizLog.UPDATE,
  113. u"修改耗材[%s],id=%d" % (instance.product_base.name, instance.id),
  114. validated_data
  115. )
  116. return instance
  117. def validSave(self):
  118. if self.is_valid():
  119. return self.save()
  120. else:
  121. raise CustomError(dump_serializer_errors(self))
  122. def validate(self, data):
  123. if 'stock_upper_limit' in data:
  124. data['stock_upper_limit'] = Formater.formatCount(data['stock_upper_limit'])
  125. if 'stock_lower_limit' in data:
  126. data['stock_lower_limit'] = Formater.formatCount(data['stock_lower_limit'])
  127. return data
  128. class DeliverSerializer(serializers.ModelSerializer):
  129. status = serializers.CharField(read_only=True)
  130. product_type_text = serializers.CharField(source='get_product_type_display', 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. receiver_text = serializers.CharField(source='receiver.name', read_only=True)
  137. receiver_department_text = serializers.CharField(source='receiver_department.name', read_only=True)
  138. goods_text = serializers.CharField(source='goods.product_base.name', read_only=True)
  139. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  140. total_count = CountShowCharField(read_only=True)
  141. total_cost = AmountShowCharField(read_only=True)
  142. class Meta:
  143. model = Deliver
  144. fields = '__all__'
  145. @staticmethod
  146. def factory(user, data, id=None):
  147. if id:
  148. instance = Deliver.getById(id)
  149. else:
  150. instance = None
  151. serializer =DeliverSerializer(instance, data=data)
  152. serializer.user = user
  153. return serializer
  154. def create(self, validated_data):
  155. validated_data['create_user'] = self.user
  156. validated_data['department'] = self.user.department
  157. deliver = Deliver.objects.create(**validated_data)
  158. BizLog.objects.addnew(
  159. self.user,
  160. BizLog.INSERT,
  161. u"添加原料/耗材出库单[%s],id=%d" % (deliver.no, deliver.id),
  162. validated_data
  163. )
  164. return deliver
  165. def update(self, instance, validated_data):
  166. instance = super(DeliverSerializer, self).update(instance, validated_data)
  167. BizLog.objects.addnew(
  168. self.user,
  169. BizLog.UPDATE,
  170. u"修改原料/耗材出库单[%s],id=%d" % (instance.no, instance.id),
  171. validated_data
  172. )
  173. return instance
  174. def validate(self, data):
  175. data['receiver_department'] = data['receiver'].department
  176. return data
  177. def validSave(self):
  178. if self.is_valid():
  179. return self.save()
  180. else:
  181. raise CustomError(dump_serializer_errors(self))
  182. class DeliverDetailSerializer(serializers.ModelSerializer):
  183. name = serializers.CharField(source='product_base.name', read_only=True)
  184. model = serializers.CharField(source='product_base.model', read_only=True)
  185. unit_text = serializers.CharField(source='product_base.unit', read_only=True)
  186. no = serializers.SerializerMethodField()
  187. count = CountShowCharField()
  188. warehouse_stock_count = CountShowCharField(source='warehouse_stock.count', read_only=True)
  189. total_cost = AmountShowCharField()
  190. class Meta:
  191. model = DeliverDetail
  192. fields = '__all__'
  193. @staticmethod
  194. def factory(user, data):
  195. serializer = DeliverDetailSerializer(None, data=data)
  196. serializer.user = user
  197. return serializer
  198. def get_no(self, obj):
  199. instance = GodownEntryDetail.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 = DeliverDetail.objects.create(**validated_data)
  207. BizLog.objects.addnew(
  208. self.user,
  209. BizLog.INSERT,
  210. u"添加原料/耗材出库明细[%s],id=%d" % (instance.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['total_cost'] = Formater.formatAmount(data['total_cost'])
  222. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['main'].warehouse, data['product_base'])
  223. data['warehouse_stock'] = warehouse_stock
  224. return data
  225. class InventorySerializer(serializers.ModelSerializer):
  226. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  227. check_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  228. check_status_text = serializers.CharField(source='get_check_status_display', read_only=True)
  229. check_user_text = serializers.CharField(source='check_user.name', read_only=True)
  230. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  231. type_text = serializers.CharField(source='get_type_display', read_only=True)
  232. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  233. total_count = CountShowCharField(read_only=True)
  234. total_amount = AmountShowCharField(read_only=True)
  235. class Meta:
  236. model = Inventory
  237. fields = '__all__'
  238. @staticmethod
  239. def factory(user, data, id=None):
  240. if id:
  241. instance = Inventory.getById(id)
  242. else:
  243. instance = None
  244. serializer = InventorySerializer(instance, data=data)
  245. serializer.user = user
  246. return serializer
  247. def create(self, validated_data):
  248. validated_data['create_user'] = self.user
  249. validated_data['department'] = self.user.department
  250. order = Inventory.objects.create(**validated_data)
  251. BizLog.objects.addnew(
  252. self.user,
  253. BizLog.INSERT,
  254. u"添加盘存单[%s],id=%d" % (order.no, order.id),
  255. validated_data
  256. )
  257. return order
  258. def update(self, instance, validated_data):
  259. instance = super(InventorySerializer, self).update(instance, validated_data)
  260. BizLog.objects.addnew(
  261. self.user,
  262. BizLog.UPDATE,
  263. u"修改盘存单[%s],id=%d" % (instance.no, instance.id),
  264. validated_data
  265. )
  266. return instance
  267. def validSave(self):
  268. if self.is_valid():
  269. return self.save()
  270. else:
  271. raise CustomError(dump_serializer_errors(self))
  272. class InventoryDetailSerializer(serializers.ModelSerializer):
  273. name = serializers.CharField(source='product.name', read_only=True)
  274. model = serializers.CharField(source='product.model', read_only=True)
  275. warehouse_text = serializers.CharField(source='main.warehouse.name', read_only=True)
  276. entry_no = serializers.SerializerMethodField()
  277. count = CountShowCharField()
  278. price = PriceShowCharField()
  279. amount = AmountShowCharField(read_only=True)
  280. class Meta:
  281. model = InventoryDetail
  282. fields = '__all__'
  283. def get_entry_no(self, obj):
  284. if obj.product.type == ProductBase.GOODS:
  285. g_row = GoodsGodownEntryDetail.objects.filter(stock_record_id=obj.loss_stock_record_id).first()
  286. else:
  287. g_row = GodownEntryDetail.objects.filter(stock_record_id=obj.loss_stock_record_id).first()
  288. if not g_row:
  289. g_row = InventoryDetail.objects.filter(warehouse_stock_record_id=obj.loss_stock_record_id).first()
  290. return g_row and g_row.main.no or ''
  291. @staticmethod
  292. def factory(user, data):
  293. instances = None
  294. serializer = InventoryDetailSerializer(instances, data=data)
  295. serializer.user = user
  296. return serializer
  297. def create(self, validated_data):
  298. order = InventoryDetail.objects.create(**validated_data)
  299. BizLog.objects.addnew(
  300. self.user,
  301. BizLog.INSERT,
  302. u"添加盘存明细[%s],id=%d" % (order.main.no, order.id),
  303. validated_data
  304. )
  305. return order
  306. def validSave(self):
  307. if self.is_valid():
  308. return self.save()
  309. else:
  310. raise CustomError(dump_serializer_errors(self))
  311. def validate(self, data):
  312. data['price'] = Formater.formatPrice(data['price'])
  313. data['count'] = Formater.formatCount(data['count'])
  314. data['amount'] = data['price'] * data['count']
  315. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['main'].warehouse, data['product'])
  316. data['warehouse_stock'] = warehouse_stock
  317. return data
  318. def update(self, instance, validated_data):
  319. instance = super(InventoryDetailSerializer, self).update(instance, validated_data)
  320. BizLog.objects.addnew(
  321. self.user,
  322. BizLog.INSERT,
  323. u"修改盘存明细[%s],id=%d" % (instance.main.no, instance.id),
  324. validated_data
  325. )
  326. return instance
  327. class DeliverReturnViewSerializer(serializers.ModelSerializer):
  328. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  329. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  330. receiver_text = serializers.CharField(source='receiver.name', read_only=True)
  331. warehouse_text = serializers.CharField(source='warehouse.name', read_only=True)
  332. total_count = CountShowCharField(read_only=True)
  333. total_cost = AmountShowCharField(read_only=True)
  334. return_count = CountShowCharField(read_only=True)
  335. return_cost = AmountShowCharField(read_only=True)
  336. class Meta:
  337. model = Deliver
  338. fields = '__all__'
  339. class DeliverReturnSerializer(serializers.ModelSerializer):
  340. create_time = serializers.DateTimeField(format=base.DATETIME_FORMAT, read_only=True)
  341. class Meta:
  342. model = DeliverReturn
  343. fields = '__all__'
  344. @staticmethod
  345. def factory(user, data):
  346. serializer = DeliverReturnSerializer(data=data)
  347. serializer.user = user
  348. return serializer
  349. def create(self, validated_data):
  350. validated_data['create_user'] = self.user
  351. validated_data['department'] = self.user.department
  352. deliver_return = DeliverReturn.objects.create(**validated_data)
  353. BizLog.objects.addnew(
  354. self.user,
  355. BizLog.INSERT,
  356. u"添加原料/耗材退料单[%s],id=%d" % (deliver_return.no, deliver_return.id),
  357. validated_data
  358. )
  359. return deliver_return
  360. def validSave(self):
  361. if self.is_valid():
  362. return self.save()
  363. else:
  364. raise CustomError(dump_serializer_errors(self))
  365. class DeliverReturnDetailSerializer(serializers.ModelSerializer):
  366. class Meta:
  367. model = DeliverReturnDetail
  368. fields = '__all__'
  369. @staticmethod
  370. def factory(user, data):
  371. serializer = DeliverReturnDetailSerializer(data=data)
  372. serializer.user = user
  373. return serializer
  374. def create(self, validated_data):
  375. deliver_return_detail = DeliverReturnDetail.objects.create(**validated_data)
  376. BizLog.objects.addnew(
  377. self.user,
  378. BizLog.INSERT,
  379. u"添加原料/耗材退料明细[%s],id=%d" % (deliver_return_detail.main.no, deliver_return_detail.id),
  380. validated_data
  381. )
  382. return deliver_return_detail
  383. def validSave(self):
  384. if self.is_valid():
  385. return self.save()
  386. else:
  387. raise CustomError(dump_serializer_errors(self))
  388. def validate(self, data):
  389. data['return_count'] = Formater.formatCount(data['return_count'])
  390. warehouse_stock = WarehouseStock.getByWarehouseAndProduct(data['deliver_detail'].main.warehouse, data['product_base'])
  391. data['warehouse_stock'] = warehouse_stock
  392. data['warehouse_record'] = BizWarehouse.deliveredBack(data['deliver_detail'].warehouse_record, data['return_count'])
  393. data['return_cost'] = data['warehouse_record'].amount
  394. return data