|
@@ -1,6 +1,6 @@
|
|
|
# coding=utf-8
|
|
|
|
|
|
-from django.db import models
|
|
|
+from django.db import models, transaction
|
|
|
from django.utils import timezone
|
|
|
from django.conf import settings
|
|
|
from django.contrib.auth import get_user_model
|
|
@@ -28,7 +28,7 @@ class Customer(models.Model):
|
|
|
|
|
|
success_count = models.IntegerField(verbose_name=u'成交次数', default=0, editable=False)
|
|
|
total_amount = models.BigIntegerField(verbose_name=u'累计消费金额', default=0, editable=False)
|
|
|
- total_point = models.BigIntegerField(verbose_name=u'累计消费积分', default=0, editable=False)
|
|
|
+ total_point = models.IntegerField(verbose_name=u'累计消费积分', default=0, editable=False)
|
|
|
|
|
|
class Meta:
|
|
|
db_table = "customer"
|
|
@@ -41,6 +41,36 @@ class Customer(models.Model):
|
|
|
default_permissions = ()
|
|
|
permissions = []
|
|
|
|
|
|
+ @staticmethod
|
|
|
+ def get_or_create_customer(user, referrer):
|
|
|
+ '''
|
|
|
+
|
|
|
+ :param user: 用户
|
|
|
+ :param referrer: 推荐人 被推荐人是新用户的时候 要创建上级分销记录
|
|
|
+ :return:
|
|
|
+ '''
|
|
|
+ customer = Customer.objects.filter(user=user).first()
|
|
|
+ if customer:
|
|
|
+ return customer
|
|
|
+ with transaction.atomic():
|
|
|
+ customer = Customer.objects.create(user=user, name=user.username, tel=user.username)
|
|
|
+ if referrer:
|
|
|
+ customer.create_distributor(referrer)
|
|
|
+ return customer
|
|
|
+
|
|
|
+ def create_distributor(self, re_customer):
|
|
|
+ referrer = Customer.objects.filter(id=re_customer).first()
|
|
|
+ if not referrer:
|
|
|
+ return ''
|
|
|
+ distributor = SuperiorDistributor.objects.create(customer=self, one_level=referrer)
|
|
|
+ re_distributor = SuperiorDistributor.objects.filter(customer=referrer).first()
|
|
|
+ if re_distributor:
|
|
|
+ distributor.two_level = re_distributor.one_level
|
|
|
+ distributor.three_level = re_distributor.two_level
|
|
|
+ distributor.four_level = re_distributor.three_level
|
|
|
+ distributor.five_level = re_distributor.four_level
|
|
|
+ distributor.save()
|
|
|
+
|
|
|
def setInfo(self, appid, openid, encryptedData, iv):
|
|
|
wx_customer = CustomerWechat.objects.filter(openid=openid, wechat_app__authorizer_appid=appid).first()
|
|
|
if not wx_customer:
|
|
@@ -58,14 +88,45 @@ class Customer(models.Model):
|
|
|
self.save()
|
|
|
return self.face, self.name
|
|
|
|
|
|
-
|
|
|
+'''
|
|
|
+-------------------------------------------------分销商备注---------------------------------------
|
|
|
+A——>B
|
|
|
+只有B是新用户的时候B才能成为A的一级分销商
|
|
|
+A——>B
|
|
|
+AB都不是分销商 B也是A的一级分销商
|
|
|
+
|
|
|
+A——>B——>C——>D——>E——>F——>G——>H 按分销商级别记录
|
|
|
+0 1 2 3 4 5
|
|
|
+BCDEF分别是A的五级分销商
|
|
|
+F消费
|
|
|
+F是A的五级分销商 A按五级返利比例获取返利
|
|
|
+F是B的四级分销商 B按四级返利比例获取返利......
|
|
|
+计算返利时 我要去找F分别是谁的几级分销商 不好计算
|
|
|
+A——>B——>C——>D——>E——>F——>G——>H 按各级分销商获取返利的返利级别记录(计算方便所以选择这种方式)
|
|
|
+5 4 3 2 1 0
|
|
|
+F消费
|
|
|
+F是A的五级分销商 A按五级返利比例获取返利
|
|
|
+F是B的四级分销商 B按四级返利比例获取返利......
|
|
|
+计算返利时 只需要找F的各级返利是谁 好计算返利
|
|
|
+A——>B——>C——>D——>E——>F——>G——>H
|
|
|
+5 4 3 2 1 0
|
|
|
+如果F消费 要根据系统设置比例分别给他的上级分销商(F/E/D/C/B/A)返利
|
|
|
+如果E不是分销商那么E就不获得返利
|
|
|
+如果E不是分销商那么D是按二级返利比例获取返利
|
|
|
+如果E后来成为分销商后 F再消费E还能获取返利
|
|
|
+
|
|
|
+要查看X的一级分销商都有谁 只需要查一级返利关联X的客户
|
|
|
+
|
|
|
+查分销商Y下级分销商
|
|
|
+SuperiorDistributor.objects.filter(Q(one_level=Y) | Q(two_level=Y) | Q(three_level=Y) | Q(four_level=Y) | Q(five_level=Y))的customer就是Y的下级分销
|
|
|
+'''
|
|
|
class SuperiorDistributor(models.Model):
|
|
|
customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, related_name='superior_distributor_customer', on_delete=models.PROTECT)
|
|
|
- one_level = models.ForeignKey(Customer, verbose_name=u'一级分销', related_name='superior_distributor_one_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
- tow_level = models.ForeignKey(Customer, verbose_name=u'二级分销', related_name='superior_distributor_tow_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
- three_level = models.ForeignKey(Customer, verbose_name=u'三级分销', related_name='superior_distributor_three_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
- four_level = models.ForeignKey(Customer, verbose_name=u'四级分销', related_name='superior_distributor_four_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
- five_level = models.ForeignKey(Customer, verbose_name=u'五级分销', related_name='superior_distributor_five_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
+ one_level = models.ForeignKey(Customer, verbose_name=u'一级返利', related_name='superior_distributor_one_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
+ two_level = models.ForeignKey(Customer, verbose_name=u'二级返利', related_name='superior_distributor_tow_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
+ three_level = models.ForeignKey(Customer, verbose_name=u'三级返利', related_name='superior_distributor_three_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
+ four_level = models.ForeignKey(Customer, verbose_name=u'四级返利', related_name='superior_distributor_four_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
+ five_level = models.ForeignKey(Customer, verbose_name=u'五级返利', related_name='superior_distributor_five_level', on_delete=models.PROTECT, null=True, blank=True)
|
|
|
|
|
|
class Meta:
|
|
|
db_table = "superior_distributor"
|
|
@@ -108,7 +169,7 @@ class CustomerWechat(models.Model):
|
|
|
return instance
|
|
|
|
|
|
@staticmethod
|
|
|
- def bindWechat(appid, openid, phoneEncryptedData, phoneIv):
|
|
|
+ def bindWechat(appid, openid, phoneEncryptedData, phoneIv, referrer):
|
|
|
'''
|
|
|
微信登录小程序
|
|
|
判断是否有推荐人,如果有且推荐人是分销商,就要创建上级分销表,同时查询推荐人是否存在上级分销表 如果存在就要将推荐人的上级分销相应的添加到本人的上级分销表里
|
|
@@ -135,44 +196,19 @@ class CustomerWechat(models.Model):
|
|
|
user = User.objects.create_customer(tel, password=tel, **{'is_active': True})
|
|
|
customer = Customer.objects.filter(user=user).first()
|
|
|
if not customer:
|
|
|
- customer = Customer.objects.create(user=user, name=tel, tel=tel)
|
|
|
+ customer = Customer.get_or_create_customer(user, referrer)
|
|
|
wx_customer.customer = customer
|
|
|
wx_customer.save()
|
|
|
return customer
|
|
|
|
|
|
|
|
|
-class Area(models.Model):
|
|
|
- PROVINCE = 0
|
|
|
- CITY = 1
|
|
|
- COUNTY = 2
|
|
|
- LEVEL_CHOICES = (
|
|
|
- (PROVINCE, u'省级'),
|
|
|
- (CITY, u'市级'),
|
|
|
- (COUNTY, u'县区级'),
|
|
|
- )
|
|
|
-
|
|
|
- name = models.CharField(verbose_name=u'名称', max_length=50, blank=True, null=True)
|
|
|
- level = models.IntegerField(verbose_name=u'层级', choices=LEVEL_CHOICES)
|
|
|
- province_name = models.CharField(u'所属省', max_length=50, blank=True, null=True)
|
|
|
- city_name = models.CharField(u'所属地市', max_length=50, blank=True, null=True)
|
|
|
- province = models.ForeignKey('Area', verbose_name=u'所属省', related_name='province_children', on_delete=models.PROTECT, blank=True, null=True)
|
|
|
- city = models.ForeignKey('Area', verbose_name=u'所属地市', related_name='city_children', on_delete=models.PROTECT, blank=True, null=True)
|
|
|
-
|
|
|
- def __unicode__(self):
|
|
|
- return '%s' % (self.name)
|
|
|
-
|
|
|
- class Meta:
|
|
|
- verbose_name = u"地区"
|
|
|
- db_table = "area"
|
|
|
-
|
|
|
-
|
|
|
class CustomerAddress(models.Model):
|
|
|
customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT, editable=False)
|
|
|
name = models.CharField(verbose_name=u'收货人姓名', max_length=20)
|
|
|
tel = models.CharField(verbose_name=u'收货人电话', max_length=11)
|
|
|
- province = models.ForeignKey(Area, verbose_name=u'省', related_name='address_province', on_delete=models.PROTECT)
|
|
|
- city = models.ForeignKey(Area, verbose_name=u'地市', related_name='address_city', null=True, on_delete=models.PROTECT)
|
|
|
- county = models.ForeignKey(Area, verbose_name=u'区县', related_name='address_county', null=True, on_delete=models.PROTECT)
|
|
|
+ province = models.CharField(verbose_name=u'省', max_length=100, null=True)
|
|
|
+ city = models.CharField(verbose_name=u'市', max_length=100, null=True)
|
|
|
+ area = models.CharField(verbose_name=u'县/区', max_length=100, null=True)
|
|
|
address = models.CharField(verbose_name=u'详细地址', max_length=500)
|
|
|
default = models.BooleanField(verbose_name=u'默认', default=False)
|
|
|
delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
|
|
@@ -185,7 +221,7 @@ class CustomerAddress(models.Model):
|
|
|
default_permissions = ()
|
|
|
|
|
|
def get_address(self):
|
|
|
- return '{}{}{}{}'.format(self.province.name, self.city.name, self.county.name, self.address)
|
|
|
+ return '{}{}{}{}'.format(self.province, self.city, self.area, self.address)
|
|
|
|
|
|
def destory(self, queryset):
|
|
|
if self.default:
|