models.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # coding=utf-8
  2. from django.db import models
  3. from django.conf import settings
  4. from django.utils import timezone
  5. from apps.commodity.models import Commodity
  6. from apps.option.models import Config, Student,Classes
  7. from apps.upload.models import Upload
  8. from utils.exceptions import CustomError
  9. from apps.base import Formater
  10. from apps.account.models import CustomerWechat
  11. from django.contrib.auth import get_user_model
  12. User = get_user_model()
  13. from apps.option.models import CommodityLevel, School
  14. class Coupon(models.Model):
  15. name = models.CharField(max_length=50, verbose_name='优惠券名称', unique=True, null=True)
  16. amount = models.BigIntegerField(verbose_name=u"优惠券金额", default=0)
  17. category = models.CharField(max_length=200, verbose_name='使用分类', null=True,)
  18. school = models.CharField(max_length=200, verbose_name='使用学校', null=True,)
  19. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  20. create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'创建人', related_name='coupon_create_user',
  21. on_delete=models.PROTECT, editable=False)
  22. begin_date = models.DateField(verbose_name=u"开始时间", null=True)
  23. end_date = models.DateField(verbose_name=u"结束时间", null=True)
  24. enable = models.BooleanField(verbose_name=u"是否在用", default=True)
  25. count = models.IntegerField(verbose_name=u"使用数量", default=0)
  26. class Meta:
  27. db_table = "coupon"
  28. verbose_name = u"优惠券"
  29. ordering = ('-id',)
  30. default_permissions = ()
  31. permissions = [
  32. ('view_coupon', u'查看'),
  33. ('add_coupon', u'添加修改'),
  34. ]
  35. class Pay(models.Model):
  36. WAIT = 0
  37. PAY = 1
  38. UNDO = 2
  39. STATUS_CHOICES = (
  40. (WAIT, u'待付款'),
  41. (PAY, u'已付款'),
  42. (UNDO, u'已取消'),
  43. )
  44. CUSTOMER = 1
  45. TYPE_CHOICES = (
  46. (CUSTOMER, u'客户'),
  47. )
  48. pay_no = models.CharField(max_length=25, verbose_name='支付单号', unique=True, null=True)
  49. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name='状态', default=WAIT)
  50. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name='类别', default=CUSTOMER)
  51. precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
  52. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  53. amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
  54. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人', related_name='pay_user',
  55. on_delete=models.PROTECT)
  56. pay_time = models.DateTimeField(verbose_name=u"创建时间", null=True)
  57. class Meta:
  58. db_table = "pay"
  59. verbose_name = u"支付信息"
  60. ordering = ('-id',)
  61. default_permissions = ()
  62. def payClosed(self):
  63. if self.status != Pay.WAIT:
  64. return
  65. self.status = Pay.UNDO
  66. self.save()
  67. def paySuccess(self, pay_amount):
  68. if self.status != Pay.WAIT:
  69. return
  70. self.status = Pay.PAY
  71. self.amount = Formater.formatPrice(pay_amount)
  72. self.pay_time = timezone.now()
  73. self.save()
  74. order = Order.objects.filter(pay=self).first()
  75. if order:
  76. order.status = Order.FINISH
  77. order.actual_amount = self.amount
  78. if order.coupon:
  79. order.coupon_deduction = order.coupon.amount
  80. order.coupon.count += 1
  81. order.coupon.save()
  82. order.save()
  83. @staticmethod
  84. def getByNo(pay_no):
  85. instance = Pay.objects.filter(pay_no=pay_no).first()
  86. if not instance:
  87. raise CustomError(u'未找到相应的支付单号!')
  88. return instance
  89. # 小程序支付
  90. @staticmethod
  91. def wechatAppPay(user, amount, type=1):
  92. item = Pay._precreatePay(
  93. user,
  94. amount,
  95. type,
  96. )
  97. return item
  98. @staticmethod
  99. def _precreatePay(user, amount, type):
  100. pay_no = '{0}{1}'.format(user.id, timezone.now().strftime('%y%m%d%H%M%S'))
  101. pay = Pay.objects.create(
  102. pay_no=pay_no,
  103. status=Pay.WAIT,
  104. precreate_amount=amount,
  105. user=user,
  106. type=type,
  107. )
  108. return pay
  109. class Order(models.Model):
  110. WAIT_PAY = 1
  111. FINISH = 2
  112. CANCEL = 3
  113. STATUS_CHOICES = (
  114. (WAIT_PAY, u'待付款'),
  115. (FINISH, u'已完成'),
  116. (CANCEL, u'已取消'),
  117. )
  118. ONLINE_PAY = 1
  119. PAYMENT_CHOICES = (
  120. (ONLINE_PAY, u'在线支付'),
  121. )
  122. no = models.CharField(max_length=50, verbose_name=u'订单号', blank=True)
  123. pay = models.ForeignKey(Pay, verbose_name='支付信息', on_delete=models.PROTECT, null=True, editable=False)
  124. coupon = models.ForeignKey(Coupon, verbose_name='优惠券', editable=False, on_delete=models.PROTECT, null=True)
  125. commodity = models.ForeignKey(Commodity, verbose_name='商品', on_delete=models.PROTECT, null=True)
  126. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"订单状态", default=WAIT_PAY)
  127. notes = models.CharField(max_length=500, verbose_name=u"备注", null=True)
  128. create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='order_create_user', verbose_name=u"添加人",
  129. on_delete=models.PROTECT, editable=False)
  130. create_time = models.DateTimeField(verbose_name=u'添加时间', auto_now_add=True, editable=False)
  131. student = models.ForeignKey(Student, verbose_name=u'学生', related_name='customer_order_student',
  132. on_delete=models.PROTECT, null=True)
  133. count = models.BigIntegerField(verbose_name=u'数量', default=0)
  134. total_amount = models.BigIntegerField(verbose_name=u'总金额', editable=False, default=0)
  135. coupon_deduction = models.BigIntegerField(verbose_name=u'优惠券抵扣', editable=False, default=0)
  136. actual_amount = models.BigIntegerField(verbose_name=u'实付金额', editable=False, default=0)
  137. class Meta:
  138. db_table = "order"
  139. verbose_name = u"订单管理"
  140. ordering = ('-id',)
  141. default_permissions = ()
  142. permissions = [
  143. ('view_order', u'查看'),
  144. ]
  145. def get_no(self):
  146. now = timezone.now()
  147. no = '%s%s%s' % ('C', self.create_user.id, now.strftime('%Y%m%d%H%M%S%f'))
  148. return no
  149. @staticmethod
  150. def get_instance_by_id(id):
  151. try:
  152. id = int(id)
  153. except:
  154. raise CustomError('无效的订单ID')
  155. instance = Order.objects.filter(pk=id).first()
  156. if not instance:
  157. raise CustomError('未找到对应的订单')
  158. return instance
  159. class ShoppingCart(models.Model):
  160. commodity = models.ForeignKey(Commodity, verbose_name='产品', on_delete=models.PROTECT)
  161. quantity = models.PositiveIntegerField(verbose_name="数量", default=1)
  162. create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)
  163. create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='shopping_cart_create_user',
  164. verbose_name=u"下单人",
  165. on_delete=models.PROTECT, editable=False)
  166. class Meta:
  167. db_table = "shopping_cart"
  168. verbose_name = "购物车"
  169. ordering = ['-id', ]
  170. default_permissions = ()