models.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. # coding=utf-8
  2. from django.db import models
  3. from django.db.models import Q
  4. from django.conf import settings
  5. from django.utils import timezone
  6. from apps.customer.models import Customer
  7. from apps.order.models import Order
  8. from apps.customer.models import SuperiorDistributor
  9. from utils.exceptions import CustomError
  10. '''
  11. 现金返利及现金变动记录
  12. '''
  13. class CashLog(models.Model):
  14. CASH_REBATE = 1
  15. TYPE_CHOICES = (
  16. (CASH_REBATE, u'现金返利'),
  17. )
  18. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
  19. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  20. happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
  21. amount = models.BigIntegerField(verbose_name=u"变动额")
  22. balance = models.BigIntegerField(verbose_name=u"余额")
  23. class Meta:
  24. db_table = "cash_log"
  25. verbose_name = u'现金日志'
  26. ordering = ['-happen_time',]
  27. index_together = (
  28. 'happen_time',
  29. )
  30. default_permissions = ()
  31. permissions = []
  32. @staticmethod
  33. def addnew(customer, type, amount):
  34. customer.balance += amount
  35. if customer.balance < 0:
  36. raise CustomError(u'用户余额不足!')
  37. customer.save()
  38. instance = CashLog.objects.create(
  39. customer=customer,
  40. type=type,
  41. happen_time=timezone.now(),
  42. amount=amount,
  43. balance=customer.balance
  44. )
  45. return instance
  46. class CashRebate(models.Model):
  47. order = models.ForeignKey(Order, verbose_name=u'订单', related_name='cash_rebate_order', editable=False, on_delete=models.PROTECT)
  48. ratio = models.FloatField(verbose_name=u'返利比例', default=0)
  49. amount = models.BigIntegerField(verbose_name=u'返利金额', default=0)
  50. customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
  51. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
  52. class Meta:
  53. db_table = "cash_rebate"
  54. verbose_name = u'现金返利'
  55. ordering = []
  56. index_together = ()
  57. default_permissions = ()
  58. permissions = []
  59. class CashRebateLog(models.Model):
  60. rebate = models.OneToOneField(CashRebate, verbose_name=u'现金返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
  61. log = models.OneToOneField(CashLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
  62. class Meta:
  63. db_table = "cash_rebate_log"
  64. verbose_name = u'现金返利日志'
  65. ordering = []
  66. index_together = ()
  67. default_permissions = ()
  68. permissions = []
  69. @staticmethod
  70. def addnew(rebate):
  71. customer = Customer.objects.select_for_update().filter(id=rebate.customer.id).first()
  72. log = CashLog.addnew(customer, CashLog.CASH_REBATE, rebate.amount)
  73. instance = CashRebateLog.objects.create(rebate=rebate, log=log)
  74. return instance
  75. '''
  76. 积分返利及积分变动记录
  77. '''
  78. class PointLog(models.Model):
  79. POINT_REBATE = 1
  80. POINT_ORDER = 2
  81. POINT_GIVE = 3
  82. POINT_CANCEL = 4
  83. TYPE_CHOICES = (
  84. (POINT_REBATE, u'积分返利'),
  85. (POINT_ORDER, u'积分兑换商品'),
  86. (POINT_GIVE, u'购买商品赠送积分'), # 购买商品赠送的积分
  87. (POINT_CANCEL, u'取消订单返还积分'), # 取消订单的时候将已扣除的积分返还
  88. )
  89. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
  90. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  91. happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
  92. amount = models.IntegerField(verbose_name=u"变动额")
  93. balance = models.IntegerField(verbose_name=u"余额")
  94. class Meta:
  95. db_table = "point_log"
  96. verbose_name = u'积分日志'
  97. ordering = ['-happen_time',]
  98. index_together = (
  99. 'happen_time',
  100. )
  101. default_permissions = ()
  102. permissions = []
  103. @staticmethod
  104. def addnew(customer, type, point):
  105. customer.points += point
  106. if customer.points < 0:
  107. raise CustomError(u'用户积分不足!')
  108. customer.save()
  109. instance = PointLog.objects.create(
  110. customer=customer,
  111. type=type,
  112. happen_time=timezone.now(),
  113. amount=point,
  114. balance=customer.points
  115. )
  116. return instance
  117. class PointRebate(models.Model):
  118. order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_rebate_order', editable=False, on_delete=models.PROTECT)
  119. ratio = models.FloatField(verbose_name=u'返利比例', default=0)
  120. amount = models.IntegerField(verbose_name=u'返利积分', default=0)
  121. customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
  122. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
  123. class Meta:
  124. db_table = "point_rebate"
  125. verbose_name = u'积分返利'
  126. ordering = []
  127. index_together = ()
  128. default_permissions = ()
  129. permissions = []
  130. class PointGive(models.Model):
  131. order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_give_order', editable=False, on_delete=models.PROTECT)
  132. ratio = models.FloatField(verbose_name=u'赠送比例', default=0)
  133. amount = models.IntegerField(verbose_name=u'赠送积分', default=0)
  134. customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
  135. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
  136. class Meta:
  137. db_table = "point_give"
  138. verbose_name = u'积分返利'
  139. ordering = []
  140. index_together = ()
  141. default_permissions = ()
  142. permissions = []
  143. class PointLogOrder(models.Model):
  144. order = models.ForeignKey(Order, verbose_name=u'订单', related_name='order', editable=False, on_delete=models.PROTECT)
  145. log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='order_log', editable=False, on_delete=models.PROTECT)
  146. class Meta:
  147. db_table = "point_log_order"
  148. verbose_name = u'积分兑换日志'
  149. ordering = []
  150. index_together = ()
  151. default_permissions = ()
  152. permissions = []
  153. @staticmethod
  154. def addnew(order, cancel_order=False):
  155. customer = Customer.objects.select_for_update().filter(id=order.customer.id).first()
  156. total_point = -order.total_point
  157. type = PointLog.POINT_ORDER
  158. if cancel_order:
  159. # 如果是作废订单就将订单积分加上去
  160. total_point = order.total_point
  161. type = PointLog.POINT_CANCEL
  162. log = PointLog.addnew(customer, type, total_point)
  163. instance = PointLogOrder.objects.create(order=order, log=log)
  164. return instance
  165. class PointRebateLog(models.Model):
  166. rebate = models.OneToOneField(PointRebate, verbose_name=u'积分返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
  167. log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
  168. class Meta:
  169. db_table = "point_log_rebate"
  170. verbose_name = u'积分返利日志'
  171. ordering = []
  172. index_together = ()
  173. default_permissions = ()
  174. permissions = []
  175. @staticmethod
  176. def addnew(rebate):
  177. customer = Customer.objects.select_for_update().filter(id=rebate.customer.id).first()
  178. log = PointLog.addnew(customer, PointLog.POINT_REBATE, rebate.amount)
  179. instance = PointRebateLog.objects.create(rebate=rebate, log=log)
  180. return instance
  181. class PointGiveLog(models.Model):
  182. give = models.OneToOneField(PointGive, verbose_name=u'赠送积分', related_name='give', editable=False, on_delete=models.PROTECT)
  183. log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='give_log', editable=False, on_delete=models.PROTECT)
  184. class Meta:
  185. db_table = "point_log_give"
  186. verbose_name = u'赠送积分日志'
  187. ordering = []
  188. index_together = ()
  189. default_permissions = ()
  190. permissions = []
  191. @staticmethod
  192. def addnew(give):
  193. customer = Customer.objects.select_for_update().filter(id=give.customer.id).first()
  194. log = PointLog.addnew(customer, PointLog.POINT_GIVE, give.amount)
  195. instance = PointGiveLog.objects.create(give=give, log=log)
  196. return instance