新增 dashou_zengsong_huiyuan,与购买会员分离;抢单/抢单池认赠送有效会员;后台送/改期/移除接口,送时积分非10则改为10并写操作日志。 Co-authored-by: Cursor <cursoragent@cursor.com>
665 lines
34 KiB
Python
665 lines
34 KiB
Python
# 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='商家今月流水')
|
||
is_youzhi_shangjia = models.BooleanField(default=False, 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')
|
||
club_id = models.CharField(max_length=16, default='xq', db_index=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=['club_id', 'zhuangtai']),
|
||
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='审核单号'
|
||
)
|
||
club_id = models.CharField(max_length=16, default='xq', db_index=True, verbose_name='俱乐部ID')
|
||
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='提现订单号(自定义)'
|
||
)
|
||
club_id = models.CharField(max_length=16, default='xq', db_index=True, verbose_name='俱乐部ID')
|
||
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}"
|
||
|
||
|
||
class DashouZengsongHuiyuan(QModel):
|
||
"""
|
||
后台赠送会员(免费接单资格),与 Huiyuangoumai 购买会员完全分离。
|
||
仅用于抢单/抢单池资格;不参与提现正式会员校验。
|
||
"""
|
||
id = models.AutoField(primary_key=True, verbose_name='记录ID')
|
||
yonghu_id = models.CharField(max_length=7, db_index=True, verbose_name='打手用户ID')
|
||
huiyuan_id = models.CharField(max_length=6, db_index=True, verbose_name='会员ID')
|
||
daoqi_time = models.DateTimeField(db_index=True, verbose_name='到期时间')
|
||
song_ren = models.CharField(max_length=30, verbose_name='赠送人账号')
|
||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='赠送时间')
|
||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||
|
||
class Meta:
|
||
db_table = 'dashou_zengsong_huiyuan'
|
||
verbose_name = '打手赠送会员'
|
||
verbose_name_plural = verbose_name
|
||
unique_together = [['yonghu_id', 'huiyuan_id']]
|
||
indexes = [
|
||
models.Index(fields=['yonghu_id', 'huiyuan_id']),
|
||
models.Index(fields=['yonghu_id', 'daoqi_time']),
|
||
]
|
||
|
||
def __str__(self):
|
||
return f"赠送会员-用户{self.yonghu_id}-会员{self.huiyuan_id}"
|
||
|
||
|
||
# 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
|
||
|
||
|