bussiness.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. # coding=utf-8
  2. from django.utils import timezone
  3. from apps.rebate.models import CashRebate, PointRebate, CashRebateLog, PointRebateLog, PointGive, PointGiveLog
  4. from apps.customer.models import SuperiorDistributor
  5. from apps.order.models import Order
  6. from apps.config.models import Config
  7. class CustomerRebate(object):
  8. def __init__(self, pay):
  9. self.pay = pay
  10. self.order = Order.objects.filter(pay=self.pay).first()
  11. def cash_rebate(self, ratio, amount, customer):
  12. '''
  13. 计算现金返利 1、2、3级分销商 返现金
  14. :param ratio:
  15. :param amount:
  16. :param customer:
  17. :return:
  18. '''
  19. rebate = CashRebate.objects.create(
  20. order=self.order,
  21. ratio=ratio,
  22. amount=amount,
  23. customer=customer,
  24. create_time=timezone.now()
  25. )
  26. CashRebateLog.addnew(rebate)
  27. def point_rebate(self, ratio, amount, customer):
  28. '''
  29. 计算积分返利 4、5级分销商 返积分
  30. :param ratio:
  31. :param amount:
  32. :param customer:
  33. :return:
  34. '''
  35. rebate = PointRebate.objects.create(
  36. order=self.order,
  37. ratio=ratio,
  38. amount=amount,
  39. customer=customer,
  40. create_time=timezone.now()
  41. )
  42. PointRebateLog.addnew(rebate)
  43. def point_give(self, ratio, amount, customer):
  44. '''
  45. 计算购买商品赠送的积分 购买商品时根据后台设置的比例赠送相应的积分给购买者
  46. :param ratio:
  47. :param amount:
  48. :param customer:
  49. :return:
  50. '''
  51. give = PointGive.objects.create(
  52. order=self.order,
  53. ratio=ratio,
  54. amount=amount,
  55. customer=customer,
  56. create_time=timezone.now()
  57. )
  58. PointGiveLog.addnew(give)
  59. def calcul_rebate(self):
  60. '''
  61. 计算返利并保存log
  62. :return:
  63. '''
  64. if not self.order:
  65. return
  66. if self.order.total_amount <= 0:
  67. return
  68. if self.order.status == Order.WAIT_PAY or self.order.status == Order.CANCEL:
  69. return
  70. customer = self.order.customer
  71. sd = SuperiorDistributor.objects.filter(customer=customer).first()
  72. if not sd:
  73. return
  74. # 判断是首次购买还是再次购买 首次购买与再次购买返利的比例不同
  75. count = Order.objects.filter(customer=customer, status__in=[Order.WAIT_DISPATCH, Order.CONFIRM_DISPATCH]).count()
  76. rebate_dic = {}
  77. if count > 1:
  78. rebate_dic = Config.get_rebate(False)
  79. elif count == 1:
  80. rebate_dic = Config.get_rebate(True)
  81. # 现金保留两位小数, 积分整数
  82. total_amount = float(self.order.total_amount or 0)
  83. if sd.one_level and sd.one_level.is_distributor and rebate_dic['one_level'] > 0:
  84. amount = int(round(total_amount * rebate_dic['one_level'] / 100.0, 0))
  85. self.cash_rebate(rebate_dic['one_level'], amount, sd.one_level)
  86. if sd.two_level and sd.two_level.is_distributor and rebate_dic['two_level'] > 0:
  87. amount = int(round(total_amount * rebate_dic['two_level']/ 100.0, 0))
  88. self.cash_rebate(rebate_dic['two_level'], amount, sd.two_level)
  89. if sd.three_level and sd.three_level.is_distributor and rebate_dic['three_level'] > 0:
  90. amount = int(round(total_amount * rebate_dic['three_level'] / 100.0, 0))
  91. self.cash_rebate(rebate_dic['three_level'], amount, sd.three_level)
  92. if sd.four_level and sd.four_level.is_distributor and rebate_dic['four_level'] > 0:
  93. amount = int(round((total_amount / 100.0) * (rebate_dic['four_level'] / 100.0), 0))
  94. self.point_rebate(rebate_dic['four_level'], amount, sd.four_level)
  95. if sd.five_level and sd.five_level.is_distributor and rebate_dic['five_level'] > 0:
  96. amount = int(round((total_amount / 100.0) * (rebate_dic['five_level'] / 100.0), 0))
  97. self.point_rebate(rebate_dic['five_level'], amount, sd.five_level)
  98. # 计算购买商品 赠送积分
  99. rule = Config.get_value(Config.KEY_POINT_RULE)
  100. if rule > 0:
  101. amount = int(round((total_amount / 100.0) * (rule / 100.0), 0))
  102. self.point_give(rule, amount, customer)