models.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. # coding=utf-8
  2. from django.db import models
  3. from django.utils import timezone
  4. from django.conf import settings
  5. from django.contrib.auth import get_user_model
  6. from utils.wx.wechat import WeChat
  7. from utils.exceptions import CustomError
  8. from utils.wx.WXBizDataCrypt import WXBizDataCrypt
  9. from apps.WechatApplet.models import WechatApplet
  10. User = get_user_model()
  11. class Customer(models.Model):
  12. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'用户', editable=False, related_name='customer_user', on_delete=models.PROTECT)
  13. is_distributor = models.BooleanField(verbose_name=u"分销商", default=False)
  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. face = models.CharField(max_length=200, verbose_name=u'头像', null=True)
  18. balance = models.BigIntegerField(verbose_name=u'余额', default=0, editable=False)
  19. points = models.IntegerField(verbose_name=u'积分', default=0, editable=False)
  20. success_count = models.IntegerField(verbose_name=u'成交次数', default=0, editable=False)
  21. total_amount = models.BigIntegerField(verbose_name=u'累计消费金额', default=0, editable=False)
  22. total_point = models.BigIntegerField(verbose_name=u'累计消费积分', default=0, editable=False)
  23. class Meta:
  24. db_table = "customer"
  25. verbose_name = u'客户管理'
  26. ordering = ['-id']
  27. index_together = (
  28. 'name',
  29. 'tel',
  30. )
  31. default_permissions = ()
  32. permissions = []
  33. def setInfo(self, appid, openid, encryptedData, iv):
  34. wx_customer = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
  35. if not wx_customer:
  36. raise CustomError(u'未找到相应的微信客户!')
  37. if wx_customer.customer and wx_customer.customer.id != self.id:
  38. raise CustomError(u'该微信已同步其他客户!')
  39. if not wx_customer.customer:
  40. wx_customer.customer = self
  41. wx_customer.save()
  42. pc = WXBizDataCrypt(wx_customer.wechat_app.authorizer_appid, wx_customer.session_key)
  43. result = pc.decrypt(encryptedData, iv)
  44. self.name = result['nickName']
  45. self.gender = result['gender']
  46. self.face = result['avatarUrl']
  47. self.save()
  48. return self.face, self.name
  49. class SuperiorDistributor(models.Model):
  50. customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, related_name='superior_distributor_customer', on_delete=models.PROTECT)
  51. one_level = models.ForeignKey(Customer, verbose_name=u'一级分销', related_name='superior_distributor_one_level', on_delete=models.PROTECT, null=True, blank=True)
  52. tow_level = models.ForeignKey(Customer, verbose_name=u'二级分销', related_name='superior_distributor_tow_level', on_delete=models.PROTECT, null=True, blank=True)
  53. three_level = models.ForeignKey(Customer, verbose_name=u'三级分销', related_name='superior_distributor_three_level', on_delete=models.PROTECT, null=True, blank=True)
  54. four_level = models.ForeignKey(Customer, verbose_name=u'四级分销', related_name='superior_distributor_four_level', on_delete=models.PROTECT, null=True, blank=True)
  55. five_level = models.ForeignKey(Customer, verbose_name=u'五级分销', related_name='superior_distributor_five_level', on_delete=models.PROTECT, null=True, blank=True)
  56. class Meta:
  57. db_table = "superior_distributor"
  58. verbose_name = u'上级分销'
  59. ordering = ['-id']
  60. default_permissions = ()
  61. permissions = []
  62. class CustomerWechat(models.Model):
  63. wechat_app = models.ForeignKey(WechatApplet, verbose_name=u'小程序', on_delete=models.PROTECT, editable=False)
  64. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False, null=True)
  65. openid = models.CharField(max_length=512, verbose_name=u"openid")
  66. session_key = models.CharField(max_length=512, verbose_name=u'session_key',null=True)
  67. class Meta:
  68. db_table = "customer_wechat"
  69. verbose_name = u'微信客户'
  70. unique_together = [
  71. ('openid')
  72. ]
  73. default_permissions = ()
  74. @staticmethod
  75. def login(code, appid):
  76. '''
  77. 微信自动登录小程序
  78. :param code:
  79. :param appid:
  80. :return:
  81. '''
  82. wx = WechatApplet.getByAppid(appid)
  83. res = WeChat.code2Session(appid, wx.secret, code)
  84. instance = CustomerWechat.objects.filter(openid=res['openid'], wechat_app=wx).first()
  85. if not instance:
  86. instance = CustomerWechat.objects.create(wechat_app=wx, openid=res['openid'], session_key=res['session_key'])
  87. else:
  88. instance.session_key = res['session_key']
  89. instance.save()
  90. return instance
  91. @staticmethod
  92. def bindWechat(appid, openid, phoneEncryptedData, phoneIv):
  93. '''
  94. 微信登录小程序
  95. 判断是否有推荐人,如果有且推荐人是分销商,就要创建上级分销表,同时查询推荐人是否存在上级分销表 如果存在就要将推荐人的上级分销相应的添加到本人的上级分销表里
  96. :param appid:
  97. :param openid:
  98. :param phoneEncryptedData:
  99. :param phoneIv:
  100. :return:
  101. '''
  102. wx_customer = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
  103. if not wx_customer:
  104. raise CustomError(u'未找到相应的微信客户!')
  105. pc = WXBizDataCrypt(appid, wx_customer.session_key)
  106. phon_data = pc.decrypt(phoneEncryptedData, phoneIv)
  107. tel = phon_data['purePhoneNumber']
  108. if wx_customer.customer:
  109. if wx_customer.customer.user.username != tel:
  110. raise CustomError(u'微信绑定的手机号与系统记录的不符!')
  111. else:
  112. return wx_customer.customer
  113. user = User.objects.filter(username=tel).first()
  114. if not user:
  115. user = User.objects.create_customer(tel, password=tel, **{'is_active': True})
  116. customer = Customer.objects.filter(user=user).first()
  117. if not customer:
  118. customer = Customer.objects.create(user=user, name=tel, tel=tel)
  119. wx_customer.customer = customer
  120. wx_customer.save()
  121. return customer
  122. class Area(models.Model):
  123. PROVINCE = 0
  124. CITY = 1
  125. COUNTY = 2
  126. LEVEL_CHOICES = (
  127. (PROVINCE, u'省级'),
  128. (CITY, u'市级'),
  129. (COUNTY, u'县区级'),
  130. )
  131. name = models.CharField(verbose_name=u'名称', max_length=50, blank=True, null=True)
  132. level = models.IntegerField(verbose_name=u'层级', choices=LEVEL_CHOICES)
  133. province_name = models.CharField(u'所属省', max_length=50, blank=True, null=True)
  134. city_name = models.CharField(u'所属地市', max_length=50, blank=True, null=True)
  135. province = models.ForeignKey('Area', verbose_name=u'所属省', related_name='province_children', on_delete=models.PROTECT, blank=True, null=True)
  136. city = models.ForeignKey('Area', verbose_name=u'所属地市', related_name='city_children', on_delete=models.PROTECT, blank=True, null=True)
  137. def __unicode__(self):
  138. return '%s' % (self.name)
  139. class Meta:
  140. verbose_name = u"地区"
  141. db_table = "area"
  142. class CustomerAddress(models.Model):
  143. customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False)
  144. name = models.CharField(verbose_name=u'收货人姓名', max_length=20)
  145. tel = models.CharField(verbose_name=u'收货人电话', max_length=11)
  146. province = models.ForeignKey(Area, verbose_name=u'省', related_name='address_province', on_delete=models.PROTECT)
  147. city = models.ForeignKey(Area, verbose_name=u'地市', related_name='address_city', null=True, on_delete=models.PROTECT)
  148. county = models.ForeignKey(Area, verbose_name=u'区县', related_name='address_county', null=True, on_delete=models.PROTECT)
  149. address = models.CharField(verbose_name=u'详细地址', max_length=500)
  150. default = models.BooleanField(verbose_name=u'默认', default=False)
  151. delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
  152. create_time = models.DateTimeField(verbose_name=u'创建时间', default=timezone.now, editable=False)
  153. class Meta:
  154. db_table = 'customer_address'
  155. verbose_name = u'收货地址'
  156. ordering = ['-default', '-id']
  157. default_permissions = ()
  158. def get_address(self):
  159. return '{}{}{}{}'.format(self.province.name, self.city.name, self.county.name, self.address)
  160. def destory(self, queryset):
  161. if self.default:
  162. self.default = False
  163. default = queryset.first()
  164. if default:
  165. default.default = True
  166. default.save()
  167. self.delete = True
  168. self.save()