models.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. # coding=utf-8
  2. from django.db import transaction
  3. from django.db import models
  4. from django.utils import timezone
  5. from django.conf import settings
  6. from apps.images.models import Images
  7. from utils.wx.wechat import WeChat
  8. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  9. from utils.exceptions import CustomError
  10. from apps.foundation.models import Config
  11. from apps.account.models import User
  12. class Customer(models.Model):
  13. user = models.ForeignKey(settings.AUTH_USER_MODEL, editable=False, on_delete=models.PROTECT, verbose_name=u'用户')
  14. name = models.CharField(max_length=100, verbose_name=u"姓名")
  15. tel = models.CharField(max_length=50, verbose_name=u'电话')
  16. gender = models.PositiveSmallIntegerField(choices=settings.GENDER_CHOICES, verbose_name=u'性别', null=True)
  17. create_time = models.DateTimeField(verbose_name=u"添加时间", default=timezone.now, editable=False)
  18. face = models.ForeignKey(Images, verbose_name=u'头像', on_delete=models.PROTECT, null=True)
  19. class Meta:
  20. db_table = "customer"
  21. verbose_name = u"客户管理"
  22. ordering = ['-id']
  23. index_together = (
  24. 'name',
  25. 'tel',
  26. )
  27. default_permissions = ()
  28. @staticmethod
  29. def getOrRegister(user):
  30. customer = Customer.objects.filter(user=user).first()
  31. if customer:
  32. return customer
  33. with transaction.atomic():
  34. customer = Customer.objects.create(user=user, tel=user.username, name=user.username)
  35. return customer
  36. def setInfo(self, nickName, gender, avatarUrl):
  37. self.name = nickName
  38. if gender == 1:
  39. self.gender = settings.MALE
  40. elif gender == 2:
  41. self.gender = settings.FEMALE
  42. else:
  43. self.gender = settings.UNKNOW
  44. if self.face == None and avatarUrl != None:
  45. self.face = Images.downLoadFace(self, avatarUrl)
  46. self.save()
  47. class CustomerWechat(models.Model):
  48. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False, null=True)
  49. openid = models.CharField(max_length=512, verbose_name=u"openid")
  50. session_key = models.CharField(max_length=512, verbose_name=u'session_key',null=True)
  51. class Meta:
  52. db_table = 'customer_wechat'
  53. verbose_name = u'微信客户'
  54. unique_together = [
  55. ('openid')
  56. ]
  57. default_permissions = ()
  58. @staticmethod
  59. def login(code):
  60. secret = Config.getConfigValue(Config.KEY_WECHAT_SESSION_KEY)
  61. appid = Config.getConfigValue(Config.KEY_WECHAT_APPID)
  62. res = WeChat.code2Session(appid, secret, code)
  63. instance = CustomerWechat.objects.filter(openid=res['openid']).first()
  64. if not instance:
  65. instance = CustomerWechat.objects.create(
  66. openid=res['openid'],
  67. session_key=res['session_key']
  68. )
  69. else:
  70. instance.session_key = res['session_key']
  71. instance.save()
  72. return instance
  73. @staticmethod
  74. def bindWechat(appid, openid, phoneEncryptedData, phoneIv):
  75. customer_wechat = CustomerWechat.objects.filter(openid=openid).first()
  76. if not customer_wechat:
  77. raise CustomError(u'未找到相应的微信客户!')
  78. pc = WXBizDataCrypt(appid, customer_wechat.session_key)
  79. phon_data = pc.decrypt(phoneEncryptedData, phoneIv)
  80. tel = phon_data['purePhoneNumber']
  81. if customer_wechat.customer:
  82. if customer_wechat.customer.user.username != tel:
  83. raise CustomError(u'微信绑定的手机号与系统记录的不符!')
  84. else:
  85. return customer_wechat.customer
  86. customer = Customer.objects.filter(tel=tel).first()
  87. if not customer:
  88. Customer.objects.create(tel=tel, name=tel)
  89. user = User.objects.filter(username=tel).first()
  90. if not user:
  91. user = User.objects.create_customer(tel, password='')
  92. try:
  93. with transaction.atomic():
  94. customer = Customer.getOrRegister(user=user)
  95. except:
  96. raise CustomError(u'用户注册失败!')
  97. customer_wechat.customer = customer
  98. customer_wechat.save()
  99. return customer
  100. class CustomerVehicle(models.Model):
  101. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
  102. name = models.CharField(max_length=100, verbose_name=u"姓名")
  103. tel = models.CharField(max_length=50, verbose_name=u'电话')
  104. vin = models.CharField(max_length=20)
  105. number = models.CharField(max_length=20)
  106. model = models.CharField(max_length=200)
  107. delete = models.BooleanField(verbose_name=u"删除", default=False)
  108. class Meta:
  109. db_table = 'customer_vehicle'
  110. verbose_name = u'客户车辆'
  111. ordering = ['-id']
  112. default_permissions = ()
  113. class CustomerAddress(models.Model):
  114. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False)
  115. name = models.CharField(max_length=100, verbose_name=u"姓名")
  116. tel = models.CharField(max_length=50, verbose_name=u'电话')
  117. area = models.CharField(max_length=200, verbose_name=u"地区")
  118. addr = models.CharField(max_length=500, verbose_name=u"详细地址")
  119. default = models.BooleanField(verbose_name=u"默认", default=False)
  120. delete = models.BooleanField(verbose_name=u"删除", default=False)
  121. create_time = models.DateTimeField(verbose_name=u"添加时间", default=timezone.now, editable=False)
  122. class Meta:
  123. db_table = 'customer_address'
  124. verbose_name = u'客户地址'
  125. ordering = ['-id']
  126. default_permissions = ()
  127. def destory(self, queryset):
  128. if self.default:
  129. self.default = False
  130. default = queryset.first()
  131. if default:
  132. default.default = True
  133. default.save()
  134. self.delete = True
  135. self.save()