mi
This commit is contained in:
@@ -3,6 +3,86 @@ from django.utils.html import format_html
|
||||
import qrcode
|
||||
from io import BytesIO
|
||||
import base64
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
class WeChatUser(models.Model):
|
||||
"""
|
||||
微信小程序用户模型
|
||||
"""
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='wechat_profile', verbose_name="关联系统用户")
|
||||
openid = models.CharField(max_length=64, unique=True, verbose_name="OpenID")
|
||||
unionid = models.CharField(max_length=64, blank=True, null=True, verbose_name="UnionID", db_index=True)
|
||||
session_key = models.CharField(max_length=64, verbose_name="SessionKey", blank=True)
|
||||
nickname = models.CharField(max_length=64, verbose_name="昵称", blank=True)
|
||||
avatar_url = models.URLField(verbose_name="头像URL", blank=True)
|
||||
gender = models.IntegerField(default=0, verbose_name="性别", help_text="0:未知, 1:男, 2:女")
|
||||
country = models.CharField(max_length=64, verbose_name="国家", blank=True)
|
||||
province = models.CharField(max_length=64, verbose_name="省份", blank=True)
|
||||
city = models.CharField(max_length=64, verbose_name="城市", blank=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||
|
||||
def __str__(self):
|
||||
return self.nickname or self.openid
|
||||
|
||||
class Meta:
|
||||
verbose_name = "微信用户"
|
||||
verbose_name_plural = "微信用户管理"
|
||||
|
||||
|
||||
class Distributor(models.Model):
|
||||
"""
|
||||
分销员模型 (替代原 Salesperson 或与其并存,此处为新系统)
|
||||
"""
|
||||
STATUS_CHOICES = (
|
||||
('pending', '审核中'),
|
||||
('active', '正常'),
|
||||
('disabled', '已禁用'),
|
||||
)
|
||||
|
||||
user = models.OneToOneField(WeChatUser, on_delete=models.CASCADE, related_name='distributor', verbose_name="关联微信用户")
|
||||
parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, related_name='children', verbose_name="上级分销员")
|
||||
level = models.IntegerField(default=1, verbose_name="分销等级")
|
||||
commission_rate = models.DecimalField(max_digits=5, decimal_places=4, default=0.10, verbose_name="分佣比例", help_text="例如 0.10 表示 10%")
|
||||
total_earnings = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name="累计收益")
|
||||
withdrawable_balance = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name="可提现余额")
|
||||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="状态")
|
||||
invite_code = models.CharField(max_length=20, unique=True, blank=True, verbose_name="邀请码")
|
||||
qr_code_url = models.URLField(blank=True, verbose_name="推广二维码URL")
|
||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="申请时间")
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.user.nickname} - {self.get_status_display()}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = "分销员"
|
||||
verbose_name_plural = "分销员管理"
|
||||
|
||||
|
||||
class Withdrawal(models.Model):
|
||||
"""
|
||||
提现记录
|
||||
"""
|
||||
STATUS_CHOICES = (
|
||||
('pending', '审核中'),
|
||||
('approved', '已打款'),
|
||||
('rejected', '已拒绝'),
|
||||
)
|
||||
|
||||
distributor = models.ForeignKey(Distributor, on_delete=models.CASCADE, related_name='withdrawals', verbose_name="分销员")
|
||||
amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="提现金额")
|
||||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="状态")
|
||||
remark = models.TextField(blank=True, verbose_name="备注")
|
||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="申请时间")
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.distributor.user.nickname} - ¥{self.amount}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = "提现记录"
|
||||
verbose_name_plural = "提现管理"
|
||||
|
||||
class ESP32Config(models.Model):
|
||||
"""
|
||||
@@ -146,6 +226,9 @@ class Order(models.Model):
|
||||
|
||||
# 销售归属
|
||||
salesperson = models.ForeignKey(Salesperson, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属销售员", related_name='orders')
|
||||
|
||||
# 关联微信用户
|
||||
wechat_user = models.ForeignKey(WeChatUser, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="下单微信用户", related_name='orders')
|
||||
|
||||
# 用户信息
|
||||
customer_name = models.CharField(max_length=100, verbose_name="收货人姓名", default="")
|
||||
|
||||
Reference in New Issue
Block a user