serializers.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # coding=utf-8
  2. import json
  3. from django.conf import settings
  4. from rest_framework import serializers
  5. from django.db.models import Q, Sum
  6. from apps.order.models import Order
  7. from apps.rebate.models import CashRebate, PointRebate, TransferCashRebate, TransferCashRebateDetail, CashRebateLog, CashLog
  8. from apps.base import Formater
  9. class OrderRebateSerializer(serializers.ModelSerializer):
  10. cash_rebate = serializers.SerializerMethodField()
  11. point_rebate = serializers.SerializerMethodField()
  12. status_text = serializers.CharField(source='get_status_display', read_only=True)
  13. customer_name = serializers.CharField(source='customer.name', read_only=True)
  14. customer_tel = serializers.CharField(source='customer.tel', read_only=True)
  15. total_amount = serializers.SerializerMethodField()
  16. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  17. transfer = serializers.SerializerMethodField()
  18. class Meta:
  19. model = Order
  20. fields = '__all__'
  21. def get_cash_rebate(self, obj):
  22. cash_bate = CashRebate.objects.filter(order=obj).aggregate(sum_amount=Sum('amount'))['sum_amount'] or 0
  23. return Formater.formatValueShow(cash_bate)
  24. def get_point_rebate(self, obj):
  25. point_rebate = PointRebate.objects.filter(order=obj).aggregate(sum_point=Sum('amount'))['sum_point'] or 0
  26. return point_rebate
  27. def get_total_amount(self, obj):
  28. return Formater.formatValueShow(obj.total_amount)
  29. def get_transfer(self, obj):
  30. transfer = TransferCashRebate.objects.filter(order=obj).count()
  31. cash_bate = CashRebate.objects.filter(order=obj, status=CashRebate.DEFAULT).aggregate(sum_amount=Sum('amount'))['sum_amount'] or 0
  32. if transfer: # 有转账记录 前端显示转账记录按钮
  33. return 2
  34. if not transfer and cash_bate > 0: # 没有转账记录 且 未转账的返利合计大于0 前端显示申请转账按钮
  35. return 1
  36. return 0 # 其他情况不显示按钮
  37. class CashRebateSerializer(serializers.ModelSerializer):
  38. amount = serializers.SerializerMethodField()
  39. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  40. customer_name = serializers.CharField(source='customer.name', read_only=True)
  41. ratio = serializers.SerializerMethodField()
  42. status_text = serializers.CharField(source='get_status_display', read_only=True)
  43. transfer = serializers.SerializerMethodField()
  44. class Meta:
  45. model = CashRebate
  46. fields = '__all__'
  47. def get_amount(self, obj):
  48. return Formater.formatValueShow(obj.amount)
  49. def get_ratio(self, obj):
  50. return str(obj.ratio) + '%'
  51. def get_transfer(self, obj):
  52. if obj.status != CashRebate.TRANSFERED:
  53. return ''
  54. count = CashRebateLog.objects.filter(rebate=obj, log__type=CashLog.CASH_TRANSFER).count()
  55. if count:
  56. return '手动核销'
  57. return '自动转账'
  58. class PointRebateSerializer(serializers.ModelSerializer):
  59. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  60. customer_name = serializers.CharField(source='customer.name', read_only=True)
  61. class Meta:
  62. model = PointRebate
  63. fields = '__all__'
  64. class TransferCashRebateSerializer(serializers.ModelSerializer):
  65. transfer_amount = serializers.SerializerMethodField()
  66. success_amount = serializers.SerializerMethodField()
  67. fail_amount = serializers.SerializerMethodField()
  68. transfer_status_text = serializers.CharField(source='get_transfer_status_display', read_only=True)
  69. transfer_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  70. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  71. class Meta:
  72. model = TransferCashRebate
  73. fields = '__all__'
  74. def get_transfer_amount(self, obj):
  75. return Formater.formatValueShow(obj.transfer_amount)
  76. def get_success_amount(self, obj):
  77. return Formater.formatValueShow(obj.success_amount)
  78. def get_fail_amount(self, obj):
  79. return Formater.formatValueShow(obj.fail_amount)
  80. class TransferCashRebateDetailSerializer(serializers.ModelSerializer):
  81. amount = serializers.SerializerMethodField()
  82. status_text = serializers.CharField(source='get_status_display', read_only=True)
  83. initiate_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  84. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
  85. customer_name = serializers.CharField(source='customer.name', read_only=True)
  86. tel = serializers.CharField(source='customer.tel', read_only=True)
  87. transfer = serializers.SerializerMethodField()
  88. class Meta:
  89. model = TransferCashRebateDetail
  90. fields = '__all__'
  91. def get_amount(self, obj):
  92. return Formater.formatValueShow(obj.amount)
  93. def get_transfer(self, obj):
  94. count = TransferCashRebateDetail.objects.filter(Q(rebate=obj.rebate), ~Q(status=TransferCashRebateDetail.FAIL)).count()
  95. if obj.rebate.status == CashRebate.DEFAULT and not count:
  96. return 0
  97. return 1