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. # images = models.ForeignKey('Upload', verbose_name='营业执照图片',on_delete=models.PROTECT, blank=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=20, 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()
  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.save()
  131. # 支付宝回调,付款
  132. def payConfirm(self, no):
  133. if self.status != Pay.PAY:
  134. return
  135. pay_amount = 0
  136. if self.pay_channel == Pay.ALIPAY:
  137. pay_amount = Alipay.queryUnifiedOrder(no)
  138. pay_amount = Formater.formatAmount(pay_amount)
  139. elif self.pay_channel == Pay.WECHAT:
  140. pay_amount = WeChatResponse().orderquery(no)
  141. pay_amount = Formater.formatPrice(pay_amount)
  142. self.status = Pay.CONFIRM
  143. self.amount = pay_amount
  144. self.save()
  145. @staticmethod
  146. def getByNo(pay_no):
  147. instance = Pay.objects.filter(pay_no=pay_no).first()
  148. if not instance:
  149. raise CustomError(u'未找到相应的支付单号!')
  150. return instance
  151. # 微信支付
  152. @staticmethod
  153. def wechatPay(user, tenant_id, amount):
  154. item = Pay._precreatePay(
  155. user,
  156. tenant_id,
  157. Pay.WECHAT,
  158. amount
  159. )
  160. return item
  161. # 支付宝支付
  162. @staticmethod
  163. def alipayPay(user, tenant_id, amount):
  164. item = Pay._precreatePay(
  165. user,
  166. tenant_id,
  167. Pay.ALIPAY,
  168. amount
  169. )
  170. return item
  171. @staticmethod
  172. def _precreatePay(user, tenant_id, pay_channel, amount):
  173. pay_no = '{0}{1}'.format(tenant_id, timezone.now().strftime('%y%m%d%H%M%S'))
  174. pay = Pay.objects.create(
  175. tenant_id=tenant_id,
  176. pay_no=pay_no,
  177. pay_channel=pay_channel,
  178. status=Pay.WAIT,
  179. precreate_amount=amount,
  180. user=user,
  181. )
  182. qrcode = ''
  183. if pay_channel == Pay.WECHAT:
  184. qrcode = WeChatResponse().unifiedOrder(pay.pay_no, round(float(Formater.formatAmountShow(amount)), 2))
  185. pass
  186. elif pay_channel == Pay.ALIPAY:
  187. qrcode = Alipay.payUnifiedOrder(pay.pay_no, round(float(Formater.formatAmountShow(amount)), 2))
  188. pay.qrcode = qrcode
  189. pay.save()
  190. return pay