Files
Django/users/models.py

636 lines
33 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from gvsdsdk.model_base import QModel
# ==================== 用户主表(已废弃,迁移至 gvsdsdk.User ====================
class UserMain(AbstractBaseUser, QModel):
# ID字段
id = models.AutoField(primary_key=True, verbose_name='主键ID')
yonghuid = models.CharField(max_length=7, unique=True, db_index=True, verbose_name='用户ID')
# 微信相关字段
openid = models.CharField(max_length=64, unique=True, db_index=True, verbose_name='微信OpenID')
unionid = models.CharField(max_length=64, null=True, blank=True, db_index=True, verbose_name='微信UnionID')
# 基础信息字段
#tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='商品图片URL') # 用CharField
avatar = models.CharField(max_length=500, null=True, blank=True,default='a_long/morentouxiang.jpg', verbose_name='头像') # 用CharField
phone = models.CharField(max_length=11, blank=True, null=True, verbose_name='手机号')
shoujihao_renzheng = models.BooleanField(default=False, verbose_name='手机号是否已认证')
password = models.CharField(max_length=200, null=True, blank=True, verbose_name='密码')
zhifu = models.CharField(max_length=500, null=True, blank=True, verbose_name='收款码图片') # 用CharField
skzhanghao = models.CharField(max_length=11, blank=True, null=True, verbose_name='收款账号')
ip = models.CharField(max_length=50, blank=True, null=True, verbose_name='来访用户ip')
last_login_time = models.DateTimeField(null=True, blank=True, verbose_name='最后登录时间')
# 用户类型字段
user_type = models.CharField(
max_length=10,
choices=[
('normal', '普通用户'),
('dashou', '打手'),
('shop', '商家'),
('guanshi', '管事'),
('admin', '管理员')
],
default='normal',
verbose_name='用户类型'
)
# 状态和时间字段
#is_active = models.BooleanField(default=True, verbose_name='是否激活')
#last_login = models.DateTimeField(blank=True, null=True, verbose_name='最后登录时间')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
# 邀请码字段
#yaoqingma = models.CharField(max_length=20, blank=True, null=True, verbose_name='邀请码')
# 只需要添加这3行
USERNAME_FIELD = 'openid' # 用openid作为用户名
REQUIRED_FIELDS = ['yonghuid'] # 必填字段
class Meta:
managed = False
db_table = 'user_main'
verbose_name = '用户主表'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['yonghuid']),
models.Index(fields=['openid']),
#models.Index(fields=['phone']),
models.Index(fields=['user_type']),
#models.Index(fields=['CreateTime']),
]
def __str__(self):
return f'{self.yonghuid}'
# 新增服务号用户表
class OfficialAccountUser(QModel):
unionid = models.CharField(max_length=64, null =True,db_index=True, verbose_name='UnionID')
official_openid = models.CharField(max_length=64, db_index=True, unique=True, verbose_name='服务号OpenID')
subscribe_time = models.DateTimeField(auto_now_add=True, verbose_name='关注时间')
is_subscribed = models.BooleanField(default=True, verbose_name='是否关注')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'official_account_user'
verbose_name = '服务号用户'
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.unionid[:8]}... (关注: {self.is_subscribed})"
# ==================== 老板扩展表 ====================
class UserBoss(QModel):
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='BossProfile',
verbose_name='关联用户', db_column='UserUUID')
nickname = models.CharField(max_length=50, verbose_name='老板昵称')
zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='消费总额')
alldingdan = models.IntegerField(default=0, verbose_name='订单总数')
alltui = models.IntegerField(default=0, verbose_name='退款总数')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'user_boss'
verbose_name = '老板扩展表'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['user']), ]
# ==================== 打手扩展表 ====================
class UserDashou(QModel):
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='DashouProfile',
verbose_name='关联用户', db_column='UserUUID')
nicheng = models.CharField(max_length=50, null=True, verbose_name='打手昵称')
chenghao = models.CharField(max_length=50, null=True,verbose_name='打手称号')
zhuangtai = models.IntegerField(default=1, verbose_name='打手状态')
zaixianzhuangtai = models.IntegerField(default=1, verbose_name='打手在线状态')
zhanghaozhuangtai = models.IntegerField(default=1, verbose_name='打手账号状态')
jieshao = models.TextField(null=True, verbose_name='打手介绍')
jiedanzongliang = models.IntegerField(default=0, verbose_name='接单总量')
chengjiaozongliang = models.IntegerField(default=0, verbose_name='成交单总量')
tuikuanliang = models.IntegerField(default=0, verbose_name='退款订单总量')
yue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='可提现余额')
zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='打单赚取总额')
dianhua = models.CharField(max_length=20, null=True, verbose_name='打手电话')
wechat = models.CharField(max_length=50,null=True, verbose_name='打手微信号')
yaoqingren = models.CharField(max_length=7,null=True, db_index=True, verbose_name='邀请人ID')
jinrijiedan = models.IntegerField(default=0, verbose_name='今日接单数量')
jinrishouyi = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今日收益金额')
jinyuejiedan = models.IntegerField(default=0, verbose_name='今月接单数量')
jinyueshouyi = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今月收益金额')
jifen = models.IntegerField(default=0, verbose_name='打手积分')
yajin= models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='打手押金')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
last_tixian_date = models.DateField(null=True, blank=True, verbose_name='最近提现日期') # 用于重置今日提现金额
jinritixian_jine = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今日已提现金额')
kaioi_ewai_xiane = models.BooleanField(default=False, verbose_name='是否开启额外提现限额') # True=开启额外限额
ewai_xiane = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='额外提现限额(元)')
class Meta:
db_table = 'user_dashou'
verbose_name = '打手扩展表'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['user']),
#models.Index(fields=['zhuangtai']),
models.Index(fields=['yaoqingren']),
#models.Index(fields=['nicheng']),
]
# ==================== 商家扩展表 ====================
class UserShangjia(QModel):
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='ShopProfile',
verbose_name='关联用户', db_column='UserUUID')
nicheng = models.CharField(max_length=50, unique=True, db_index=True, verbose_name='商家昵称')
zhuangtai = models.IntegerField(choices=[(0, '待审核'), (1, '正常'), (2, '禁用')], default=1,
verbose_name='商家状态')
dianhua = models.CharField(max_length=20,null=True,verbose_name='商家电话')
wechat = models.CharField(max_length=50, null=True, verbose_name='商家微信号')
fabu = models.IntegerField(default=0, verbose_name='发布订单总数量')
tuikuan = models.IntegerField(default=0, verbose_name='退款订单总量')
yue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='商家余额')
chengjiao = models.IntegerField(default=0, verbose_name='商家成交订单总量')
jinridingdan = models.IntegerField(default=0, verbose_name='商家今日订单总量')
jinriliushui = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='商家今日流水')
jinyuedingdan = models.IntegerField(default=0, verbose_name='商家今月订单总量')
jinyueliushui = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='商家今月流水')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'user_shangjia'
verbose_name = '商家扩展表'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['user']),
models.Index(fields=['nicheng']),
]
# ==================== 管事扩展表 ====================
class UserGuanshi(QModel):
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='GuanshiProfile',
verbose_name='关联用户', db_column='UserUUID')
yaoqingren = models.CharField(max_length=7,null=True, db_index=True, verbose_name='邀请人ID')
yaoqingma = models.CharField(max_length=20,null=True,db_index=True, verbose_name='邀请码')
invite_qrcode_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='邀请码二维码图片URL')
dianhua = models.CharField(max_length=20,null=True, verbose_name='管事电话')
wechat = models.CharField(max_length=50,null=True, verbose_name='管事微信号')
yaogingshuliang = models.IntegerField(default=0, verbose_name='邀请打手总数')
zhuangtai = models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='管事状态')
jinrichongzhi = models.IntegerField(default=0, verbose_name='今日充值打手数量')
jinyuechongzhi = models.IntegerField(default=0, verbose_name='今月充值打手数量')
chongzhifenrun = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='充值分佣总额')
yue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='可提现余额')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
# 新增:首次分红金额(针对特殊用户)
fenhong_yici = models.DecimalField(max_digits=10,decimal_places=2,default=0.00,verbose_name='首次分红金额')
# 新增:二次分红开关
fenghong_erci_enabled = models.BooleanField(default=False,verbose_name='开启二次分红')
# 新增:二次分红金额
fenghong_erci = models.DecimalField(max_digits=10,decimal_places=2,default=0.00,verbose_name='二次分红金额')
last_tixian_date = models.DateField(null=True, blank=True, verbose_name='最近提现日期')
jinritixian_jine = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今日已提现金额')
kaioi_ewai_xiane = models.BooleanField(default=False, verbose_name='是否开启额外提现限额')
ewai_xiane = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='额外提现限额(元)')
class Meta:
db_table = 'user_guanshi'
verbose_name = '管事扩展表'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['user']),
models.Index(fields=['yaoqingma']),
]
class UserZuzhang(QModel):
"""组长扩展表与UserMain一对一关联"""
user = models.OneToOneField(
'users.User',
on_delete=models.CASCADE,
related_name='ZuzhangProfile',
verbose_name='关联用户',
db_index=True,
db_column='UserUUID'
)
# 组长邀请码
yaoqingma = models.CharField(max_length=20, null=True, db_index=True, verbose_name='组长邀请码')
# 分佣总额
fenyong_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='分佣总额(元)')
# 可提现金额
ketixian_jine = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='可提现金额(元)')
# 邀请总数
yaoqing_zongshu = models.IntegerField(default=0, verbose_name='邀请总数')
# 今日分佣
jinri_fenyong = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今日分佣(元)')
# 今月分佣
jinyue_fenyong = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今月分佣(元)')
# 账号状态
zhuangtai = models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='账号状态')
# 推广海报相对URL
haibao_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='推广海报相对URL')
# 今日提现
jinri_tixian = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='今日提现金额(元)')
# 最后提现时间
last_tixian_time = models.DateTimeField(null=True, blank=True, verbose_name='最后提现时间')
# 额外提现限额
ewai_tixian_xiane = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='额外提现限额(元)')
# 是否开启额外提现
kaioi_ewai_tixian = models.BooleanField(default=False, verbose_name='开启额外提现')
# 是否开启额外分红
kaioi_ewai_fenhong = models.BooleanField(default=False, verbose_name='开启额外分红')
# 额外分红金额
ewai_fenhong_jine = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='额外分红金额(元)')
# 创建时间
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
# 更新时间
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'user_zuzhang'
verbose_name = '组长扩展表'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['user']),
models.Index(fields=['yaoqingma']),
]
def __str__(self):
return f"组长 {self.user.UserUID}"
class UserShenheguan(QModel):
"""审核官扩展表与UserMain一对一关联"""
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='ShenheguanProfile', verbose_name='关联用户', db_index=True, db_column='UserUUID')
zhuangtai = models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='账号状态')
shenhe_zhuangtai = models.IntegerField(choices=[(0, '空闲'), (1, '审核中')], default=0, verbose_name='审核官状态')
is_renzheng = models.BooleanField(default=False, verbose_name='是否认证')
shenhe_zongshu = models.IntegerField(default=0, verbose_name='审核总数')
tongguo_zongshu = models.IntegerField(default=0, verbose_name='通过总数')
yue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='可提现余额')
zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='赚取总额')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'user_shenheguan'
verbose_name = '审核官扩展表'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['user'])]
# ==================== 管理员扩展表 ====================
class AdminProfile(QModel):
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='AdminProfile',
verbose_name='关联用户', db_column='UserUUID')
password = models.CharField(max_length=255, verbose_name='密码')
wechat = models.CharField(max_length=50, blank=True, verbose_name='管理员微信')
yaoqingma = models.CharField(max_length=20, null=True, db_index=True,verbose_name='管理员邀请码') # 🟢 新增字段
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'admin_profile'
verbose_name = '管理员扩展表'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['user']), ]
class UserKefu(QModel):
user = models.OneToOneField('users.User', on_delete=models.CASCADE, related_name='KefuProfile', verbose_name='关联用户', db_column='UserUUID')
nicheng = models.CharField(max_length=50, verbose_name='客服昵称')
erjimima = models.CharField(max_length=128, verbose_name='二级密码')
zhuangtai = models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='客服状态')
jinrichuli = models.IntegerField(default=0, verbose_name='今日处理订单数')
jinyuechuli = models.IntegerField(default=0, verbose_name='本月处理订单数')
zongchuli = models.IntegerField(default=0, verbose_name='累计处理订单数')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'user_kefu'
verbose_name = '客服扩展表'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['user']),
models.Index(fields=['zhuangtai']),
]
def __str__(self):
return f"{self.nicheng} ({self.user.UserUID})"
class Tixianjilu(QModel):
id = models.AutoField(primary_key=True, verbose_name='提现记录ID')
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='提现用户ID')
avatar = models.CharField(max_length=500, null=True, blank=True, verbose_name='头像') # 用CharField
phone = models.CharField(max_length=11, blank=True, null=True, verbose_name='手机号')
nicheng = models.CharField(max_length=50, null=True, verbose_name='打手昵称')
leixing = models.PositiveIntegerField(null=True, blank=True, verbose_name='提现类型1:打手佣金2管事分红')
zhifu = models.CharField(max_length=500, null=True, blank=True, verbose_name='收款码图片') # 用CharField
skzhanghao = models.CharField(max_length=11, blank=True, null=True, verbose_name='收款账号')
jine = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='提现金额')
# 状态与平台:用整数表示,具体含义由业务逻辑定义
zhuangtai = models.IntegerField(default=1, null=True, blank=True, db_index=True, verbose_name='提现状态1:审核2成功3失败')
fangshi = models.IntegerField(null=True, blank=True,db_index=True, verbose_name='收款方式1:微信2支付宝')
shenheid = models.CharField(max_length=11, null=True, db_index=True, verbose_name='审核用户ID')
bhliyou = models.TextField(null=True, blank=True, verbose_name='驳回理由')
# ---------- 自动提现审核新流程关联字段(旧数据为空,兼容历史记录) ----------
shenhe_jilu_id = models.IntegerField(
null=True, blank=True, db_index=True,
verbose_name='关联提现审核记录ID(TixianShenheJilu.id)'
)
shenhe_danhao = models.CharField(
max_length=32, null=True, blank=True, db_index=True,
verbose_name='关联提现审核单号'
)
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'tixianjilu'
verbose_name = '提现记录表'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['yonghuid']),
models.Index(fields=['zhuangtai']),
models.Index(fields=['shenheid']),
models.Index(fields=['fangshi']),
models.Index(fields=['shenhe_danhao']),
models.Index(fields=['shenhe_jilu_id']),
]
class TixianShenheJilu(QModel):
"""
提现审核记录表(自动打款新流程)
状态码与前端 TX_STATUS / Tixianjilu.zhuangtai 完全对标:
1=审核中 2=提现成功(已收款) 3=提现失败 4=审核成功 5=审核失败 6=待收款
"""
# 审核单号(唯一,前端字段 shenhe_danhao
shenhe_danhao = models.CharField(
max_length=32, unique=True, db_index=True, verbose_name='审核单号'
)
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='用户ID')
# 提现类型1打手佣金 2管事分红 3组长分红 4考核官分佣 5打手押金 6商家余额
leixing = models.PositiveSmallIntegerField(db_index=True, verbose_name='提现类型')
zhuangtai = models.IntegerField(
default=1, db_index=True,
verbose_name='审核状态(1审核中2提现成功3提现失败4审核成功5审核失败6待收款)'
)
# 金额shenqing_jine=申请扣款金额shijidaozhang=实际打款到账金额
shenqing_jine = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='申请提现金额(扣款额)')
shouxufei = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='手续费')
shijidaozhang = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='实际到账金额')
feilv = models.DecimalField(max_digits=5, decimal_places=4, default=0, verbose_name='手续费率')
# 审核/驳回
bhliyou = models.TextField(null=True, blank=True, verbose_name='驳回/失败原因')
bo_hui_ren_id = models.CharField(
max_length=11, null=True, blank=True, db_index=True, verbose_name='驳回人用户ID'
)
shenhe_ren_id = models.CharField(
max_length=11, null=True, blank=True, db_index=True, verbose_name='审核通过操作人ID'
)
# 关联提现记录表主键
tixianjilu_id = models.IntegerField(null=True, blank=True, db_index=True, verbose_name='关联Tixianjilu.id')
# 最近一次打款单号(仅作记录,不唯一;同一审核单可多次收款产生多条打款记录)
tixian_auto_id = models.CharField(
max_length=32, null=True, blank=True, db_index=True,
verbose_name='最近一次打款单号(非唯一,重试收款会更新)'
)
fail_reason = models.TextField(null=True, blank=True, verbose_name='微信打款失败原因')
# 打款方式1=手动打款 2=自动打款(微信商家转账)
dakuan_mode = models.PositiveSmallIntegerField(
default=1, db_index=True, verbose_name='打款方式(1手动2自动)'
)
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'tixian_shenhe_jilu'
verbose_name = '提现审核记录'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['yonghuid', 'zhuangtai']),
models.Index(fields=['yonghuid', 'leixing']),
models.Index(fields=['shenhe_danhao']),
]
def __str__(self):
return f'{self.shenhe_danhao}({self.yonghuid})'
class TixianAutoRecord(QModel):
"""
自动提现记录表(微信自动打款)
"""
id = models.BigAutoField(primary_key=True)
tixian_id = models.CharField(
max_length=32,
unique=True,
db_index=True,
verbose_name='提现订单号(自定义)'
)
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='用户ID')
leixing = models.IntegerField(verbose_name='提现类型 1打手 2管事')
jine = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='申请提现金额')
shouxufei = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='手续费')
shijidaozhang = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='实际到账金额')
feilv = models.DecimalField(max_digits=5, decimal_places=4, verbose_name='费率')
zhuangtai = models.IntegerField(
default=0,
choices=[(0, '处理中'), (1, '成功'), (2, '失败')],
verbose_name='状态'
)
wechat_transfer_no = models.CharField(
max_length=64,
null=True,
blank=True,
verbose_name='微信转账单号'
)
wechat_package = models.TextField(
null=True,
blank=True,
verbose_name='微信返回的package_info(JSON)'
)
fail_reason = models.TextField(null=True, blank=True, verbose_name='失败原因')
# 关联提现审核单号(新流程必填,旧数据为空)
shenhe_danhao = models.CharField(
max_length=32, null=True, blank=True, db_index=True, verbose_name='关联审核单号'
)
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'tixian_auto_record'
verbose_name = '自动提现记录'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['tixian_id']),
models.Index(fields=['yonghuid']),
models.Index(fields=['zhuangtai']),
]
def __str__(self):
return f"{self.tixian_id} - {self.get_zhuangtai_display()}"
# yonghu/models.py
class Xiugaijilu(QModel):
id = models.AutoField(primary_key=True, verbose_name='记录ID')
yonghuid = models.CharField(max_length=7, verbose_name='被修改用户ID')
xiugaiid = models.CharField(max_length=30, verbose_name='修改人账号ID')
leixing = models.IntegerField(verbose_name='被修改用户类型')
# 打手相关金钱字段
xiugaitijiao = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
verbose_name='修改后的打手提现金额')
xiugaitijiaoq = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
verbose_name='修改前的打手提现金额')
# 打手积分
jifen = models.IntegerField(default=0, verbose_name='修改后的打手积分')
yjifen = models.IntegerField(default=0, verbose_name='修改前的打手积分')
# 打手押金
yajin = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='修改后的打手押金')
yyajin = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='修改前的打手押金')
# 商家余额
shangjiayue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='修改后的商家余额')
shangjiayueq = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='修改前的商家余额')
# 管事余额
guanshiyue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='修改后的管事余额')
guanshiyueq = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='修改前的管事余额')
# 会员相关
huiyuants = models.IntegerField(default=0, verbose_name='添加会员天数')
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
# 其他字段
qitashuoming = models.TextField(null=True, blank=True, verbose_name='其他说明')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'xiugaijilu'
verbose_name = '修改记录表'
verbose_name_plural = verbose_name
def __str__(self):
return f"修改记录-用户{self.yonghuid}"
# yonghu/models.py - 新增排行榜模型
class RankingRecord(QModel):
# id: 主键ID
id = models.AutoField(primary_key=True, verbose_name='ID')
# zhouqi: 周期类型1=日榜2=月榜
zhouqi = models.IntegerField(choices=[(1, '日榜'), (2, '月榜')], verbose_name='周期类型')
# tongji_date: 统计日期(日榜存具体日期,月榜存月份第一天)
tongji_date = models.DateField(db_index=True, verbose_name='统计日期')
# shenfen: 用户身份2=打手3=管事4=商家1=普通用户不统计)
shenfen = models.IntegerField(choices=[(2, '打手'), (3, '管事'), (4, '商家')], verbose_name='用户身份')
# yonghuid: 用户ID冗余存储避免连表查询
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='用户ID')
# paiming: 排名从1开始
paiming = models.IntegerField(verbose_name='排名')
# zhizhi: 指标数值(打手:收益金额,管事:充值人数,商家:流水金额)
zhizhi = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='指标值')
# nicheng: 用户昵称
nicheng = models.CharField(max_length=50, null=True,verbose_name='用户昵称')
# avatar: 用户头像URL
avatar = models.CharField(max_length=500, blank=True, null=True, verbose_name='头像')
# chuangjian_time: 记录创建时间
chuangjian_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
class Meta:
db_table = 'ranking_record'
verbose_name = '排行榜记录'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['zhouqi', 'tongji_date', 'shenfen', 'paiming']),
models.Index(fields=['yonghuid', 'zhouqi']),
models.Index(fields=['tongji_date']),
]
unique_together = [['zhouqi', 'tongji_date', 'shenfen', 'paiming']]
def __str__(self):
zhouqi_str = '' if self.zhouqi == 1 else ''
shenfen_map = {2: '打手', 3: '管事', 4: '商家'}
return f"{self.tongji_date} {zhouqi_str}{shenfen_map.get(self.shenfen)}{self.paiming}"
# ==================== 用户敏感数据表 ====================
class UserSensitiveData(QModel):
"""用户敏感数据表——独立存储敏感信息,不继承 gvsdsdk"""
user_uuid = models.OneToOneField(
'users.User',
on_delete=models.CASCADE,
related_name='sensitive_data',
verbose_name='关联用户',
db_column='user_uuid_id',
)
password = models.CharField(max_length=200, null=True, blank=True, verbose_name='密码')
zhifu = models.CharField(max_length=500, null=True, blank=True, verbose_name='收款码图片')
skzhanghao = models.CharField(max_length=11, blank=True, null=True, verbose_name='收款账号')
shoujihao_renzheng = models.BooleanField(default=False, verbose_name='手机号是否已认证')
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'user_sensitive_data'
verbose_name = '用户敏感数据'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['user_uuid'])]
def __str__(self):
return f'敏感数据-{self.user_uuid_id}'
# === 业务用户模型注册 ===
# 导入业务子类,使 Django app registry 注册具体 User 模型users.User
# 放在文件末尾以避免循环导入:此时本模块所有类已定义完毕。
from users.business_models import User as _BusinessUser # noqa: E402,F401