models.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #coding=utf-8
  2. from django.db import models
  3. from django.utils import timezone
  4. from django.conf import settings
  5. from apps.package_order.models import PackageOrder
  6. from apps.vehicle_order.models import VehicleOrder
  7. from apps.vehicle_model.models import Model
  8. from apps.package.models import Package
  9. from apps.commission_order.models import CommissionOrder, CommissionOrderPackage
  10. from apps.tenant.models import Tenant
  11. from apps.WechatApplet.models import WechatApplet
  12. from apps.customer.models import CustomerWechat
  13. from apps.customer.models import Customer
  14. from apps.activity.models import Order
  15. from apps.account.models import Branch
  16. from util.exceptions import CustomError
  17. from util.wechatpay import WechatPay
  18. class Pay(models.Model):
  19. WAIT = 1
  20. CONFIRM = 2
  21. CLOSED = 3
  22. STATUS_CHOICES = (
  23. (WAIT, u'待付款'),
  24. (CONFIRM, u'已付款'),
  25. (CLOSED, u'已关闭'),
  26. )
  27. branch = models.ForeignKey(Branch, verbose_name=u"门店", on_delete=models.PROTECT, editable=False)
  28. no = models.CharField(max_length=64, verbose_name=u"单号")
  29. create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
  30. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
  31. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"支付状态")
  32. precreate_amount = models.BigIntegerField(verbose_name=u"预支付金额")
  33. amount = models.BigIntegerField(verbose_name=u"实际支付金额", null=True)
  34. class Meta:
  35. db_table = "pay"
  36. verbose_name = u"支付"
  37. ordering = ('-id',)
  38. index_together = (
  39. 'create_time',
  40. 'status',
  41. )
  42. unique_together = (
  43. 'no',
  44. )
  45. default_permissions = ()
  46. def payClosed(self):
  47. if self.status != Pay.WAIT:
  48. return
  49. self.status = Pay.CLOSED
  50. self.save()
  51. def payConfirm(self, amount):
  52. if self.status != Pay.WAIT:
  53. return
  54. self.status = Pay.CONFIRM
  55. self.amount = amount
  56. self.save()
  57. order = Order.objects.filter(pay=self).first()
  58. if order:
  59. order.status = Order.FINISH
  60. order.amount = self.amount
  61. order.save()
  62. @staticmethod
  63. def getByNo(no):
  64. instance = Pay.objects.filter(no=no).first()
  65. if not instance:
  66. raise CustomError(u'未找到相应的支付单!')
  67. return instance
  68. @staticmethod
  69. def wechatPay(branch, customer, amount, openid):
  70. instance = Pay._addnew(branch, customer, amount)
  71. return instance, instance._wechatUnifiedOrder(openid)
  72. @staticmethod
  73. def _addnew(branch, customer, amount):
  74. if amount <= 0:
  75. raise CustomError(u'无效的付款金额!')
  76. no = timezone.now().strftime('%y%m%d%H%M%S') + str(customer.id)
  77. instance = Pay.objects.create(
  78. branch=branch,
  79. no=no,
  80. customer=customer,
  81. type=type,
  82. status=Pay.WAIT,
  83. precreate_amount=amount
  84. )
  85. return instance
  86. def _wechatUnifiedOrder(self, openid):
  87. wechatpay = WechatPay(settings.APPID, settings.AGENT_NUM, settings.AGENT_KEY)
  88. wechatpay.unifiedOrder(self.no, self.precreate_amount, openid)
  89. data = wechatpay.getAppString()
  90. return data