进行了 GVSDSDK 迁移,可能存在诸多问题

This commit is contained in:
2026-06-17 20:37:47 +08:00
parent 72770ad73b
commit d00f0d08e5
132 changed files with 161593 additions and 4827 deletions

View File

@@ -1,213 +1,417 @@
# Generated by Django 5.2.10 on 2026-01-14 19:59
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Xiugaijilu',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, 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(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的打手提现金额')),
('xiugaitijiaoq', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的打手提现金额')),
('jifen', models.IntegerField(default=0, verbose_name='修改后的打手积分')),
('yjifen', models.IntegerField(default=0, verbose_name='修改前的打手积分')),
('yajin', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的打手押金')),
('yyajin', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的打手押金')),
('shangjiayue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的商家余额')),
('shangjiayueq', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的商家余额')),
('guanshiyue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的管事余额')),
('guanshiyueq', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的管事余额')),
('huiyuants', models.IntegerField(default=0, verbose_name='添加会员天数')),
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
('qitashuoming', models.TextField(blank=True, null=True, verbose_name='其他说明')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '修改记录表',
'verbose_name_plural': '修改记录表',
'db_table': 'xiugaijilu',
},
),
migrations.CreateModel(
name='UserMain',
fields=[
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='主键ID')),
('yonghuid', models.CharField(db_index=True, max_length=7, unique=True, verbose_name='用户ID')),
('openid', models.CharField(db_index=True, max_length=64, unique=True, verbose_name='微信OpenID')),
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='头像')),
('phone', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机号')),
('password', models.CharField(blank=True, max_length=200, null=True, verbose_name='密码')),
('zhifu', models.CharField(blank=True, max_length=500, null=True, verbose_name='收款码图片')),
('skzhanghao', models.CharField(blank=True, max_length=11, null=True, verbose_name='收款账号')),
('ip', models.CharField(blank=True, max_length=50, null=True, verbose_name='来访用户ip')),
('last_login_time', models.DateTimeField(blank=True, null=True, verbose_name='最后登录时间')),
('user_type', models.CharField(choices=[('normal', '普通用户'), ('dashou', '打手'), ('shop', '商家'), ('guanshi', '管事'), ('admin', '管理员')], default='normal', max_length=10, verbose_name='用户类型')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '用户主表',
'verbose_name_plural': '用户主表',
'db_table': 'user_main',
'indexes': [models.Index(fields=['yonghuid'], name='user_main_yonghui_b8b2fe_idx'), models.Index(fields=['openid'], name='user_main_openid_c9edbe_idx'), models.Index(fields=['user_type'], name='user_main_user_ty_8515fd_idx')],
},
),
migrations.CreateModel(
name='Tixianjilu',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='提现记录ID')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='提现用户ID')),
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='头像')),
('phone', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机号')),
('nicheng', models.CharField(max_length=50, null=True, verbose_name='打手昵称')),
('leixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='提现类型1:打手佣金2管事分红')),
('zhifu', models.CharField(blank=True, max_length=500, null=True, verbose_name='收款码图片')),
('skzhanghao', models.CharField(blank=True, max_length=11, null=True, verbose_name='收款账号')),
('jine', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='提现金额')),
('zhuangtai', models.IntegerField(blank=True, db_index=True, default=1, null=True, verbose_name='提现状态1:审核2成功3失败')),
('fangshi', models.IntegerField(blank=True, db_index=True, null=True, verbose_name='收款方式1:微信2支付宝')),
('shenheid', models.CharField(db_index=True, max_length=7, null=True, verbose_name='审核用户ID')),
('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回理由')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '提现记录表',
'verbose_name_plural': '提现记录表',
'db_table': 'tixianjilu',
'indexes': [models.Index(fields=['yonghuid'], name='tixianjilu_yonghui_8083bb_idx'), models.Index(fields=['zhuangtai'], name='tixianjilu_zhuangt_839d8e_idx'), models.Index(fields=['shenheid'], name='tixianjilu_shenhei_470e0c_idx'), models.Index(fields=['fangshi'], name='tixianjilu_fangshi_a1e0bc_idx')],
},
),
migrations.CreateModel(
name='AdminProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=255, verbose_name='密码')),
('wechat', models.CharField(blank=True, max_length=50, verbose_name='管理员微信')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='admin_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '管理员扩展表',
'verbose_name_plural': '管理员扩展表',
'db_table': 'admin_profile',
'indexes': [models.Index(fields=['user'], name='admin_profi_user_id_7d067d_idx')],
},
),
migrations.CreateModel(
name='UserBoss',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nickname', models.CharField(max_length=50, verbose_name='老板昵称')),
('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='消费总额')),
('alldingdan', models.IntegerField(default=0, verbose_name='订单总数')),
('alltui', models.IntegerField(default=0, verbose_name='退款总数')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='boss_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '老板扩展表',
'verbose_name_plural': '老板扩展表',
'db_table': 'user_boss',
'indexes': [models.Index(fields=['user'], name='user_boss_user_id_4e81a4_idx')],
},
),
migrations.CreateModel(
name='UserDashou',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现余额')),
('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, 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(db_index=True, max_length=7, null=True, verbose_name='邀请人ID')),
('jinrijiedan', models.IntegerField(default=0, verbose_name='今日接单数量')),
('jinrishouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日收益金额')),
('jinyuejiedan', models.IntegerField(default=0, verbose_name='今月接单数量')),
('jinyueshouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今月收益金额')),
('jifen', models.IntegerField(default=0, verbose_name='打手积分')),
('yajin', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='打手押金')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='dashou_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '打手扩展表',
'verbose_name_plural': '打手扩展表',
'db_table': 'user_dashou',
'indexes': [models.Index(fields=['user'], name='user_dashou_user_id_cf0410_idx'), models.Index(fields=['yaoqingren'], name='user_dashou_yaoqing_894658_idx')],
},
),
migrations.CreateModel(
name='UserGuanshi',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('yaoqingma', models.CharField(db_index=True, max_length=20, null=True, verbose_name='邀请码')),
('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(decimal_places=2, default=0.0, max_digits=12, verbose_name='充值分佣总额')),
('yue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现余额')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='guanshi_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '管事扩展表',
'verbose_name_plural': '管事扩展表',
'db_table': 'user_guanshi',
'indexes': [models.Index(fields=['user'], name='user_guansh_user_id_cbadac_idx'), models.Index(fields=['yaoqingma'], name='user_guansh_yaoqing_21d1d4_idx')],
},
),
migrations.CreateModel(
name='UserShangjia',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nicheng', models.CharField(db_index=True, max_length=50, unique=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(decimal_places=2, default=0.0, max_digits=12, verbose_name='商家余额')),
('chengjiao', models.IntegerField(default=0, verbose_name='商家成交订单总量')),
('jinridingdan', models.IntegerField(default=0, verbose_name='商家今日订单总量')),
('jinriliushui', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='商家今日流水')),
('jinyuedingdan', models.IntegerField(default=0, verbose_name='商家今月订单总量')),
('jinyueliushui', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='商家今月流水')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='shop_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '商家扩展表',
'verbose_name_plural': '商家扩展表',
'db_table': 'user_shangjia',
'indexes': [models.Index(fields=['user'], name='user_shangj_user_id_823c5c_idx'), models.Index(fields=['nicheng'], name='user_shangj_nicheng_6967bc_idx')],
},
),
]
# Generated by Django 4.2.27 on 2026-06-17 16:31
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='UserMain',
fields=[
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='主键ID')),
('yonghuid', models.CharField(db_index=True, max_length=7, unique=True, verbose_name='用户ID')),
('openid', models.CharField(db_index=True, max_length=64, unique=True, verbose_name='微信OpenID')),
('unionid', models.CharField(blank=True, db_index=True, max_length=64, null=True, verbose_name='微信UnionID')),
('avatar', models.CharField(blank=True, default='a_long/morentouxiang.jpg', max_length=500, null=True, verbose_name='头像')),
('phone', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机号')),
('shoujihao_renzheng', models.BooleanField(default=False, verbose_name='手机号是否已认证')),
('password', models.CharField(blank=True, max_length=200, null=True, verbose_name='密码')),
('zhifu', models.CharField(blank=True, max_length=500, null=True, verbose_name='收款码图片')),
('skzhanghao', models.CharField(blank=True, max_length=11, null=True, verbose_name='收款账号')),
('ip', models.CharField(blank=True, max_length=50, null=True, verbose_name='来访用户ip')),
('last_login_time', models.DateTimeField(blank=True, null=True, verbose_name='最后登录时间')),
('user_type', models.CharField(choices=[('normal', '普通用户'), ('dashou', '打手'), ('shop', '商家'), ('guanshi', '管事'), ('admin', '管理员')], default='normal', max_length=10, verbose_name='用户类型')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '用户主表',
'verbose_name_plural': '用户主表',
'db_table': 'user_main',
'managed': False,
},
),
migrations.CreateModel(
name='OfficialAccountUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('unionid', models.CharField(db_index=True, max_length=64, null=True, verbose_name='UnionID')),
('official_openid', models.CharField(db_index=True, max_length=64, 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='更新时间')),
],
options={
'verbose_name': '服务号用户',
'verbose_name_plural': '服务号用户',
'db_table': 'official_account_user',
},
),
migrations.CreateModel(
name='Xiugaijilu',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, 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(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的打手提现金额')),
('xiugaitijiaoq', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的打手提现金额')),
('jifen', models.IntegerField(default=0, verbose_name='修改后的打手积分')),
('yjifen', models.IntegerField(default=0, verbose_name='修改前的打手积分')),
('yajin', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的打手押金')),
('yyajin', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的打手押金')),
('shangjiayue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的商家余额')),
('shangjiayueq', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的商家余额')),
('guanshiyue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改后的管事余额')),
('guanshiyueq', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='修改前的管事余额')),
('huiyuants', models.IntegerField(default=0, verbose_name='添加会员天数')),
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
('qitashuoming', models.TextField(blank=True, null=True, verbose_name='其他说明')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '修改记录表',
'verbose_name_plural': '修改记录表',
'db_table': 'xiugaijilu',
},
),
migrations.CreateModel(
name='TixianShenheJilu',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('shenhe_danhao', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='审核单号')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('leixing', models.PositiveSmallIntegerField(db_index=True, verbose_name='提现类型')),
('zhuangtai', models.IntegerField(db_index=True, default=1, verbose_name='审核状态(1审核中2提现成功3提现失败4审核成功5审核失败6待收款)')),
('shenqing_jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='申请提现金额(扣款额)')),
('shouxufei', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='手续费')),
('shijidaozhang', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='实际到账金额')),
('feilv', models.DecimalField(decimal_places=4, default=0, max_digits=5, verbose_name='手续费率')),
('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回/失败原因')),
('bo_hui_ren_id', models.CharField(blank=True, db_index=True, max_length=11, null=True, verbose_name='驳回人用户ID')),
('shenhe_ren_id', models.CharField(blank=True, db_index=True, max_length=11, null=True, verbose_name='审核通过操作人ID')),
('tixianjilu_id', models.IntegerField(blank=True, db_index=True, null=True, verbose_name='关联Tixianjilu.id')),
('tixian_auto_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='最近一次打款单号(非唯一,重试收款会更新)')),
('fail_reason', models.TextField(blank=True, null=True, verbose_name='微信打款失败原因')),
('dakuan_mode', models.PositiveSmallIntegerField(db_index=True, default=1, verbose_name='打款方式(1手动2自动)')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '提现审核记录',
'verbose_name_plural': '提现审核记录',
'db_table': 'tixian_shenhe_jilu',
'indexes': [models.Index(fields=['yonghuid', 'zhuangtai'], name='tixian_shen_yonghui_a782e9_idx'), models.Index(fields=['yonghuid', 'leixing'], name='tixian_shen_yonghui_bb44eb_idx'), models.Index(fields=['shenhe_danhao'], name='tixian_shen_shenhe__4a1ca7_idx')],
},
),
migrations.CreateModel(
name='Tixianjilu',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='提现记录ID')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='提现用户ID')),
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='头像')),
('phone', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机号')),
('nicheng', models.CharField(max_length=50, null=True, verbose_name='打手昵称')),
('leixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='提现类型1:打手佣金2管事分红')),
('zhifu', models.CharField(blank=True, max_length=500, null=True, verbose_name='收款码图片')),
('skzhanghao', models.CharField(blank=True, max_length=11, null=True, verbose_name='收款账号')),
('jine', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='提现金额')),
('zhuangtai', models.IntegerField(blank=True, db_index=True, default=1, null=True, verbose_name='提现状态1:审核2成功3失败')),
('fangshi', models.IntegerField(blank=True, db_index=True, null=True, verbose_name='收款方式1:微信2支付宝')),
('shenheid', models.CharField(db_index=True, max_length=11, null=True, verbose_name='审核用户ID')),
('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回理由')),
('shenhe_jilu_id', models.IntegerField(blank=True, db_index=True, null=True, verbose_name='关联提现审核记录ID(TixianShenheJilu.id)')),
('shenhe_danhao', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联提现审核单号')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '提现记录表',
'verbose_name_plural': '提现记录表',
'db_table': 'tixianjilu',
'indexes': [models.Index(fields=['yonghuid'], name='tixianjilu_yonghui_8083bb_idx'), models.Index(fields=['zhuangtai'], name='tixianjilu_zhuangt_839d8e_idx'), models.Index(fields=['shenheid'], name='tixianjilu_shenhei_470e0c_idx'), models.Index(fields=['fangshi'], name='tixianjilu_fangshi_a1e0bc_idx'), models.Index(fields=['shenhe_danhao'], name='tixianjilu_shenhe__7b3e7f_idx'), models.Index(fields=['shenhe_jilu_id'], name='tixianjilu_shenhe__d9355e_idx')],
},
),
migrations.CreateModel(
name='TixianAutoRecord',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('tixian_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='提现订单号(自定义)')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('leixing', models.IntegerField(verbose_name='提现类型 1打手 2管事')),
('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='申请提现金额')),
('shouxufei', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='手续费')),
('shijidaozhang', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='实际到账金额')),
('feilv', models.DecimalField(decimal_places=4, max_digits=5, verbose_name='费率')),
('zhuangtai', models.IntegerField(choices=[(0, '处理中'), (1, '成功'), (2, '失败')], default=0, verbose_name='状态')),
('wechat_transfer_no', models.CharField(blank=True, max_length=64, null=True, verbose_name='微信转账单号')),
('wechat_package', models.TextField(blank=True, null=True, verbose_name='微信返回的package_info(JSON)')),
('fail_reason', models.TextField(blank=True, null=True, verbose_name='失败原因')),
('shenhe_danhao', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联审核单号')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '自动提现记录',
'verbose_name_plural': '自动提现记录',
'db_table': 'tixian_auto_record',
'indexes': [models.Index(fields=['tixian_id'], name='tixian_auto_tixian__273dac_idx'), models.Index(fields=['yonghuid'], name='tixian_auto_yonghui_61c5b6_idx'), models.Index(fields=['zhuangtai'], name='tixian_auto_zhuangt_24d9fa_idx')],
},
),
migrations.CreateModel(
name='RankingRecord',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID')),
('zhouqi', models.IntegerField(choices=[(1, '日榜'), (2, '月榜')], verbose_name='周期类型')),
('tongji_date', models.DateField(db_index=True, verbose_name='统计日期')),
('shenfen', models.IntegerField(choices=[(2, '打手'), (3, '管事'), (4, '商家')], verbose_name='用户身份')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('paiming', models.IntegerField(verbose_name='排名')),
('zhizhi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='指标值')),
('nicheng', models.CharField(max_length=50, null=True, verbose_name='用户昵称')),
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='头像')),
('chuangjian_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': '排行榜记录',
'verbose_name_plural': '排行榜记录',
'db_table': 'ranking_record',
'indexes': [models.Index(fields=['zhouqi', 'tongji_date', 'shenfen', 'paiming'], name='ranking_rec_zhouqi_fc9f4d_idx'), models.Index(fields=['yonghuid', 'zhouqi'], name='ranking_rec_yonghui_e5be77_idx'), models.Index(fields=['tongji_date'], name='ranking_rec_tongji__820158_idx')],
'unique_together': {('zhouqi', 'tongji_date', 'shenfen', 'paiming')},
},
),
migrations.CreateModel(
name='UserZuzhang',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('yaoqingma', models.CharField(db_index=True, max_length=20, null=True, verbose_name='组长邀请码')),
('fenyong_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='分佣总额(元)')),
('ketixian_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现金额(元)')),
('yaoqing_zongshu', models.IntegerField(default=0, verbose_name='邀请总数')),
('jinri_fenyong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日分佣(元)')),
('jinyue_fenyong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今月分佣(元)')),
('zhuangtai', models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='账号状态')),
('haibao_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='推广海报相对URL')),
('jinri_tixian', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日提现金额(元)')),
('last_tixian_time', models.DateTimeField(blank=True, null=True, verbose_name='最后提现时间')),
('ewai_tixian_xiane', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, 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(decimal_places=2, default=0.0, max_digits=10, verbose_name='额外分红金额(元)')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='zuzhang_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '组长扩展表',
'verbose_name_plural': '组长扩展表',
'db_table': 'user_zuzhang',
'indexes': [models.Index(fields=['user'], name='user_zuzhan_UserUUI_125e05_idx'), models.Index(fields=['yaoqingma'], name='user_zuzhan_yaoqing_cba91d_idx')],
},
),
migrations.CreateModel(
name='UserShenheguan',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现余额')),
('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='赚取总额')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='shenheguan_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '审核官扩展表',
'verbose_name_plural': '审核官扩展表',
'db_table': 'user_shenheguan',
'indexes': [models.Index(fields=['user'], name='user_shenhe_UserUUI_bdc981_idx')],
},
),
migrations.CreateModel(
name='UserShangjia',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nicheng', models.CharField(db_index=True, max_length=50, unique=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(decimal_places=2, default=0.0, max_digits=12, verbose_name='商家余额')),
('chengjiao', models.IntegerField(default=0, verbose_name='商家成交订单总量')),
('jinridingdan', models.IntegerField(default=0, verbose_name='商家今日订单总量')),
('jinriliushui', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='商家今日流水')),
('jinyuedingdan', models.IntegerField(default=0, verbose_name='商家今月订单总量')),
('jinyueliushui', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='商家今月流水')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='shop_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '商家扩展表',
'verbose_name_plural': '商家扩展表',
'db_table': 'user_shangjia',
'indexes': [models.Index(fields=['user'], name='user_shangj_UserUUI_9d7fad_idx'), models.Index(fields=['nicheng'], name='user_shangj_nicheng_6967bc_idx')],
},
),
migrations.CreateModel(
name='UserSensitiveData',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(blank=True, max_length=200, null=True, verbose_name='密码')),
('zhifu', models.CharField(blank=True, max_length=500, null=True, verbose_name='收款码图片')),
('skzhanghao', models.CharField(blank=True, max_length=11, null=True, verbose_name='收款账号')),
('shoujihao_renzheng', models.BooleanField(default=False, verbose_name='手机号是否已认证')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user_uuid', models.OneToOneField(db_column='user_uuid_id', on_delete=django.db.models.deletion.CASCADE, related_name='sensitive_data', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '用户敏感数据',
'verbose_name_plural': '用户敏感数据',
'db_table': 'user_sensitive_data',
'indexes': [models.Index(fields=['user_uuid'], name='user_sensit_user_uu_1d562f_idx')],
},
),
migrations.CreateModel(
name='UserKefu',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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='累计处理订单数')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='kefu_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '客服扩展表',
'verbose_name_plural': '客服扩展表',
'db_table': 'user_kefu',
'indexes': [models.Index(fields=['user'], name='user_kefu_UserUUI_ccf71c_idx'), models.Index(fields=['zhuangtai'], name='user_kefu_zhuangt_317491_idx')],
},
),
migrations.CreateModel(
name='UserGuanshi',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('yaoqingren', models.CharField(db_index=True, max_length=7, null=True, verbose_name='邀请人ID')),
('yaoqingma', models.CharField(db_index=True, max_length=20, null=True, verbose_name='邀请码')),
('invite_qrcode_url', models.CharField(blank=True, max_length=500, null=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(decimal_places=2, default=0.0, max_digits=12, verbose_name='充值分佣总额')),
('yue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现余额')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('fenhong_yici', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='首次分红金额')),
('fenghong_erci_enabled', models.BooleanField(default=False, verbose_name='开启二次分红')),
('fenghong_erci', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='二次分红金额')),
('last_tixian_date', models.DateField(blank=True, null=True, verbose_name='最近提现日期')),
('jinritixian_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日已提现金额')),
('kaioi_ewai_xiane', models.BooleanField(default=False, verbose_name='是否开启额外提现限额')),
('ewai_xiane', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='额外提现限额(元)')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='guanshi_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '管事扩展表',
'verbose_name_plural': '管事扩展表',
'db_table': 'user_guanshi',
'indexes': [models.Index(fields=['user'], name='user_guansh_UserUUI_1d9453_idx'), models.Index(fields=['yaoqingma'], name='user_guansh_yaoqing_21d1d4_idx')],
},
),
migrations.CreateModel(
name='UserDashou',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现余额')),
('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, 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(db_index=True, max_length=7, null=True, verbose_name='邀请人ID')),
('jinrijiedan', models.IntegerField(default=0, verbose_name='今日接单数量')),
('jinrishouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日收益金额')),
('jinyuejiedan', models.IntegerField(default=0, verbose_name='今月接单数量')),
('jinyueshouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今月收益金额')),
('jifen', models.IntegerField(default=0, verbose_name='打手积分')),
('yajin', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='打手押金')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('last_tixian_date', models.DateField(blank=True, null=True, verbose_name='最近提现日期')),
('jinritixian_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日已提现金额')),
('kaioi_ewai_xiane', models.BooleanField(default=False, verbose_name='是否开启额外提现限额')),
('ewai_xiane', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='额外提现限额(元)')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='dashou_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '打手扩展表',
'verbose_name_plural': '打手扩展表',
'db_table': 'user_dashou',
'indexes': [models.Index(fields=['user'], name='user_dashou_UserUUI_92ac5a_idx'), models.Index(fields=['yaoqingren'], name='user_dashou_yaoqing_894658_idx')],
},
),
migrations.CreateModel(
name='UserBoss',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nickname', models.CharField(max_length=50, verbose_name='老板昵称')),
('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='消费总额')),
('alldingdan', models.IntegerField(default=0, verbose_name='订单总数')),
('alltui', models.IntegerField(default=0, verbose_name='退款总数')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='boss_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '老板扩展表',
'verbose_name_plural': '老板扩展表',
'db_table': 'user_boss',
'indexes': [models.Index(fields=['user'], name='user_boss_UserUUI_4579c2_idx')],
},
),
migrations.CreateModel(
name='AdminProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=255, verbose_name='密码')),
('wechat', models.CharField(blank=True, max_length=50, verbose_name='管理员微信')),
('yaoqingma', models.CharField(db_index=True, max_length=20, null=True, verbose_name='管理员邀请码')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('user', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='admin_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '管理员扩展表',
'verbose_name_plural': '管理员扩展表',
'db_table': 'admin_profile',
'indexes': [models.Index(fields=['user'], name='admin_profi_UserUUI_0699ce_idx')],
},
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.27 on 2026-01-21 12:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='adminprofile',
name='yaoqingma',
field=models.CharField(db_index=True, max_length=20, null=True, verbose_name='管理员邀请码'),
),
]

View File

@@ -1,35 +0,0 @@
# Generated by Django 4.2.27 on 2026-01-24 23:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0002_adminprofile_yaoqingma'),
]
operations = [
migrations.CreateModel(
name='RankingRecord',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID')),
('zhouqi', models.IntegerField(choices=[(1, '日榜'), (2, '月榜')], verbose_name='周期类型')),
('tongji_date', models.DateField(db_index=True, verbose_name='统计日期')),
('shenfen', models.IntegerField(choices=[(2, '打手'), (3, '管事'), (4, '商家')], verbose_name='用户身份')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('paiming', models.IntegerField(verbose_name='排名')),
('zhizhi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='指标值')),
('nicheng', models.CharField(max_length=50, null=True, verbose_name='用户昵称')),
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='头像')),
('chuangjian_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': '排行榜记录',
'verbose_name_plural': '排行榜记录',
'db_table': 'ranking_record',
'indexes': [models.Index(fields=['zhouqi', 'tongji_date', 'shenfen', 'paiming'], name='ranking_rec_zhouqi_fc9f4d_idx'), models.Index(fields=['yonghuid', 'zhouqi'], name='ranking_rec_yonghui_e5be77_idx'), models.Index(fields=['tongji_date'], name='ranking_rec_tongji__820158_idx')],
'unique_together': {('zhouqi', 'tongji_date', 'shenfen', 'paiming')},
},
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.27 on 2026-01-24 23:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0003_rankingrecord'),
]
operations = [
migrations.AlterField(
model_name='usermain',
name='avatar',
field=models.CharField(blank=True, default='a_long/morentouxiang.jpg', max_length=500, null=True, verbose_name='头像'),
),
]

View File

@@ -1,35 +0,0 @@
# Generated by Django 4.2.27 on 2026-02-07 19:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0004_alter_usermain_avatar'),
]
operations = [
migrations.CreateModel(
name='OfficialAccountUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('unionid', models.CharField(db_index=True, max_length=64, verbose_name='UnionID')),
('official_openid', models.CharField(db_index=True, max_length=64, 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='更新时间')),
],
options={
'verbose_name': '服务号用户',
'verbose_name_plural': '服务号用户',
'db_table': 'official_account_user',
},
),
migrations.AddField(
model_name='usermain',
name='unionid',
field=models.CharField(blank=True, db_index=True, max_length=64, null=True, verbose_name='微信UnionID'),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.27 on 2026-02-07 22:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0005_officialaccountuser_usermain_unionid'),
]
operations = [
migrations.AlterField(
model_name='officialaccountuser',
name='unionid',
field=models.CharField(db_index=True, max_length=64, null=True, verbose_name='UnionID'),
),
]

View File

@@ -1,36 +0,0 @@
# Generated by Django 4.2.27 on 2026-02-21 14:37
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0006_alter_officialaccountuser_unionid'),
]
operations = [
migrations.CreateModel(
name='UserKefu',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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='累计处理订单数')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='kefu_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '客服扩展表',
'verbose_name_plural': '客服扩展表',
'db_table': 'user_kefu',
'indexes': [models.Index(fields=['user'], name='user_kefu_user_id_5fe3a1_idx'), models.Index(fields=['zhuangtai'], name='user_kefu_zhuangt_317491_idx')],
},
),
]

View File

@@ -1,28 +0,0 @@
# Generated by Django 4.2.27 on 2026-02-27 15:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0007_userkefu'),
]
operations = [
migrations.AddField(
model_name='userguanshi',
name='fenghong_erci',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='二次分红金额'),
),
migrations.AddField(
model_name='userguanshi',
name='fenghong_erci_enabled',
field=models.BooleanField(default=False, verbose_name='开启二次分红'),
),
migrations.AddField(
model_name='userguanshi',
name='fenhong_yici',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='首次分红金额'),
),
]

View File

@@ -1,89 +0,0 @@
# Generated by Django 4.2.27 on 2026-03-16 17:04
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0008_userguanshi_fenghong_erci_and_more'),
]
operations = [
migrations.AddField(
model_name='userdashou',
name='ewai_xiane',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='额外提现限额(元)'),
),
migrations.AddField(
model_name='userdashou',
name='jinritixian_jine',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日已提现金额'),
),
migrations.AddField(
model_name='userdashou',
name='kaioi_ewai_xiane',
field=models.BooleanField(default=False, verbose_name='是否开启额外提现限额'),
),
migrations.AddField(
model_name='userdashou',
name='last_tixian_date',
field=models.DateField(blank=True, null=True, verbose_name='最近提现日期'),
),
migrations.AddField(
model_name='userguanshi',
name='ewai_xiane',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='额外提现限额(元)'),
),
migrations.AddField(
model_name='userguanshi',
name='jinritixian_jine',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日已提现金额'),
),
migrations.AddField(
model_name='userguanshi',
name='kaioi_ewai_xiane',
field=models.BooleanField(default=False, verbose_name='是否开启额外提现限额'),
),
migrations.AddField(
model_name='userguanshi',
name='last_tixian_date',
field=models.DateField(blank=True, null=True, verbose_name='最近提现日期'),
),
migrations.AddField(
model_name='userguanshi',
name='yaoqingren',
field=models.CharField(db_index=True, max_length=7, null=True, verbose_name='邀请人ID'),
),
migrations.CreateModel(
name='UserZuzhang',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('yaoqingma', models.CharField(db_index=True, max_length=20, null=True, verbose_name='组长邀请码')),
('fenyong_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='分佣总额(元)')),
('ketixian_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现金额(元)')),
('yaoqing_zongshu', models.IntegerField(default=0, verbose_name='邀请总数')),
('jinri_fenyong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日分佣(元)')),
('jinyue_fenyong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今月分佣(元)')),
('zhuangtai', models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='账号状态')),
('haibao_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='推广海报相对URL')),
('jinri_tixian', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日提现金额(元)')),
('last_tixian_time', models.DateTimeField(blank=True, null=True, verbose_name='最后提现时间')),
('ewai_tixian_xiane', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, 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(decimal_places=2, default=0.0, max_digits=10, verbose_name='额外分红金额(元)')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='zuzhang_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '组长扩展表',
'verbose_name_plural': '组长扩展表',
'db_table': 'user_zuzhang',
'indexes': [models.Index(fields=['user'], name='user_zuzhan_user_id_8064f2_idx'), models.Index(fields=['yaoqingma'], name='user_zuzhan_yaoqing_cba91d_idx')],
},
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.27 on 2026-03-19 12:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0009_userdashou_ewai_xiane_userdashou_jinritixian_jine_and_more'),
]
operations = [
migrations.AddField(
model_name='userguanshi',
name='invite_qrcode_url',
field=models.CharField(blank=True, max_length=500, null=True, verbose_name='邀请码二维码图片URL'),
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.27 on 2026-05-10 02:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0010_userguanshi_invite_qrcode_url'),
]
operations = [
migrations.AddField(
model_name='usermain',
name='shoujihao_renzheng',
field=models.BooleanField(default=False, verbose_name='手机号是否已认证'),
),
]

View File

@@ -1,36 +0,0 @@
# Generated by Django 4.2.27 on 2026-05-14 18:42
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0011_usermain_shoujihao_renzheng'),
]
operations = [
migrations.CreateModel(
name='UserShenheguan',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('zhuangtai', models.IntegerField(choices=[(0, '禁用'), (1, '正常')], default=1, verbose_name='账号状态')),
('shenhe_zhuangtai', models.IntegerField(choices=[(0, '空闲'), (1, '审核中')], default=0, verbose_name='审核官状态')),
('shenhe_zongshu', models.IntegerField(default=0, verbose_name='审核总数')),
('tongguo_zongshu', models.IntegerField(default=0, verbose_name='通过总数')),
('yue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现余额')),
('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='赚取总额')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='shenheguan_profile', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')),
],
options={
'verbose_name': '审核官扩展表',
'verbose_name_plural': '审核官扩展表',
'db_table': 'user_shenheguan',
'indexes': [models.Index(fields=['user'], name='user_shenhe_user_id_624f19_idx')],
},
),
]

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.27 on 2026-05-18 02:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0012_usershenheguan'),
]
operations = [
migrations.AddField(
model_name='usershenheguan',
name='is_renzheng',
field=models.BooleanField(default=False, verbose_name='是否认证'),
),
]

View File

@@ -1,113 +0,0 @@
# Generated by Django 4.2.27 on 2026-06-08 23:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0013_usershenheguan_is_renzheng'),
]
operations = [
migrations.CreateModel(
name='TixianAutoRecord',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False)),
('tixian_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='提现订单号(自定义)')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('leixing', models.IntegerField(verbose_name='提现类型 1打手 2管事')),
('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='申请提现金额')),
('shouxufei', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='手续费')),
('shijidaozhang', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='实际到账金额')),
('feilv', models.DecimalField(decimal_places=4, max_digits=5, verbose_name='费率')),
('zhuangtai', models.IntegerField(choices=[(0, '处理中'), (1, '成功'), (2, '失败')], default=0, verbose_name='状态')),
('wechat_transfer_no', models.CharField(blank=True, max_length=64, null=True, verbose_name='微信转账单号')),
('wechat_package', models.TextField(blank=True, null=True, verbose_name='微信返回的package_info(JSON)')),
('fail_reason', models.TextField(blank=True, null=True, verbose_name='失败原因')),
('shenhe_danhao', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联审核单号')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '自动提现记录',
'verbose_name_plural': '自动提现记录',
'db_table': 'tixian_auto_record',
},
),
migrations.CreateModel(
name='TixianShenheJilu',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('shenhe_danhao', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='审核单号')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('leixing', models.PositiveSmallIntegerField(db_index=True, verbose_name='提现类型')),
('zhuangtai', models.IntegerField(db_index=True, default=1, verbose_name='审核状态(1审核中2提现成功3提现失败4审核成功5审核失败6待收款)')),
('shenqing_jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='申请提现金额(扣款额)')),
('shouxufei', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='手续费')),
('shijidaozhang', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='实际到账金额')),
('feilv', models.DecimalField(decimal_places=4, default=0, max_digits=5, verbose_name='手续费率')),
('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回/失败原因')),
('bo_hui_ren_id', models.CharField(blank=True, db_index=True, max_length=11, null=True, verbose_name='驳回人用户ID')),
('shenhe_ren_id', models.CharField(blank=True, db_index=True, max_length=11, null=True, verbose_name='审核通过操作人ID')),
('tixianjilu_id', models.IntegerField(blank=True, db_index=True, null=True, verbose_name='关联Tixianjilu.id')),
('tixian_auto_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='最近一次打款单号(非唯一,重试收款会更新)')),
('fail_reason', models.TextField(blank=True, null=True, verbose_name='微信打款失败原因')),
('dakuan_mode', models.PositiveSmallIntegerField(db_index=True, default=1, verbose_name='打款方式(1手动2自动)')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '提现审核记录',
'verbose_name_plural': '提现审核记录',
'db_table': 'tixian_shenhe_jilu',
},
),
migrations.AddField(
model_name='tixianjilu',
name='shenhe_danhao',
field=models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联提现审核单号'),
),
migrations.AddField(
model_name='tixianjilu',
name='shenhe_jilu_id',
field=models.IntegerField(blank=True, db_index=True, null=True, verbose_name='关联提现审核记录ID(TixianShenheJilu.id)'),
),
migrations.AlterField(
model_name='tixianjilu',
name='shenheid',
field=models.CharField(db_index=True, max_length=11, null=True, verbose_name='审核用户ID'),
),
migrations.AddIndex(
model_name='tixianjilu',
index=models.Index(fields=['shenhe_danhao'], name='tixianjilu_shenhe__7b3e7f_idx'),
),
migrations.AddIndex(
model_name='tixianjilu',
index=models.Index(fields=['shenhe_jilu_id'], name='tixianjilu_shenhe__d9355e_idx'),
),
migrations.AddIndex(
model_name='tixianshenhejilu',
index=models.Index(fields=['yonghuid', 'zhuangtai'], name='tixian_shen_yonghui_a782e9_idx'),
),
migrations.AddIndex(
model_name='tixianshenhejilu',
index=models.Index(fields=['yonghuid', 'leixing'], name='tixian_shen_yonghui_bb44eb_idx'),
),
migrations.AddIndex(
model_name='tixianshenhejilu',
index=models.Index(fields=['shenhe_danhao'], name='tixian_shen_shenhe__4a1ca7_idx'),
),
migrations.AddIndex(
model_name='tixianautorecord',
index=models.Index(fields=['tixian_id'], name='tixian_auto_tixian__273dac_idx'),
),
migrations.AddIndex(
model_name='tixianautorecord',
index=models.Index(fields=['yonghuid'], name='tixian_auto_yonghui_61c5b6_idx'),
),
migrations.AddIndex(
model_name='tixianautorecord',
index=models.Index(fields=['zhuangtai'], name='tixian_auto_zhuangt_24d9fa_idx'),
),
]

View File

@@ -4,7 +4,7 @@ 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')
@@ -54,6 +54,7 @@ class UserMain(AbstractBaseUser, QModel):
REQUIRED_FIELDS = ['yonghuid'] # 必填字段
class Meta:
managed = False
db_table = 'user_main'
verbose_name = '用户主表'
verbose_name_plural = verbose_name
@@ -90,8 +91,8 @@ class OfficialAccountUser(QModel):
# ==================== 老板扩展表 ====================
class UserBoss(QModel):
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='boss_profile',
verbose_name='关联用户')
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='boss_profile',
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='订单总数')
@@ -107,8 +108,8 @@ class UserBoss(QModel):
# ==================== 打手扩展表 ====================
class UserDashou(QModel):
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='dashou_profile',
verbose_name='关联用户')
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='dashou_profile',
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='打手状态')
@@ -151,8 +152,8 @@ class UserDashou(QModel):
# ==================== 商家扩展表 ====================
class UserShangjia(QModel):
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='shop_profile',
verbose_name='关联用户')
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='shop_profile',
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='商家状态')
@@ -180,8 +181,8 @@ class UserShangjia(QModel):
# ==================== 管事扩展表 ====================
class UserGuanshi(QModel):
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='guanshi_profile',
verbose_name='关联用户')
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='guanshi_profile',
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')
@@ -223,11 +224,12 @@ class UserGuanshi(QModel):
class UserZuzhang(QModel):
"""组长扩展表与UserMain一对一关联"""
user = models.OneToOneField(
UserMain,
'gvsdsdk.User',
on_delete=models.CASCADE,
related_name='zuzhang_profile',
verbose_name='关联用户',
db_index=True
db_index=True,
db_column='UserUUID'
)
# 组长邀请码
yaoqingma = models.CharField(max_length=20, null=True, db_index=True, verbose_name='组长邀请码')
@@ -276,7 +278,7 @@ class UserZuzhang(QModel):
class UserShenheguan(QModel):
"""审核官扩展表与UserMain一对一关联"""
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='shenheguan_profile', verbose_name='关联用户', db_index=True)
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='shenheguan_profile', 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='是否认证')
@@ -296,8 +298,8 @@ class UserShenheguan(QModel):
# ==================== 管理员扩展表 ====================
class AdminProfile(QModel):
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='admin_profile',
verbose_name='关联用户')
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='admin_profile',
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='管理员邀请码') # 🟢 新增字段
@@ -311,7 +313,7 @@ class AdminProfile(QModel):
class UserKefu(QModel):
user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='kefu_profile', verbose_name='关联用户')
user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='kefu_profile', 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='客服状态')
@@ -598,3 +600,30 @@ class RankingRecord(QModel):
return f"{self.tongji_date} {zhouqi_str}{shenfen_map.get(self.shenfen)}{self.paiming}"
# ==================== 用户敏感数据表 ====================
class UserSensitiveData(QModel):
"""用户敏感数据表——独立存储敏感信息,不继承 gvsdsdk"""
user_uuid = models.OneToOneField(
'gvsdsdk.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='手机号是否已认证')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = 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}'

View File

@@ -17,7 +17,8 @@ from backend.models import (
ZuzhangRiTongji,
ShangjiaRiTongji,
)
from users.models import UserMain, UserDashou, UserShangjia, UserBoss
from users.models import UserDashou, UserShangjia, UserBoss
from gvsdsdk.models import User
logger = logging.getLogger(__name__)
@@ -200,7 +201,7 @@ class PhbHqsjView(APIView):
if not yonghuids:
return {}, {}
users = UserMain.objects.filter(yonghuid__in=yonghuids)
users = User.objects.filter(yonghuid__in=yonghuids)
avatar_map = {u.yonghuid: u.avatar or '' for u in users}
nick_map = {}

View File

@@ -12,9 +12,10 @@ import logging
from decimal import Decimal
from users.models import (
UserMain, UserDashou, UserShangjia, UserGuanshi, UserBoss,
UserDashou, UserShangjia, UserGuanshi, UserBoss,
RankingRecord
)
from gvsdsdk.models import User
logger = logging.getLogger(__name__)

View File

@@ -41,11 +41,11 @@ from .models import (
Tixianjilu,
UserDashou,
UserGuanshi,
UserMain,
UserShenheguan,
UserShangjia,
UserZuzhang,
)
from gvsdsdk.models import User
from orders.utils import update_daily_payout
@@ -708,8 +708,8 @@ def release_collect_quota_for_record(auto_record):
if not _quota_already_reserved_for_record(auto_record):
return
try:
user_main = UserMain.query.get(yonghuid=auto_record.yonghuid)
except UserMain.DoesNotExist:
user_main = User.query.get(yonghuid=auto_record.yonghuid)
except User.DoesNotExist:
logger.error('回滚限额预占失败:用户不存在 %s', auto_record.yonghuid)
return
release_collect_quota_reservation(
@@ -753,8 +753,8 @@ def apply_transfer_success_quota(auto_record):
shijidaozhang = auto_record.shijidaozhang or decimal.Decimal('0.00')
try:
user_main = UserMain.query.get(yonghuid=auto_record.yonghuid)
except UserMain.DoesNotExist:
user_main = User.query.get(yonghuid=auto_record.yonghuid)
except User.DoesNotExist:
logger.error('打款成功累加限额失败:用户不存在 %s', auto_record.yonghuid)
return
@@ -966,7 +966,7 @@ def close_audit_over_limit_refund(audit, auto_record=None, fail_reason='单笔
if audit.zhuangtai in (2, 3, 5):
return False
user_main = UserMain.objects.select_for_update().get(yonghuid=audit.yonghuid)
user_main = User.objects.select_for_update().get(yonghuid=audit.yonghuid)
refund_balance(user_main, audit.leixing, audit.shijidaozhang)
sync_audit_and_jilu_status(
audit, 3,

View File

@@ -60,11 +60,12 @@ from backend.utils import (
from rank.utils import get_tag_fee, create_shenhe_jilu, validate_shenheguan
from .models import (
UserMain, UserBoss, UserDashou, UserShangjia, UserGuanshi,
UserBoss, UserDashou, UserShangjia, UserGuanshi,
UserZuzhang, UserKefu, AdminProfile, OfficialAccountUser,
TixianAutoRecord, TixianShenheJilu, Tixianjilu, Xiugaijilu,
RankingRecord
)
from gvsdsdk.models import User
from .tixian_shenhe_services import (
load_audit_meta_map, refund_balance, sync_audit_and_jilu_status,
mark_transfer_success, release_collect_quota_for_record,
@@ -202,7 +203,7 @@ class WechatMiniProgramLoginView(APIView):
with transaction.atomic():
# 创建或获取用户
user_main, created = UserMain.objects.select_for_update().get_or_create(
user_main, created = User.objects.select_for_update().get_or_create(
openid=openid,
defaults={'yonghuid': self.shengchengYonghuID(), 'user_type': 'normal'}
)
@@ -342,7 +343,7 @@ class WechatMiniProgramLoginView(APIView):
user_id = timestamp_part + random_part
if len(user_id) == 7 and user_id.isdigit():
if not UserMain.query.filter(yonghuid=user_id).exists():
if not User.query.filter(yonghuid=user_id).exists():
return user_id
raise Exception('生成用户ID失败')
@@ -826,9 +827,9 @@ class HuoQuYaoQingRenView(APIView):
# 3. 查询邀请人主表(头像)
try:
inviter_main = UserMain.query.get(yonghuid=yaoqingren_id)
inviter_main = User.query.get(yonghuid=yaoqingren_id)
touxiang = inviter_main.avatar or ''
except UserMain.DoesNotExist:
except User.DoesNotExist:
return Response({
'code': 404,
'message': '邀请人信息不存在',
@@ -1291,7 +1292,7 @@ class DashouZhuceView(APIView):
}, status=status.HTTP_400_BAD_REQUEST)
current_user = request.user
# 注意这里request.user是UserMain实例
# 注意这里request.user是User实例
# 2. 检查用户是否已是打手 (使用反向查询,性能最优)
try:
@@ -2303,7 +2304,7 @@ class AdminLoginView(APIView):
with transaction.atomic():
# 【优化点1】使用select_related一次性获取管理员扩展表
# 只查询管理员类型的用户
user = UserMain.query.filter(
user = User.query.filter(
phone=zhanghao, # 手机号作为账号
password=mima, # 密码
user_type='admin' # 必须是管理员类型
@@ -2422,7 +2423,7 @@ class AdminFinancialDataView(APIView):
status=status.HTTP_401_UNAUTHORIZED
)
# 2. 获取当前登录用户JWT认证后request.user就是UserMain实例)
# 2. 获取当前登录用户JWT认证后request.user就是User实例
dangqianyonghu = request.user
# 3. 验证用户类型是否为admin
@@ -2444,7 +2445,7 @@ class AdminFinancialDataView(APIView):
try:
# 使用select_related一次性获取管理员扩展表
# 注意这里假设user_type='admin'的用户都有admin_profile
yonghu_xiangxi = UserMain.query.select_related('admin_profile').get(
yonghu_xiangxi = User.query.select_related('admin_profile').get(
pk=dangqianyonghu.pk,
user_type='admin'
)
@@ -2456,7 +2457,7 @@ class AdminFinancialDataView(APIView):
status=status.HTTP_401_UNAUTHORIZED
)
except UserMain.DoesNotExist:
except User.DoesNotExist:
return Response(
{'code': 401, 'msg': '身份验证失败', 'data': None},
status=status.HTTP_401_UNAUTHORIZED
@@ -3826,7 +3827,7 @@ class AdckyhxqView(APIView):
}, status=status.HTTP_400_BAD_REQUEST)
# 查询用户主表 - 使用select_related优化查询
user_main = UserMain.query.filter(yonghuid=uid).first()
user_main = User.query.filter(yonghuid=uid).first()
if not user_main:
return Response({
'code': 404,
@@ -3855,7 +3856,7 @@ class AdckyhxqView(APIView):
# 根据用户类型查询扩展信息
if user_type == 1: # 老板
# 使用select_related预取boss_profile
user_main = UserMain.query.filter(yonghuid=uid).select_related('boss_profile').first()
user_main = User.query.filter(yonghuid=uid).select_related('boss_profile').first()
if user_main.boss_profile:
boss_profile = user_main.boss_profile
user_info.update({
@@ -3868,7 +3869,7 @@ class AdckyhxqView(APIView):
elif user_type == 2: # 打手
# 使用select_related预取dashou_profile
user_main = UserMain.query.filter(yonghuid=uid).select_related('dashou_profile').first()
user_main = User.query.filter(yonghuid=uid).select_related('dashou_profile').first()
if user_main.dashou_profile:
dashou_profile = user_main.dashou_profile
@@ -3927,7 +3928,7 @@ class AdckyhxqView(APIView):
elif user_type == 3: # 管事
# 使用select_related预取guanshi_profile
user_main = UserMain.query.filter(yonghuid=uid).select_related('guanshi_profile').first()
user_main = User.query.filter(yonghuid=uid).select_related('guanshi_profile').first()
if user_main.guanshi_profile:
guanshi_profile = user_main.guanshi_profile
user_info.update({
@@ -3946,7 +3947,7 @@ class AdckyhxqView(APIView):
elif user_type == 4: # 商家
# 使用select_related预取shop_profile
user_main = UserMain.query.filter(yonghuid=uid).select_related('shop_profile').first()
user_main = User.query.filter(yonghuid=uid).select_related('shop_profile').first()
if user_main.shop_profile:
shop_profile = user_main.shop_profile
user_info.update({
@@ -4060,7 +4061,7 @@ class AdcjxgView(APIView):
}, status=status.HTTP_400_BAD_REQUEST)
# 查询用户主表
user_main = UserMain.query.filter(yonghuid=uid).first()
user_main = User.query.filter(yonghuid=uid).first()
if not user_main:
return Response({
'code': 404,
@@ -5315,7 +5316,7 @@ class WechatLoginAndDashouRegisterView(APIView):
# 4. 开始数据库事务(确保登录和注册的原子性)
with transaction.atomic():
# 4.1 创建或获取用户(登录逻辑)
user_main, created = UserMain.objects.select_for_update().get_or_create(
user_main, created = User.objects.select_for_update().get_or_create(
openid=openid,
defaults={
'yonghuid': self.shengchengYonghuID(),
@@ -5456,7 +5457,7 @@ class WechatLoginAndDashouRegisterView(APIView):
user_id = timestamp_part + random_part
if len(user_id) == 7 and user_id.isdigit():
if not UserMain.query.filter(yonghuid=user_id).exists():
if not User.query.filter(yonghuid=user_id).exists():
return user_id
raise Exception('生成用户ID失败')
@@ -6718,8 +6719,8 @@ class KefuLoginView(APIView):
client_ip = self.get_client_ip(request)
# 3. 查询所有手机号匹配且类型为客服的用户
# 注意UserMain 中需要有 user_type 字段,且值为 'kefu' 代表客服
user_mains = UserMain.query.filter(
# 注意User 中需要有 user_type 字段,且值为 'kefu' 代表客服
user_mains = User.query.filter(
phone=phone,
user_type='kefu' # 只查找客服账号
).select_related('kefu_profile') # 预加载客服扩展表
@@ -7063,7 +7064,7 @@ class KefuGetOrderListView(APIView):
laoban_ids = [o.pingtai_kuozhan.laoban_id for o in orders_qs if hasattr(o, 'pingtai_kuozhan') and o.pingtai_kuozhan.laoban_id]
nickname_map = {}
if laoban_ids:
users = UserMain.query.filter(yonghuid__in=laoban_ids).select_related('boss_profile').only(
users = User.query.filter(yonghuid__in=laoban_ids).select_related('boss_profile').only(
'yonghuid', 'boss_profile__nickname'
)
for user in users:
@@ -7193,7 +7194,7 @@ class KefuGetShangjiaOrderListView(APIView):
q_conditions &= Q(clkf__icontains=clkf)
if shangjia_nicheng:
# 通过商家扩展表关联 UserShangjia 的昵称
q_conditions &= Q(shangjia_kuozhan__shangjia_id__in=UserMain.query.filter(
q_conditions &= Q(shangjia_kuozhan__shangjia_id__in=User.query.filter(
shop_profile__nicheng__icontains=shangjia_nicheng
).values_list('yonghuid', flat=True))
@@ -7232,7 +7233,7 @@ class KefuGetShangjiaOrderListView(APIView):
shangjia_ids = [o.shangjia_kuozhan.shangjia_id for o in orders_qs if hasattr(o, 'shangjia_kuozhan') and o.shangjia_kuozhan.shangjia_id]
nickname_map = {}
if shangjia_ids:
users = UserMain.query.filter(yonghuid__in=shangjia_ids).select_related('shop_profile').only(
users = User.query.filter(yonghuid__in=shangjia_ids).select_related('shop_profile').only(
'yonghuid', 'shop_profile__nicheng'
)
for user in users:
@@ -7338,8 +7339,8 @@ class KefuChangeDashouView(APIView):
# 5. 查询新打手
try:
new_dashou_user = UserMain.query.get(yonghuid=new_dashou_id)
except UserMain.DoesNotExist:
new_dashou_user = User.query.get(yonghuid=new_dashou_id)
except User.DoesNotExist:
return Response({'code': 404, 'msg': '打手不存在'}, status=status.HTTP_404_NOT_FOUND)
# 6. 验证打手扩展表
@@ -7400,13 +7401,13 @@ class KefuChangeDashouView(APIView):
old_dashou_id = order.jiedan_dashou_id
if old_dashou_id:
try:
old_dashou_user = UserMain.query.get(yonghuid=old_dashou_id)
old_dashou_user = User.query.get(yonghuid=old_dashou_id)
old_dashou_profile = old_dashou_user.dashou_profile
old_dashou_profile.zhuangtai = 1 # 恢复空闲
old_dashou_profile.tuikuanliang += 1 # 原打手退款总量+1业务逻辑
old_dashou_profile.save()
logger.info(f"原打手 {old_dashou_id} 状态已更新")
except (UserMain.DoesNotExist, ObjectDoesNotExist):
except (User.DoesNotExist, ObjectDoesNotExist):
logger.warning(f"原打手 {old_dashou_id} 不存在或信息不完整,跳过更新")
except Exception as e:
logger.error(f"更新原打手时异常: {str(e)}", exc_info=True)
@@ -7576,13 +7577,13 @@ class KefuPlatformRefundView(APIView):
jiedan_dashou_id = order.jiedan_dashou_id
if jiedan_dashou_id:
try:
dashou_user = UserMain.query.get(yonghuid=jiedan_dashou_id)
dashou_user = User.query.get(yonghuid=jiedan_dashou_id)
dashou_profile = dashou_user.dashou_profile
dashou_profile.tuikuanliang += 1
dashou_profile.zhuangtai = 1 # 打手状态设为空闲
dashou_profile.save()
logger.info(f"平台退款:打手 {jiedan_dashou_id} 退款订单+1")
except (UserMain.DoesNotExist, ObjectDoesNotExist):
except (User.DoesNotExist, ObjectDoesNotExist):
logger.warning(f"平台退款:打手 {jiedan_dashou_id} 不存在或扩展表缺失,跳过更新")
# ========== 新增:商品和店铺每日统计 ==========
@@ -7841,7 +7842,7 @@ class KefuRejectRefundView(APIView):
# 7. 给打手结算(返还分成)
if jiedan_dashou_id:
try:
dashou_user = UserMain.query.get(yonghuid=jiedan_dashou_id)
dashou_user = User.query.get(yonghuid=jiedan_dashou_id)
dashou_profile = dashou_user.dashou_profile
# 增加打手相关统计数据
dashou_profile.chengjiaozongliang += 1
@@ -7851,7 +7852,7 @@ class KefuRejectRefundView(APIView):
dashou_profile.jinyueshouyi += dashou_fencheng
dashou_profile.save()
logger.info(f"拒绝退款:打手 {jiedan_dashou_id} 获得分成 {dashou_fencheng}")
except (UserMain.DoesNotExist, AttributeError):
except (User.DoesNotExist, AttributeError):
logger.warning(f"拒绝退款:打手 {jiedan_dashou_id} 不存在或扩展表缺失,跳过结算")
# 8. 如果是商家发单,更新商家成交订单数量
@@ -7861,7 +7862,7 @@ class KefuRejectRefundView(APIView):
shangjia_kuozhan = order.shangjia_kuozhan
shangjia_id = shangjia_kuozhan.shangjia_id
if shangjia_id:
shangjia_user = UserMain.query.get(yonghuid=shangjia_id)
shangjia_user = User.query.get(yonghuid=shangjia_id)
shangjia_profile = shangjia_user.shop_profile
shangjia_profile.chengjiao += 1
shangjia_profile.save()
@@ -7873,7 +7874,7 @@ class KefuRejectRefundView(APIView):
amount=Decimal(str(order.jine)),
action=2 # 2 = 结算
)
except (ObjectDoesNotExist, UserMain.DoesNotExist, AttributeError):
except (ObjectDoesNotExist, User.DoesNotExist, AttributeError):
logger.warning(f"拒绝退款:商家信息不存在,跳过商家更新")
# 9. 更新退款记录表
@@ -8018,22 +8019,22 @@ class KefuMerchantRefundView(APIView):
# 更新打手
if jiedan_dashou_id:
try:
dashou_user = UserMain.query.get(yonghuid=jiedan_dashou_id)
dashou_user = User.query.get(yonghuid=jiedan_dashou_id)
dashou_profile = dashou_user.dashou_profile
dashou_profile.tuikuanliang += 1
dashou_profile.zhuangtai = 1
dashou_profile.save()
except (UserMain.DoesNotExist, ObjectDoesNotExist):
except (User.DoesNotExist, ObjectDoesNotExist):
logger.warning(f"商家退款:打手 {jiedan_dashou_id} 不存在,跳过更新")
# 更新商家
try:
shangjia_user = UserMain.query.get(yonghuid=shangjia_id)
shangjia_user = User.query.get(yonghuid=shangjia_id)
shangjia_profile = shangjia_user.shop_profile
shangjia_profile.tuikuan += 1
shangjia_profile.yue += jine
shangjia_profile.save()
except (UserMain.DoesNotExist, ObjectDoesNotExist):
except (User.DoesNotExist, ObjectDoesNotExist):
logger.warning(f"商家退款:商家 {shangjia_id} 不存在,跳过更新")
# 更新退款记录表
@@ -8155,13 +8156,13 @@ class KefuRejectSettlementView(APIView):
# 5.3 更新打手扩展表
try:
dashou_user = UserMain.query.get(yonghuid=jiedan_dashou_id)
dashou_user = User.query.get(yonghuid=jiedan_dashou_id)
dashou_profile = dashou_user.dashou_profile
dashou_profile.zhuangtai = 1 # 打手状态设为空闲
dashou_profile.tuikuanliang += 1 # 退款订单总量+1
dashou_profile.save()
logger.info(f"拒绝结算:打手 {jiedan_dashou_id} 退款订单+1状态空闲")
except (UserMain.DoesNotExist, ObjectDoesNotExist):
except (User.DoesNotExist, ObjectDoesNotExist):
logger.warning(f"拒绝结算:打手 {jiedan_dashou_id} 不存在或扩展表缺失,跳过更新")
except Exception as e:
logger.error(f"拒绝结算更新打手异常: {str(e)}", exc_info=True)
@@ -8380,7 +8381,7 @@ class KefuGetDashouListView(APIView):
return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED)
# 3. 构建查询条件(只查询打手)
# 通过 UserDashou 扩展表关联 UserMain
# 通过 UserDashou 扩展表关联 User
queryset = UserDashou.query.select_related('user').all()
if keyword:
@@ -8470,10 +8471,10 @@ class KefuGetDashouDetailView(APIView):
# 3. 查询打手主表和扩展表
try:
# 使用 select_related 预加载 dashou_profile减少数据库查询
user_main = UserMain.query.select_related('dashou_profile').get(
user_main = User.query.select_related('dashou_profile').get(
yonghuid=uid
)
except UserMain.DoesNotExist:
except User.DoesNotExist:
return Response({'code': 404, 'msg': '打手不存在'}, status=status.HTTP_404_NOT_FOUND)
# 验证用户类型是否为打手(可选,但建议验证)
@@ -8616,9 +8617,9 @@ class KefuUpdateDashouView(APIView):
# 3. 查询打手是否存在
try:
dashou_user = UserMain.query.get(yonghuid=dashou_id, user_type='dashou')
dashou_user = User.query.get(yonghuid=dashou_id, user_type='dashou')
dashou_profile = dashou_user.dashou_profile
except UserMain.DoesNotExist:
except User.DoesNotExist:
return Response({'code': 404, 'msg': '打手不存在'})
except UserDashou.DoesNotExist:
return Response({'code': 404, 'msg': '打手扩展信息缺失'})
@@ -9409,7 +9410,7 @@ class KefuForceCompleteView(APIView):
# 5. 给打手结算
try:
dashou_user = UserMain.query.get(yonghuid=dashou_id)
dashou_user = User.query.get(yonghuid=dashou_id)
dashou_profile = dashou_user.dashou_profile
# 原子更新(避免并发重复加)
dashou_profile.chengjiaozongliang = F('chengjiaozongliang') + 1
@@ -9421,7 +9422,7 @@ class KefuForceCompleteView(APIView):
'chengjiaozongliang', 'yue', 'zonge',
'jinrishouyi', 'jinyueshouyi'
])
except (UserMain.DoesNotExist, AttributeError):
except (User.DoesNotExist, AttributeError):
return Response({'code': 400, 'msg': '打手不存在或扩展表缺失'})
# 6. 如果是商家发单,更新商家成交订单数量
@@ -9430,7 +9431,7 @@ class KefuForceCompleteView(APIView):
# 通过 DingdanShangjia 获取商家ID
shangjia_ext = order.shangjia_kuozhan # 假设 related_name='shangjia_kuozhan'
if shangjia_ext and shangjia_ext.shangjia_id:
shangjia_user = UserMain.query.get(yonghuid=shangjia_ext.shangjia_id)
shangjia_user = User.query.get(yonghuid=shangjia_ext.shangjia_id)
shangjia_profile = shangjia_user.shop_profile
shangjia_profile.chengjiao = F('chengjiao') + 1
shangjia_profile.save(update_fields=['chengjiao'])
@@ -9873,8 +9874,8 @@ class KefuWithdrawDetailView(APIView):
# 查询用户主表
try:
user = UserMain.query.get(yonghuid=record.yonghuid)
except UserMain.DoesNotExist:
user = User.query.get(yonghuid=record.yonghuid)
except User.DoesNotExist:
user = None
# 构建基础返回数据(字段必须与前端一致)
@@ -10046,8 +10047,8 @@ class KefuWithdrawActionView(APIView):
raise ValueError(f'提现记录{tixian_id}:审核记录非审核中状态')
try:
user = UserMain.objects.select_for_update().get(yonghuid=req_yonghuid)
except UserMain.DoesNotExist:
user = User.objects.select_for_update().get(yonghuid=req_yonghuid)
except User.DoesNotExist:
raise ValueError(f'用户{req_yonghuid}不存在')
if action == 1:
@@ -10099,8 +10100,8 @@ class KefuWithdrawActionView(APIView):
raise ValueError(f'提现记录{tixian_id}:自动打款请走自动流程')
try:
user = UserMain.query.get(yonghuid=tixian.yonghuid)
except UserMain.DoesNotExist:
user = User.query.get(yonghuid=tixian.yonghuid)
except User.DoesNotExist:
raise ValueError(f'用户{tixian.yonghuid}不存在')
if action == 1:
@@ -10246,9 +10247,9 @@ class KefuPunishView(APIView):
# 5. 查询打手
try:
dashou_user = UserMain.query.get(yonghuid=dashou_id)
dashou_user = User.query.get(yonghuid=dashou_id)
dashou = dashou_user.dashou_profile
except UserMain.DoesNotExist:
except User.DoesNotExist:
return Response({'code': 404, 'msg': '打手用户不存在'}, status=status.HTTP_404_NOT_FOUND)
except ObjectDoesNotExist:
return Response({'code': 400, 'msg': '该用户不是打手'}, status=status.HTTP_400_BAD_REQUEST)
@@ -10319,7 +10320,7 @@ class AdKftjView(APIView):
return Response({'code': 401, 'message': '身份验证失败'}, status=status.HTTP_401_UNAUTHORIZED)
# 3. 检查手机号是否已被使用
if UserMain.query.filter(phone=phone).exists():
if User.query.filter(phone=phone).exists():
return Response({'code': 400, 'message': '该手机号已被注册'})
# 4. 生成唯一 yonghuid
@@ -10328,13 +10329,13 @@ class AdKftjView(APIView):
timestamp = str(int(time.time()))[-5:]
rand = str(random.randint(0, 99)).zfill(2)
uid = timestamp + rand
if len(uid) == 7 and not UserMain.query.filter(yonghuid=uid).exists():
if len(uid) == 7 and not User.query.filter(yonghuid=uid).exists():
return uid
raise Exception('无法生成唯一用户ID')
with transaction.atomic():
# 创建主表用户
user = UserMain.query.create(
user = User.query.create(
yonghuid=generate_yonghuid(),
phone=phone,
password=password,
@@ -10466,9 +10467,9 @@ class AdKfxgView(APIView):
# 查询客服
try:
user = UserMain.query.get(phone=uid)
user = User.query.get(phone=uid)
kefu = user.kefu_profile
except (UserMain.DoesNotExist, UserKefu.DoesNotExist):
except (User.DoesNotExist, UserKefu.DoesNotExist):
return Response({'code': 404, 'message': '客服不存在'})
# 更新数据
@@ -10476,7 +10477,7 @@ class AdKfxgView(APIView):
# 更新主表字段
if 'phone' in request.data:
new_phone = request.data.get('phone').strip()
if new_phone and UserMain.query.filter(phone=new_phone).exclude(phone=uid).exists():
if new_phone and User.query.filter(phone=new_phone).exclude(phone=uid).exists():
return Response({'code': 400, 'message': '手机号已被使用'})
user.phone = new_phone
if 'password' in request.data:
@@ -10538,7 +10539,7 @@ class WechatLoginAndGuanshiRegisterView(APIView):
kehuduan_ip = self._huoqu_kehuduan_ip(request)
with transaction.atomic():
user_main, created = UserMain.objects.select_for_update().get_or_create(
user_main, created = User.objects.select_for_update().get_or_create(
openid=openid,
defaults={
'yonghuid': self._shengcheng_yonghu_id(),
@@ -10644,7 +10645,7 @@ class WechatLoginAndGuanshiRegisterView(APIView):
random_part = str(random.randint(0, 99)).zfill(2)
user_id = timestamp_part + random_part
if len(user_id) == 7 and user_id.isdigit():
if not UserMain.query.filter(yonghuid=user_id).exists():
if not User.query.filter(yonghuid=user_id).exists():
return user_id
raise Exception('生成用户ID失败')
@@ -11207,7 +11208,7 @@ class DashouJianquanView(APIView):
def post(self, request):
# ========== 1. 通过 JWT 获取当前登录用户 ==========
user = request.user # UserMain 实例
user = request.user # User 实例
# ========== 2. 检查是否为已注册打手 ==========
try:
@@ -11286,7 +11287,7 @@ class LaobanJianquanView(APIView):
def post(self, request):
# ========== 1. 通过 JWT 获取当前登录用户 ==========
user = request.user # UserMain 实例
user = request.user # User 实例
# ========== 2. 高效查询平台订单扩展表 ==========
# 利用 DingdanPingtai.laoban_id 索引 + Dingdan.zhuangtai 索引
@@ -12368,7 +12369,7 @@ class KaohePayCallbackView(View):
temp = KaohePayTemp.query.get(dingdan_id=out_trade_no, yonghuid=order.yonghuid)
logger.info(f"找到临时表记录: {out_trade_no}, 用户ID: {order.yonghuid}")
user = UserMain.query.get(yonghuid=order.yonghuid)
user = User.query.get(yonghuid=order.yonghuid)
logger.info(f"获取用户信息成功: {user.yonghuid}")
success, msg, record = create_shenhe_jilu_from_temp(user, temp)
@@ -12652,7 +12653,7 @@ class GuanshiContactView(APIView):
def post(self, request):
# 1. 获取当前登录用户必须已通过JWT认证
current_user = request.user # 类型: UserMain
current_user = request.user # 类型: User
# 2. 校验是否为管事身份(存在管事扩展表记录)
try:
@@ -12675,8 +12676,8 @@ class GuanshiContactView(APIView):
# 4. 根据邀请人用户ID查询用户主表
try:
inviter_user = UserMain.query.get(yonghuid=inviter_yonghuid)
except UserMain.DoesNotExist:
inviter_user = User.query.get(yonghuid=inviter_yonghuid)
except User.DoesNotExist:
logger.error(f"邀请人用户不存在: yonghuid={inviter_yonghuid}")
return Response({
'code': 404,