This commit is contained in:
jeremygan2021
2026-02-11 01:31:21 +08:00
parent 61afc52ac2
commit 2d090cd0f4
97 changed files with 3661 additions and 4 deletions

View File

@@ -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="")