models.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # coding=utf-8
  2. from django.db import models
  3. from django.conf import settings
  4. from django.db.models import Q
  5. from utils.exceptions import CustomError
  6. from django.utils import timezone
  7. from apps.base import Formater
  8. from apps.WeChatResponse import WeChatResponse
  9. from apps.Alipay import Alipay
  10. class Tenant(models.Model):
  11. company_no = models.CharField(max_length=10, verbose_name=u'单位编号', blank=True, null=True)
  12. company_name = models.CharField(max_length=200, verbose_name=u'单位名称', blank=True, null=True)
  13. organ_code = models.CharField(max_length=200, verbose_name=u'组织代码', blank=True, null=True)
  14. # images = models.ForeignKey('Upload', verbose_name='营业执照图片',on_delete=models.PROTECT, blank=True)
  15. name = models.CharField(max_length=20, verbose_name=u'联系人名称')
  16. tel = models.CharField(max_length=20, verbose_name=u'联系人电话')
  17. address = models.CharField(max_length=20, verbose_name=u'地址', blank=True, null=True)
  18. create_time = models.DateTimeField(verbose_name=u'申请时间', auto_now_add=True, editable=False)
  19. end_date = models.DateField(verbose_name=u'到期时间', editable=False, blank=True, null=True)
  20. status = models.PositiveSmallIntegerField(choices=settings.CHECK_STATE_CHOICES, verbose_name=u'审核状态',
  21. default=settings.DEFAULT)
  22. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"申请人", on_delete=models.PROTECT,
  23. editable=False, null=True)
  24. reject_reason = models.CharField(max_length=200, verbose_name=u'拒绝原因', blank=True, null=True)
  25. delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
  26. class Meta:
  27. db_table = 'tenant'
  28. ordering = ['-id']
  29. verbose_name = '租户'
  30. default_permissions = ()
  31. def get_no(self):
  32. now = int(timezone.now().strftime('%H%M%S')) * 1.3
  33. no = '{0}{1}'.format(self.id, now)
  34. return no
  35. @staticmethod
  36. def is_exist(company_name, exclude_id=None):
  37. rows = Tenant.objects.filter(delete=False, company_name=company_name)
  38. if exclude_id:
  39. rows = rows.filter(~Q(id=exclude_id))
  40. return rows.count()
  41. @staticmethod
  42. def getById(id):
  43. try:
  44. id = int(id)
  45. except:
  46. raise CustomError(u'无效的租户id!')
  47. tenant = Tenant.objects.filter(id=id, delete=False).first()
  48. if not tenant:
  49. raise CustomError(u'未找到相应的租户信息!')
  50. return tenant
  51. class RenewLog(models.Model):
  52. tenant = models.ForeignKey(Tenant, verbose_name=u"租户", on_delete=models.PROTECT, editable=False, )
  53. amount = models.FloatField(verbose_name='金额')
  54. create_time = models.DateTimeField(verbose_name=u'续费时间', auto_now_add=True, editable=False)
  55. end_date = models.DateField(verbose_name=u'到期时间', editable=False, blank=True, null=True)
  56. class Meta:
  57. db_table = 'tenant_renew_log'
  58. ordering = ['-id']
  59. verbose_name = '租户续费记录'
  60. class Pay(models.Model):
  61. WAIT = 0
  62. PAY = 1
  63. CONFIRM = 2
  64. UNDO = 4
  65. STATUS_CHOICES = (
  66. (WAIT, u'待付款'),
  67. (PAY, u'已付款'),
  68. (CONFIRM, u'已确认付款'),
  69. (UNDO, u'已取消'),
  70. )
  71. WECHAT = 1
  72. ALIPAY = 2
  73. PAY_CHANNEL_CHOICES = (
  74. (WECHAT, u'微信'),
  75. (ALIPAY, u'支付宝'),
  76. )
  77. pay_no = models.CharField(max_length=25, verbose_name='支付单号',unique=True, null=True)
  78. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name='状态', default=WAIT)
  79. pay_channel = models.PositiveSmallIntegerField(choices=PAY_CHANNEL_CHOICES, verbose_name='支付通道')
  80. precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
  81. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  82. qrcode = models.CharField(max_length=512, verbose_name=u"付款码", null=True)
  83. amount = models.BigIntegerField(verbose_name=u"支付金额", null=True)
  84. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'下单人',related_name='pay_user', on_delete=models.PROTECT)
  85. tenant = models.ForeignKey(Tenant, verbose_name=u'商户',related_name='pay_tenant', on_delete=models.PROTECT)
  86. class Meta:
  87. db_table = "pay"
  88. verbose_name = u"支付信息"
  89. ordering = ('-id',)
  90. default_permissions = ()
  91. def payClosed(self):
  92. if self.status != Pay.WAIT:
  93. return
  94. self.status = Pay.UNDO
  95. self.save()
  96. def paySuccess(self, pay_amount):
  97. if self.status != Pay.WAIT:
  98. return
  99. self.status = Pay.PAY
  100. self.amount = Formater.formatAmount(pay_amount)
  101. self.save()
  102. # 支付宝回调,付款
  103. def payConfirm(self, no):
  104. if self.status != Pay.PAY:
  105. return
  106. pay_amount = 0
  107. if self.pay_channel == Pay.ALIPAY:
  108. pay_amount = Alipay.queryUnifiedOrder(no)
  109. pay_amount = Formater.formatAmount(pay_amount)
  110. elif self.pay_channel == Pay.WECHAT:
  111. pay_amount = WeChatResponse().orderquery(no)
  112. pay_amount = Formater.formatPrice(pay_amount)
  113. self.status = Pay.CONFIRM
  114. self.amount = pay_amount
  115. self.save()
  116. @staticmethod
  117. def getByNo(pay_no):
  118. instance = Pay.objects.filter(pay_no=pay_no).first()
  119. if not instance:
  120. raise CustomError(u'未找到相应的支付单号!')
  121. return instance
  122. # 微信支付
  123. @staticmethod
  124. def wechatPay(user, tenant_id, amount):
  125. item = Pay._precreatePay(
  126. user,
  127. tenant_id,
  128. Pay.WECHAT,
  129. amount
  130. )
  131. return item
  132. # 支付宝支付
  133. @staticmethod
  134. def alipayPay(user, tenant_id, amount):
  135. item = Pay._precreatePay(
  136. user,
  137. tenant_id,
  138. Pay.ALIPAY,
  139. amount
  140. )
  141. return item
  142. @staticmethod
  143. def _precreatePay(user, tenant_id, pay_channel, amount):
  144. pay_no = '{0}{1}'.format(tenant_id, timezone.now().strftime('%y%m%d%H%M%S'))
  145. pay = Pay.objects.create(
  146. tenant_id=tenant_id,
  147. pay_no=pay_no,
  148. pay_channel=pay_channel,
  149. status=Pay.WAIT,
  150. precreate_amount=amount,
  151. user=user,
  152. )
  153. qrcode = ''
  154. if pay_channel == Pay.WECHAT:
  155. qrcode = WeChatResponse().unifiedOrder(pay.pay_no, round(float(Formater.formatAmountShow(amount)), 2))
  156. pass
  157. elif pay_channel == Pay.ALIPAY:
  158. qrcode = Alipay.payUnifiedOrder(pay.pay_no, round(float(Formater.formatAmountShow(amount)), 2))
  159. pay.qrcode = qrcode
  160. pay.save()
  161. return pay