models.py 7.7 KB

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