models.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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 = "cahs_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. TYPE_CHOICES = (
  83. (POINT_REBATE, u'积分返利'),
  84. (POINT_ORDER, u'积分兑换'),
  85. (POINT_GIVE, u'赠送积分'), # 购买商品赠送的积分
  86. )
  87. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
  88. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  89. happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
  90. amount = models.IntegerField(verbose_name=u"变动额")
  91. balance = models.IntegerField(verbose_name=u"余额")
  92. class Meta:
  93. db_table = "point_log"
  94. verbose_name = u'积分日志'
  95. ordering = ['-happen_time',]
  96. index_together = (
  97. 'happen_time',
  98. )
  99. default_permissions = ()
  100. permissions = []
  101. @staticmethod
  102. def addnew(customer, type, point):
  103. customer.points += point
  104. if customer.points < 0:
  105. raise CustomError(u'用户积分不足!')
  106. customer.save()
  107. instance = PointLog.objects.create(
  108. customer=customer,
  109. type=type,
  110. happen_time=timezone.now(),
  111. amount=point,
  112. balance=customer.points
  113. )
  114. return instance
  115. class PointRebate(models.Model):
  116. order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_rebate_order', editable=False, on_delete=models.PROTECT)
  117. ratio = models.FloatField(verbose_name=u'返利比例', default=0)
  118. amount = models.IntegerField(verbose_name=u'返利积分', default=0)
  119. customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
  120. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
  121. class Meta:
  122. db_table = "point_rebate"
  123. verbose_name = u'积分返利'
  124. ordering = []
  125. index_together = ()
  126. default_permissions = ()
  127. permissions = []
  128. class PointGive(models.Model):
  129. order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_give_order', editable=False, on_delete=models.PROTECT)
  130. ratio = models.FloatField(verbose_name=u'赠送比例', default=0)
  131. amount = models.IntegerField(verbose_name=u'赠送积分', default=0)
  132. customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
  133. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
  134. class Meta:
  135. db_table = "point_give"
  136. verbose_name = u'积分返利'
  137. ordering = []
  138. index_together = ()
  139. default_permissions = ()
  140. permissions = []
  141. class PointLogOrder(models.Model):
  142. order = models.OneToOneField(Order, verbose_name=u'订单', related_name='order', editable=False, on_delete=models.PROTECT)
  143. log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='order_log', editable=False, on_delete=models.PROTECT)
  144. class Meta:
  145. db_table = "point_log_order"
  146. verbose_name = u'积分兑换日志'
  147. ordering = []
  148. index_together = ()
  149. default_permissions = ()
  150. permissions = []
  151. @staticmethod
  152. def addnew(order):
  153. customer = Customer.objects.select_for_update().filter(id=order.customer.id).first()
  154. log = PointLog.addnew(customer, PointLog.POINT_ORDER, -order.total_point)
  155. instance = PointLogOrder.objects.create(order=order, log=log)
  156. return instance
  157. class PointRebateLog(models.Model):
  158. rebate = models.OneToOneField(PointRebate, verbose_name=u'积分返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
  159. log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
  160. class Meta:
  161. db_table = "point_log_rebate"
  162. verbose_name = u'积分返利日志'
  163. ordering = []
  164. index_together = ()
  165. default_permissions = ()
  166. permissions = []
  167. @staticmethod
  168. def addnew(rebate):
  169. customer = Customer.objects.select_for_update().filter(id=rebate.customer.id).first()
  170. log = PointLog.addnew(customer, PointLog.POINT_REBATE, rebate.amount)
  171. instance = PointRebateLog.objects.create(rebate=rebate, log=log)
  172. return instance
  173. class PointGiveLog(models.Model):
  174. give = models.OneToOneField(PointGive, verbose_name=u'赠送积分', related_name='give', editable=False, on_delete=models.PROTECT)
  175. log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='give_log', editable=False, on_delete=models.PROTECT)
  176. class Meta:
  177. db_table = "point_log_give"
  178. verbose_name = u'赠送积分日志'
  179. ordering = []
  180. index_together = ()
  181. default_permissions = ()
  182. permissions = []
  183. @staticmethod
  184. def addnew(give):
  185. customer = Customer.objects.select_for_update().filter(id=give.customer.id).first()
  186. log = PointLog.addnew(customer, PointLog.POINT_GIVE, give.amount)
  187. instance = PointGiveLog.objects.create(give=give, log=log)
  188. return instance