models.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # coding=utf-8
  2. from django.db import models
  3. from django.conf import settings
  4. from django.utils import timezone
  5. from utils.exceptions import CustomError
  6. from apps.base import Formater
  7. from apps.option.models import Balance
  8. from apps.log.models import BizLog
  9. from django.contrib.auth import get_user_model
  10. User = get_user_model()
  11. class Pay(models.Model):
  12. WAIT = 0
  13. PAY = 1
  14. UNDO = 2
  15. STATUS_CHOICES = (
  16. (WAIT, u'待付款'),
  17. (PAY, u'已付款'),
  18. (UNDO, u'已取消'),
  19. )
  20. CUSTOMER = 1
  21. TYPE_CHOICES = (
  22. (CUSTOMER, u'客户'),
  23. )
  24. pay_no = models.CharField(max_length=25, verbose_name='支付单号', unique=True, null=True)
  25. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name='状态', default=WAIT)
  26. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name='类别', default=CUSTOMER)
  27. precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
  28. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  29. amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
  30. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人', related_name='pay_user',
  31. on_delete=models.PROTECT)
  32. pay_time = models.DateTimeField(verbose_name=u"创建时间", null=True)
  33. class Meta:
  34. db_table = "pay"
  35. verbose_name = u"支付信息"
  36. ordering = ('-id',)
  37. default_permissions = ()
  38. def payClosed(self):
  39. if self.status != Pay.WAIT:
  40. return
  41. self.status = Pay.UNDO
  42. self.save()
  43. def paySuccess(self, pay_amount):
  44. if self.status != Pay.WAIT:
  45. return
  46. self.status = Pay.PAY
  47. self.amount = Formater.formatPrice(pay_amount)
  48. self.pay_time = timezone.now()
  49. self.save()
  50. order = Order.objects.filter(pay=self).first()
  51. if order:
  52. order.status = Order.FINISH
  53. order.actual_amount = self.amount
  54. if order.package:
  55. desc = '充值{}元,赠送{}元'.format(Formater.formatPriceShow(order.package.amount),
  56. Formater.formatPriceShow(order.package.give_amount))
  57. Balance.update_balance(order.create_user, order.package.amount+order.package.give_amount, desc)
  58. order.save()
  59. @staticmethod
  60. def getByNo(pay_no):
  61. instance = Pay.objects.filter(pay_no=pay_no).first()
  62. if not instance:
  63. raise CustomError(u'未找到相应的支付单号!')
  64. return instance
  65. # 小程序支付
  66. @staticmethod
  67. def wechatAppPay(user, amount, type=1):
  68. item = Pay._precreatePay(
  69. user,
  70. amount,
  71. type,
  72. )
  73. return item
  74. @staticmethod
  75. def _precreatePay(user, amount, type):
  76. pay_no = '{0}{1}'.format(user.id, timezone.now().strftime('%y%m%d%H%M%S'))
  77. pay = Pay.objects.create(
  78. pay_no=pay_no,
  79. status=Pay.WAIT,
  80. precreate_amount=amount,
  81. user=user,
  82. type=type,
  83. )
  84. return pay
  85. class Package(models.Model):
  86. create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='package_create_user', verbose_name=u"添加人",
  87. on_delete=models.PROTECT, editable=False)
  88. create_time = models.DateTimeField(verbose_name=u'添加时间', auto_now_add=True, editable=False)
  89. amount = models.BigIntegerField(verbose_name=u'充值金额', default=0)
  90. give_amount = models.BigIntegerField(verbose_name=u'赠送余额', default=0)
  91. class Meta:
  92. db_table = "package"
  93. verbose_name = u"套餐"
  94. ordering = ('-id',)
  95. default_permissions = ()
  96. permissions = [
  97. ]
  98. class Order(models.Model):
  99. WAIT_PAY = 1
  100. FINISH = 2
  101. CANCEL = 3
  102. STATUS_CHOICES = (
  103. (WAIT_PAY, u'待付款'),
  104. (FINISH, u'已完成'),
  105. (CANCEL, u'已取消'),
  106. )
  107. no = models.CharField(max_length=50, verbose_name=u'订单号', blank=True)
  108. pay = models.ForeignKey(Pay, verbose_name='支付信息', on_delete=models.PROTECT, null=True, editable=False)
  109. package = models.ForeignKey(Package, verbose_name='套餐', on_delete=models.PROTECT, null=True, editable=False)
  110. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"订单状态", default=WAIT_PAY)
  111. create_user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='order_create_user', verbose_name=u"添加人",
  112. on_delete=models.PROTECT, editable=False)
  113. create_time = models.DateTimeField(verbose_name=u'添加时间', auto_now_add=True, editable=False)
  114. total_amount = models.BigIntegerField(verbose_name=u'总金额', default=0)
  115. balance_deduction = models.BigIntegerField(verbose_name=u'余额抵扣', editable=False, default=0)
  116. actual_amount = models.BigIntegerField(verbose_name=u'实付金额', editable=False, default=0)
  117. class Meta:
  118. db_table = "order"
  119. verbose_name = u"订单管理"
  120. ordering = ('-id',)
  121. default_permissions = ()
  122. permissions = [
  123. ]
  124. def get_no(self):
  125. now = timezone.now()
  126. no = '%s%s' % (self.create_user.id, now.strftime('%Y%m%d%H%M%S'))
  127. return no
  128. @staticmethod
  129. def get_instance_by_id(id):
  130. try:
  131. id = int(id)
  132. except:
  133. raise CustomError('无效的订单ID')
  134. instance = Order.objects.filter(pk=id).first()
  135. if not instance:
  136. raise CustomError('未找到对应的订单')
  137. return instance