models.py 7.9 KB

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