diff --git a/a_long_dianjing/settings.py b/a_long_dianjing/settings.py index da67050..8eda5ef 100644 --- a/a_long_dianjing/settings.py +++ b/a_long_dianjing/settings.py @@ -119,8 +119,8 @@ SIMPLE_JWT = { 'LEEWAY': 0, 'AUTH_HEADER_TYPES': ('Bearer',), 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', - 'USER_ID_FIELD': 'yonghuid', - 'USER_ID_CLAIM': 'yonghuid', + 'USER_ID_FIELD': 'YonghuID', + 'USER_ID_CLAIM': 'YonghuID', 'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule', 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 'TOKEN_TYPE_CLAIM': 'token_type', @@ -132,7 +132,10 @@ AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', ] -AUTH_USER_MODEL = 'users.UserMain' +AUTH_USER_MODEL = 'gvsdsdk.User' + +# gvsdsdk 去远程化:所有 gvsdsdk 表存储在本地数据库 +GVSDSDK_MANAGE_TABLES = True # ==================== DRF 配置 ==================== REST_FRAMEWORK = { diff --git a/backend/migrations/0001_initial.py b/backend/migrations/0001_initial.py index d065534..c08df42 100644 --- a/backend/migrations/0001_initial.py +++ b/backend/migrations/0001_initial.py @@ -1,296 +1,275 @@ -# Generated by Django 4.2.27 on 2026-04-06 23:31 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [] - - operations = [ - migrations.CreateModel( - name="AbnormalUserLog", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "account_id", - models.CharField( - db_index=True, max_length=20, verbose_name="账号ID(phone)" - ), - ), - ( - "ip_address", - models.GenericIPAddressField( - blank=True, null=True, verbose_name="IP地址" - ), - ), - ( - "real_ip", - models.GenericIPAddressField( - blank=True, null=True, verbose_name="真实IP(穿透代理后)" - ), - ), - ( - "x_forwarded_for", - models.CharField( - blank=True, - default="", - max_length=255, - verbose_name="X-Forwarded-For", - ), - ), - ( - "user_agent", - models.CharField( - blank=True, - default="", - max_length=500, - verbose_name="User-Agent", - ), - ), - ( - "request_method", - models.CharField( - blank=True, default="", max_length=10, verbose_name="请求方法" - ), - ), - ( - "request_path", - models.CharField( - blank=True, default="", max_length=500, verbose_name="请求路径" - ), - ), - ( - "request_params", - models.TextField( - blank=True, default="", verbose_name="请求参数(GET/POST)" - ), - ), - ( - "request_body", - models.TextField( - blank=True, default="", verbose_name="请求体(原始)" - ), - ), - ( - "request_headers", - models.TextField( - blank=True, default="", verbose_name="请求头(JSON格式)" - ), - ), - ( - "attempt_type", - models.CharField( - blank=True, default="", max_length=50, verbose_name="攻击类型" - ), - ), - ( - "detail", - models.TextField(blank=True, default="", verbose_name="详细描述"), - ), - ( - "create_time", - models.DateTimeField(auto_now_add=True, verbose_name="创建时间"), - ), - ], - options={ - "verbose_name": "异常用户日志", - "verbose_name_plural": "异常用户日志", - "db_table": "abnormal_user_log", - }, - ), - migrations.CreateModel( - name="Permission", - fields=[ - ( - "perm_id", - models.AutoField( - primary_key=True, serialize=False, verbose_name="权限ID" - ), - ), - ( - "perm_code", - models.CharField( - db_index=True, - max_length=100, - unique=True, - verbose_name="权限编码", - ), - ), - ( - "perm_name", - models.CharField(max_length=100, verbose_name="权限名称"), - ), - ( - "description", - models.CharField( - blank=True, default="", max_length=200, 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": "permission", - }, - ), - migrations.CreateModel( - name="Role", - fields=[ - ( - "role_id", - models.AutoField( - primary_key=True, serialize=False, verbose_name="角色ID" - ), - ), - ( - "role_code", - models.CharField( - db_index=True, - max_length=50, - unique=True, - verbose_name="角色编码", - ), - ), - ("role_name", models.CharField(max_length=50, verbose_name="角色名称")), - ( - "description", - models.CharField( - blank=True, default="", max_length=200, 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": "role", - }, - ), - migrations.CreateModel( - name="UserRole", - fields=[ - ("id", models.AutoField(primary_key=True, serialize=False)), - ( - "account_id", - models.CharField( - db_index=True, max_length=11, verbose_name="账号ID" - ), - ), - ( - "create_time", - models.DateTimeField(auto_now_add=True, verbose_name="创建时间"), - ), - ( - "update_time", - models.DateTimeField(auto_now=True, verbose_name="更新时间"), - ), - ( - "role", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="backend.role", - verbose_name="角色", - ), - ), - ], - options={ - "verbose_name": "用户角色关联", - "verbose_name_plural": "用户角色关联", - "db_table": "user_role", - }, - ), - migrations.CreateModel( - name="RolePermission", - fields=[ - ("id", models.AutoField(primary_key=True, serialize=False)), - ( - "create_time", - models.DateTimeField(auto_now_add=True, verbose_name="创建时间"), - ), - ( - "permission", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="backend.permission", - verbose_name="权限", - ), - ), - ( - "role", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="backend.role", - verbose_name="角色", - ), - ), - ], - options={ - "verbose_name": "角色权限关联", - "verbose_name_plural": "角色权限关联", - "db_table": "role_permission", - }, - ), - migrations.AddIndex( - model_name="role", - index=models.Index(fields=["role_code"], name="role_role_co_b9f497_idx"), - ), - migrations.AddIndex( - model_name="permission", - index=models.Index( - fields=["perm_code"], name="permission_perm_co_56cbe3_idx" - ), - ), - migrations.AddIndex( - model_name="abnormaluserlog", - index=models.Index( - fields=["account_id"], name="abnormal_us_account_425899_idx" - ), - ), - migrations.AddIndex( - model_name="abnormaluserlog", - index=models.Index( - fields=["ip_address"], name="abnormal_us_ip_addr_3d612b_idx" - ), - ), - migrations.AddIndex( - model_name="abnormaluserlog", - index=models.Index( - fields=["create_time"], name="abnormal_us_create__ee16da_idx" - ), - ), - migrations.AlterUniqueTogether( - name="userrole", - unique_together={("account_id", "role")}, - ), - migrations.AlterUniqueTogether( - name="rolepermission", - unique_together={("role", "permission")}, - ), - ] +# Generated by Django 4.2.27 on 2026-06-17 01:34 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AbnormalUserLog', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('account_id', models.CharField(db_index=True, max_length=20, verbose_name='账号ID(phone)')), + ('ip_address', models.GenericIPAddressField(blank=True, null=True, verbose_name='IP地址')), + ('real_ip', models.GenericIPAddressField(blank=True, null=True, verbose_name='真实IP(穿透代理后)')), + ('x_forwarded_for', models.CharField(blank=True, default='', max_length=255, verbose_name='X-Forwarded-For')), + ('user_agent', models.CharField(blank=True, default='', max_length=500, verbose_name='User-Agent')), + ('request_method', models.CharField(blank=True, default='', max_length=10, verbose_name='请求方法')), + ('request_path', models.CharField(blank=True, default='', max_length=500, verbose_name='请求路径')), + ('request_params', models.TextField(blank=True, default='', verbose_name='请求参数(GET/POST)')), + ('request_body', models.TextField(blank=True, default='', verbose_name='请求体(原始)')), + ('request_headers', models.TextField(blank=True, default='', verbose_name='请求头(JSON格式)')), + ('attempt_type', models.CharField(blank=True, default='', max_length=50, verbose_name='攻击类型')), + ('detail', models.TextField(blank=True, default='', verbose_name='详细描述')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '异常用户日志', + 'verbose_name_plural': '异常用户日志', + 'db_table': 'abnormal_user_log', + }, + ), + migrations.CreateModel( + name='DashouRiTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='打手用户ID')), + ('riqi', models.DateField(db_index=True, verbose_name='日期')), + ('jiedan_zongliang', models.IntegerField(default=0, verbose_name='接单总量')), + ('chengjiao_zongliang', models.IntegerField(default=0, verbose_name='成交单总量')), + ('jiedan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='接单总金额')), + ('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总金额')), + ('tuikuan_liang', models.IntegerField(default=0, verbose_name='退款订单量')), + ('tuikuan_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总金额')), + ], + options={ + 'verbose_name': '打手每日统计', + 'db_table': 'dashou_ri_tongji', + }, + ), + migrations.CreateModel( + name='GuanshiRiTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='管事用户ID')), + ('riqi', models.DateField(db_index=True, verbose_name='日期')), + ('yaoqing_dashou_shu', models.IntegerField(default=0, verbose_name='邀请打手总数')), + ('chongzhi_dashou_shu', models.IntegerField(default=0, verbose_name='充值打手数量')), + ('shouru_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='收入总额')), + ], + options={ + 'verbose_name': '管事每日统计', + 'db_table': 'guanshi_ri_tongji', + }, + ), + migrations.CreateModel( + name='GuanshiXufeiRiTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='管事用户ID')), + ('riqi', models.DateField(db_index=True, verbose_name='日期')), + ('xufei_zongshu', models.IntegerField(default=0, verbose_name='今日续费总数')), + ('xufei_shouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='续费收益金额')), + ], + options={ + 'verbose_name': '管事续费每日统计', + 'db_table': 'guanshi_xufei_ri_tongji', + }, + ), + migrations.CreateModel( + name='Permission', + fields=[ + ('perm_id', models.AutoField(primary_key=True, serialize=False, verbose_name='权限ID')), + ('perm_code', models.CharField(db_index=True, max_length=100, unique=True, verbose_name='权限编码')), + ('perm_name', models.CharField(max_length=100, verbose_name='权限名称')), + ('description', models.CharField(blank=True, default='', max_length=200, 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': 'permission', + }, + ), + migrations.CreateModel( + name='Role', + fields=[ + ('role_id', models.AutoField(primary_key=True, serialize=False, verbose_name='角色ID')), + ('role_code', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='角色编码')), + ('role_name', models.CharField(max_length=50, verbose_name='角色名称')), + ('description', models.CharField(blank=True, default='', max_length=200, 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': 'role', + }, + ), + migrations.CreateModel( + name='ZuzhangRiTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='组长用户ID')), + ('riqi', models.DateField(db_index=True, verbose_name='日期')), + ('yaoqing_guanshi_shu', models.IntegerField(default=0, verbose_name='邀请管事总数')), + ('shouru_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='收入总额(分佣)')), + ('fenyong_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='分佣金额')), + ], + options={ + 'verbose_name': '组长每日统计', + 'db_table': 'zuzhang_ri_tongji', + 'indexes': [models.Index(fields=['riqi', '-yaoqing_guanshi_shu'], name='zuzhang_ri__riqi_87169e_idx'), models.Index(fields=['riqi', '-shouru_zonge'], name='zuzhang_ri__riqi_1d7e51_idx')], + 'unique_together': {('yonghuid', 'riqi')}, + }, + ), + migrations.CreateModel( + name='UserRole', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('account_id', models.CharField(db_index=True, max_length=11, verbose_name='账号ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.role', verbose_name='角色')), + ], + options={ + 'verbose_name': '用户角色关联', + 'verbose_name_plural': '用户角色关联', + 'db_table': 'user_role', + }, + ), + migrations.CreateModel( + name='TixianRiTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('riqi', models.DateField(db_index=True, verbose_name='日期')), + ('leixing', models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '组长'), (4, '考核官'), (5, '打手押金'), (6, '商家余额')], verbose_name='用户类型')), + ('total_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='当天提现总额(元)')), + ], + options={ + 'verbose_name': '每日提现统计', + 'db_table': 'tixian_ri_tongji', + 'indexes': [models.Index(fields=['riqi', 'leixing'], name='tixian_ri_t_riqi_c18bb2_idx')], + 'unique_together': {('riqi', 'leixing')}, + }, + ), + migrations.CreateModel( + name='ShangjiaRiTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='商家用户ID')), + ('riqi', models.DateField(db_index=True, verbose_name='日期')), + ('paifa_dingdan_shu', models.IntegerField(default=0, verbose_name='派发订单总数')), + ('paifa_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='派发订单总金额')), + ('jiesuan_dingdan_shu', models.IntegerField(default=0, verbose_name='结算订单总数')), + ('jiesuan_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='结算总金额')), + ('tuikuan_dingdan_shu', models.IntegerField(default=0, verbose_name='退款订单总数')), + ('tuikuan_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总金额')), + ], + options={ + 'verbose_name': '商家每日统计', + 'db_table': 'shangjia_ri_tongji', + 'indexes': [models.Index(fields=['riqi', '-paifa_jine'], name='shangjia_ri_riqi_d00f7f_idx'), models.Index(fields=['riqi', '-jiesuan_jine'], name='shangjia_ri_riqi_25772a_idx'), models.Index(fields=['riqi', '-paifa_dingdan_shu'], name='shangjia_ri_riqi_e05c54_idx')], + 'unique_together': {('yonghuid', 'riqi')}, + }, + ), + migrations.CreateModel( + name='RolePermission', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.permission', verbose_name='权限')), + ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.role', verbose_name='角色')), + ], + options={ + 'verbose_name': '角色权限关联', + 'verbose_name_plural': '角色权限关联', + 'db_table': 'role_permission', + }, + ), + migrations.AddIndex( + model_name='role', + index=models.Index(fields=['role_code'], name='role_role_co_b9f497_idx'), + ), + migrations.AddIndex( + model_name='permission', + index=models.Index(fields=['perm_code'], name='permission_perm_co_56cbe3_idx'), + ), + migrations.AddIndex( + model_name='guanshixufeiritongji', + index=models.Index(fields=['riqi', '-xufei_zongshu'], name='guanshi_xuf_riqi_7c128f_idx'), + ), + migrations.AddIndex( + model_name='guanshixufeiritongji', + index=models.Index(fields=['riqi', '-xufei_shouyi'], name='guanshi_xuf_riqi_8f09b5_idx'), + ), + migrations.AlterUniqueTogether( + name='guanshixufeiritongji', + unique_together={('yonghuid', 'riqi')}, + ), + migrations.AddIndex( + model_name='guanshiritongji', + index=models.Index(fields=['riqi', '-yaoqing_dashou_shu'], name='guanshi_ri__riqi_075e1a_idx'), + ), + migrations.AddIndex( + model_name='guanshiritongji', + index=models.Index(fields=['riqi', '-chongzhi_dashou_shu'], name='guanshi_ri__riqi_78a79d_idx'), + ), + migrations.AddIndex( + model_name='guanshiritongji', + index=models.Index(fields=['riqi', '-shouru_zonge'], name='guanshi_ri__riqi_334f52_idx'), + ), + migrations.AlterUniqueTogether( + name='guanshiritongji', + unique_together={('yonghuid', 'riqi')}, + ), + migrations.AddIndex( + model_name='dashouritongji', + index=models.Index(fields=['riqi', '-jiedan_zongliang'], name='dashou_ri_t_riqi_95a785_idx'), + ), + migrations.AddIndex( + model_name='dashouritongji', + index=models.Index(fields=['riqi', '-chengjiao_zongliang'], name='dashou_ri_t_riqi_ad9c1a_idx'), + ), + migrations.AddIndex( + model_name='dashouritongji', + index=models.Index(fields=['riqi', '-jiedan_zonge'], name='dashou_ri_t_riqi_5da703_idx'), + ), + migrations.AddIndex( + model_name='dashouritongji', + index=models.Index(fields=['riqi', '-chengjiao_zonge'], name='dashou_ri_t_riqi_0a3156_idx'), + ), + migrations.AlterUniqueTogether( + name='dashouritongji', + unique_together={('yonghuid', 'riqi')}, + ), + migrations.AddIndex( + model_name='abnormaluserlog', + index=models.Index(fields=['account_id'], name='abnormal_us_account_425899_idx'), + ), + migrations.AddIndex( + model_name='abnormaluserlog', + index=models.Index(fields=['ip_address'], name='abnormal_us_ip_addr_3d612b_idx'), + ), + migrations.AddIndex( + model_name='abnormaluserlog', + index=models.Index(fields=['create_time'], name='abnormal_us_create__ee16da_idx'), + ), + migrations.AlterUniqueTogether( + name='userrole', + unique_together={('account_id', 'role')}, + ), + migrations.AlterUniqueTogether( + name='rolepermission', + unique_together={('role', 'permission')}, + ), + ] diff --git a/backend/migrations/0002_zuzhangritongji_shangjiaritongji_and_more.py b/backend/migrations/0002_zuzhangritongji_shangjiaritongji_and_more.py deleted file mode 100644 index fa5cae7..0000000 --- a/backend/migrations/0002_zuzhangritongji_shangjiaritongji_and_more.py +++ /dev/null @@ -1,339 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-09 14:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("backend", "0001_initial"), - ] - - operations = [ - migrations.CreateModel( - name="ZuzhangRiTongji", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "yonghuid", - models.CharField( - db_index=True, max_length=7, verbose_name="组长用户ID" - ), - ), - ("riqi", models.DateField(db_index=True, verbose_name="日期")), - ( - "yaoqing_guanshi_shu", - models.IntegerField(default=0, verbose_name="邀请管事总数"), - ), - ( - "shouru_zonge", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="收入总额(分佣)", - ), - ), - ( - "fenyong_jine", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="分佣金额", - ), - ), - ], - options={ - "verbose_name": "组长每日统计", - "db_table": "zuzhang_ri_tongji", - "indexes": [ - models.Index( - fields=["riqi", "-yaoqing_guanshi_shu"], - name="zuzhang_ri__riqi_87169e_idx", - ), - models.Index( - fields=["riqi", "-shouru_zonge"], - name="zuzhang_ri__riqi_1d7e51_idx", - ), - ], - "unique_together": {("yonghuid", "riqi")}, - }, - ), - migrations.CreateModel( - name="ShangjiaRiTongji", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "yonghuid", - models.CharField( - db_index=True, max_length=7, verbose_name="商家用户ID" - ), - ), - ("riqi", models.DateField(db_index=True, verbose_name="日期")), - ( - "paifa_dingdan_shu", - models.IntegerField(default=0, verbose_name="派发订单总数"), - ), - ( - "paifa_jine", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="派发订单总金额", - ), - ), - ( - "jiesuan_dingdan_shu", - models.IntegerField(default=0, verbose_name="结算订单总数"), - ), - ( - "jiesuan_jine", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="结算总金额", - ), - ), - ( - "tuikuan_dingdan_shu", - models.IntegerField(default=0, verbose_name="退款订单总数"), - ), - ( - "tuikuan_jine", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="退款总金额", - ), - ), - ], - options={ - "verbose_name": "商家每日统计", - "db_table": "shangjia_ri_tongji", - "indexes": [ - models.Index( - fields=["riqi", "-paifa_jine"], - name="shangjia_ri_riqi_d00f7f_idx", - ), - models.Index( - fields=["riqi", "-jiesuan_jine"], - name="shangjia_ri_riqi_25772a_idx", - ), - models.Index( - fields=["riqi", "-paifa_dingdan_shu"], - name="shangjia_ri_riqi_e05c54_idx", - ), - ], - "unique_together": {("yonghuid", "riqi")}, - }, - ), - migrations.CreateModel( - name="GuanshiXufeiRiTongji", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "yonghuid", - models.CharField( - db_index=True, max_length=7, verbose_name="管事用户ID" - ), - ), - ("riqi", models.DateField(db_index=True, verbose_name="日期")), - ( - "xufei_zongshu", - models.IntegerField(default=0, verbose_name="今日续费总数"), - ), - ( - "xufei_shouyi", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="续费收益金额", - ), - ), - ], - options={ - "verbose_name": "管事续费每日统计", - "db_table": "guanshi_xufei_ri_tongji", - "indexes": [ - models.Index( - fields=["riqi", "-xufei_zongshu"], - name="guanshi_xuf_riqi_7c128f_idx", - ), - models.Index( - fields=["riqi", "-xufei_shouyi"], - name="guanshi_xuf_riqi_8f09b5_idx", - ), - ], - "unique_together": {("yonghuid", "riqi")}, - }, - ), - migrations.CreateModel( - name="GuanshiRiTongji", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "yonghuid", - models.CharField( - db_index=True, max_length=7, verbose_name="管事用户ID" - ), - ), - ("riqi", models.DateField(db_index=True, verbose_name="日期")), - ( - "yaoqing_dashou_shu", - models.IntegerField(default=0, verbose_name="邀请打手总数"), - ), - ( - "chongzhi_dashou_shu", - models.IntegerField(default=0, verbose_name="充值打手数量"), - ), - ( - "shouru_zonge", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="收入总额", - ), - ), - ], - options={ - "verbose_name": "管事每日统计", - "db_table": "guanshi_ri_tongji", - "indexes": [ - models.Index( - fields=["riqi", "-yaoqing_dashou_shu"], - name="guanshi_ri__riqi_075e1a_idx", - ), - models.Index( - fields=["riqi", "-chongzhi_dashou_shu"], - name="guanshi_ri__riqi_78a79d_idx", - ), - models.Index( - fields=["riqi", "-shouru_zonge"], - name="guanshi_ri__riqi_334f52_idx", - ), - ], - "unique_together": {("yonghuid", "riqi")}, - }, - ), - migrations.CreateModel( - name="DashouRiTongji", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "yonghuid", - models.CharField( - db_index=True, max_length=7, verbose_name="打手用户ID" - ), - ), - ("riqi", models.DateField(db_index=True, verbose_name="日期")), - ( - "jiedan_zongliang", - models.IntegerField(default=0, verbose_name="接单总量"), - ), - ( - "chengjiao_zongliang", - models.IntegerField(default=0, verbose_name="成交单总量"), - ), - ( - "jiedan_zonge", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="接单总金额", - ), - ), - ( - "chengjiao_zonge", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="成交总金额", - ), - ), - ( - "tuikuan_liang", - models.IntegerField(default=0, verbose_name="退款订单量"), - ), - ( - "tuikuan_jine", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="退款总金额", - ), - ), - ], - options={ - "verbose_name": "打手每日统计", - "db_table": "dashou_ri_tongji", - "indexes": [ - models.Index( - fields=["riqi", "-jiedan_zongliang"], - name="dashou_ri_t_riqi_95a785_idx", - ), - models.Index( - fields=["riqi", "-chengjiao_zongliang"], - name="dashou_ri_t_riqi_ad9c1a_idx", - ), - models.Index( - fields=["riqi", "-jiedan_zonge"], - name="dashou_ri_t_riqi_5da703_idx", - ), - models.Index( - fields=["riqi", "-chengjiao_zonge"], - name="dashou_ri_t_riqi_0a3156_idx", - ), - ], - "unique_together": {("yonghuid", "riqi")}, - }, - ), - ] diff --git a/backend/migrations/0003_tixianritongji.py b/backend/migrations/0003_tixianritongji.py deleted file mode 100644 index 40d140c..0000000 --- a/backend/migrations/0003_tixianritongji.py +++ /dev/null @@ -1,54 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-10 18:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("backend", "0002_zuzhangritongji_shangjiaritongji_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="TixianRiTongji", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("riqi", models.DateField(db_index=True, verbose_name="日期")), - ( - "leixing", - models.IntegerField( - choices=[(1, "打手"), (2, "管事"), (3, "组长")], - verbose_name="用户类型", - ), - ), - ( - "total_amount", - models.DecimalField( - decimal_places=2, - default=0.0, - max_digits=12, - verbose_name="当天提现总额(元)", - ), - ), - ], - options={ - "verbose_name": "每日提现统计", - "db_table": "tixian_ri_tongji", - "indexes": [ - models.Index( - fields=["riqi", "leixing"], name="tixian_ri_t_riqi_c18bb2_idx" - ) - ], - "unique_together": {("riqi", "leixing")}, - }, - ), - ] diff --git a/backend/migrations/0004_alter_rolepermission_permission_and_more.py b/backend/migrations/0004_alter_rolepermission_permission_and_more.py deleted file mode 100644 index faa7b49..0000000 --- a/backend/migrations/0004_alter_rolepermission_permission_and_more.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-15 01:42 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('backend', '0003_tixianritongji'), - ] - - operations = [ - migrations.AlterField( - model_name='rolepermission', - name='permission', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.permission', verbose_name='权限'), - ), - migrations.AlterField( - model_name='rolepermission', - name='role', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.role', verbose_name='角色'), - ), - migrations.AlterField( - model_name='tixianritongji', - name='leixing', - field=models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '组长'), (4, '考核官'), (5, '打手押金'), (6, '商家余额')], verbose_name='用户类型'), - ), - migrations.AlterField( - model_name='userrole', - name='role', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.role', verbose_name='角色'), - ), - ] diff --git a/config/migrations/0001_initial.py b/config/migrations/0001_initial.py index f5be730..8650dca 100644 --- a/config/migrations/0001_initial.py +++ b/config/migrations/0001_initial.py @@ -1,92 +1,296 @@ -# Generated by Django 5.2.10 on 2026-01-14 19:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Gonggao', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('leixing', models.IntegerField(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='更改时间')), - ('jieshao', models.TextField(blank=True, null=True, verbose_name='公告介绍')), - ], - options={ - 'verbose_name': '公告', - 'verbose_name_plural': '公告', - 'db_table': 'gonggao', - }, - ), - migrations.CreateModel( - name='Lunbo', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='轮播图片URL')), - ('leixing', models.IntegerField(blank=True, null=True, 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': 'lunbo', - }, - ), - migrations.CreateModel( - name='Qunpeizhi', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('peizhiid', models.IntegerField(blank=True, null=True, verbose_name='群类型:1.打手 2.管事')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更改时间')), - ('neirong', models.CharField(blank=True, max_length=200, null=True, verbose_name='群介绍')), - ('qunid', models.CharField(blank=True, max_length=100, null=True, verbose_name='群id')), - ('jieshao', models.CharField(blank=True, max_length=200, null=True, verbose_name='介绍')), - ], - options={ - 'db_table': 'qunpeizhi', - }, - ), - migrations.CreateModel( - name='Szjilu', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='记录ID')), - ('zongsy', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='总收益')), - ('zongls', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='总流水')), - ('zongzc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='总支出')), - ('jrzc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日支出')), - ('jrls', 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='更改时间')), - ], - options={ - 'verbose_name': '收支记录', - 'verbose_name_plural': '收支记录', - 'db_table': 'szjilu', - }, - ), - migrations.CreateModel( - name='Tupianpeizhi', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='配置图片URL')), - ('leixing', models.PositiveIntegerField(blank=True, null=True, 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': 'tupianpeizhi', - }, - ), - ] +# Generated by Django 4.2.27 on 2026-06-17 01:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Gonggao', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('leixing', models.IntegerField(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='更改时间')), + ('jieshao', models.TextField(blank=True, null=True, verbose_name='公告介绍')), + ], + options={ + 'verbose_name': '公告', + 'verbose_name_plural': '公告', + 'db_table': 'gonggao', + }, + ), + migrations.CreateModel( + name='Lunbo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='轮播图片URL')), + ('leixing', models.IntegerField(blank=True, null=True, 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': 'lunbo', + }, + ), + migrations.CreateModel( + name='PopupConfig', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('popup_id', models.CharField(max_length=50, verbose_name='弹窗唯一ID')), + ('title', models.CharField(blank=True, max_length=200, verbose_name='标题(后台用)')), + ('description', models.TextField(blank=True, verbose_name='描述(后台用)')), + ('strategy_type', models.CharField(choices=[('once', '仅一次'), ('daily', '每日'), ('weekly', '每周'), ('monthly', '每月'), ('yearly', '每年'), ('always', '始终'), ('count', '周期内次数限制')], default='once', max_length=20)), + ('max_count', models.PositiveIntegerField(default=1, verbose_name='周期内最大展示次数')), + ('reset_interval', models.CharField(blank=True, choices=[('day', '天'), ('week', '周'), ('month', '月'), ('year', '年')], max_length=20, verbose_name='重置周期(count类型时使用)')), + ('duration', models.PositiveIntegerField(default=0, verbose_name='强制阅读秒数(0=无强制)')), + ('force_even_muted', models.BooleanField(default=False, verbose_name='强制弹出(忽略用户今日屏蔽)')), + ('sort_order', models.PositiveIntegerField(default=0, verbose_name='展示顺序')), + ('is_active', models.BooleanField(default=True, verbose_name='是否启用')), + ('start_time', models.DateTimeField(blank=True, null=True, verbose_name='生效开始时间')), + ('end_time', models.DateTimeField(blank=True, null=True, verbose_name='生效结束时间')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'verbose_name': '弹窗配置', + 'verbose_name_plural': '弹窗配置', + 'db_table': 'popup_config', + 'ordering': ['sort_order', 'id'], + }, + ), + migrations.CreateModel( + name='PopupPage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('page_key', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='页面标识')), + ('name', models.CharField(max_length=100, verbose_name='页面名称')), + ('description', models.TextField(blank=True, verbose_name='描述')), + ('is_active', models.BooleanField(default=True, verbose_name='是否启用')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('ignore_user_mute', models.BooleanField(default=False, verbose_name='忽略用户今日屏蔽')), + ], + options={ + 'verbose_name': '弹窗页面', + 'verbose_name_plural': '弹窗页面', + 'db_table': 'popup_page', + }, + ), + migrations.CreateModel( + name='Qunpeizhi', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('peizhiid', models.IntegerField(blank=True, null=True, verbose_name='群类型:1.打手 2.管事')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更改时间')), + ('neirong', models.CharField(blank=True, max_length=200, null=True, verbose_name='群介绍')), + ('qunid', models.CharField(blank=True, max_length=100, null=True, verbose_name='群id')), + ('jieshao', models.CharField(blank=True, max_length=200, null=True, verbose_name='介绍')), + ], + options={ + 'db_table': 'qunpeizhi', + }, + ), + migrations.CreateModel( + name='Szjilu', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='记录ID')), + ('zongsy', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='总收益')), + ('zongls', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='总流水')), + ('zongzc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='总支出')), + ('jrzc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='今日支出')), + ('jrls', 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='更改时间')), + ], + options={ + 'verbose_name': '收支记录', + 'verbose_name_plural': '收支记录', + 'db_table': 'szjilu', + }, + ), + migrations.CreateModel( + name='TixianQuotaDefault', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False)), + ('leixing', models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '组长'), (4, '考核官'), (5, '打手押金'), (6, '商家余额')], unique=True, verbose_name='用户类型')), + ('default_quota', models.DecimalField(decimal_places=2, default=20.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='更新时间')), + ], + options={ + 'verbose_name': '默认提现限额', + 'verbose_name_plural': '默认提现限额', + 'db_table': 'tixian_quota_default', + }, + ), + migrations.CreateModel( + name='Tupianpeizhi', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='配置图片URL')), + ('leixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='提现类型1:打手规则图片2:默认头像图片')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更改时间')), + ('fangwen_cishu', models.PositiveIntegerField(default=0, verbose_name='访问次数')), + ], + options={ + 'verbose_name': '配置图片', + 'verbose_name_plural': '配置图片', + 'db_table': 'tupianpeizhi', + }, + ), + migrations.CreateModel( + name='WithdrawConfig', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mode', models.IntegerField(choices=[(1, '自动提现'), (2, '手动提现')], default=2, verbose_name='提现模式')), + ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('updated_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '提现模式配置', + 'verbose_name_plural': '提现模式配置', + 'db_table': 'withdraw_config', + }, + ), + migrations.CreateModel( + name='ShangjiaMoban', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='模板ID')), + ('yonghu_id', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), + ('leixing_id', models.PositiveIntegerField(db_index=True, verbose_name='商品类型ID')), + ('moban_jieshao', models.CharField(max_length=500, verbose_name='模板介绍')), + ('jiage', models.DecimalField(decimal_places=2, help_text='单位:元', max_digits=10, verbose_name='模板价格')), + ('fabu_shuliang', models.PositiveIntegerField(default=0, verbose_name='发布数量')), + ('yongjin_qiangdan', models.BooleanField(default=False, verbose_name='是否开启佣金抢单')), + ('yongjin_jiage', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金价格')), + ('chenghao_id', models.IntegerField(blank=True, null=True, verbose_name='关联称号ID')), + ('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': 'shangjia_moban', + 'indexes': [models.Index(fields=['yonghu_id', 'leixing_id'], name='shangjia_mo_yonghu__bb287d_idx'), models.Index(fields=['yonghu_id', 'leixing_id', 'id'], name='shangjia_mo_yonghu__4240d0_idx')], + 'unique_together': {('yonghu_id', 'leixing_id', 'moban_jieshao')}, + }, + ), + migrations.CreateModel( + name='ShangjiaLianjie', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='链接ID')), + ('yonghu_id', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), + ('leixing_id', models.PositiveIntegerField(db_index=True, verbose_name='商品类型ID')), + ('moban_id', models.PositiveIntegerField(db_index=True, verbose_name='模板ID')), + ('lianjie', models.CharField(max_length=500, unique=True, verbose_name='链接地址')), + ('dingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('is_used', models.BooleanField(db_index=True, default=False, verbose_name='是否已使用')), + ('shiyongzhe_ip', models.CharField(blank=True, max_length=50, null=True, verbose_name='使用者IP')), + ('youxiao_shijian', models.DateTimeField(blank=True, null=True, verbose_name='有效截止时间')), + ('lianjie_token', models.CharField(blank=True, db_index=True, max_length=32, null=True, unique=True, verbose_name='链接Token')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('previous_lianjie_id', models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='上一个链接ID')), + ('previous_dingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='上一个订单ID')), + ], + options={ + 'verbose_name': '商家链接', + 'verbose_name_plural': '商家链接', + 'db_table': 'shangjia_lianjie', + 'indexes': [models.Index(fields=['yonghu_id', 'moban_id', 'leixing_id'], name='shangjia_li_yonghu__9f2b25_idx'), models.Index(fields=['lianjie_token'], name='shangjia_li_lianjie_99014c_idx'), models.Index(fields=['dingdan_id'], name='shangjia_li_dingdan_95b682_idx')], + }, + ), + migrations.CreateModel( + name='PopupImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image_url', models.CharField(max_length=500, verbose_name='图片相对路径')), + ('text', models.TextField(blank=True, verbose_name='图片上方文字')), + ('sort_order', models.PositiveIntegerField(default=0, verbose_name='展示顺序')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('popup_config', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='config.popupconfig')), + ], + options={ + 'verbose_name': '弹窗图片', + 'verbose_name_plural': '弹窗图片', + 'db_table': 'popup_image', + 'ordering': ['sort_order', 'id'], + }, + ), + migrations.AddField( + model_name='popupconfig', + name='page', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='popups', to='config.popuppage'), + ), + migrations.CreateModel( + name='DailyPayoutStat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(db_index=True, unique=True, verbose_name='统计日期')), + ('year', models.PositiveSmallIntegerField(verbose_name='年份')), + ('month', models.PositiveSmallIntegerField(verbose_name='月份')), + ('day', models.PositiveSmallIntegerField(verbose_name='日期')), + ('total_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='出款总额')), + ('total_count', models.PositiveIntegerField(default=0, 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': 'daily_payout_stat', + 'indexes': [models.Index(fields=['date'], name='daily_payou_date_b534ec_idx'), models.Index(fields=['year', 'month', 'day'], name='daily_payou_year_6376ca_idx')], + }, + ), + migrations.CreateModel( + name='DailyIncomeStat', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(db_index=True, unique=True, verbose_name='统计日期')), + ('year', models.PositiveSmallIntegerField(verbose_name='年份')), + ('month', models.PositiveSmallIntegerField(verbose_name='月份')), + ('day', models.PositiveSmallIntegerField(verbose_name='日期')), + ('total_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='总收入金额')), + ('total_count', models.PositiveIntegerField(default=0, 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': 'daily_income_stat', + 'indexes': [models.Index(fields=['date'], name='daily_incom_date_75e6df_idx'), models.Index(fields=['year', 'month', 'day'], name='daily_incom_year_d85d10_idx')], + }, + ), + migrations.CreateModel( + name='AccountPermission', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('account_id', models.CharField(db_index=True, max_length=11, verbose_name='账号ID')), + ('permission_code', models.IntegerField(verbose_name='权限代码')), + ('is_enabled', models.BooleanField(default=False, verbose_name='是否开启')), + ], + options={ + 'verbose_name': '账号权限', + 'verbose_name_plural': '账号权限', + 'db_table': 'account_permission', + 'unique_together': {('account_id', 'permission_code')}, + }, + ), + migrations.AlterUniqueTogether( + name='popupconfig', + unique_together={('page', 'popup_id')}, + ), + ] diff --git a/config/migrations/0002_shangjiamoban_shangjialianjie.py b/config/migrations/0002_shangjiamoban_shangjialianjie.py deleted file mode 100644 index c3451a5..0000000 --- a/config/migrations/0002_shangjiamoban_shangjialianjie.py +++ /dev/null @@ -1,56 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-27 12:18 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='ShangjiaMoban', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='模板ID')), - ('yonghu_id', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), - ('leixing_id', models.PositiveIntegerField(db_index=True, verbose_name='商品类型ID')), - ('moban_jieshao', models.CharField(max_length=500, verbose_name='模板介绍')), - ('jiage', models.DecimalField(decimal_places=2, help_text='单位:元', max_digits=10, verbose_name='模板价格')), - ('fabu_shuliang', models.PositiveIntegerField(default=0, 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': 'shangjia_moban', - 'indexes': [models.Index(fields=['yonghu_id', 'leixing_id'], name='shangjia_mo_yonghu__bb287d_idx'), models.Index(fields=['yonghu_id', 'leixing_id', 'id'], name='shangjia_mo_yonghu__4240d0_idx')], - 'unique_together': {('yonghu_id', 'leixing_id', 'moban_jieshao')}, - }, - ), - migrations.CreateModel( - name='ShangjiaLianjie', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='链接ID')), - ('yonghu_id', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), - ('leixing_id', models.PositiveIntegerField(db_index=True, verbose_name='商品类型ID')), - ('moban_id', models.PositiveIntegerField(db_index=True, verbose_name='模板ID')), - ('lianjie', models.CharField(max_length=500, unique=True, verbose_name='链接地址')), - ('dingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='订单ID')), - ('is_used', models.BooleanField(db_index=True, default=False, verbose_name='是否已使用')), - ('shiyongzhe_ip', models.CharField(blank=True, max_length=50, null=True, verbose_name='使用者IP')), - ('youxiao_shijian', models.DateTimeField(blank=True, null=True, verbose_name='有效截止时间')), - ('lianjie_token', models.CharField(blank=True, db_index=True, max_length=32, null=True, unique=True, verbose_name='链接Token')), - ('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': 'shangjia_lianjie', - 'indexes': [models.Index(fields=['yonghu_id', 'moban_id', 'leixing_id'], name='shangjia_li_yonghu__9f2b25_idx'), models.Index(fields=['lianjie_token'], name='shangjia_li_lianjie_99014c_idx'), models.Index(fields=['dingdan_id'], name='shangjia_li_dingdan_95b682_idx')], - }, - ), - ] diff --git a/config/migrations/0003_tupianpeizhi_fangwen_cishu.py b/config/migrations/0003_tupianpeizhi_fangwen_cishu.py deleted file mode 100644 index a312d76..0000000 --- a/config/migrations/0003_tupianpeizhi_fangwen_cishu.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-16 17:04 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0002_shangjiamoban_shangjialianjie'), - ] - - operations = [ - migrations.AddField( - model_name='tupianpeizhi', - name='fangwen_cishu', - field=models.PositiveIntegerField(default=0, verbose_name='访问次数'), - ), - ] diff --git a/config/migrations/0004_tixianquotadefault.py b/config/migrations/0004_tixianquotadefault.py deleted file mode 100644 index 2e4267e..0000000 --- a/config/migrations/0004_tixianquotadefault.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-20 15:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0003_tupianpeizhi_fangwen_cishu'), - ] - - operations = [ - migrations.CreateModel( - name='TixianQuotaDefault', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('leixing', models.IntegerField(choices=[(1, '打手'), (2, '管事')], unique=True, verbose_name='用户类型')), - ('default_quota', models.DecimalField(decimal_places=2, default=20.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='更新时间')), - ], - options={ - 'verbose_name': '默认提现限额', - 'verbose_name_plural': '默认提现限额', - 'db_table': 'tixian_quota_default', - }, - ), - ] diff --git a/config/migrations/0005_ordertypemapping_dailydispatchstat_club.py b/config/migrations/0005_ordertypemapping_dailydispatchstat_club.py deleted file mode 100644 index 2ef0046..0000000 --- a/config/migrations/0005_ordertypemapping_dailydispatchstat_club.py +++ /dev/null @@ -1,76 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-24 17:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0004_tixianquotadefault'), - ] - - operations = [ - migrations.CreateModel( - name='OrderTypeMapping', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('partner_club_id', models.CharField(db_index=True, max_length=6, verbose_name='对方俱乐部ID')), - ('partner_type_id', models.PositiveIntegerField(verbose_name='对方订单类型ID')), - ('partner_type_name', models.CharField(max_length=100, verbose_name='对方订单类型名称')), - ('our_type_id', models.PositiveIntegerField(verbose_name='我方订单类型ID')), - ('our_type_name', models.CharField(max_length=100, 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': 'order_type_mapping', - 'unique_together': {('partner_club_id', 'partner_type_id')}, - }, - ), - migrations.CreateModel( - name='DailyDispatchStat', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(db_index=True, verbose_name='统计日期')), - ('year', models.PositiveSmallIntegerField(verbose_name='年份')), - ('month', models.PositiveSmallIntegerField(verbose_name='月份')), - ('day', models.PositiveSmallIntegerField(verbose_name='日期')), - ('direction', models.PositiveSmallIntegerField(choices=[(1, '我方派单'), (2, '对方派单')], verbose_name='派单方向')), - ('partner_club_id', models.CharField(db_index=True, max_length=6, verbose_name='对方俱乐部ID')), - ('dispatch_count', models.PositiveIntegerField(default=0, verbose_name='派单数')), - ('dispatch_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='派单总额')), - ('success_count', models.PositiveIntegerField(default=0, verbose_name='成交订单数')), - ('success_amount', 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='更新时间')), - ], - options={ - 'verbose_name': '每日派单统计', - 'verbose_name_plural': '每日派单统计', - 'db_table': 'daily_dispatch_stat', - 'indexes': [models.Index(fields=['year', 'month', 'day', 'direction', 'partner_club_id'], name='daily_dispa_year_f98f91_idx'), models.Index(fields=['date'], name='daily_dispa_date_9ac7fe_idx')], - }, - ), - migrations.CreateModel( - name='Club', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('club_id', models.CharField(db_index=True, max_length=6, verbose_name='本俱乐部ID')), - ('partner_club_id', models.CharField(max_length=6, unique=True, verbose_name='对方俱乐部ID')), - ('is_interop_enabled', models.BooleanField(default=False, verbose_name='是否开启平台互通')), - ('is_receive_enabled', models.BooleanField(default=False, verbose_name='是否同意接收对方订单')), - ('dashou_rate', models.DecimalField(decimal_places=4, default=1.0, max_digits=5, verbose_name='打手分红费率')), - ('partner_domain', models.URLField(blank=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': 'club', - 'indexes': [models.Index(fields=['club_id'], name='club_club_id_e75636_idx'), models.Index(fields=['partner_club_id'], name='club_partner_b76039_idx')], - }, - ), - ] diff --git a/config/migrations/0006_clubconfig_accountpermission.py b/config/migrations/0006_clubconfig_accountpermission.py deleted file mode 100644 index dbe8188..0000000 --- a/config/migrations/0006_clubconfig_accountpermission.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-01 09:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0005_ordertypemapping_dailydispatchstat_club'), - ] - - operations = [ - migrations.CreateModel( - name='ClubConfig', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('club_id', models.CharField(db_index=True, max_length=6, verbose_name='俱乐部ID')), - ('club_nickname', models.CharField(blank=True, default='', max_length=50, verbose_name='俱乐部昵称')), - ('club_avatar', models.CharField(blank=True, default='', max_length=500, verbose_name='俱乐部头像地址')), - ('backend_domain', models.CharField(blank=True, default='', max_length=200, verbose_name='后台域名')), - ('chat_api_key', models.CharField(blank=True, default='', max_length=200, verbose_name='聊天API密钥')), - ('chat_api_id', models.CharField(blank=True, default='', max_length=200, verbose_name='聊天API ID')), - ('customer_service_api_url', models.CharField(blank=True, default='', max_length=200, verbose_name='客服API URL')), - ('customer_service_corp_id', models.CharField(blank=True, default='', max_length=100, verbose_name='客服企业ID')), - ('storage_bucket_domain', models.CharField(blank=True, default='', max_length=500, verbose_name='存储桶域名')), - ('is_self', models.SmallIntegerField(choices=[(0, '对方'), (1, '我方')], db_index=True, default=0, 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': 'club_config', - 'unique_together': {('club_id',)}, - }, - ), - migrations.CreateModel( - name='AccountPermission', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('account_id', models.CharField(db_index=True, max_length=11, verbose_name='账号ID')), - ('permission_code', models.IntegerField(verbose_name='权限代码')), - ('is_enabled', models.BooleanField(default=False, verbose_name='是否开启')), - ], - options={ - 'verbose_name': '账号权限', - 'verbose_name_plural': '账号权限', - 'db_table': 'account_permission', - 'unique_together': {('account_id', 'permission_code')}, - }, - ), - ] diff --git a/config/migrations/0007_club_receive_rate_dailydispatchstat_claimed_amount_and_more.py b/config/migrations/0007_club_receive_rate_dailydispatchstat_claimed_amount_and_more.py deleted file mode 100644 index 5072dad..0000000 --- a/config/migrations/0007_club_receive_rate_dailydispatchstat_claimed_amount_and_more.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-02 13:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0006_clubconfig_accountpermission'), - ] - - operations = [ - migrations.AddField( - model_name='club', - name='receive_rate', - field=models.DecimalField(decimal_places=4, default=1.0, max_digits=5, verbose_name='接收打手分红费率'), - ), - migrations.AddField( - model_name='dailydispatchstat', - name='claimed_amount', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='抢单总额'), - ), - migrations.AddField( - model_name='dailydispatchstat', - name='claimed_count', - field=models.PositiveIntegerField(default=0, verbose_name='抢单数'), - ), - ] diff --git a/config/migrations/0008_clubconfig_storage_bucket_name.py b/config/migrations/0008_clubconfig_storage_bucket_name.py deleted file mode 100644 index 7c7310a..0000000 --- a/config/migrations/0008_clubconfig_storage_bucket_name.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-04 18:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0007_club_receive_rate_dailydispatchstat_claimed_amount_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='clubconfig', - name='storage_bucket_name', - field=models.CharField(blank=True, default='', max_length=100, verbose_name='存储桶名称'), - ), - ] diff --git a/config/migrations/0009_dailypayoutstat_dailyincomestat.py b/config/migrations/0009_dailypayoutstat_dailyincomestat.py deleted file mode 100644 index 8f8dfcb..0000000 --- a/config/migrations/0009_dailypayoutstat_dailyincomestat.py +++ /dev/null @@ -1,53 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-05 13:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0008_clubconfig_storage_bucket_name'), - ] - - operations = [ - migrations.CreateModel( - name='DailyPayoutStat', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(db_index=True, unique=True, verbose_name='统计日期')), - ('year', models.PositiveSmallIntegerField(verbose_name='年份')), - ('month', models.PositiveSmallIntegerField(verbose_name='月份')), - ('day', models.PositiveSmallIntegerField(verbose_name='日期')), - ('total_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='出款总额')), - ('total_count', models.PositiveIntegerField(default=0, 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': 'daily_payout_stat', - 'indexes': [models.Index(fields=['date'], name='daily_payou_date_b534ec_idx'), models.Index(fields=['year', 'month', 'day'], name='daily_payou_year_6376ca_idx')], - }, - ), - migrations.CreateModel( - name='DailyIncomeStat', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('date', models.DateField(db_index=True, unique=True, verbose_name='统计日期')), - ('year', models.PositiveSmallIntegerField(verbose_name='年份')), - ('month', models.PositiveSmallIntegerField(verbose_name='月份')), - ('day', models.PositiveSmallIntegerField(verbose_name='日期')), - ('total_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='总收入金额')), - ('total_count', models.PositiveIntegerField(default=0, 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': 'daily_income_stat', - 'indexes': [models.Index(fields=['date'], name='daily_incom_date_75e6df_idx'), models.Index(fields=['year', 'month', 'day'], name='daily_incom_year_d85d10_idx')], - }, - ), - ] diff --git a/config/migrations/0010_popupconfig_popuppage_popupimage_popupconfig_page_and_more.py b/config/migrations/0010_popupconfig_popuppage_popupimage_popupconfig_page_and_more.py deleted file mode 100644 index 0aeb527..0000000 --- a/config/migrations/0010_popupconfig_popuppage_popupimage_popupconfig_page_and_more.py +++ /dev/null @@ -1,84 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-22 11:24 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0009_dailypayoutstat_dailyincomestat'), - ] - - operations = [ - migrations.CreateModel( - name='PopupConfig', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('popup_id', models.CharField(max_length=50, verbose_name='弹窗唯一ID')), - ('title', models.CharField(blank=True, max_length=200, verbose_name='标题(后台用)')), - ('description', models.TextField(blank=True, verbose_name='描述(后台用)')), - ('strategy_type', models.CharField(choices=[('once', '仅一次'), ('daily', '每日'), ('weekly', '每周'), ('monthly', '每月'), ('yearly', '每年'), ('always', '始终'), ('count', '周期内次数限制')], default='once', max_length=20)), - ('max_count', models.PositiveIntegerField(default=1, verbose_name='周期内最大展示次数')), - ('reset_interval', models.CharField(blank=True, choices=[('day', '天'), ('week', '周'), ('month', '月'), ('year', '年')], max_length=20, verbose_name='重置周期(count类型时使用)')), - ('duration', models.PositiveIntegerField(default=0, verbose_name='强制阅读秒数(0=无强制)')), - ('force_even_muted', models.BooleanField(default=False, verbose_name='强制弹出(忽略用户今日屏蔽)')), - ('sort_order', models.PositiveIntegerField(default=0, verbose_name='展示顺序')), - ('is_active', models.BooleanField(default=True, verbose_name='是否启用')), - ('start_time', models.DateTimeField(blank=True, null=True, verbose_name='生效开始时间')), - ('end_time', models.DateTimeField(blank=True, null=True, verbose_name='生效结束时间')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ], - options={ - 'verbose_name': '弹窗配置', - 'verbose_name_plural': '弹窗配置', - 'db_table': 'popup_config', - 'ordering': ['sort_order', 'id'], - }, - ), - migrations.CreateModel( - name='PopupPage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('page_key', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='页面标识')), - ('name', models.CharField(max_length=100, verbose_name='页面名称')), - ('description', models.TextField(blank=True, verbose_name='描述')), - ('is_active', models.BooleanField(default=True, verbose_name='是否启用')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('ignore_user_mute', models.BooleanField(default=False, verbose_name='忽略用户今日屏蔽')), - ], - options={ - 'verbose_name': '弹窗页面', - 'verbose_name_plural': '弹窗页面', - 'db_table': 'popup_page', - }, - ), - migrations.CreateModel( - name='PopupImage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('image_url', models.CharField(max_length=500, verbose_name='图片相对路径')), - ('text', models.TextField(blank=True, verbose_name='图片上方文字')), - ('sort_order', models.PositiveIntegerField(default=0, verbose_name='展示顺序')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('popup_config', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='config.popupconfig')), - ], - options={ - 'verbose_name': '弹窗图片', - 'verbose_name_plural': '弹窗图片', - 'db_table': 'popup_image', - 'ordering': ['sort_order', 'id'], - }, - ), - migrations.AddField( - model_name='popupconfig', - name='page', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='popups', to='config.popuppage'), - ), - migrations.AlterUniqueTogether( - name='popupconfig', - unique_together={('page', 'popup_id')}, - ), - ] diff --git a/config/migrations/0011_withdrawconfig.py b/config/migrations/0011_withdrawconfig.py deleted file mode 100644 index 62e3800..0000000 --- a/config/migrations/0011_withdrawconfig.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-25 12:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0010_popupconfig_popuppage_popupimage_popupconfig_page_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='WithdrawConfig', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('mode', models.IntegerField(choices=[(1, '自动提现'), (2, '手动提现')], default=2, verbose_name='提现模式')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('updated_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'verbose_name': '提现模式配置', - 'verbose_name_plural': '提现模式配置', - 'db_table': 'withdraw_config', - }, - ), - ] diff --git a/config/migrations/0012_shangjiamoban_chenghao_id_and_more.py b/config/migrations/0012_shangjiamoban_chenghao_id_and_more.py deleted file mode 100644 index c22a4c8..0000000 --- a/config/migrations/0012_shangjiamoban_chenghao_id_and_more.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-17 18:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0011_withdrawconfig'), - ] - - operations = [ - migrations.AddField( - model_name='shangjiamoban', - name='chenghao_id', - field=models.IntegerField(blank=True, null=True, verbose_name='关联称号ID'), - ), - migrations.AddField( - model_name='shangjiamoban', - name='yongjin_jiage', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金价格'), - ), - migrations.AddField( - model_name='shangjiamoban', - name='yongjin_qiangdan', - field=models.BooleanField(default=False, verbose_name='是否开启佣金抢单'), - ), - ] diff --git a/config/migrations/0013_shangjialianjie_previous_dingdan_id_and_more.py b/config/migrations/0013_shangjialianjie_previous_dingdan_id_and_more.py deleted file mode 100644 index bbb9ff6..0000000 --- a/config/migrations/0013_shangjialianjie_previous_dingdan_id_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-26 03:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0012_shangjiamoban_chenghao_id_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='shangjialianjie', - name='previous_dingdan_id', - field=models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='上一个订单ID'), - ), - migrations.AddField( - model_name='shangjialianjie', - name='previous_lianjie_id', - field=models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='上一个链接ID'), - ), - ] diff --git a/config/migrations/0014_delete_club_delete_clubconfig_and_more.py b/config/migrations/0014_delete_club_delete_clubconfig_and_more.py deleted file mode 100644 index 5e5942d..0000000 --- a/config/migrations/0014_delete_club_delete_clubconfig_and_more.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-15 01:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('config', '0013_shangjialianjie_previous_dingdan_id_and_more'), - ] - - operations = [ - migrations.DeleteModel( - name='Club', - ), - migrations.DeleteModel( - name='ClubConfig', - ), - migrations.DeleteModel( - name='DailyDispatchStat', - ), - migrations.DeleteModel( - name='OrderTypeMapping', - ), - migrations.AlterField( - model_name='tixianquotadefault', - name='leixing', - field=models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '组长'), (4, '考核官'), (5, '打手押金'), (6, '商家余额')], unique=True, verbose_name='用户类型'), - ), - ] diff --git a/gvsdsdk/migrations/0001_initial.py b/gvsdsdk/migrations/0001_initial.py index 3a8544f..0104da4 100644 --- a/gvsdsdk/migrations/0001_initial.py +++ b/gvsdsdk/migrations/0001_initial.py @@ -1,8 +1,8 @@ -# Generated by Django 6.0.5 on 2026-06-13 11:43 +# Generated by Django 4.2.27 on 2026-06-17 01:34 import datetime -import gvsdsdk.models from django.db import migrations, models +import gvsdsdk.models class Migration(migrations.Migration): @@ -13,12 +13,40 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False, verbose_name='用户UUID')), + ('UserName', models.CharField(db_column='UserName', max_length=256, unique=True, verbose_name='用户名')), + ('UserPassword', models.CharField(db_column='UserPassword', default='', max_length=200, verbose_name='密码')), + ('UserPositionStatus', models.SmallIntegerField(db_column='UserPositionStatus', default=0, verbose_name='职位状态')), + ('UserPersonalSignature', models.CharField(db_column='UserPersonalSignature', default='', max_length=1024, verbose_name='个人签名')), + ('UserEmail', models.CharField(db_column='UserEmail', default='', max_length=256, verbose_name='邮箱')), + ('UserEmailVerify', models.SmallIntegerField(db_column='UserEmailVerify', default=0, verbose_name='邮箱验证')), + ('UserAccountLicense', models.SmallIntegerField(db_column='UserAccountLicense', default=1, verbose_name='账户许可')), + ('UserGender', models.SmallIntegerField(db_column='UserGender', default=-1, verbose_name='性别')), + ('UserTele', models.CharField(blank=True, db_column='UserTele', max_length=16, null=True, verbose_name='电话')), + ('UserCreateTime', models.DateTimeField(db_column='UserCreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ('UserLastLoginDate', models.DateTimeField(db_column='UserLastLoginDate', default=datetime.datetime.utcnow, verbose_name='最后登录')), + ('IsStaff', models.BooleanField(db_column='IsStaff', default=False, verbose_name='是否员工')), + ('IsSuperuser', models.BooleanField(db_column='IsSuperuser', default=False, verbose_name='是否超级用户')), + ('YonghuID', models.CharField(blank=True, db_column='YonghuID', db_index=True, max_length=7, null=True, unique=True, verbose_name='用户业务ID')), + ('UserAvatar', models.CharField(blank=True, db_column='UserAvatar', default='a_long/morentouxiang.jpg', max_length=500, null=True, verbose_name='头像')), + ('UserType', models.CharField(choices=[('normal', '普通用户'), ('dashou', '打手'), ('shop', '商家'), ('guanshi', '管事'), ('admin', '管理员'), ('kefu', '客服')], db_column='UserType', default='normal', max_length=10, verbose_name='用户类型')), + ], + options={ + 'verbose_name': '用户', + 'verbose_name_plural': '用户', + 'db_table': 'User', + 'managed': True, + }, + ), migrations.CreateModel( name='AccountActivation', fields=[ - ('AccountActivationCode', gvsdsdk.models.FixedBinaryField(binary_length=6, db_column='AccountActivationCode', max_length=6, primary_key=True, serialize=False)), - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID')), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), + ('AccountActivationCode', gvsdsdk.models.FixedBinaryField(binary_length=6, db_column='AccountActivationCode', max_length=6, primary_key=True, serialize=False, verbose_name='激活码')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ 'verbose_name': '账户激活', @@ -30,13 +58,13 @@ class Migration(migrations.Migration): migrations.CreateModel( name='EphemeralToken', fields=[ - ('ELTUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUUID', primary_key=True, serialize=False)), - ('ELTUserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUserUUID', db_index=True)), - ('ELTCreateTime', models.DateTimeField(db_column='ELTCreateTime', default=datetime.datetime.utcnow)), - ('ELTEndTime', models.DateTimeField(db_column='ELTEndTime', default=gvsdsdk.models._elt_end_time_default)), - ('ELTType', models.SmallIntegerField(db_column='ELTType', default=0)), - ('ELTAllowIP', models.JSONField(db_column='ELTAllowIP', default=list)), - ('ELTStatus', models.SmallIntegerField(db_column='ELTStatus', db_index=True, default=1)), + ('ELTUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUUID', primary_key=True, serialize=False, verbose_name='令牌UUID')), + ('ELTUserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ELTUserUUID', db_index=True, verbose_name='用户UUID')), + ('ELTCreateTime', models.DateTimeField(db_column='ELTCreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ('ELTEndTime', models.DateTimeField(db_column='ELTEndTime', default=gvsdsdk.models._EltEndTimeDefault, verbose_name='过期时间')), + ('ELTType', models.SmallIntegerField(db_column='ELTType', default=0, verbose_name='令牌类型')), + ('ELTAllowIP', models.JSONField(db_column='ELTAllowIP', default=list, verbose_name='允许IP')), + ('ELTStatus', models.SmallIntegerField(db_column='ELTStatus', db_index=True, default=1, verbose_name='状态')), ], options={ 'verbose_name': '临时令牌', @@ -48,8 +76,8 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Password', fields=[ - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False)), - ('Password', models.CharField(db_column='Password', max_length=1024)), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False, verbose_name='用户UUID')), + ('Password', models.CharField(db_column='Password', max_length=1024, verbose_name='密码哈希')), ], options={ 'verbose_name': '密码', @@ -61,12 +89,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Permission', fields=[ - ('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', primary_key=True, serialize=False)), - ('PermName', models.CharField(db_column='PermName', max_length=128)), - ('PermCode', models.CharField(db_column='PermCode', max_length=128)), - ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')), - ('PermStatus', models.SmallIntegerField(db_column='PermStatus', default=1)), - ('PermDesc', models.CharField(db_column='PermDesc', default='', max_length=512)), + ('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', primary_key=True, serialize=False, verbose_name='权限UUID')), + ('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')), + ('PermName', models.CharField(db_column='PermName', max_length=128, verbose_name='权限名称')), + ('PermCode', models.CharField(db_column='PermCode', max_length=128, verbose_name='权限键')), + ('PermCategory', models.CharField(db_column='PermCategory', default='', max_length=64, verbose_name='权限分类')), + ('PermStatus', models.SmallIntegerField(db_column='PermStatus', default=1, verbose_name='是否启用')), + ('PermDesc', models.CharField(db_column='PermDesc', default='', max_length=512, verbose_name='描述')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ 'verbose_name': '权限', @@ -75,16 +105,72 @@ class Migration(migrations.Migration): 'managed': True, }, ), + migrations.CreateModel( + name='Position', + fields=[ + ('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionUUID', primary_key=True, serialize=False, verbose_name='职务UUID')), + ('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')), + ('PositionName', models.CharField(db_column='PositionName', max_length=128, verbose_name='职务名称')), + ('PositionCode', models.CharField(db_column='PositionCode', default='', max_length=64, verbose_name='职务编码')), + ('PositionLevel', models.SmallIntegerField(db_column='PositionLevel', default=0, verbose_name='职务级别')), + ('PositionStatus', models.SmallIntegerField(db_column='PositionStatus', default=1, verbose_name='状态')), + ('PositionDesc', models.CharField(db_column='PositionDesc', default='', max_length=512, verbose_name='描述')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '人事职务标签', + 'verbose_name_plural': '人事职务标签', + 'db_table': 'Position', + 'managed': True, + }, + ), + migrations.CreateModel( + name='PositionTemplate', + fields=[ + ('PositionTemplateUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionTemplateUUID', primary_key=True, serialize=False, verbose_name='岗位模板UUID')), + ('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')), + ('TemplateName', models.CharField(db_column='TemplateName', max_length=128, verbose_name='模板名称')), + ('TemplateCode', models.CharField(db_column='TemplateCode', default='', max_length=64, verbose_name='模板编码')), + ('TemplateStatus', models.SmallIntegerField(db_column='TemplateStatus', default=1, verbose_name='模板状态')), + ('TemplateDesc', models.CharField(db_column='TemplateDesc', default='', max_length=512, verbose_name='模板描述')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '岗位模板', + 'verbose_name_plural': '岗位模板', + 'db_table': 'PositionTemplate', + 'managed': True, + }, + ), + migrations.CreateModel( + name='PositionTemplatePermission', + fields=[ + ('PTPermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PTPermUUID', primary_key=True, serialize=False, verbose_name='关联UUID')), + ('PositionTemplateUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionTemplateUUID', verbose_name='岗位模板UUID')), + ('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', verbose_name='权限UUID')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '岗位模板权限关联', + 'verbose_name_plural': '岗位模板权限关联', + 'db_table': 'PositionTemplatePermission', + 'managed': True, + }, + ), migrations.CreateModel( name='Role', fields=[ - ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', primary_key=True, serialize=False)), - ('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID')), - ('DeptUUID', gvsdsdk.models.UUIDField(binary_length=16, blank=True, db_column='DeptUUID', null=True)), - ('RoleName', models.CharField(db_column='RoleName', max_length=128)), - ('RoleType', models.SmallIntegerField(db_column='RoleType', default=2)), - ('RoleStatus', models.SmallIntegerField(db_column='RoleStatus', default=1)), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), + ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', primary_key=True, serialize=False, verbose_name='角色UUID')), + ('TenantUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='TenantUUID', verbose_name='租户UUID')), + ('RoleName', models.CharField(db_column='RoleName', max_length=128, verbose_name='角色名称')), + ('RoleType', models.SmallIntegerField(db_column='RoleType', default=2, verbose_name='角色类型')), + ('RoleStatus', models.SmallIntegerField(db_column='RoleStatus', default=1, verbose_name='角色状态')), + ('AssignScope', models.SmallIntegerField(db_column='AssignScope', default=0, verbose_name='分配可见范围')), + ('AssignScopeUUID', gvsdsdk.models.UUIDField(binary_length=16, blank=True, db_column='AssignScopeUUID', null=True, verbose_name='分配范围UUID')), + ('RoleDesc', models.CharField(db_column='RoleDesc', default='', max_length=512, verbose_name='角色描述')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ 'verbose_name': '角色', @@ -94,55 +180,69 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='RoleDept', + name='RolePermission', fields=[ - ('RoleDeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleDeptUUID', primary_key=True, serialize=False)), - ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')), - ('DeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='DeptUUID')), - ('IsMainDept', models.SmallIntegerField(db_column='IsMainDept', default=1)), + ('RolePermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RolePermUUID', primary_key=True, serialize=False, verbose_name='关联UUID')), + ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', verbose_name='角色UUID')), + ('PermUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PermUUID', verbose_name='权限UUID')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ - 'verbose_name': '角色部门关联', - 'verbose_name_plural': '角色部门关联', - 'db_table': 'RoleDept', + 'verbose_name': '角色权限关联', + 'verbose_name_plural': '角色权限关联', + 'db_table': 'RolePermission', 'managed': True, }, ), migrations.CreateModel( - name='User', + name='RoleShop', fields=[ - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False)), - ('UserName', models.CharField(db_column='UserName', max_length=256, unique=True)), - ('UserPassword', models.CharField(db_column='UserPassword', default='', max_length=60)), - ('UserPositionStatus', models.SmallIntegerField(db_column='UserPositionStatus', default=0)), - ('UserPersonalSignature', models.CharField(db_column='UserPersonalSignature', default='', max_length=1024)), - ('UserEmail', models.CharField(db_column='UserEmail', default='', max_length=256)), - ('UserEmailVerify', models.SmallIntegerField(db_column='UserEmailVerify', default=0)), - ('UserAccountLicense', models.SmallIntegerField(db_column='UserAccountLicense', default=1)), - ('UserGender', models.SmallIntegerField(db_column='UserGender', default=-1)), - ('UserTele', models.CharField(blank=True, db_column='UserTele', max_length=16, null=True)), - ('UserCreateTime', models.DateTimeField(db_column='UserCreateTime', default=datetime.datetime.utcnow)), - ('UserLastLoginDate', models.DateTimeField(db_column='UserLastLoginDate', default=datetime.datetime.utcnow)), - ('IsStaff', models.BooleanField(db_column='IsStaff', default=False)), - ('IsSuperuser', models.BooleanField(db_column='IsSuperuser', default=False)), + ('RoleShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleShopUUID', primary_key=True, serialize=False, verbose_name='关联UUID')), + ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', verbose_name='角色UUID')), + ('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID', verbose_name='商铺UUID')), + ('IsMainShop', models.SmallIntegerField(db_column='IsMainShop', default=0, verbose_name='主商铺')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ - 'verbose_name': '用户', - 'verbose_name_plural': '用户', - 'db_table': 'User', + 'verbose_name': '角色商铺关联', + 'verbose_name_plural': '角色商铺关联', + 'db_table': 'RoleShop', + 'managed': True, + }, + ), + migrations.CreateModel( + name='Shop', + fields=[ + ('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID', primary_key=True, serialize=False, verbose_name='商铺UUID')), + ('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID', verbose_name='公司UUID')), + ('ShopName', models.CharField(db_column='ShopName', max_length=128, verbose_name='商铺名称')), + ('ShopCode', models.CharField(db_column='ShopCode', default='', max_length=64, verbose_name='商铺编码')), + ('ShopType', models.SmallIntegerField(db_column='ShopType', default=0, verbose_name='商铺类型')), + ('ShopStatus', models.SmallIntegerField(db_column='ShopStatus', default=1, verbose_name='商铺状态')), + ('ShopAddress', models.CharField(db_column='ShopAddress', default='', max_length=512, verbose_name='商铺地址')), + ('ShopContact', models.CharField(db_column='ShopContact', default='', max_length=128, verbose_name='联系人')), + ('ShopPhone', models.CharField(db_column='ShopPhone', default='', max_length=32, verbose_name='联系电话')), + ('ShopDesc', models.CharField(db_column='ShopDesc', default='', max_length=512, verbose_name='描述')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '商铺', + 'verbose_name_plural': '商铺', + 'db_table': 'Shop', 'managed': True, }, ), migrations.CreateModel( name='User2FA', fields=[ - ('User2FAUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='User2FAUUID', primary_key=True, serialize=False)), - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True)), - ('SecretKey', models.CharField(db_column='SecretKey', max_length=64)), - ('IsEnabled', models.SmallIntegerField(db_column='IsEnabled', default=0)), - ('Verified', models.SmallIntegerField(db_column='Verified', default=0)), - ('LastUsedAt', models.DateTimeField(blank=True, db_column='LastUsedAt', null=True)), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), + ('User2FAUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='User2FAUUID', primary_key=True, serialize=False, verbose_name='2FA UUID')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True, verbose_name='用户UUID')), + ('SecretKey', models.CharField(db_column='SecretKey', max_length=64, verbose_name='密钥')), + ('IsEnabled', models.SmallIntegerField(db_column='IsEnabled', default=0, verbose_name='是否启用')), + ('Verified', models.SmallIntegerField(db_column='Verified', default=0, verbose_name='已验证')), + ('LastUsedAt', models.DateTimeField(blank=True, db_column='LastUsedAt', null=True, verbose_name='最后使用')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ 'verbose_name': '双因素认证', @@ -154,9 +254,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='UserABAC', fields=[ - ('UserABACUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserABACUUID', primary_key=True, serialize=False)), - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID')), - ('HierarchicalPermissionIdentifiers', models.CharField(db_column='HierarchicalPermissionIdentifiers', max_length=256)), + ('UserABACUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserABACUUID', primary_key=True, serialize=False, verbose_name='ABAC UUID')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')), + ('HierarchicalPermissionIdentifiers', models.CharField(db_column='HierarchicalPermissionIdentifiers', max_length=256, verbose_name='层级权限标识')), ], options={ 'verbose_name': '用户ABAC', @@ -168,10 +268,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='UserAvatar', fields=[ - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False)), - ('UserAvatar', models.BinaryField(db_column='UserAvatar', editable=True)), - ('AvatarUploadTime', models.DateTimeField(db_column='AvatarUploadTime', default=datetime.datetime.utcnow)), - ('AvatarFileType', models.CharField(db_column='AvatarFileType', default='png', max_length=16)), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', primary_key=True, serialize=False, verbose_name='用户UUID')), + ('UserAvatar', models.BinaryField(db_column='UserAvatar', editable=True, verbose_name='头像数据')), + ('AvatarUploadTime', models.DateTimeField(db_column='AvatarUploadTime', default=datetime.datetime.utcnow, verbose_name='上传时间')), + ('AvatarFileType', models.CharField(db_column='AvatarFileType', default='png', max_length=16, verbose_name='文件类型')), ], options={ 'verbose_name': '用户头像', @@ -180,16 +280,33 @@ class Migration(migrations.Migration): 'managed': True, }, ), + migrations.CreateModel( + name='UserDept', + fields=[ + ('UserDeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserDeptUUID', primary_key=True, serialize=False, verbose_name='关联UUID')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')), + ('DeptUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='DeptUUID', verbose_name='部门UUID')), + ('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, blank=True, db_column='PositionUUID', null=True, verbose_name='职务标签UUID')), + ('IsMainDept', models.SmallIntegerField(db_column='IsMainDept', default=1, verbose_name='是否主部门')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '员工部门关联', + 'verbose_name_plural': '员工部门关联', + 'db_table': 'UserDept', + 'managed': True, + }, + ), migrations.CreateModel( name='UserLoginLog', fields=[ - ('LogUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='LogUUID', primary_key=True, serialize=False)), - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True)), - ('LoginIP', models.CharField(db_column='LoginIP', max_length=39)), - ('LoginPlatform', models.CharField(db_column='LoginPlatform', max_length=32)), - ('LoginStatus', models.SmallIntegerField(db_column='LoginStatus')), - ('LoginTime', models.DateTimeField(db_column='LoginTime', default=datetime.datetime.utcnow)), - ('UserAgent', models.CharField(db_column='UserAgent', default='', max_length=512)), + ('LogUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='LogUUID', primary_key=True, serialize=False, verbose_name='日志UUID')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', db_index=True, verbose_name='用户UUID')), + ('LoginIP', models.CharField(db_column='LoginIP', max_length=39, verbose_name='登录IP')), + ('LoginPlatform', models.CharField(db_column='LoginPlatform', max_length=32, verbose_name='登录平台')), + ('LoginStatus', models.SmallIntegerField(db_column='LoginStatus', verbose_name='登录状态')), + ('LoginTime', models.DateTimeField(db_column='LoginTime', default=datetime.datetime.utcnow, verbose_name='登录时间')), + ('UserAgent', models.CharField(db_column='UserAgent', default='', max_length=512, verbose_name='用户代理')), ], options={ 'verbose_name': '登录日志', @@ -201,10 +318,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='UserPending2FA', fields=[ - ('PendingUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PendingUUID', primary_key=True, serialize=False)), - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', unique=True)), - ('SecretKey', models.CharField(db_column='SecretKey', max_length=64)), - ('ExpireAt', models.DateTimeField(db_column='ExpireAt')), + ('PendingUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PendingUUID', primary_key=True, serialize=False, verbose_name='待确认UUID')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', unique=True, verbose_name='用户UUID')), + ('SecretKey', models.CharField(db_column='SecretKey', max_length=64, verbose_name='密钥')), + ('ExpireAt', models.DateTimeField(db_column='ExpireAt', verbose_name='过期时间')), ], options={ 'verbose_name': '2FA待确认', @@ -216,10 +333,11 @@ class Migration(migrations.Migration): migrations.CreateModel( name='UserRole', fields=[ - ('UserRoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserRoleUUID', primary_key=True, serialize=False)), - ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID')), - ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), + ('UserRoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserRoleUUID', primary_key=True, serialize=False, verbose_name='关联UUID')), + ('UserUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='UserUUID', verbose_name='用户UUID')), + ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID', verbose_name='角色UUID')), + ('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID', verbose_name='公司UUID')), + ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow, verbose_name='创建时间')), ], options={ 'verbose_name': '用户角色关联', diff --git a/gvsdsdk/migrations/0002_position_roleposition_roleshop_shop.py b/gvsdsdk/migrations/0002_position_roleposition_roleshop_shop.py deleted file mode 100644 index 8251940..0000000 --- a/gvsdsdk/migrations/0002_position_roleposition_roleshop_shop.py +++ /dev/null @@ -1,90 +0,0 @@ -# Generated by Django 6.0.5 on 2026-06-13 12:29 - -import datetime -import gvsdsdk.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('gvsdsdk', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Position', - fields=[ - ('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionUUID', primary_key=True, serialize=False)), - ('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID')), - ('PositionName', models.CharField(db_column='PositionName', max_length=128)), - ('PositionCode', models.CharField(db_column='PositionCode', default='', max_length=64)), - ('PositionLevel', models.SmallIntegerField(db_column='PositionLevel', default=0)), - ('PositionStatus', models.SmallIntegerField(db_column='PositionStatus', default=1)), - ('PositionDesc', models.CharField(db_column='PositionDesc', default='', max_length=512)), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), - ('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow)), - ], - options={ - 'verbose_name': '职务', - 'verbose_name_plural': '职务', - 'db_table': 'Position', - 'managed': True, - }, - ), - migrations.CreateModel( - name='RolePosition', - fields=[ - ('RolePositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RolePositionUUID', primary_key=True, serialize=False)), - ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')), - ('PositionUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='PositionUUID')), - ('IsMainPosition', models.SmallIntegerField(db_column='IsMainPosition', default=0)), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), - ], - options={ - 'verbose_name': '角色职务关联', - 'verbose_name_plural': '角色职务关联', - 'db_table': 'RolePosition', - 'managed': True, - }, - ), - migrations.CreateModel( - name='RoleShop', - fields=[ - ('RoleShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleShopUUID', primary_key=True, serialize=False)), - ('RoleUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='RoleUUID')), - ('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID')), - ('IsMainShop', models.SmallIntegerField(db_column='IsMainShop', default=0)), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), - ], - options={ - 'verbose_name': '角色商铺关联', - 'verbose_name_plural': '角色商铺关联', - 'db_table': 'RoleShop', - 'managed': True, - }, - ), - migrations.CreateModel( - name='Shop', - fields=[ - ('ShopUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='ShopUUID', primary_key=True, serialize=False)), - ('CompanyUUID', gvsdsdk.models.UUIDField(binary_length=16, db_column='CompanyUUID')), - ('ShopName', models.CharField(db_column='ShopName', max_length=128)), - ('ShopCode', models.CharField(db_column='ShopCode', default='', max_length=64)), - ('ShopType', models.SmallIntegerField(db_column='ShopType', default=0)), - ('ShopStatus', models.SmallIntegerField(db_column='ShopStatus', default=1)), - ('ShopAddress', models.CharField(db_column='ShopAddress', default='', max_length=512)), - ('ShopContact', models.CharField(db_column='ShopContact', default='', max_length=128)), - ('ShopPhone', models.CharField(db_column='ShopPhone', default='', max_length=32)), - ('ShopDesc', models.CharField(db_column='ShopDesc', default='', max_length=512)), - ('CreateTime', models.DateTimeField(db_column='CreateTime', default=datetime.datetime.utcnow)), - ('UpdateTime', models.DateTimeField(db_column='UpdateTime', default=datetime.datetime.utcnow)), - ], - options={ - 'verbose_name': '商铺', - 'verbose_name_plural': '商铺', - 'db_table': 'Shop', - 'managed': True, - }, - ), - ] diff --git a/gvsdsdk/model_base.py b/gvsdsdk/model_base.py index 9170247..190d52a 100644 --- a/gvsdsdk/model_base.py +++ b/gvsdsdk/model_base.py @@ -294,62 +294,6 @@ class _CastJsonExpression: return f'CastJsonExpr({self.field_name}[{self.key!r}]->{type_name})' -class ForeignKeyIdDescriptor: - """FK 字段描述符:类级别访问返回 FieldExpression,实例级别访问/设置委托给原始 Django 字段。""" - def __init__(self, fk_name): - self.fk_name = fk_name - self.id_attr = fk_name + '_id' - self._original_field = None # 延迟绑定原始 Django 字段 - - def _get_original_field(self, owner): - if self._original_field is None: - try: - self._original_field = owner._meta.get_field(self.fk_name) - except Exception: - pass - return self._original_field - - def __get__(self, obj, objtype=None): - if obj is None: - return FieldExpression(objtype, self.id_attr) - return getattr(obj, self.id_attr) - - def __set__(self, obj, value): - # 直接写入实例 __dict__,避免触发描述符递归 - obj.__dict__[self.id_attr] = value - - -class FieldExpressionDescriptor: - """普通字段描述符:类级别访问返回 FieldExpression,实例级别访问/设置委托给原始 Django 字段。""" - def __init__(self, field_name): - self.field_name = field_name - self._original_field = None # 延迟绑定原始 Django 字段 - - def _get_original_field(self, owner): - if self._original_field is None: - try: - self._original_field = owner._meta.get_field(self.field_name) - except Exception: - pass - return self._original_field - - def __get__(self, obj, objtype=None): - if obj is None: - return FieldExpression(objtype, self.field_name) - # 实例级别:从 __dict__ 获取,或让 Django 字段描述符处理 - if self.field_name in obj.__dict__: - return obj.__dict__[self.field_name] - # 委托给原始 Django 字段 - orig = self._get_original_field(objtype) - if orig is not None: - return orig.__get__(obj, objtype) - return getattr(obj, self.field_name) - - def __set__(self, obj, value): - # 直接写入实例 __dict__,避免触发描述符递归 - obj.__dict__[self.field_name] = value - - class QModelBase(models.base.ModelBase): def __new__(mcs, name, bases, namespace, **kwargs): # 不再强制设置 db_column —— Django 会自动处理 diff --git a/gvsdsdk/models.py b/gvsdsdk/models.py index 310a117..efd9834 100644 --- a/gvsdsdk/models.py +++ b/gvsdsdk/models.py @@ -172,11 +172,16 @@ class UserManager(BaseUserManager): # === 用户表 === class User(QModel): - """用户表——系统核心身份模型(映射 SAAS 主库 User 表)""" + """用户表——系统核心身份模型 + + 去远程化后存储在本地数据库,作为 AUTH_USER_MODEL。 + 在 SAAS 主库字段基础上增加本地业务字段(YonghuID/UserAvatar/UserType)。 + 敏感数据(OpenID/支付信息)存放在 users.UserSensitiveData 表。 + """ UserUUID = UUIDField(primary_key=True, db_column='UserUUID', verbose_name='用户UUID') UserName = models.CharField(max_length=256, unique=True, db_column='UserName', verbose_name='用户名') - UserPassword = models.CharField(max_length=60, default='', db_column='UserPassword', verbose_name='密码') + UserPassword = models.CharField(max_length=200, default='', db_column='UserPassword', verbose_name='密码') UserPositionStatus = models.SmallIntegerField(default=0, db_column='UserPositionStatus', verbose_name='职位状态') UserPersonalSignature = models.CharField(max_length=1024, default='', db_column='UserPersonalSignature', verbose_name='个人签名') UserEmail = models.CharField(max_length=256, default='', db_column='UserEmail', verbose_name='邮箱') @@ -189,17 +194,261 @@ class User(QModel): IsStaff = models.BooleanField(default=False, db_column='IsStaff', verbose_name='是否员工') IsSuperuser = models.BooleanField(default=False, db_column='IsSuperuser', verbose_name='是否超级用户') + # === 本地业务字段(去远程化新增) === + YonghuID = models.CharField(max_length=7, unique=True, null=True, blank=True, db_index=True, db_column='YonghuID', verbose_name='用户业务ID') + UserAvatar = models.CharField(max_length=500, null=True, blank=True, default='a_long/morentouxiang.jpg', db_column='UserAvatar', verbose_name='头像') + UserType = models.CharField( + max_length=10, + choices=[ + ('normal', '普通用户'), + ('dashou', '打手'), + ('shop', '商家'), + ('guanshi', '管事'), + ('admin', '管理员'), + ('kefu', '客服'), + ], + default='normal', db_column='UserType', verbose_name='用户类型' + ) + objects = UserManager() + # Django auth 框架要求 + USERNAME_FIELD = 'YonghuID' + REQUIRED_FIELDS = ['UserName'] + class Meta: - managed = False + managed = True app_label = 'gvsdsdk' db_table = 'User' verbose_name = '用户' verbose_name_plural = '用户' def __str__(self): - return self.UserName + return self.YonghuID or self.UserName + + # === 兼容属性(snake_case → PascalCase 映射,保持现有代码兼容) === + + @property + def yonghuid(self): + """兼容 UserMain.yonghuid""" + return self.YonghuID + + @yonghuid.setter + def yonghuid(self, value): + self.YonghuID = value + + @property + def avatar(self): + """兼容 UserMain.avatar""" + return self.UserAvatar + + @avatar.setter + def avatar(self, value): + self.UserAvatar = value + + @property + def user_type(self): + """兼容 UserMain.user_type""" + return self.UserType + + @user_type.setter + def user_type(self, value): + self.UserType = value + + @property + def phone(self): + """兼容 UserMain.phone""" + return self.UserTele + + @phone.setter + def phone(self, value): + self.UserTele = value + + @property + def openid(self): + """兼容 UserMain.openid —— 从 UserSensitiveData 延迟加载""" + if hasattr(self, '_openid_cache'): + return self._openid_cache + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + self._openid_cache = sd.OpenID if sd else None + except Exception: + self._openid_cache = None + return self._openid_cache + + @openid.setter + def openid(self, value): + """设置 openid —— 写入 UserSensitiveData""" + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'OpenID': value or ''} + ) + if not created: + sd.OpenID = value or '' + sd.save(update_fields=['OpenID']) + self._openid_cache = value + + @property + def unionid(self): + """兼容 UserMain.unionid""" + if hasattr(self, '_unionid_cache'): + return self._unionid_cache + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + self._unionid_cache = sd.UnionID if sd else None + except Exception: + self._unionid_cache = None + return self._unionid_cache + + @unionid.setter + def unionid(self, value): + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'UnionID': value or ''} + ) + if not created: + sd.UnionID = value or '' + sd.save(update_fields=['UnionID']) + + @property + def password(self): + """兼容 UserMain.password —— 从 UserSensitiveData 加载""" + if hasattr(self, '_password_cache'): + return self._password_cache + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + self._password_cache = sd.Password if sd else '' + except Exception: + self._password_cache = '' + return self._password_cache + + @password.setter + def password(self, value): + """设置 password —— 写入 UserSensitiveData""" + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'Password': value or ''} + ) + if not created: + sd.Password = value or '' + sd.save(update_fields=['Password']) + self._password_cache = value + + @property + def zhifu(self): + """兼容 UserMain.zhifu""" + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + return sd.Zhifu if sd else None + except Exception: + return None + + @zhifu.setter + def zhifu(self, value): + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'Zhifu': value or ''} + ) + if not created: + sd.Zhifu = value or '' + sd.save(update_fields=['Zhifu']) + + @property + def skzhanghao(self): + """兼容 UserMain.skzhanghao""" + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + return sd.SKZhanghao if sd else None + except Exception: + return None + + @skzhanghao.setter + def skzhanghao(self, value): + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'SKZhanghao': value or ''} + ) + if not created: + sd.SKZhanghao = value or '' + sd.save(update_fields=['SKZhanghao']) + + @property + def ip(self): + """兼容 UserMain.ip""" + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + return sd.IP if sd else None + except Exception: + return None + + @ip.setter + def ip(self, value): + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'IP': value or ''} + ) + if not created: + sd.IP = value or '' + sd.save(update_fields=['IP']) + + @property + def shoujihao_renzheng(self): + """兼容 UserMain.shoujihao_renzheng""" + try: + from users.models import UserSensitiveData + sd = UserSensitiveData.objects.filter(UserUUID=self.UserUUID).first() + return sd.PhoneVerified if sd else False + except Exception: + return False + + @shoujihao_renzheng.setter + def shoujihao_renzheng(self, value): + from users.models import UserSensitiveData + sd, created = UserSensitiveData.objects.get_or_create( + UserUUID=self.UserUUID, + defaults={'PhoneVerified': value} + ) + if not created: + sd.PhoneVerified = value + sd.save(update_fields=['PhoneVerified']) + + @property + def last_login_time(self): + """兼容 UserMain.last_login_time""" + return self.UserLastLoginDate + + @last_login_time.setter + def last_login_time(self, value): + self.UserLastLoginDate = value + + @property + def create_time(self): + """兼容 UserMain.create_time""" + return self.UserCreateTime + + @property + def id(self): + """兼容 UserMain.id —— 返回 YonghuID(业务主键)""" + return self.YonghuID + + @property + def pk(self): + """Django 内部使用 —— 返回 UserUUID""" + return self.UserUUID + + # === gvsdsdk 原生方法 === @property def UUIDStr(self): @@ -254,31 +503,15 @@ class User(QModel): """获取电话,空则返回默认文本""" return self.UserTele or '未填写' - def GetCompanies(self): - """获取用户所属公司列表""" - # Company 模型不在 gvsdsdk 中,此处返回空 QuerySet - # 如需使用,请在子服务器中自行实现 - return [] - def GetRoles(self): - """获取用户角色列表(需在同一 database 连接下使用)""" + """获取用户角色列表""" user_role_uuids = UserRole.objects.filter( UserUUID=self.UserUUID ).values_list('RoleUUID', flat=True) return Role.objects.filter(RoleUUID__in=user_role_uuids) - def GetDepartments(self): - """获取用户部门列表""" - # Department 模型不在 gvsdsdk 中,此处返回空列表 - # 如需使用,请在子服务器中自行实现 - return [] - def HasPermission(self, PermCode): - """检查用户是否拥有指定权限(需在同一 database 连接下使用) - - 通过 UserRole → RolePermission → Permission 链路查询, - 汇总所有角色的操作权限后判断。 - """ + """检查用户是否拥有指定权限""" user_role_uuids = UserRole.objects.filter( UserUUID=self.UserUUID ).values_list('RoleUUID', flat=True) @@ -291,7 +524,7 @@ class User(QModel): PermStatus=1, ).exists() - # Django auth 框架兼容(内部使用蛇形命名) + # Django auth 框架兼容(蛇形命名) @property def is_active(self): return self.IsActive @@ -304,14 +537,6 @@ class User(QModel): def is_authenticated(self): return self.IsAuthenticated - @property - def pk(self): - return self.PK - - @property - def id(self): - return self.ID - def set_password(self, raw_password): self.SetPassword(raw_password) diff --git a/migrate_to_gvsdsdk.py b/migrate_to_gvsdsdk.py new file mode 100644 index 0000000..c99dc2a --- /dev/null +++ b/migrate_to_gvsdsdk.py @@ -0,0 +1,510 @@ +""" +gvsdsdk User 表迁移脚本 +将 user_main 数据迁移到 gvsdsdk.User + user_sensitive_data + +执行前确保已全量备份数据库! +分阶段执行,每阶段验证后才继续下一阶段。 +""" +import uuid +import sys +import MySQLdb + +# ==================== 配置 ==================== +DB_CONFIG = { + 'host': 'gvsds.com', + 'port': 50030, + 'user': 'root', + 'passwd': 'sajksh.sdfGH3YUge.wjkd+', + 'db': 'xaio_cheng_xu', + 'charset': 'utf8mb4', + 'connect_timeout': 10, +} + +# UUID 命名空间(固定值,确保可重现) +UUID_NAMESPACE = uuid.UUID('6e6d6163-0000-0000-0000-000000000000') + +# 旧 RBAC 表 → 重命名映射 +RBAC_RENAME_MAP = { + 'role': 'legacy_role', + 'user_role': 'legacy_user_role', + 'permission': 'legacy_permission', + 'role_permission': 'legacy_role_permission', + 'account_permission': 'legacy_account_permission', +} + +# 扩展表 + admin_profile(有 FK 约束指向 user_main.id) +EXT_TABLES_WITH_FK = [ + 'user_boss', 'user_dashou', 'user_guanshi', 'user_kefu', + 'user_shangjia', 'user_shenheguan', 'user_zuzhang', 'admin_profile', +] + + +def get_conn(): + return MySQLdb.connect(**DB_CONFIG) + + +def table_exists(cur, table_name): + cur.execute(""" + SELECT COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s + """, (DB_CONFIG['db'], table_name)) + return cur.fetchone()[0] > 0 + + +def fk_constraint_exists(cur, table_name, ref_table): + cur.execute(""" + SELECT CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s AND REFERENCED_TABLE_NAME = %s + """, (DB_CONFIG['db'], table_name, ref_table)) + return [r[0] for r in cur.fetchall()] + + +def phase1_rename_rbac_tables(): + """Phase 1: 重命名旧 RBAC 表,避免与 gvsdsdk PascalCase 表名冲突""" + print('\n' + '='*60) + print('Phase 1: 重命名旧 RBAC 表') + print('='*60) + + conn = get_conn() + cur = conn.cursor() + + for old_name, new_name in RBAC_RENAME_MAP.items(): + if table_exists(cur, old_name) and not table_exists(cur, new_name): + sql = f'RENAME TABLE `{old_name}` TO `{new_name}`' + print(f' {old_name} -> {new_name}') + cur.execute(sql) + elif table_exists(cur, new_name): + print(f' {new_name} 已存在,跳过') + else: + print(f' {old_name} 不存在,跳过') + + conn.commit() + cur.close() + conn.close() + print('Phase 1 完成') + + +def phase2_create_tables(): + """Phase 2: 创建 User 表和 user_sensitive_data 表""" + print('\n' + '='*60) + print('Phase 2: 创建 User 表 + user_sensitive_data 表') + print('='*60) + + conn = get_conn() + cur = conn.cursor() + + # 2.1 创建 User 表 + if table_exists(cur, 'User'): + print(' User 表已存在,跳过创建') + else: + print(' 创建 User 表...') + cur.execute(""" + CREATE TABLE `User` ( + `UserUUID` BINARY(16) NOT NULL PRIMARY KEY, + `UserName` varchar(256) NOT NULL UNIQUE, + `UserPassword` varchar(200) NOT NULL DEFAULT '', + `UserPositionStatus` smallint NOT NULL DEFAULT 0, + `UserPersonalSignature` varchar(1024) NOT NULL DEFAULT '', + `UserEmail` varchar(256) NOT NULL DEFAULT '', + `UserEmailVerify` smallint NOT NULL DEFAULT 0, + `UserAccountLicense` smallint NOT NULL DEFAULT 1, + `UserGender` smallint NOT NULL DEFAULT -1, + `UserTele` varchar(16) NULL, + `UserCreateTime` datetime(6) NOT NULL, + `UserLastLoginDate` datetime(6) NOT NULL, + `IsStaff` tinyint(1) NOT NULL DEFAULT 0, + `IsSuperuser` tinyint(1) NOT NULL DEFAULT 0, + `YonghuID` varchar(7) NULL UNIQUE, + `UserAvatar` varchar(500) NULL DEFAULT 'a_long/morentouxiang.jpg', + `UserType` varchar(10) NOT NULL DEFAULT 'normal', + INDEX `User_UserUUID_0a9d8a_idx` (`UserUUID`), + INDEX `User_YonghuID_idx` (`YonghuID`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci + """) + print(' User 表创建完成') + + # 2.2 创建 user_sensitive_data 表 + if table_exists(cur, 'user_sensitive_data'): + print(' user_sensitive_data 表已存在,跳过创建') + else: + print(' 创建 user_sensitive_data 表...') + cur.execute(""" + CREATE TABLE `user_sensitive_data` ( + `id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, + `UserUUID` BINARY(16) NOT NULL UNIQUE, + `OpenID` varchar(64) NULL UNIQUE, + `UnionID` varchar(64) NULL, + `Password` varchar(200) NULL, + `PhoneVerified` tinyint(1) NOT NULL DEFAULT 0, + `Zhifu` varchar(500) NULL, + `SKZhanghao` varchar(11) NULL, + `IP` varchar(50) NULL, + `create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + `update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), + INDEX `user_sensitive_data_OpenID_idx` (`OpenID`), + INDEX `user_sensitive_data_UnionID_idx` (`UnionID`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci + """) + print(' user_sensitive_data 表创建完成') + + conn.commit() + cur.close() + conn.close() + print('Phase 2 完成') + + +def phase3_migrate_user_data(): + """Phase 3: 迁移 user_main 数据到 User + user_sensitive_data""" + print('\n' + '='*60) + print('Phase 3: 迁移 user_main 数据') + print('='*60) + + conn = get_conn() + cur = conn.cursor() + + # 检查 User 表是否已有数据 + cur.execute('SELECT COUNT(*) FROM `User`') + existing = cur.fetchone()[0] + if existing > 0: + print(f' User 表已有 {existing} 行数据,跳过迁移') + cur.close() + conn.close() + return + + # 获取所有 user_main 数据 + cur.execute(""" + SELECT id, yonghuid, openid, avatar, phone, password, zhifu, + skzhanghao, ip, last_login_time, user_type, create_time, + update_time, unionid, shoujihao_renzheng, last_login + FROM user_main + """) + rows = cur.fetchall() + print(f' 从 user_main 读取 {len(rows)} 行') + + # 生成 UUID 并批量插入 + user_data = [] + sensitive_data = [] + + for row in rows: + (id_, yonghuid, openid, avatar, phone, password, zhifu, + skzhanghao, ip, last_login_time, user_type, create_time, + update_time, unionid, shoujihao_renzheng, last_login) = row + + # 生成确定性 UUID + user_uuid = uuid.uuid5(UUID_NAMESPACE, yonghuid).bytes + + # User 表数据 + is_superuser = 1 if user_type == 'admin' else 0 + is_staff = 1 if user_type in ('admin', 'kefu') else 0 + user_name = yonghuid # 用 yonghuid 作为 UserName + avatar_val = avatar if avatar else 'a_long/morentouxiang.jpg' + last_login = last_login_time or last_login or create_time + + user_data.append(( + user_uuid, user_name, '', # UserPassword 留空 + 0, # UserPositionStatus + '', # UserPersonalSignature + '', # UserEmail + 0, # UserEmailVerify + 1, # UserAccountLicense + -1, # UserGender + phone, # UserTele + create_time, # UserCreateTime + last_login, # UserLastLoginDate + is_staff, is_superuser, + yonghuid, # YonghuID + avatar_val, # UserAvatar + user_type, # UserType + )) + + # user_sensitive_data 表数据 + sensitive_data.append(( + user_uuid, + openid if openid else None, + unionid if unionid else None, + password if password else None, + 1 if shoujihao_renzheng else 0, + zhifu if zhifu else None, + skzhanghao if skzhanghao else None, + ip if ip else None, + )) + + # 批量插入 User 表 + print(f' 插入 {len(user_data)} 行到 User 表...') + cur.executemany(""" + INSERT INTO `User` ( + UserUUID, UserName, UserPassword, UserPositionStatus, + UserPersonalSignature, UserEmail, UserEmailVerify, + UserAccountLicense, UserGender, UserTele, + UserCreateTime, UserLastLoginDate, IsStaff, IsSuperuser, + YonghuID, UserAvatar, UserType + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """, user_data) + + # 批量插入 user_sensitive_data 表 + print(f' 插入 {len(sensitive_data)} 行到 user_sensitive_data 表...') + cur.executemany(""" + INSERT INTO user_sensitive_data ( + UserUUID, OpenID, UnionID, Password, PhoneVerified, + Zhifu, SKZhanghao, IP + ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s) + """, sensitive_data) + + conn.commit() + + # 验证 + cur.execute('SELECT COUNT(*) FROM `User`') + user_count = cur.fetchone()[0] + cur.execute('SELECT COUNT(*) FROM user_sensitive_data') + sd_count = cur.fetchone()[0] + print(f' 验证: User={user_count}, UserSensitiveData={sd_count}') + + if user_count != len(rows): + print(f' 警告: User 表行数({user_count}) != user_main 行数({len(rows)})') + + cur.close() + conn.close() + print('Phase 3 完成') + + +def phase4_alter_extension_tables(): + """Phase 4: 删除 FK 约束,修改扩展表 user_id 列类型 int → BINARY(16)""" + print('\n' + '='*60) + print('Phase 4: 修改扩展表 FK 列类型') + print('='*60) + + conn = get_conn() + cur = conn.cursor() + + for table in EXT_TABLES_WITH_FK: + print(f'\n 处理 {table}...') + + # 4.1 删除 FK 约束 + fk_names = fk_constraint_exists(cur, table, 'user_main') + for fk_name in fk_names: + print(f' 删除 FK: {fk_name}') + cur.execute(f'ALTER TABLE `{table}` DROP FOREIGN KEY `{fk_name}`') + + # 4.2 检查是否已有 new_user_id 列 + cur.execute(""" + SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s AND COLUMN_NAME = 'new_user_id' + """, (DB_CONFIG['db'], table)) + has_new = cur.fetchone()[0] > 0 + + if not has_new: + # 4.3 添加新 BINARY(16) 列 + print(f' 添加 new_user_id BINARY(16) 列') + cur.execute(f'ALTER TABLE `{table}` ADD COLUMN `new_user_id` BINARY(16) NULL') + + # 4.4 填充新列:通过 user_main.id → user_main.yonghuid → User.UserUUID + print(f' 填充 new_user_id...') + cur.execute(f""" + UPDATE `{table}` ext + JOIN user_main um ON ext.user_id = um.id + JOIN `User` u ON u.YonghuID = um.yonghuid COLLATE utf8mb4_general_ci + SET ext.new_user_id = u.UserUUID + """) + affected = cur.rowcount + print(f' 更新 {affected} 行') + + # 4.5 删除旧 user_id 列 + print(f' 删除旧 user_id 列') + cur.execute(f'ALTER TABLE `{table}` DROP COLUMN `user_id`') + + # 4.6 重命名 new_user_id → user_id + print(f' 重命名 new_user_id → user_id') + cur.execute(f'ALTER TABLE `{table}` CHANGE `new_user_id` `user_id` BINARY(16) NULL') + + # 4.7 添加索引 + print(f' 添加索引') + cur.execute(f'ALTER TABLE `{table}` ADD INDEX `{table}_user_id_idx` (`user_id`)') + + conn.commit() + + # 4.8 处理 django_admin_log(空表,直接改列类型) + print(f'\n 处理 django_admin_log...') + fk_names = fk_constraint_exists(cur, 'django_admin_log', 'user_main') + for fk_name in fk_names: + print(f' 删除 FK: {fk_name}') + cur.execute(f'ALTER TABLE `django_admin_log` DROP FOREIGN KEY `{fk_name}`') + + # 检查并修改 user_id 列类型 + cur.execute(""" + SELECT DATA_TYPE FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = 'django_admin_log' AND COLUMN_NAME = 'user_id' + """, (DB_CONFIG['db'],)) + col_type = cur.fetchone() + if col_type and col_type[0] != 'binary': + print(f' 修改 user_id 列类型: {col_type[0]} → BINARY(16)') + cur.execute('ALTER TABLE `django_admin_log` MODIFY COLUMN `user_id` BINARY(16) NULL') + else: + print(f' user_id 已是 BINARY 类型,跳过') + + conn.commit() + cur.close() + conn.close() + print('\nPhase 4 完成') + + +def phase5_update_migrations(): + """Phase 5: 更新 django_migrations 记录""" + print('\n' + '='*60) + print('Phase 5: 更新 django_migrations 记录') + print('='*60) + + conn = get_conn() + cur = conn.cursor() + + # 删除旧迁移记录 + apps = ['gvsdsdk', 'users', 'shop', 'backend', 'rank', 'orders', 'config', 'products'] + for app in apps: + cur.execute('DELETE FROM django_migrations WHERE app = %s', (app,)) + if cur.rowcount > 0: + print(f' 删除 {app} 旧迁移记录: {cur.rowcount} 条') + + # 插入新迁移记录 + from datetime import datetime + now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + new_migrations = [ + ('gvsdsdk', '0001_initial'), + ('users', '0001_initial'), + ('shop', '0001_initial'), + ('backend', '0001_initial'), + ('rank', '0001_initial'), + ('orders', '0001_initial'), + ('config', '0001_initial'), + ('products', '0001_initial'), + ('products', '0002_initial'), + ] + for app, name in new_migrations: + cur.execute( + 'INSERT INTO django_migrations (app, name, applied) VALUES (%s, %s, %s)', + (app, name, now) + ) + print(f' 插入 {app}.{name}') + + conn.commit() + cur.close() + conn.close() + print('Phase 5 完成') + + +def phase6_verify(): + """Phase 6: 验证迁移结果""" + print('\n' + '='*60) + print('Phase 6: 验证迁移结果') + print('='*60) + + conn = get_conn() + cur = conn.cursor() + + # 1. User 表数据量 + cur.execute('SELECT COUNT(*) FROM `User`') + user_count = cur.fetchone()[0] + print(f' User 表: {user_count} 行') + + # 2. user_sensitive_data 数据量 + cur.execute('SELECT COUNT(*) FROM user_sensitive_data') + sd_count = cur.fetchone()[0] + print(f' user_sensitive_data: {sd_count} 行') + + # 3. user_main 对比 + cur.execute('SELECT COUNT(*) FROM user_main') + um_count = cur.fetchone()[0] + print(f' user_main: {um_count} 行 (原表保留)') + + # 4. 验证 User 表字段 + cur.execute('DESCRIBE `User`') + print(f'\n User 表结构:') + for c in cur.fetchall(): + print(f' {c[0]} | {c[1]}') + + # 5. 验证扩展表 user_id 列类型 + print(f'\n 扩展表 user_id 列类型:') + for table in EXT_TABLES_WITH_FK: + cur.execute(""" + SELECT DATA_TYPE FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s AND COLUMN_NAME = 'user_id' + """, (DB_CONFIG['db'], table)) + result = cur.fetchone() + print(f' {table}.user_id: {result[0] if result else "不存在"}') + + # 6. 验证扩展表数据完整性 + print(f'\n 扩展表数据完整性:') + for table in EXT_TABLES_WITH_FK: + cur.execute(f'SELECT COUNT(*) FROM `{table}`') + total = cur.fetchone()[0] + cur.execute(f'SELECT COUNT(*) FROM `{table}` WHERE user_id IS NULL') + null_count = cur.fetchone()[0] + print(f' {table}: total={total}, null_user_id={null_count}') + + # 7. 验证 RBAC 表重命名 + print(f'\n RBAC 表重命名验证:') + for old, new in RBAC_RENAME_MAP.items(): + cur.execute(""" + SELECT COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s + """, (DB_CONFIG['db'], new)) + exists = cur.fetchone()[0] > 0 + print(f' {new}: {"存在" if exists else "不存在"}') + + # 8. 验证 django_migrations + print(f'\n django_migrations:') + cur.execute("SELECT app, name FROM django_migrations WHERE app IN ('gvsdsdk','users','shop') ORDER BY app") + for r in cur.fetchall(): + print(f' {r[0]}.{r[1]}') + + # 9. 抽样验证数据一致性 + print(f'\n 抽样验证 (前5行):') + cur.execute(""" + SELECT u.YonghuID, u.UserType, u.UserTele, u.UserAvatar, + sd.OpenID, sd.Password, sd.PhoneVerified + FROM `User` u + LEFT JOIN user_sensitive_data sd ON u.UserUUID = sd.UserUUID + LIMIT 5 + """) + for r in cur.fetchall(): + print(f' YonghuID={r[0]}, Type={r[1]}, Tele={r[2]}, OpenID={r[4]}, Verified={r[6]}') + + cur.close() + conn.close() + print('\nPhase 6 验证完成') + + +def main(): + print('='*60) + print('gvsdsdk User 表迁移脚本') + print('='*60) + print(f'目标数据库: {DB_CONFIG["db"]} @ {DB_CONFIG["host"]}:{DB_CONFIG["port"]}') + + # 确认 + if '--yes' not in sys.argv: + print('\n警告: 此脚本将修改生产数据库!') + print('请确保已全量备份数据库。') + print('使用 --yes 参数跳过确认。') + response = input('输入 YES 确认执行: ') + if response != 'YES': + print('已取消') + return + + # 执行各阶段 + phase1_rename_rbac_tables() + phase2_create_tables() + phase3_migrate_user_data() + phase4_alter_extension_tables() + phase5_update_migrations() + phase6_verify() + + print('\n' + '='*60) + print('迁移完成!') + print('='*60) + print('\n后续步骤:') + print('1. 在服务器上部署新代码 (git pull)') + print('2. 重启 Django 服务') + print('3. 测试登录和核心功能') + print('4. 确认无误后 DROP TABLE user_main') + + +if __name__ == '__main__': + main() diff --git a/migrate_user_to_gvsdsdk.sql b/migrate_user_to_gvsdsdk.sql new file mode 100644 index 0000000..13722ef --- /dev/null +++ b/migrate_user_to_gvsdsdk.sql @@ -0,0 +1,179 @@ +-- ============================================================ +-- 用户表架构迁移脚本 +-- 从旧 user_main 表迁移数据到新 User + user_sensitive_data 表 +-- +-- 执行顺序: +-- 1. 先执行 python manage.py migrate(创建新表) +-- 2. 再执行本 SQL 脚本(迁移数据) +-- 3. 最后删除旧表(确认无误后) +-- ============================================================ + +-- ============================================================ +-- 第1步:从 user_main 迁移数据到 User 表 +-- ============================================================ + +-- User 表:核心身份字段 +INSERT INTO `User` ( + `UserUUID`, + `UserName`, + `UserPassword`, + `UserPositionStatus`, + `UserPersonalSignature`, + `UserEmail`, + `UserEmailVerify`, + `UserAccountLicense`, + `UserGender`, + `UserTele`, + `UserCreateTime`, + `UserLastLoginDate`, + `IsStaff`, + `IsSuperuser`, + `YonghuID`, + `UserAvatar`, + `UserType` +) +SELECT + UNHEX(REPLACE(UUID(), '-', '')), -- 生成 16 字节 UUID + COALESCE(yonghuid, openid), -- UserName = yonghuid 或 openid + COALESCE(password, ''), -- UserPassword + 0, -- UserPositionStatus + '', -- UserPersonalSignature + '', -- UserEmail + 0, -- UserEmailVerify + 1, -- UserAccountLicense (启用) + -1, -- UserGender + phone, -- UserTele + create_time, -- UserCreateTime + COALESCE(last_login_time, create_time), -- UserLastLoginDate + CASE WHEN user_type = 'admin' THEN 1 ELSE 0 END, -- IsStaff + CASE WHEN user_type = 'admin' THEN 1 ELSE 0 END, -- IsSuperuser + yonghuid, -- YonghuID + COALESCE(avatar, 'a_long/morentouxiang.jpg'), -- UserAvatar + user_type -- UserType +FROM `user_main` +WHERE yonghuid IS NOT NULL AND yonghuid != ''; + +-- ============================================================ +-- 第2步:迁移敏感数据到 user_sensitive_data 表 +-- ============================================================ + +INSERT INTO `user_sensitive_data` ( + `UserUUID_id`, + `OpenID`, + `UnionID`, + `Password`, + `PhoneVerified`, + `Zhifu`, + `SKZhanghao`, + `IP`, + `create_time`, + `update_time` +) +SELECT + u.`UserUUID`, + um.openid, + um.unionid, + um.password, + um.shoujihao_renzheng, + um.zhifu, + um.skzhanghao, + um.ip, + um.create_time, + NOW() +FROM `user_main` um +JOIN `User` u ON u.`YonghuID` = um.yonghuid; + +-- ============================================================ +-- 第3步:更新扩展表的外键引用 +-- 扩展表(user_dashou, user_shangjia 等)的 user_id 原来指向 user_main.id(自增整数) +-- 现在需要改为指向 User.UserUUID(16字节二进制) +-- ============================================================ + +-- user_boss +UPDATE `user_boss` ub +JOIN `user_main` um ON um.id = ub.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET ub.user_id = u.`UserUUID`; + +-- user_dashou +UPDATE `user_dashou` ud +JOIN `user_main` um ON um.id = ud.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET ud.user_id = u.`UserUUID`; + +-- user_shangjia +UPDATE `user_shangjia` us +JOIN `user_main` um ON um.id = us.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET us.user_id = u.`UserUUID`; + +-- user_guanshi +UPDATE `user_guanshi` ug +JOIN `user_main` um ON um.id = ug.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET ug.user_id = u.`UserUUID`; + +-- user_zuzhang +UPDATE `user_zuzhang` uz +JOIN `user_main` um ON um.id = uz.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET uz.user_id = u.`UserUUID`; + +-- user_shenheguan +UPDATE `user_shenheguan` ush +JOIN `user_main` um ON um.id = ush.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET ush.user_id = u.`UserUUID`; + +-- admin_profile +UPDATE `admin_profile` ap +JOIN `user_main` um ON um.id = ap.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET ap.user_id = u.`UserUUID`; + +-- user_kefu +UPDATE `user_kefu` uk +JOIN `user_main` um ON um.id = uk.user_id +JOIN `User` u ON u.`YonghuID` = um.yonghuid +SET uk.user_id = u.`UserUUID`; + +-- ============================================================ +-- 第4步:更新 yonghu_dianpu_bangding 表的 to_field 引用 +-- 原来用 to_field='yonghuid' 关联 user_main.yonghuid +-- 现在用 to_field='YonghuID' 关联 User.YonghuID +-- 数据本身不需要变(yonghuid 值相同),但需要确认列名 +-- ============================================================ + +-- yonghu_dianpu_bangding 的 yonghu_id 列存储的是 yonghuid 字符串值 +-- 新模型 to_field='YonghuID',列名变为 yonghu_id(Django 自动生成) +-- 如果旧列名也是 yonghu_id,则数据不需要迁移 + +-- ============================================================ +-- 第5步:验证数据完整性 +-- ============================================================ + +-- 验证 User 表行数 = user_main 表行数 +SELECT 'User count' AS check_name, COUNT(*) AS cnt FROM `User` +UNION ALL +SELECT 'user_main count', COUNT(*) FROM `user_main` +UNION ALL +SELECT 'user_sensitive_data count', COUNT(*) FROM `user_sensitive_data` +UNION ALL +SELECT 'user_dashou count', COUNT(*) FROM `user_dashou` +UNION ALL +SELECT 'user_shangjia count', COUNT(*) FROM `user_shangjia`; + +-- 验证所有扩展表的 user_id 都能匹配到 User 表 +SELECT 'orphan user_dashou' AS check_name, COUNT(*) AS cnt +FROM `user_dashou` ud LEFT JOIN `User` u ON u.`UserUUID` = ud.user_id +WHERE u.`UserUUID` IS NULL +UNION ALL +SELECT 'orphan user_shangjia', COUNT(*) +FROM `user_shangjia` us LEFT JOIN `User` u ON u.`UserUUID` = us.user_id +WHERE u.`UserUUID` IS NULL; + +-- ============================================================ +-- 第6步:确认无误后删除旧表(手动执行) +-- ============================================================ +-- DROP TABLE IF EXISTS `user_main`; +-- 注意:删除前请确保所有数据已正确迁移! diff --git a/orders/migrations/0001_initial.py b/orders/migrations/0001_initial.py index 784b965..68e9989 100644 --- a/orders/migrations/0001_initial.py +++ b/orders/migrations/0001_initial.py @@ -1,205 +1,454 @@ -# Generated by Django 5.2.10 on 2026-01-14 19:59 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Lilubiao', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lilu', models.DecimalField(decimal_places=4, max_digits=5, null=True, verbose_name='平台分成利率,1是平台,2是商家')), - ('fadanpingtai', models.CharField(max_length=10, null=True, verbose_name='订单所属平台,(商家或平台)')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'db_table': 'lilubiao', - }, - ), - migrations.CreateModel( - name='Ptliushui', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('zonge', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='收取总金额')), - ('zhichuzonge', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='支出总金额')), - ('zongshouyi', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='总收益')), - ('rizonge', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='日收取')), - ('rizhichu', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='日支出')), - ('rishouyi', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='日收益')), - ('zongshoucishu', models.IntegerField(default=0, verbose_name='总收取次数')), - ('rishoucishu', models.IntegerField(default=0, verbose_name='日收取次数')), - ('zongzhichucishu', models.IntegerField(default=0, verbose_name='总支出次数')), - ('rizhichucishu', models.IntegerField(default=0, verbose_name='日支出次数')), - ], - options={ - 'db_table': 'ptliushui', - }, - ), - migrations.CreateModel( - name='Chufajilu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dashouid', models.CharField(db_index=True, max_length=7, null=True, verbose_name='被罚打手ID')), - ('qingqiuid', models.CharField(db_index=True, max_length=7, null=True, verbose_name='请求处罚ID')), - ('chuliid', models.CharField(db_index=True, max_length=7, null=True, verbose_name='处理处罚ID')), - ('cfliyou', models.TextField(blank=True, null=True, verbose_name='处罚理由')), - ('sqzhuangtai', models.IntegerField(blank=True, default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')), - ('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回处罚理由')), - ('jifen', models.IntegerField(default=0, verbose_name='扣除打手积分')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, null=True, verbose_name='订单ID')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'db_table': 'chufajilu', - 'indexes': [models.Index(fields=['dashouid'], name='chufajilu_dashoui_07aac0_idx'), models.Index(fields=['qingqiuid'], name='chufajilu_qingqiu_ac160e_idx'), models.Index(fields=['chuliid'], name='chufajilu_chuliid_cd63ac_idx'), models.Index(fields=['dingdan_id'], name='chufajilu_dingdan_b8f0c2_idx')], - }, - ), - migrations.CreateModel( - name='Dashoutupian', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, null=True, verbose_name='订单ID')), - ('dashou', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), - ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='打手提交图片URL')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'db_table': 'dashoutupian', - 'indexes': [models.Index(fields=['dashou'], name='dashoutupia_dashou_7de8bd_idx'), models.Index(fields=['dingdan_id'], name='dashoutupia_dingdan_97c685_idx')], - }, - ), - migrations.CreateModel( - name='Dingdan', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')), - ('zhuangtai', models.IntegerField(blank=True, db_index=True, default=1, null=True, verbose_name='订单状态')), - ('fadan_pingtai', models.IntegerField(blank=True, null=True, verbose_name='发单平台')), - ('jine', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')), - ('dashou_fencheng', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')), - ('jiedan_dashou_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), - ('dashou_liuyan', models.TextField(blank=True, null=True, verbose_name='打手留言')), - ('zhiding_id', models.CharField(blank=True, max_length=32, null=True, verbose_name='指定ID')), - ('shangpin_id', models.IntegerField(blank=True, null=True, verbose_name='商品ID')), - ('leixing_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品类型ID')), - ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='商品图片URL')), - ('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')), - ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), - ('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), - ('jieshao', models.TextField(blank=True, null=True, verbose_name='订单介绍')), - ('beizhu', models.TextField(blank=True, null=True, verbose_name='订单备注')), - ('nicheng', models.CharField(blank=True, max_length=50, null=True, verbose_name='游戏昵称')), - ('user1_id', models.CharField(db_index=True, max_length=30, null=True, verbose_name='用户1标识')), - ('user2_id', models.CharField(db_index=True, max_length=30, null=True, verbose_name='用户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': 'dingdan', - 'indexes': [models.Index(fields=['zhuangtai'], name='dingdan_zhuangt_2febe8_idx'), models.Index(fields=['dingdan_id'], name='dingdan_dingdan_83dcb6_idx'), models.Index(fields=['jiedan_dashou_id'], name='dingdan_jiedan__921bfa_idx')], - }, - ), - migrations.CreateModel( - name='Liaotian', - fields=[ - ('id', models.BigAutoField(primary_key=True, serialize=False, verbose_name='主键ID')), - ('user1_id', models.CharField(db_index=True, max_length=30, verbose_name='用户1标识')), - ('user2_id', models.CharField(db_index=True, max_length=30, verbose_name='用户2标识')), - ('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')), - ('zhuangtai', models.IntegerField(choices=[(1, '开启中'), (0, '已关闭')], db_index=True, default=1, verbose_name='聊天状态')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'db_table': 'liaotian', - 'indexes': [models.Index(fields=['user1_id'], name='liaotian_user1_i_6be6cd_idx'), models.Index(fields=['user2_id'], name='liaotian_user2_i_9f61a4_idx'), models.Index(fields=['zhuangtai'], name='liaotian_zhuangt_5e8be5_idx')], - }, - ), - migrations.CreateModel( - name='Pingfen', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dashou', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), - ('zongfen', models.PositiveIntegerField(default=0, verbose_name='总分')), - ('cishu', models.PositiveIntegerField(default=0, verbose_name='评分次数')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'verbose_name': '评分表', - 'db_table': 'pingfenbiao', - 'indexes': [models.Index(fields=['dashou'], name='pingfenbiao_dashou_f62f10_idx')], - }, - ), - migrations.CreateModel( - name='Tuikuanjilu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')), - ('dashouid', models.CharField(max_length=7, null=True, verbose_name='接单打手ID')), - ('qingqiuid', models.CharField(max_length=7, null=True, verbose_name='请求用户ID')), - ('chuliid', models.CharField(db_index=True, max_length=7, null=True, verbose_name='处理人ID')), - ('liyou', models.TextField(blank=True, null=True, verbose_name='理由')), - ('sqzhuangtai', models.IntegerField(blank=True, db_index=True, default=0, null=True, verbose_name='申请状态:0待处理,1成功,2驳回')), - ('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回理由')), - ('jine', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')), - ('dashou_fencheng', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')), - ('jieshao', models.TextField(blank=True, null=True, verbose_name='订单介绍')), - ('beizhu', models.TextField(blank=True, null=True, verbose_name='订单备注')), - ('nicheng', models.CharField(blank=True, max_length=50, null=True, verbose_name='游戏昵称')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'db_table': 'tuikuanjilu', - 'indexes': [models.Index(fields=['chuliid'], name='tuikuanjilu_chuliid_0b0f16_idx'), models.Index(fields=['sqzhuangtai'], name='tuikuanjilu_sqzhuan_d89dc9_idx')], - }, - ), - migrations.CreateModel( - name='DingdanPingtai', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('laoban_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='老板ID')), - ('laoban_pingjia', models.TextField(blank=True, null=True, verbose_name='老板评价')), - ('dingdan', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='pingtai_kuozhan', to='orders.dingdan', verbose_name='订单')), - ], - options={ - 'verbose_name': '平台订单扩展', - 'verbose_name_plural': '平台订单扩展', - 'db_table': 'dingdan_pingtai', - 'indexes': [models.Index(fields=['laoban_id'], name='dingdan_pin_laoban__d55e6f_idx')], - }, - ), - migrations.CreateModel( - name='DingdanShangjia', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('shangjia_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='商家ID')), - ('shangjia_pingjia', models.TextField(blank=True, null=True, verbose_name='商家评价')), - ('cfliyou', models.TextField(blank=True, null=True, verbose_name='商家处罚理由')), - ('sqzhuangtai', models.IntegerField(blank=True, default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')), - ('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回商家处罚理由')), - ('sjnicheng', models.CharField(max_length=50, null=True, verbose_name='商家昵称')), - ('dingdan', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='shangjia_kuozhan', to='orders.dingdan', verbose_name='订单')), - ], - options={ - 'verbose_name': '商家订单扩展', - 'verbose_name_plural': '商家订单扩展', - 'db_table': 'dingdan_shangjia', - 'indexes': [models.Index(fields=['shangjia_id'], name='dingdan_sha_shangji_64d28b_idx')], - }, - ), - ] +# Generated by Django 4.2.27 on 2026-06-17 01:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Chufajilu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dashouid', models.CharField(db_index=True, max_length=7, null=True, verbose_name='被罚打手ID')), + ('qingqiuid', models.CharField(db_index=True, max_length=11, null=True, verbose_name='请求处罚ID')), + ('chuliid', models.CharField(db_index=True, max_length=11, null=True, verbose_name='处理处罚ID')), + ('cfliyou', models.TextField(blank=True, null=True, verbose_name='处罚理由')), + ('ssliyou', models.TextField(blank=True, null=True, verbose_name='打手申诉理由')), + ('sqzhuangtai', models.IntegerField(blank=True, default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')), + ('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回处罚理由')), + ('jifen', models.IntegerField(default=0, verbose_name='扣除打手积分')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'db_table': 'chufajilu', + }, + ), + migrations.CreateModel( + name='Chufatupian', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('yonghuid', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='用户ID')), + ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='证据图片URL')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'db_table': 'chufatupian', + }, + ), + migrations.CreateModel( + name='Dashoutupian', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('dashou', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), + ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='打手提交图片URL')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'db_table': 'dashoutupian', + }, + ), + migrations.CreateModel( + name='Dingdan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')), + ('zhuangtai', models.IntegerField(blank=True, db_index=True, default=1, null=True, verbose_name='订单状态')), + ('fadan_pingtai', models.IntegerField(blank=True, null=True, verbose_name='发单平台')), + ('jine', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')), + ('dashou_fencheng', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')), + ('guanshi_fencheng', models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=10, null=True, verbose_name='管事分成')), + ('jiedan_dashou_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), + ('dashou_liuyan', models.TextField(blank=True, null=True, verbose_name='打手留言')), + ('zhiding_id', models.CharField(blank=True, max_length=32, null=True, verbose_name='指定ID')), + ('shangpin_id', models.IntegerField(blank=True, null=True, verbose_name='商品ID')), + ('leixing_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品类型ID')), + ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='商品图片URL')), + ('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')), + ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), + ('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), + ('jieshao', models.TextField(blank=True, null=True, verbose_name='订单介绍')), + ('beizhu', models.TextField(blank=True, null=True, verbose_name='订单备注')), + ('nicheng', models.CharField(blank=True, max_length=50, null=True, verbose_name='游戏昵称')), + ('user1_id', models.CharField(db_index=True, max_length=30, null=True, verbose_name='用户1标识')), + ('user2_id', models.CharField(db_index=True, max_length=30, null=True, verbose_name='用户2打手标识')), + ('auto_task_id', models.CharField(blank=True, default='', max_length=255, verbose_name='延时任务ID')), + ('auto_expire_at', models.DateTimeField(blank=True, null=True, verbose_name='计划过期时间')), + ('pending_dispatch', models.BooleanField(db_index=True, default=False, verbose_name='待调度标记')), + ('status_8_time', models.DateTimeField(blank=True, null=True, verbose_name='状态变为8的时间')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('clkf', models.CharField(db_index=True, max_length=20, null=True, verbose_name='处理客服')), + ('tkly', models.CharField(blank=True, max_length=500, null=True, verbose_name='退款/拒绝理由')), + ('wechat_transaction_id', models.CharField(blank=True, db_index=True, max_length=64, null=True, verbose_name='微信支付订单号')), + ], + options={ + 'verbose_name': '订单', + 'verbose_name_plural': '订单', + 'db_table': 'dingdan', + }, + ), + migrations.CreateModel( + name='DingdanPeihu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')), + ('zhudashou_id', models.CharField(db_index=True, max_length=32, verbose_name='主打手ID')), + ('peihu1_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='陪护1打手ID')), + ('peihu2_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='陪护2打手ID')), + ('zhuangtai', models.IntegerField(default=1, verbose_name='陪护订单状态')), + ('peihu_xuqiu_shuliang', models.IntegerField(default=1, verbose_name='陪护需求数量')), + ('yongjin_yaoqiu', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='抢单佣金要求')), + ('peihu1_dengji_xuqiu', models.PositiveIntegerField(blank=True, null=True, verbose_name='陪护1等级需求(称号ID)')), + ('peihu2_dengji_xuqiu', models.PositiveIntegerField(blank=True, null=True, verbose_name='陪护2等级需求(称号ID)')), + ('peihu1_zhadan_danze', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护1炸单担责比例')), + ('peihu2_zhadan_danze', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护2炸单担责比例')), + ('peihu1_fenhong', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护1分红比例')), + ('peihu2_fenhong', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护2分红比例')), + ('zhiding_peihu1', models.CharField(blank=True, max_length=32, null=True, verbose_name='指定陪护1 ID')), + ('zhiding_peihu2', models.CharField(blank=True, max_length=32, null=True, verbose_name='指定陪护2 ID')), + ('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': 'dingdan_peihu', + }, + ), + migrations.CreateModel( + name='DingdanPingtai', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('laoban_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='老板ID')), + ('laoban_pingjia', models.TextField(blank=True, null=True, verbose_name='老板评价')), + ('jjjs_biaoshi', models.IntegerField(default=0, verbose_name='拒绝结算标记(1表示拒绝结算)')), + ('pingtai_shouyi', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='平台收益')), + ('dianpu_shouyi', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='店铺收益')), + ('dianpu_id', models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='所属店铺ID')), + ('shangji_dianpu_id', models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='该订单的上级店铺ID')), + ('shangji_fenhong', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='上级分红金额')), + ], + options={ + 'verbose_name': '平台订单扩展', + 'verbose_name_plural': '平台订单扩展', + 'db_table': 'dingdan_pingtai', + }, + ), + migrations.CreateModel( + name='DingdanShangjia', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('shangjia_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='商家ID')), + ('shangjia_pingjia', models.TextField(blank=True, null=True, verbose_name='商家评价')), + ('cfliyou', models.TextField(blank=True, null=True, verbose_name='商家处罚理由')), + ('sqzhuangtai', models.IntegerField(blank=True, default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')), + ('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回商家处罚理由')), + ('sjnicheng', models.CharField(max_length=50, null=True, verbose_name='商家昵称')), + ('shangyige_dingdan_id', models.CharField(blank=True, max_length=32, null=True, verbose_name='上一个订单ID')), + ], + options={ + 'verbose_name': '商家订单扩展', + 'verbose_name_plural': '商家订单扩展', + 'db_table': 'dingdan_shangjia', + }, + ), + migrations.CreateModel( + name='Fadan', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')), + ('beichufa_id', models.CharField(db_index=True, max_length=20, verbose_name='被处罚用户ID')), + ('shenqing_chufa', models.CharField(blank=True, max_length=20, null=True, verbose_name='申请处罚者ID')), + ('shenfen', models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '商家'), (4, '组长')], default=1, verbose_name='被处罚者身份')), + ('chufaliyou', models.TextField(blank=True, null=True, verbose_name='处罚理由')), + ('fakuanjine', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='罚款金额')), + ('guanliandingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联订单ID')), + ('zhuangtai', models.IntegerField(choices=[(1, '待缴纳'), (2, '已缴纳'), (3, '申诉中'), (4, '已驳回')], db_index=True, default=1, verbose_name='罚单状态')), + ('yingxiang_qiangdan', models.IntegerField(choices=[(1, '影响抢单'), (0, '不影响抢单')], db_index=True, default=1, verbose_name='是否影响抢单')), + ('shensuliyou', models.TextField(blank=True, null=True, verbose_name='申诉理由')), + ('tongyi_chufaliyou', models.TextField(blank=True, null=True, verbose_name='同意处罚理由')), + ('bohuiliyou', 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='更新时间')), + ('shenqingren_shenfen', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], default=1, verbose_name='申请处罚人身份')), + ('chulizhe_shenfen', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员')], default=2, verbose_name='处理者身份')), + ('chulizhe', models.CharField(blank=True, max_length=20, null=True, verbose_name='处理者')), + ('shenqingren_fenhong_jine', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='申请人分红金额')), + ], + options={ + 'verbose_name': '罚单', + 'verbose_name_plural': '罚单', + 'db_table': 'fadan', + }, + ), + migrations.CreateModel( + name='FadanFenhongLilv', + fields=[ + ('shenfen', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], primary_key=True, serialize=False, verbose_name='申请处罚人身份')), + ('lilv', models.DecimalField(decimal_places=4, default=0.0, max_digits=5, 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': 'fadan_fenhong_lilv', + }, + ), + migrations.CreateModel( + name='Lilubiao', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('lilu', models.DecimalField(decimal_places=4, max_digits=5, null=True, verbose_name='平台分成利率,1是平台,2是商家')), + ('fadanpingtai', models.CharField(max_length=10, null=True, verbose_name='订单所属平台,(商家或平台)')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'db_table': 'lilubiao', + }, + ), + migrations.CreateModel( + name='Ptliushui', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('zonge', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='收取总金额')), + ('zhichuzonge', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='支出总金额')), + ('zongshouyi', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='总收益')), + ('rizonge', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='日收取')), + ('rizhichu', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='日支出')), + ('rishouyi', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='日收益')), + ('zongshoucishu', models.IntegerField(default=0, verbose_name='总收取次数')), + ('rishoucishu', models.IntegerField(default=0, verbose_name='日收取次数')), + ('zongzhichucishu', models.IntegerField(default=0, verbose_name='总支出次数')), + ('rizhichucishu', models.IntegerField(default=0, verbose_name='日支出次数')), + ], + options={ + 'db_table': 'ptliushui', + }, + ), + migrations.CreateModel( + name='Tuikuanjilu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')), + ('dashouid', models.CharField(max_length=7, null=True, verbose_name='接单打手ID')), + ('qingqiuid', models.CharField(max_length=7, null=True, verbose_name='请求用户ID')), + ('chuliid', models.CharField(db_index=True, max_length=11, null=True, verbose_name='处理人ID')), + ('liyou', models.TextField(blank=True, null=True, verbose_name='理由')), + ('sqzhuangtai', models.IntegerField(blank=True, db_index=True, default=0, null=True, verbose_name='申请状态:0待处理,1成功,2驳回')), + ('bhliyou', models.TextField(blank=True, null=True, verbose_name='驳回理由')), + ('jine', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')), + ('dashou_fencheng', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')), + ('jieshao', models.TextField(blank=True, null=True, verbose_name='订单介绍')), + ('beizhu', models.TextField(blank=True, null=True, verbose_name='订单备注')), + ('nicheng', models.CharField(blank=True, max_length=50, null=True, verbose_name='游戏昵称')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'db_table': 'tuikuanjilu', + 'indexes': [models.Index(fields=['chuliid'], name='tuikuanjilu_chuliid_0b0f16_idx'), models.Index(fields=['sqzhuangtai'], name='tuikuanjilu_sqzhuan_d89dc9_idx')], + }, + ), + migrations.CreateModel( + name='Pingfen', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dashou', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), + ('zongfen', models.PositiveIntegerField(default=0, verbose_name='总分')), + ('cishu', models.PositiveIntegerField(default=0, verbose_name='评分次数')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '评分表', + 'db_table': 'pingfenbiao', + 'indexes': [models.Index(fields=['dashou'], name='pingfenbiao_dashou_f62f10_idx')], + }, + ), + migrations.CreateModel( + name='OrderDashouHistory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, verbose_name='订单ID')), + ('dashou_id', models.CharField(db_index=True, max_length=7, verbose_name='打手ID')), + ('times', models.PositiveSmallIntegerField(verbose_name='第几次接单(从1开始)')), + ('operator', models.CharField(max_length=11, verbose_name='操作客服ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '订单打手变更历史', + 'verbose_name_plural': '订单打手变更历史', + 'db_table': 'order_dashou_history', + 'indexes': [models.Index(fields=['dingdan_id'], name='order_dasho_dingdan_1e79ab_idx'), models.Index(fields=['dashou_id'], name='order_dasho_dashou__0a637c_idx')], + }, + ), + migrations.CreateModel( + name='Liaotian', + fields=[ + ('id', models.BigAutoField(primary_key=True, serialize=False, verbose_name='主键ID')), + ('user1_id', models.CharField(db_index=True, max_length=30, verbose_name='用户1标识')), + ('user2_id', models.CharField(db_index=True, max_length=30, verbose_name='用户2标识')), + ('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')), + ('zhuangtai', models.IntegerField(choices=[(1, '开启中'), (0, '已关闭')], db_index=True, default=1, verbose_name='聊天状态')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'db_table': 'liaotian', + 'indexes': [models.Index(fields=['user1_id'], name='liaotian_user1_i_6be6cd_idx'), models.Index(fields=['user2_id'], name='liaotian_user2_i_9f61a4_idx'), models.Index(fields=['zhuangtai'], name='liaotian_zhuangt_5e8be5_idx')], + }, + ), + migrations.CreateModel( + name='FadanShensuTupian', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('beichufa_id', models.CharField(db_index=True, max_length=7, verbose_name='被处罚用户ID')), + ('tupian_url', models.CharField(max_length=500, verbose_name='图片相对URL')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('yongtu', models.IntegerField(choices=[(1, '处罚证据图片'), (2, '申诉图片')], default=2, verbose_name='图片用途')), + ('fadan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shensu_tupians', to='orders.fadan', verbose_name='关联罚单')), + ], + options={ + 'verbose_name': '罚款申诉图片', + 'verbose_name_plural': '罚款申诉图片', + 'db_table': 'fadan_shensu_tupian', + }, + ), + migrations.CreateModel( + name='FadanFenhong', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')), + ('fenhongzhe_id', models.CharField(db_index=True, max_length=20, verbose_name='分红者ID')), + ('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='分红总额')), + ('ketixian_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现分红')), + ('shenfen', models.IntegerField(choices=[(1, '商家'), (2, '客服'), (3, '平台管理者'), (4, '店铺'), (5, '售后')], default=1, verbose_name='分红者身份')), + ('fenhong_cishu', models.IntegerField(default=0, verbose_name='分红次数')), + ('is_individual_rate', models.BooleanField(default=False, verbose_name='是否单独开启分红利率')), + ('yingde_lilv', models.DecimalField(decimal_places=4, default=0.0, max_digits=5, 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': 'fadan_fenhong', + 'indexes': [models.Index(fields=['fenhongzhe_id'], name='fadan_fenhong_zhe_idx'), models.Index(fields=['shenfen'], name='fadan_fenhong_sf_idx')], + }, + ), + migrations.AddIndex( + model_name='fadan', + index=models.Index(fields=['beichufa_id', 'yingxiang_qiangdan', 'zhuangtai'], name='fadan_qiangdan_check'), + ), + migrations.AddIndex( + model_name='fadan', + index=models.Index(fields=['guanliandingdan_id'], name='fadan_dingdan_idx'), + ), + migrations.AddField( + model_name='dingdanshangjia', + name='dingdan', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='shangjia_kuozhan', to='orders.dingdan', verbose_name='订单'), + ), + migrations.AddField( + model_name='dingdanpingtai', + name='dingdan', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='pingtai_kuozhan', to='orders.dingdan', verbose_name='订单'), + ), + migrations.AddIndex( + model_name='dingdanpeihu', + index=models.Index(fields=['zhudashou_id'], name='dingdan_pei_zhudash_583f4e_idx'), + ), + migrations.AddIndex( + model_name='dingdanpeihu', + index=models.Index(fields=['peihu1_id'], name='dingdan_pei_peihu1__728279_idx'), + ), + migrations.AddIndex( + model_name='dingdanpeihu', + index=models.Index(fields=['peihu2_id'], name='dingdan_pei_peihu2__77e45e_idx'), + ), + migrations.AddIndex( + model_name='dingdanpeihu', + index=models.Index(fields=['zhuangtai'], name='dingdan_pei_zhuangt_22eaf6_idx'), + ), + migrations.AddIndex( + model_name='dingdan', + index=models.Index(fields=['zhuangtai'], name='dingdan_zhuangt_2febe8_idx'), + ), + migrations.AddIndex( + model_name='dingdan', + index=models.Index(fields=['dingdan_id'], name='dingdan_dingdan_83dcb6_idx'), + ), + migrations.AddIndex( + model_name='dingdan', + index=models.Index(fields=['jiedan_dashou_id'], name='dingdan_jiedan__921bfa_idx'), + ), + migrations.AddIndex( + model_name='dingdan', + index=models.Index(fields=['wechat_transaction_id'], name='dingdan_wechat__278b79_idx'), + ), + migrations.AddIndex( + model_name='dashoutupian', + index=models.Index(fields=['dashou'], name='dashoutupia_dashou_7de8bd_idx'), + ), + migrations.AddIndex( + model_name='dashoutupian', + index=models.Index(fields=['dingdan_id'], name='dashoutupia_dingdan_97c685_idx'), + ), + migrations.AddIndex( + model_name='chufatupian', + index=models.Index(fields=['yonghuid'], name='chufatupian_yonghui_71e585_idx'), + ), + migrations.AddIndex( + model_name='chufatupian', + index=models.Index(fields=['dingdan_id'], name='chufatupian_dingdan_ce0dd4_idx'), + ), + migrations.AddIndex( + model_name='chufajilu', + index=models.Index(fields=['dashouid'], name='chufajilu_dashoui_07aac0_idx'), + ), + migrations.AddIndex( + model_name='chufajilu', + index=models.Index(fields=['qingqiuid'], name='chufajilu_qingqiu_ac160e_idx'), + ), + migrations.AddIndex( + model_name='chufajilu', + index=models.Index(fields=['chuliid'], name='chufajilu_chuliid_cd63ac_idx'), + ), + migrations.AddIndex( + model_name='chufajilu', + index=models.Index(fields=['dingdan_id'], name='chufajilu_dingdan_b8f0c2_idx'), + ), + migrations.AddIndex( + model_name='fadanshensutupian', + index=models.Index(fields=['fadan_id'], name='fadan_shens_fadan_i_78fab9_idx'), + ), + migrations.AddIndex( + model_name='fadanshensutupian', + index=models.Index(fields=['beichufa_id'], name='fadan_shens_beichuf_59748e_idx'), + ), + migrations.AddIndex( + model_name='dingdanshangjia', + index=models.Index(fields=['shangjia_id'], name='dingdan_sha_shangji_64d28b_idx'), + ), + migrations.AddIndex( + model_name='dingdanpingtai', + index=models.Index(fields=['laoban_id'], name='dingdan_pin_laoban__d55e6f_idx'), + ), + migrations.AddIndex( + model_name='dingdanpingtai', + index=models.Index(fields=['dianpu_id'], name='dingdan_pin_dianpu__9fbe27_idx'), + ), + ] diff --git a/orders/migrations/0002_dingdan_auto_expire_at_dingdan_auto_task_id.py b/orders/migrations/0002_dingdan_auto_expire_at_dingdan_auto_task_id.py deleted file mode 100644 index e9bbc52..0000000 --- a/orders/migrations/0002_dingdan_auto_expire_at_dingdan_auto_task_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-17 15:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='auto_expire_at', - field=models.DateTimeField(blank=True, null=True, verbose_name='计划过期时间'), - ), - migrations.AddField( - model_name='dingdan', - name='auto_task_id', - field=models.CharField(blank=True, default='', max_length=255, verbose_name='延时任务ID'), - ), - ] diff --git a/orders/migrations/0003_dingdan_pending_dispatch_dingdan_status_8_time.py b/orders/migrations/0003_dingdan_pending_dispatch_dingdan_status_8_time.py deleted file mode 100644 index 06253b7..0000000 --- a/orders/migrations/0003_dingdan_pending_dispatch_dingdan_status_8_time.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-17 16:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0002_dingdan_auto_expire_at_dingdan_auto_task_id'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='pending_dispatch', - field=models.BooleanField(db_index=True, default=False, verbose_name='待调度标记'), - ), - migrations.AddField( - model_name='dingdan', - name='status_8_time', - field=models.DateTimeField(blank=True, null=True, verbose_name='状态变为8的时间'), - ), - ] diff --git a/orders/migrations/0004_alter_tuikuanjilu_chuliid.py b/orders/migrations/0004_alter_tuikuanjilu_chuliid.py deleted file mode 100644 index bdd63ca..0000000 --- a/orders/migrations/0004_alter_tuikuanjilu_chuliid.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-17 23:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0003_dingdan_pending_dispatch_dingdan_status_8_time'), - ] - - operations = [ - migrations.AlterField( - model_name='tuikuanjilu', - name='chuliid', - field=models.CharField(db_index=True, max_length=11, null=True, verbose_name='处理人ID'), - ), - ] diff --git a/orders/migrations/0005_alter_chufajilu_chuliid.py b/orders/migrations/0005_alter_chufajilu_chuliid.py deleted file mode 100644 index 5514d10..0000000 --- a/orders/migrations/0005_alter_chufajilu_chuliid.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-20 19:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0004_alter_tuikuanjilu_chuliid'), - ] - - operations = [ - migrations.AlterField( - model_name='chufajilu', - name='chuliid', - field=models.CharField(db_index=True, max_length=11, null=True, verbose_name='处理处罚ID'), - ), - ] diff --git a/orders/migrations/0006_chufatupian.py b/orders/migrations/0006_chufatupian.py deleted file mode 100644 index 1eab403..0000000 --- a/orders/migrations/0006_chufatupian.py +++ /dev/null @@ -1,28 +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 = [ - ('orders', '0005_alter_chufajilu_chuliid'), - ] - - operations = [ - migrations.CreateModel( - name='Chufatupian', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, null=True, verbose_name='订单ID')), - ('yonghuid', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='用户ID')), - ('tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='证据图片URL')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - options={ - 'db_table': 'chufatupian', - 'indexes': [models.Index(fields=['yonghuid'], name='chufatupian_yonghui_71e585_idx'), models.Index(fields=['dingdan_id'], name='chufatupian_dingdan_ce0dd4_idx')], - }, - ), - ] diff --git a/orders/migrations/0007_chufajilu_ssliyou.py b/orders/migrations/0007_chufajilu_ssliyou.py deleted file mode 100644 index f00f99a..0000000 --- a/orders/migrations/0007_chufajilu_ssliyou.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-08 00:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0006_chufatupian'), - ] - - operations = [ - migrations.AddField( - model_name='chufajilu', - name='ssliyou', - field=models.TextField(blank=True, null=True, verbose_name='打手申诉理由'), - ), - ] diff --git a/orders/migrations/0008_dingdan_is_cross_dingdan_partner_order_id.py b/orders/migrations/0008_dingdan_is_cross_dingdan_partner_order_id.py deleted file mode 100644 index 7bdaf56..0000000 --- a/orders/migrations/0008_dingdan_is_cross_dingdan_partner_order_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-14 18:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0007_chufajilu_ssliyou'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='is_cross', - field=models.IntegerField(default=0, verbose_name='是否跨平台订单(0否,1是)'), - ), - migrations.AddField( - model_name='dingdan', - name='partner_order_id', - field=models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='对方平台订单ID'), - ), - ] diff --git a/orders/migrations/0009_dingdanpingtai_clkf_dingdanpingtai_jjjs_biaoshi.py b/orders/migrations/0009_dingdanpingtai_clkf_dingdanpingtai_jjjs_biaoshi.py deleted file mode 100644 index 8b7cd25..0000000 --- a/orders/migrations/0009_dingdanpingtai_clkf_dingdanpingtai_jjjs_biaoshi.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-21 14:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0008_dingdan_is_cross_dingdan_partner_order_id'), - ] - - operations = [ - migrations.AddField( - model_name='dingdanpingtai', - name='clkf', - field=models.CharField(db_index=True, max_length=20, null=True, verbose_name='处理客服'), - ), - migrations.AddField( - model_name='dingdanpingtai', - name='jjjs_biaoshi', - field=models.IntegerField(default=0, verbose_name='拒绝结算标记(1表示拒绝结算)'), - ), - ] diff --git a/orders/migrations/0010_remove_dingdanpingtai_clkf_dingdan_clkf.py b/orders/migrations/0010_remove_dingdanpingtai_clkf_dingdan_clkf.py deleted file mode 100644 index 59c7732..0000000 --- a/orders/migrations/0010_remove_dingdanpingtai_clkf_dingdan_clkf.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-21 16:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0009_dingdanpingtai_clkf_dingdanpingtai_jjjs_biaoshi'), - ] - - operations = [ - migrations.RemoveField( - model_name='dingdanpingtai', - name='clkf', - ), - migrations.AddField( - model_name='dingdan', - name='clkf', - field=models.CharField(db_index=True, max_length=20, null=True, verbose_name='处理客服'), - ), - ] diff --git a/orders/migrations/0011_dingdan_tkly.py b/orders/migrations/0011_dingdan_tkly.py deleted file mode 100644 index 7235148..0000000 --- a/orders/migrations/0011_dingdan_tkly.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-21 17:15 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0010_remove_dingdanpingtai_clkf_dingdan_clkf'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='tkly', - field=models.CharField(blank=True, max_length=500, null=True, verbose_name='退款/拒绝理由'), - ), - ] diff --git a/orders/migrations/0012_dingdan_wechat_transaction_id_and_more.py b/orders/migrations/0012_dingdan_wechat_transaction_id_and_more.py deleted file mode 100644 index a6fba66..0000000 --- a/orders/migrations/0012_dingdan_wechat_transaction_id_and_more.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-22 12:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0011_dingdan_tkly'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='wechat_transaction_id', - field=models.CharField(blank=True, db_index=True, max_length=64, null=True, verbose_name='微信支付订单号'), - ), - migrations.AddIndex( - model_name='dingdan', - index=models.Index(fields=['wechat_transaction_id'], name='dingdan_wechat__278b79_idx'), - ), - ] diff --git a/orders/migrations/0013_alter_chufajilu_qingqiuid.py b/orders/migrations/0013_alter_chufajilu_qingqiuid.py deleted file mode 100644 index 5d7fb22..0000000 --- a/orders/migrations/0013_alter_chufajilu_qingqiuid.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-22 19:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0012_dingdan_wechat_transaction_id_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='chufajilu', - name='qingqiuid', - field=models.CharField(db_index=True, max_length=11, null=True, verbose_name='请求处罚ID'), - ), - ] diff --git a/orders/migrations/0014_dingdan_dispatch_type_dingdan_partner_club_id.py b/orders/migrations/0014_dingdan_dispatch_type_dingdan_partner_club_id.py deleted file mode 100644 index 3dcbe37..0000000 --- a/orders/migrations/0014_dingdan_dispatch_type_dingdan_partner_club_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-24 17:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0013_alter_chufajilu_qingqiuid'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='dispatch_type', - field=models.IntegerField(choices=[(1, '我方派单'), (2, '对方派单')], default=0, verbose_name='派发情况'), - ), - migrations.AddField( - model_name='dingdan', - name='partner_club_id', - field=models.CharField(blank=True, db_index=True, max_length=6, null=True, verbose_name='对方俱乐部ID'), - ), - ] diff --git a/orders/migrations/0015_presettlement_orderdashouhistory_and_more.py b/orders/migrations/0015_presettlement_orderdashouhistory_and_more.py deleted file mode 100644 index fc3fe17..0000000 --- a/orders/migrations/0015_presettlement_orderdashouhistory_and_more.py +++ /dev/null @@ -1,73 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-01 09:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0014_dingdan_dispatch_type_dingdan_partner_club_id'), - ] - - operations = [ - migrations.CreateModel( - name='PreSettlement', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='我方订单ID')), - ('partner_order_id', models.CharField(db_index=True, max_length=32, verbose_name='对方订单ID')), - ('partner_club_id', models.CharField(db_index=True, max_length=6, verbose_name='对方俱乐部ID')), - ('dashou_id', models.CharField(db_index=True, max_length=7, verbose_name='接单打手ID')), - ('amount', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='打手应分金额')), - ('order_amount', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='订单原金额')), - ('status', models.SmallIntegerField(choices=[(0, '待结算'), (1, '已结算'), (2, '已拒绝')], default=0, verbose_name='结算状态')), - ('process_time', models.DateTimeField(blank=True, null=True, verbose_name='处理时间')), - ('operator', models.CharField(blank=True, default='', max_length=32, 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': 'pre_settlement', - 'indexes': [models.Index(fields=['dingdan_id'], name='pre_settlem_dingdan_4f3541_idx'), models.Index(fields=['partner_order_id'], name='pre_settlem_partner_45b29e_idx'), models.Index(fields=['partner_club_id'], name='pre_settlem_partner_d2c44c_idx'), models.Index(fields=['dashou_id'], name='pre_settlem_dashou__d5fe7c_idx'), models.Index(fields=['status'], name='pre_settlem_status_0aa711_idx')], - }, - ), - migrations.CreateModel( - name='OrderDashouHistory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, verbose_name='订单ID')), - ('dashou_id', models.CharField(db_index=True, max_length=7, verbose_name='打手ID')), - ('times', models.PositiveSmallIntegerField(verbose_name='第几次接单(从1开始)')), - ('operator', models.CharField(max_length=11, verbose_name='操作客服ID')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ], - options={ - 'verbose_name': '订单打手变更历史', - 'verbose_name_plural': '订单打手变更历史', - 'db_table': 'order_dashou_history', - 'indexes': [models.Index(fields=['dingdan_id'], name='order_dasho_dingdan_1e79ab_idx'), models.Index(fields=['dashou_id'], name='order_dasho_dashou__0a637c_idx')], - }, - ), - migrations.CreateModel( - name='CrossPlatformOrderData', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='我方订单ID')), - ('partner_order_id', models.CharField(db_index=True, max_length=32, verbose_name='对方平台订单ID')), - ('partner_club_id', models.CharField(db_index=True, max_length=6, verbose_name='对方俱乐部ID')), - ('partner_order_status', models.IntegerField(default=0, verbose_name='对方平台订单状态')), - ('partner_dashou_id', models.CharField(blank=True, default='', max_length=32, verbose_name='对方平台接单打手ID')), - ('partner_amount', 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='更新时间')), - ], - options={ - 'verbose_name': '跨平台订单扩展', - 'verbose_name_plural': '跨平台订单扩展', - 'db_table': 'cross_platform_order_data', - 'indexes': [models.Index(fields=['dingdan_id'], name='cross_platf_dingdan_498d08_idx'), models.Index(fields=['partner_order_id'], name='cross_platf_partner_5d5615_idx'), models.Index(fields=['partner_club_id'], name='cross_platf_partner_1054e1_idx')], - }, - ), - ] diff --git a/orders/migrations/0016_alter_presettlement_dingdan_id_and_more.py b/orders/migrations/0016_alter_presettlement_dingdan_id_and_more.py deleted file mode 100644 index 34e0859..0000000 --- a/orders/migrations/0016_alter_presettlement_dingdan_id_and_more.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-04 15:10 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0015_presettlement_orderdashouhistory_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='presettlement', - name='dingdan_id', - field=models.CharField(db_index=True, max_length=32, verbose_name='我方订单ID'), - ), - migrations.AlterUniqueTogether( - name='presettlement', - unique_together={('dingdan_id', 'dashou_id')}, - ), - ] diff --git a/orders/migrations/0017_dingdanpingtai_dianpu_id_and_more.py b/orders/migrations/0017_dingdanpingtai_dianpu_id_and_more.py deleted file mode 100644 index 03a58c2..0000000 --- a/orders/migrations/0017_dingdanpingtai_dianpu_id_and_more.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-23 14:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0016_alter_presettlement_dingdan_id_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='dingdanpingtai', - name='dianpu_id', - field=models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='所属店铺ID'), - ), - migrations.AddField( - model_name='dingdanpingtai', - name='dianpu_shouyi', - field=models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='店铺收益'), - ), - migrations.AddField( - model_name='dingdanpingtai', - name='pingtai_shouyi', - field=models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='平台收益'), - ), - migrations.AddIndex( - model_name='dingdanpingtai', - index=models.Index(fields=['dianpu_id'], name='dingdan_pin_dianpu__9fbe27_idx'), - ), - ] diff --git a/orders/migrations/0018_dingdanshangjia_partner_yonghu_id.py b/orders/migrations/0018_dingdanshangjia_partner_yonghu_id.py deleted file mode 100644 index 2c45ee5..0000000 --- a/orders/migrations/0018_dingdanshangjia_partner_yonghu_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-30 02:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0017_dingdanpingtai_dianpu_id_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='dingdanshangjia', - name='partner_yonghu_id', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='对方平台用户ID'), - ), - ] diff --git a/orders/migrations/0019_dingdanpingtai_shangji_dianpu_id_and_more.py b/orders/migrations/0019_dingdanpingtai_shangji_dianpu_id_and_more.py deleted file mode 100644 index 780942d..0000000 --- a/orders/migrations/0019_dingdanpingtai_shangji_dianpu_id_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-05 10:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0018_dingdanshangjia_partner_yonghu_id'), - ] - - operations = [ - migrations.AddField( - model_name='dingdanpingtai', - name='shangji_dianpu_id', - field=models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='该订单的上级店铺ID'), - ), - migrations.AddField( - model_name='dingdanpingtai', - name='shangji_fenhong', - field=models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='上级分红金额'), - ), - ] diff --git a/orders/migrations/0020_fadanfenhong_fadan.py b/orders/migrations/0020_fadanfenhong_fadan.py deleted file mode 100644 index 9849a9d..0000000 --- a/orders/migrations/0020_fadanfenhong_fadan.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-06 11:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0019_dingdanpingtai_shangji_dianpu_id_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='FadanFenhong', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')), - ('fenhongzhe_id', models.CharField(db_index=True, max_length=20, verbose_name='分红者ID')), - ('zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='分红总额')), - ('ketixian_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现分红')), - ('shenfen', models.IntegerField(choices=[(1, '商家'), (2, '客服'), (3, '平台管理者')], default=1, verbose_name='分红者身份')), - ('fenhong_cishu', models.IntegerField(default=0, verbose_name='分红次数')), - ('yingde_lilv', models.DecimalField(decimal_places=4, default=0.0, max_digits=5, 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': 'fadan_fenhong', - 'indexes': [models.Index(fields=['fenhongzhe_id'], name='fadan_fenhong_zhe_idx'), models.Index(fields=['shenfen'], name='fadan_fenhong_sf_idx')], - }, - ), - migrations.CreateModel( - name='Fadan', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')), - ('beichufa_id', models.CharField(db_index=True, max_length=20, verbose_name='被处罚用户ID')), - ('shenqing_chufa', models.CharField(blank=True, max_length=20, null=True, verbose_name='申请处罚者ID')), - ('shenfen', models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '商家'), (4, '组长')], default=1, verbose_name='被处罚者身份')), - ('chufaliyou', models.TextField(blank=True, null=True, verbose_name='处罚理由')), - ('fakuanjine', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='罚款金额')), - ('guanliandingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联订单ID')), - ('zhuangtai', models.IntegerField(choices=[(1, '待缴纳'), (2, '已缴纳'), (3, '申诉中'), (4, '已驳回')], db_index=True, default=1, verbose_name='罚单状态')), - ('yingxiang_qiangdan', models.IntegerField(choices=[(1, '影响抢单'), (0, '不影响抢单')], db_index=True, default=1, verbose_name='是否影响抢单')), - ('shensuliyou', models.TextField(blank=True, null=True, verbose_name='申诉理由')), - ('tongyi_chufaliyou', models.TextField(blank=True, null=True, verbose_name='同意处罚理由')), - ('bohuiliyou', 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': 'fadan', - 'indexes': [models.Index(fields=['beichufa_id', 'yingxiang_qiangdan', 'zhuangtai'], name='fadan_qiangdan_check'), models.Index(fields=['guanliandingdan_id'], name='fadan_dingdan_idx')], - }, - ), - ] diff --git a/orders/migrations/0021_fadanshensutupian.py b/orders/migrations/0021_fadanshensutupian.py deleted file mode 100644 index e6cc657..0000000 --- a/orders/migrations/0021_fadanshensutupian.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-07 11:15 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0020_fadanfenhong_fadan'), - ] - - operations = [ - migrations.CreateModel( - name='FadanShensuTupian', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('beichufa_id', models.CharField(db_index=True, max_length=7, verbose_name='被处罚用户ID')), - ('tupian_url', models.CharField(max_length=500, verbose_name='图片相对URL')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('fadan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shensu_tupians', to='orders.fadan', verbose_name='关联罚单')), - ], - options={ - 'verbose_name': '罚款申诉图片', - 'verbose_name_plural': '罚款申诉图片', - 'db_table': 'fadan_shensu_tupian', - 'indexes': [models.Index(fields=['fadan_id'], name='fadan_shens_fadan_i_78fab9_idx'), models.Index(fields=['beichufa_id'], name='fadan_shens_beichuf_59748e_idx')], - }, - ), - ] diff --git a/orders/migrations/0022_fadan_partner_club_id_fadan_shenqingren_shenfen.py b/orders/migrations/0022_fadan_partner_club_id_fadan_shenqingren_shenfen.py deleted file mode 100644 index e104eb5..0000000 --- a/orders/migrations/0022_fadan_partner_club_id_fadan_shenqingren_shenfen.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-07 16:18 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0021_fadanshensutupian'), - ] - - operations = [ - migrations.AddField( - model_name='fadan', - name='partner_club_id', - field=models.CharField(blank=True, db_index=True, max_length=6, null=True, verbose_name='对方俱乐部ID'), - ), - migrations.AddField( - model_name='fadan', - name='shenqingren_shenfen', - field=models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员')], default=1, verbose_name='申请处罚人身份'), - ), - ] diff --git a/orders/migrations/0023_fadanshensutupian_yongtu.py b/orders/migrations/0023_fadanshensutupian_yongtu.py deleted file mode 100644 index 8a0ba9b..0000000 --- a/orders/migrations/0023_fadanshensutupian_yongtu.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-07 17:03 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0022_fadan_partner_club_id_fadan_shenqingren_shenfen'), - ] - - operations = [ - migrations.AddField( - model_name='fadanshensutupian', - name='yongtu', - field=models.IntegerField(choices=[(1, '处罚证据图片'), (2, '申诉图片')], default=2, verbose_name='图片用途'), - ), - ] diff --git a/orders/migrations/0024_fadan_chulizhe_fadan_chulizhe_shenfen.py b/orders/migrations/0024_fadan_chulizhe_fadan_chulizhe_shenfen.py deleted file mode 100644 index 59c6b7f..0000000 --- a/orders/migrations/0024_fadan_chulizhe_fadan_chulizhe_shenfen.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-07 19:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0023_fadanshensutupian_yongtu'), - ] - - operations = [ - migrations.AddField( - model_name='fadan', - name='chulizhe', - field=models.CharField(blank=True, max_length=20, null=True, verbose_name='处理者'), - ), - migrations.AddField( - model_name='fadan', - name='chulizhe_shenfen', - field=models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员')], default=2, verbose_name='处理者身份'), - ), - ] diff --git a/orders/migrations/0025_alter_fadan_shenqingren_shenfen.py b/orders/migrations/0025_alter_fadan_shenqingren_shenfen.py deleted file mode 100644 index e9cfae8..0000000 --- a/orders/migrations/0025_alter_fadan_shenqingren_shenfen.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-10 00:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0024_fadan_chulizhe_fadan_chulizhe_shenfen'), - ] - - operations = [ - migrations.AlterField( - model_name='fadan', - name='shenqingren_shenfen', - field=models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺')], default=1, verbose_name='申请处罚人身份'), - ), - ] diff --git a/orders/migrations/0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more.py b/orders/migrations/0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more.py deleted file mode 100644 index 3ff4939..0000000 --- a/orders/migrations/0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-10 17:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0025_alter_fadan_shenqingren_shenfen'), - ] - - operations = [ - migrations.CreateModel( - name='FadanFenhongLilv', - fields=[ - ('shenfen', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], primary_key=True, serialize=False, verbose_name='申请处罚人身份')), - ('lilv', models.DecimalField(decimal_places=4, default=0.0, max_digits=5, 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': 'fadan_fenhong_lilv', - }, - ), - migrations.AlterField( - model_name='fadan', - name='shenqingren_shenfen', - field=models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], default=1, verbose_name='申请处罚人身份'), - ), - migrations.AlterField( - model_name='fadanfenhong', - name='shenfen', - field=models.IntegerField(choices=[(1, '商家'), (2, '客服'), (3, '平台管理者'), (4, '店铺'), (5, '售后')], default=1, verbose_name='分红者身份'), - ), - ] diff --git a/orders/migrations/0027_dingdanpeihu.py b/orders/migrations/0027_dingdanpeihu.py deleted file mode 100644 index d7f96e7..0000000 --- a/orders/migrations/0027_dingdanpeihu.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-22 15:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='DingdanPeihu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')), - ('zhudashou_id', models.CharField(db_index=True, max_length=32, verbose_name='主打手ID')), - ('peihu1_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='陪护1打手ID')), - ('peihu2_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='陪护2打手ID')), - ('zhuangtai', models.IntegerField(default=1, verbose_name='陪护订单状态')), - ('peihu_xuqiu_shuliang', models.IntegerField(default=1, verbose_name='陪护需求数量')), - ('yongjin_yaoqiu', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='抢单佣金要求')), - ('peihu1_dengji_xuqiu', models.PositiveIntegerField(blank=True, null=True, verbose_name='陪护1等级需求(称号ID)')), - ('peihu2_dengji_xuqiu', models.PositiveIntegerField(blank=True, null=True, verbose_name='陪护2等级需求(称号ID)')), - ('peihu1_zhadan_danze', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护1炸单担责比例')), - ('peihu2_zhadan_danze', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护2炸单担责比例')), - ('peihu1_fenhong', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护1分红比例')), - ('peihu2_fenhong', models.CharField(blank=True, max_length=10, null=True, verbose_name='陪护2分红比例')), - ('zhiding_peihu1', models.CharField(blank=True, max_length=32, null=True, verbose_name='指定陪护1 ID')), - ('zhiding_peihu2', models.CharField(blank=True, max_length=32, null=True, verbose_name='指定陪护2 ID')), - ('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': 'dingdan_peihu', - 'indexes': [models.Index(fields=['zhudashou_id'], name='dingdan_pei_zhudash_583f4e_idx'), models.Index(fields=['peihu1_id'], name='dingdan_pei_peihu1__728279_idx'), models.Index(fields=['peihu2_id'], name='dingdan_pei_peihu2__77e45e_idx'), models.Index(fields=['zhuangtai'], name='dingdan_pei_zhuangt_22eaf6_idx')], - }, - ), - ] diff --git a/orders/migrations/0028_dingdanshangjia_shangyige_dingdan_id.py b/orders/migrations/0028_dingdanshangjia_shangyige_dingdan_id.py deleted file mode 100644 index e69a717..0000000 --- a/orders/migrations/0028_dingdanshangjia_shangyige_dingdan_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-29 17:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0027_dingdanpeihu'), - ] - - operations = [ - migrations.AddField( - model_name='dingdanshangjia', - name='shangyige_dingdan_id', - field=models.CharField(blank=True, max_length=32, null=True, verbose_name='上一个订单ID'), - ), - ] diff --git a/orders/migrations/0029_fadanfenhong_is_individual_rate.py b/orders/migrations/0029_fadanfenhong_is_individual_rate.py deleted file mode 100644 index 0b8abc8..0000000 --- a/orders/migrations/0029_fadanfenhong_is_individual_rate.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-31 22:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0028_dingdanshangjia_shangyige_dingdan_id'), - ] - - operations = [ - migrations.AddField( - model_name='fadanfenhong', - name='is_individual_rate', - field=models.BooleanField(default=False, verbose_name='是否单独开启分红利率'), - ), - ] diff --git a/orders/migrations/0030_fadan_shenqingren_fenhong_jine.py b/orders/migrations/0030_fadan_shenqingren_fenhong_jine.py deleted file mode 100644 index dbd48ca..0000000 --- a/orders/migrations/0030_fadan_shenqingren_fenhong_jine.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-01 00:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0029_fadanfenhong_is_individual_rate'), - ] - - operations = [ - migrations.AddField( - model_name='fadan', - name='shenqingren_fenhong_jine', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='申请人分红金额'), - ), - ] diff --git a/orders/migrations/0031_dingdan_guanshi_fencheng.py b/orders/migrations/0031_dingdan_guanshi_fencheng.py deleted file mode 100644 index 0bd71be..0000000 --- a/orders/migrations/0031_dingdan_guanshi_fencheng.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-12 01:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0030_fadan_shenqingren_fenhong_jine'), - ] - - operations = [ - migrations.AddField( - model_name='dingdan', - name='guanshi_fencheng', - field=models.DecimalField(blank=True, decimal_places=2, default=0, max_digits=10, null=True, verbose_name='管事分成'), - ), - ] diff --git a/orders/migrations/0032_delete_crossplatformorderdata_delete_presettlement_and_more.py b/orders/migrations/0032_delete_crossplatformorderdata_delete_presettlement_and_more.py deleted file mode 100644 index f87b00b..0000000 --- a/orders/migrations/0032_delete_crossplatformorderdata_delete_presettlement_and_more.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-15 01:42 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0031_dingdan_guanshi_fencheng'), - ] - - operations = [ - migrations.DeleteModel( - name='CrossPlatformOrderData', - ), - migrations.DeleteModel( - name='PreSettlement', - ), - migrations.RemoveField( - model_name='dingdan', - name='dispatch_type', - ), - migrations.RemoveField( - model_name='dingdan', - name='is_cross', - ), - migrations.RemoveField( - model_name='dingdan', - name='partner_club_id', - ), - migrations.RemoveField( - model_name='dingdan', - name='partner_order_id', - ), - migrations.RemoveField( - model_name='dingdanshangjia', - name='partner_yonghu_id', - ), - migrations.RemoveField( - model_name='fadan', - name='partner_club_id', - ), - ] diff --git a/products/migrations/0001_initial.py b/products/migrations/0001_initial.py index dbc04a5..6403ee6 100644 --- a/products/migrations/0001_initial.py +++ b/products/migrations/0001_initial.py @@ -1,149 +1,208 @@ -# Generated by Django 5.2.10 on 2026-01-14 19:59 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Huiyuan', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('huiyuan_id', models.CharField(max_length=6, unique=True, verbose_name='会员ID')), - ('jieshao', models.CharField(max_length=30, verbose_name='会员介绍')), - ('jtjieshao', models.TextField(blank=True, null=True, verbose_name='会员规则介绍')), - ('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='会员价格')), - ('guanshifc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分成')), - ('goumai_cishu', models.PositiveIntegerField(default=0, 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': 'huiyuan', - }, - ), - migrations.CreateModel( - name='Huiyuangoumai', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='购买记录ID')), - ('huiyuan_id', models.CharField(db_index=True, max_length=6, verbose_name='会员ID')), - ('yonghu_id', models.CharField(db_index=True, max_length=32, verbose_name='用户ID')), - ('huiyuan_zhuangtai', models.PositiveIntegerField(default=1, verbose_name='会员状态')), - ('jieshao', models.CharField(max_length=30, null=True, verbose_name='会员介绍')), - ('daoqi_time', models.DateTimeField(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': 'huiyuangoumai', - }, - ), - migrations.CreateModel( - name='Shangpin', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='商品ID')), - ('biaoqian', models.CharField(blank=True, max_length=45, null=True, verbose_name='商品标题')), - ('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='商品价格')), - ('kucun', models.PositiveIntegerField(default=0, verbose_name='商品库存')), - ('leixing_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品类型ID')), - ('zhuanqu_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品专区ID')), - ('zhenshi_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品真实销量')), - ('duiwai_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品对外销量')), - ('jieshao', models.TextField(blank=True, null=True, verbose_name='商品介绍')), - ('xiadan_xuzhi', models.TextField(blank=True, null=True, verbose_name='下单须知')), - ('guize_tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='规则图片URL')), - ('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')), - ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), - ('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), - ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='商品图片URL')), - ('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': 'shangpin', - }, - ), - migrations.CreateModel( - name='ShangpinLeixing', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='类型ID')), - ('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')), - ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), - ('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), - ('jieshao', models.CharField(blank=True, max_length=45, null=True, verbose_name='类型介绍')), - ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='类型图片URL')), - ], - options={ - 'verbose_name': '商品类型', - 'verbose_name_plural': '商品类型', - 'db_table': 'shangpin_leixing', - }, - ), - migrations.CreateModel( - name='ShangpinZhuanqu', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='专区ID')), - ('mingzi', models.CharField(blank=True, max_length=45, null=True, verbose_name='专区名称')), - ('leixing_id', models.PositiveIntegerField(verbose_name='类型ID')), - ], - options={ - 'verbose_name': '商品专区', - 'verbose_name_plural': '商品专区', - 'db_table': 'shangpin_zhuanqu', - }, - ), - migrations.CreateModel( - name='Czjilu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')), - ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), - ('zhuangtai', models.IntegerField(blank=True, null=True, verbose_name='订单状态')), - ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), - ('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单金额')), - ('leixing', models.IntegerField(blank=True, null=True, verbose_name='充值类型,1:会员,2:押金,3:积分,4:商家')), - ('shuoming', models.CharField(blank=True, max_length=100, 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': 'czjilu', - 'indexes': [models.Index(fields=['dingdan_id'], name='czjilu_dingdan_39bbd0_idx'), models.Index(fields=['yonghuid'], name='czjilu_yonghui_a0555f_idx')], - }, - ), - migrations.CreateModel( - name='Gsfenhong', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')), - ('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')), - ('dashouid', models.CharField(db_index=True, max_length=7, unique=True, verbose_name='打手ID')), - ('shuoming', models.CharField(blank=True, max_length=100, null=True, verbose_name='订单说明')), - ('fenhong', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单分红金额')), - ('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='打手头像')), - ('nicheng', models.CharField(max_length=50, 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': 'gsfenhong', - 'indexes': [models.Index(fields=['guanshi'], name='gsfenhong_guanshi_dc440f_idx'), models.Index(fields=['dashouid'], name='gsfenhong_dashoui_5473ca_idx')], - }, - ), - ] +# Generated by Django 4.2.27 on 2026-06-17 01:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Czjilu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')), + ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), + ('zhuangtai', models.IntegerField(blank=True, null=True, verbose_name='订单状态')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), + ('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单金额')), + ('leixing', models.IntegerField(blank=True, null=True, verbose_name='充值类型,1:会员,2:押金,3:积分,4:商家')), + ('shuoming', models.CharField(blank=True, max_length=100, 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': 'czjilu', + }, + ), + migrations.CreateModel( + name='DuociFenhong', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('huiyuan', models.CharField(max_length=10, verbose_name='会员ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')), + ('cishu', models.PositiveIntegerField(verbose_name='分红次数')), + ('guanshi_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分红金额')), + ('zuzhang_fenhong', 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='更新时间')), + ], + options={ + 'verbose_name': '多次分红配置', + 'verbose_name_plural': '多次分红配置', + 'db_table': 'duoci_fenhong', + }, + ), + migrations.CreateModel( + name='Gsfenhong', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')), + ('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')), + ('dashouid', models.CharField(db_index=True, max_length=7, verbose_name='打手ID')), + ('shuoming', models.CharField(blank=True, max_length=100, null=True, verbose_name='订单说明')), + ('fenhong', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单分红金额')), + ('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='打手头像')), + ('nicheng', models.CharField(max_length=50, null=True, verbose_name='打手昵称')), + ('zuzhang_id', models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID')), + ('zuzhang_fenhong', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='组长分红金额')), + ('fenhong_leixing', models.PositiveSmallIntegerField(choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')], default=1, verbose_name='分红类型')), + ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), + ('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': 'gsfenhong', + }, + ), + migrations.CreateModel( + name='Huiyuan', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('huiyuan_id', models.CharField(max_length=6, unique=True, verbose_name='会员ID')), + ('jieshao', models.CharField(max_length=30, verbose_name='会员介绍')), + ('jtjieshao', models.TextField(blank=True, null=True, verbose_name='会员规则介绍')), + ('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='会员价格')), + ('guanshifc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分成')), + ('zuzhangfc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='组长分成')), + ('goumai_cishu', models.PositiveIntegerField(default=0, 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': 'huiyuan', + }, + ), + migrations.CreateModel( + name='Huiyuangoumai', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='购买记录ID')), + ('huiyuan_id', models.CharField(db_index=True, max_length=6, verbose_name='会员ID')), + ('yonghu_id', models.CharField(db_index=True, max_length=32, verbose_name='用户ID')), + ('huiyuan_zhuangtai', models.PositiveIntegerField(default=1, verbose_name='会员状态')), + ('jieshao', models.CharField(max_length=30, null=True, verbose_name='会员介绍')), + ('daoqi_time', models.DateTimeField(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': 'huiyuangoumai', + }, + ), + migrations.CreateModel( + name='Shangpin', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='商品ID')), + ('biaoqian', models.CharField(blank=True, max_length=45, null=True, verbose_name='商品标题')), + ('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='商品价格')), + ('kucun', models.PositiveIntegerField(default=0, verbose_name='商品库存')), + ('leixing_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品类型ID')), + ('zhuanqu_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品专区ID')), + ('zhenshi_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品真实销量')), + ('duiwai_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品对外销量')), + ('jieshao', models.TextField(blank=True, null=True, verbose_name='商品介绍')), + ('xiadan_xuzhi', models.TextField(blank=True, null=True, verbose_name='下单须知')), + ('guize_tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='规则图片URL')), + ('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')), + ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), + ('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), + ('kaioi_ewai_dashou_fencheng', models.BooleanField(default=False, verbose_name='是否开启打手额外分成')), + ('ewai_dashou_fencheng', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手额外分成金额')), + ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='商品图片URL')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更改时间')), + ('paixu', models.IntegerField(default=0, verbose_name='排序权重')), + ('shenhezhuangtai', models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态')), + ('shangjia_zhuangtai', models.BooleanField(default=True, verbose_name='是否上架')), + ('fengjin_zhuangtai', models.BooleanField(default=True, verbose_name='是否封禁')), + ('shenhe_zhuangtai', models.BooleanField(default=False, help_text='True=审核通过,False=未审核', verbose_name='平台审核状态')), + ], + options={ + 'verbose_name': '商品', + 'verbose_name_plural': '商品', + 'db_table': 'shangpin', + }, + ), + migrations.CreateModel( + name='ShangpinLeixing', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='类型ID')), + ('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')), + ('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')), + ('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), + ('jieshao', models.CharField(blank=True, max_length=45, null=True, verbose_name='类型介绍')), + ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='类型图片URL')), + ('paixu', models.IntegerField(default=0, verbose_name='排序权重')), + ('shenhezhuangtai', models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态')), + ], + options={ + 'verbose_name': '商品类型', + 'verbose_name_plural': '商品类型', + 'db_table': 'shangpin_leixing', + }, + ), + migrations.CreateModel( + name='ShangpinMeiriTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('riqi', models.DateField(db_index=True, verbose_name='统计日期')), + ('nian', models.PositiveSmallIntegerField(verbose_name='年份')), + ('yue', models.PositiveSmallIntegerField(verbose_name='月份')), + ('ri', models.PositiveSmallIntegerField(verbose_name='日')), + ('diandan_zongliang', models.PositiveIntegerField(default=0, verbose_name='点单总量')), + ('diandan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='点单总额')), + ('chengjiao_zongliang', models.PositiveIntegerField(default=0, verbose_name='成交总量')), + ('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总额')), + ('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')), + ('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')), + ('pingtai_shouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='平台收益')), + ('dianpu_zongshouyi', 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='更新时间')), + ], + options={ + 'verbose_name': '商品每日统计', + 'verbose_name_plural': '商品每日统计', + 'db_table': 'shangpin_meiri_tongji', + }, + ), + migrations.CreateModel( + name='ShangpinZhuanqu', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='专区ID')), + ('mingzi', models.CharField(blank=True, max_length=45, null=True, verbose_name='专区名称')), + ('leixing_id', models.PositiveIntegerField(verbose_name='类型ID')), + ('paixu', models.IntegerField(default=0, verbose_name='排序权重')), + ('shenhezhuangtai', models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态')), + ('shangjia_zhuangtai', models.BooleanField(default=True, verbose_name='是否上架')), + ('fengjin_zhuangtai', models.BooleanField(default=True, verbose_name='是否封禁')), + ], + options={ + 'verbose_name': '商品专区', + 'verbose_name_plural': '商品专区', + 'db_table': 'shangpin_zhuanqu', + }, + ), + ] diff --git a/products/migrations/0002_alter_huiyuangoumai_unique_together_and_more.py b/products/migrations/0002_alter_huiyuangoumai_unique_together_and_more.py deleted file mode 100644 index 873aaaf..0000000 --- a/products/migrations/0002_alter_huiyuangoumai_unique_together_and_more.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-18 14:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0001_initial'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='huiyuangoumai', - unique_together={('yonghu_id', 'huiyuan_id')}, - ), - migrations.AddIndex( - model_name='huiyuangoumai', - index=models.Index(fields=['yonghu_id'], name='huiyuangoum_yonghu__ba2138_idx'), - ), - migrations.AddIndex( - model_name='huiyuangoumai', - index=models.Index(fields=['huiyuan_id'], name='huiyuangoum_huiyuan_35fe1d_idx'), - ), - migrations.AddIndex( - model_name='huiyuangoumai', - index=models.Index(fields=['yonghu_id', 'huiyuan_id'], name='huiyuangoum_yonghu__21e6e1_idx'), - ), - ] diff --git a/products/migrations/0002_initial.py b/products/migrations/0002_initial.py new file mode 100644 index 0000000..b1735c0 --- /dev/null +++ b/products/migrations/0002_initial.py @@ -0,0 +1,105 @@ +# Generated by Django 4.2.27 on 2026-06-17 01:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('rank', '0001_initial'), + ('products', '0001_initial'), + ('shop', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='shangpinzhuanqu', + name='dianpu', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='所属店铺'), + ), + migrations.AddField( + model_name='shangpinzhuanqu', + name='dianpu_leixing', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shop.shangpinleixingdianpu', verbose_name='店铺商品类型'), + ), + migrations.AddField( + model_name='shangpinmeiritongji', + name='shangpin', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.shangpin', verbose_name='商品ID'), + ), + migrations.AddField( + model_name='shangpinleixing', + name='bankuai', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rank.bankuai', verbose_name='所属板块'), + ), + migrations.AddField( + model_name='shangpin', + name='dianpu', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='所属店铺'), + ), + migrations.AddField( + model_name='shangpin', + name='dianpu_leixing', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shop.shangpinleixingdianpu', verbose_name='店铺商品类型'), + ), + migrations.AddIndex( + model_name='huiyuangoumai', + index=models.Index(fields=['yonghu_id'], name='huiyuangoum_yonghu__ba2138_idx'), + ), + migrations.AddIndex( + model_name='huiyuangoumai', + index=models.Index(fields=['huiyuan_id'], name='huiyuangoum_huiyuan_35fe1d_idx'), + ), + migrations.AddIndex( + model_name='huiyuangoumai', + index=models.Index(fields=['yonghu_id', 'huiyuan_id'], name='huiyuangoum_yonghu__21e6e1_idx'), + ), + migrations.AlterUniqueTogether( + name='huiyuangoumai', + unique_together={('yonghu_id', 'huiyuan_id')}, + ), + migrations.AddField( + model_name='huiyuan', + name='bankuai', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rank.bankuai', verbose_name='所属板块'), + ), + migrations.AddIndex( + model_name='gsfenhong', + index=models.Index(fields=['guanshi'], name='gsfenhong_guanshi_dc440f_idx'), + ), + migrations.AddIndex( + model_name='gsfenhong', + index=models.Index(fields=['dashouid'], name='gsfenhong_dashoui_5473ca_idx'), + ), + migrations.AddIndex( + model_name='duocifenhong', + index=models.Index(fields=['yonghuid'], name='duoci_fenho_yonghui_db6a2f_idx'), + ), + migrations.AlterUniqueTogether( + name='duocifenhong', + unique_together={('huiyuan', 'yonghuid', 'cishu')}, + ), + migrations.AddIndex( + model_name='czjilu', + index=models.Index(fields=['dingdan_id'], name='czjilu_dingdan_39bbd0_idx'), + ), + migrations.AddIndex( + model_name='czjilu', + index=models.Index(fields=['yonghuid'], name='czjilu_yonghui_a0555f_idx'), + ), + migrations.AddIndex( + model_name='shangpinmeiritongji', + index=models.Index(fields=['shangpin', 'riqi'], name='shangpin_me_shangpi_d27e5c_idx'), + ), + migrations.AddIndex( + model_name='shangpinmeiritongji', + index=models.Index(fields=['nian', 'yue', 'ri'], name='shangpin_me_nian_e3b409_idx'), + ), + migrations.AlterUniqueTogether( + name='shangpinmeiritongji', + unique_together={('shangpin', 'riqi')}, + ), + ] diff --git a/products/migrations/0003_shangpin_paixu_shangpinleixing_paixu_and_more.py b/products/migrations/0003_shangpin_paixu_shangpinleixing_paixu_and_more.py deleted file mode 100644 index 011b22a..0000000 --- a/products/migrations/0003_shangpin_paixu_shangpinleixing_paixu_and_more.py +++ /dev/null @@ -1,33 +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 = [ - ('products', '0002_alter_huiyuangoumai_unique_together_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='shangpin', - name='paixu', - field=models.IntegerField(default=0, verbose_name='排序权重'), - ), - migrations.AddField( - model_name='shangpinleixing', - name='paixu', - field=models.IntegerField(default=0, verbose_name='排序权重'), - ), - migrations.AddField( - model_name='shangpinleixing', - name='shenhezhuangtai', - field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'), - ), - migrations.AddField( - model_name='shangpinzhuanqu', - name='paixu', - field=models.IntegerField(default=0, verbose_name='排序权重'), - ), - ] diff --git a/products/migrations/0004_shangpin_shenhezhuangtai_and_more.py b/products/migrations/0004_shangpin_shenhezhuangtai_and_more.py deleted file mode 100644 index c5e7a35..0000000 --- a/products/migrations/0004_shangpin_shenhezhuangtai_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-02-09 15:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0003_shangpin_paixu_shangpinleixing_paixu_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='shangpin', - name='shenhezhuangtai', - field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'), - ), - migrations.AddField( - model_name='shangpinzhuanqu', - name='shenhezhuangtai', - field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'), - ), - ] diff --git a/products/migrations/0005_alter_gsfenhong_dashouid.py b/products/migrations/0005_alter_gsfenhong_dashouid.py deleted file mode 100644 index 4d4e422..0000000 --- a/products/migrations/0005_alter_gsfenhong_dashouid.py +++ /dev/null @@ -1,18 +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 = [ - ('products', '0004_shangpin_shenhezhuangtai_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='gsfenhong', - name='dashouid', - field=models.CharField(db_index=True, max_length=7, verbose_name='打手ID'), - ), - ] diff --git a/products/migrations/0006_gsfenhong_huiyuan_id_huiyuan_zuzhangfc_duocifenhong.py b/products/migrations/0006_gsfenhong_huiyuan_id_huiyuan_zuzhangfc_duocifenhong.py deleted file mode 100644 index adabfa6..0000000 --- a/products/migrations/0006_gsfenhong_huiyuan_id_huiyuan_zuzhangfc_duocifenhong.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-18 12:09 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0005_alter_gsfenhong_dashouid'), - ] - - operations = [ - migrations.AddField( - model_name='gsfenhong', - name='huiyuan_id', - field=models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID'), - ), - migrations.AddField( - model_name='huiyuan', - name='zuzhangfc', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='组长分成'), - ), - migrations.CreateModel( - name='DuociFenhong', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')), - ('zuzhang', models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID')), - ('cishu', models.PositiveIntegerField(verbose_name='分红次数')), - ('guanshi_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分红金额')), - ('zuzhang_fenhong', 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='更新时间')), - ('huiyuan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.huiyuan', verbose_name='会员')), - ], - options={ - 'verbose_name': '多次分红配置', - 'verbose_name_plural': '多次分红配置', - 'db_table': 'duoci_fenhong', - 'indexes': [models.Index(fields=['guanshi'], name='duoci_fenho_guanshi_b3de53_idx'), models.Index(fields=['zuzhang'], name='duoci_fenho_zuzhang_69997d_idx')], - 'unique_together': {('huiyuan', 'guanshi', 'cishu')}, - }, - ), - ] diff --git a/products/migrations/0007_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more.py b/products/migrations/0007_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more.py deleted file mode 100644 index a354d2b..0000000 --- a/products/migrations/0007_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-19 13:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0006_gsfenhong_huiyuan_id_huiyuan_zuzhangfc_duocifenhong'), - ] - - operations = [ - migrations.RemoveIndex( - model_name='duocifenhong', - name='duoci_fenho_guanshi_b3de53_idx', - ), - migrations.RemoveIndex( - model_name='duocifenhong', - name='duoci_fenho_zuzhang_69997d_idx', - ), - migrations.RenameField( - model_name='duocifenhong', - old_name='guanshi', - new_name='yonghuid', - ), - migrations.AlterUniqueTogether( - name='duocifenhong', - unique_together=set(), - ), - migrations.AlterField( - model_name='duocifenhong', - name='huiyuan', - field=models.CharField(max_length=10, verbose_name='会员ID'), - ), - migrations.AlterUniqueTogether( - name='duocifenhong', - unique_together={('huiyuan', 'yonghuid', 'cishu')}, - ), - migrations.AddIndex( - model_name='duocifenhong', - index=models.Index(fields=['yonghuid'], name='duoci_fenho_yonghui_db6a2f_idx'), - ), - migrations.RemoveField( - model_name='duocifenhong', - name='zuzhang', - ), - ] diff --git a/products/migrations/0008_gsfenhong_zuzhang_fenhong_gsfenhong_zuzhang_id.py b/products/migrations/0008_gsfenhong_zuzhang_fenhong_gsfenhong_zuzhang_id.py deleted file mode 100644 index 04974ac..0000000 --- a/products/migrations/0008_gsfenhong_zuzhang_fenhong_gsfenhong_zuzhang_id.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-19 13:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0007_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='gsfenhong', - name='zuzhang_fenhong', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='组长分红金额'), - ), - migrations.AddField( - model_name='gsfenhong', - name='zuzhang_id', - field=models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID'), - ), - ] diff --git a/products/migrations/0009_shangpin_ewai_dashou_fencheng_and_more.py b/products/migrations/0009_shangpin_ewai_dashou_fencheng_and_more.py deleted file mode 100644 index 5783b55..0000000 --- a/products/migrations/0009_shangpin_ewai_dashou_fencheng_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-22 15:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0008_gsfenhong_zuzhang_fenhong_gsfenhong_zuzhang_id'), - ] - - operations = [ - migrations.AddField( - model_name='shangpin', - name='ewai_dashou_fencheng', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手额外分成金额'), - ), - migrations.AddField( - model_name='shangpin', - name='kaioi_ewai_dashou_fencheng', - field=models.BooleanField(default=False, verbose_name='是否开启打手额外分成'), - ), - ] diff --git a/products/migrations/0010_shangpinleixing_is_cross_enabled.py b/products/migrations/0010_shangpinleixing_is_cross_enabled.py deleted file mode 100644 index 3f2582d..0000000 --- a/products/migrations/0010_shangpinleixing_is_cross_enabled.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-03-24 17:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0009_shangpin_ewai_dashou_fencheng_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='shangpinleixing', - name='is_cross_enabled', - field=models.BooleanField(default=False, verbose_name='是否开启平台互通'), - ), - ] diff --git a/products/migrations/0011_shangpin_dianpu_shangpin_dianpu_leixing_and_more.py b/products/migrations/0011_shangpin_dianpu_shangpin_dianpu_leixing_and_more.py deleted file mode 100644 index 9ec490a..0000000 --- a/products/migrations/0011_shangpin_dianpu_shangpin_dianpu_leixing_and_more.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-21 12:36 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('shop', '0001_initial'), - ('products', '0010_shangpinleixing_is_cross_enabled'), - ] - - operations = [ - migrations.AddField( - model_name='shangpin', - name='dianpu', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='所属店铺'), - ), - migrations.AddField( - model_name='shangpin', - name='dianpu_leixing', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shop.shangpinleixingdianpu', verbose_name='店铺商品类型'), - ), - migrations.AddField( - model_name='shangpin', - name='fengjin_zhuangtai', - field=models.BooleanField(default=True, verbose_name='是否封禁'), - ), - migrations.AddField( - model_name='shangpin', - name='shangjia_zhuangtai', - field=models.BooleanField(default=True, verbose_name='是否上架'), - ), - migrations.AddField( - model_name='shangpin', - name='shenhe_zhuangtai', - field=models.BooleanField(default=False, help_text='True=审核通过,False=未审核', verbose_name='平台审核状态'), - ), - migrations.AddField( - model_name='shangpinzhuanqu', - name='dianpu', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='所属店铺'), - ), - migrations.AddField( - model_name='shangpinzhuanqu', - name='dianpu_leixing', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shop.shangpinleixingdianpu', verbose_name='店铺商品类型'), - ), - migrations.AddField( - model_name='shangpinzhuanqu', - name='fengjin_zhuangtai', - field=models.BooleanField(default=True, verbose_name='是否封禁'), - ), - migrations.AddField( - model_name='shangpinzhuanqu', - name='shangjia_zhuangtai', - field=models.BooleanField(default=True, verbose_name='是否上架'), - ), - ] diff --git a/products/migrations/0012_shangpinmeiritongji.py b/products/migrations/0012_shangpinmeiritongji.py deleted file mode 100644 index 0df137a..0000000 --- a/products/migrations/0012_shangpinmeiritongji.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-23 14:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0011_shangpin_dianpu_shangpin_dianpu_leixing_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='ShangpinMeiriTongji', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('riqi', models.DateField(db_index=True, verbose_name='统计日期')), - ('nian', models.PositiveSmallIntegerField(verbose_name='年份')), - ('yue', models.PositiveSmallIntegerField(verbose_name='月份')), - ('ri', models.PositiveSmallIntegerField(verbose_name='日')), - ('diandan_zongliang', models.PositiveIntegerField(default=0, verbose_name='点单总量')), - ('diandan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='点单总额')), - ('chengjiao_zongliang', models.PositiveIntegerField(default=0, verbose_name='成交总量')), - ('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总额')), - ('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')), - ('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')), - ('pingtai_shouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='平台收益')), - ('dianpu_zongshouyi', 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='更新时间')), - ('shangpin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.shangpin', verbose_name='商品ID')), - ], - options={ - 'verbose_name': '商品每日统计', - 'verbose_name_plural': '商品每日统计', - 'db_table': 'shangpin_meiri_tongji', - 'indexes': [models.Index(fields=['shangpin', 'riqi'], name='shangpin_me_shangpi_d27e5c_idx'), models.Index(fields=['nian', 'yue', 'ri'], name='shangpin_me_nian_e3b409_idx')], - 'unique_together': {('shangpin', 'riqi')}, - }, - ), - ] diff --git a/products/migrations/0013_shangpinleixing_bankuai.py b/products/migrations/0013_shangpinleixing_bankuai.py deleted file mode 100644 index cb260b2..0000000 --- a/products/migrations/0013_shangpinleixing_bankuai.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-14 04:25 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0003_alter_dashoubiaoxian_bankuai'), - ('products', '0012_shangpinmeiritongji'), - ] - - operations = [ - migrations.AddField( - model_name='shangpinleixing', - name='bankuai', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rank.bankuai', verbose_name='所属板块'), - ), - ] diff --git a/products/migrations/0014_huiyuan_bankuai.py b/products/migrations/0014_huiyuan_bankuai.py deleted file mode 100644 index a63de19..0000000 --- a/products/migrations/0014_huiyuan_bankuai.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-16 16:51 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0010_kaohejilufeiyong'), - ('products', '0013_shangpinleixing_bankuai'), - ] - - operations = [ - migrations.AddField( - model_name='huiyuan', - name='bankuai', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='rank.bankuai', verbose_name='所属板块'), - ), - ] diff --git a/products/migrations/0015_gsfenhong_fenhong_leixing.py b/products/migrations/0015_gsfenhong_fenhong_leixing.py deleted file mode 100644 index 0248dd1..0000000 --- a/products/migrations/0015_gsfenhong_fenhong_leixing.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-12 01:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0014_huiyuan_bankuai'), - ] - - operations = [ - migrations.AddField( - model_name='gsfenhong', - name='fenhong_leixing', - field=models.PositiveSmallIntegerField(choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')], default=1, verbose_name='分红类型'), - ), - ] diff --git a/products/migrations/0016_remove_shangpinleixing_is_cross_enabled.py b/products/migrations/0016_remove_shangpinleixing_is_cross_enabled.py deleted file mode 100644 index a23701b..0000000 --- a/products/migrations/0016_remove_shangpinleixing_is_cross_enabled.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.27 on 2026-06-15 01:42 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('products', '0015_gsfenhong_fenhong_leixing'), - ] - - operations = [ - migrations.RemoveField( - model_name='shangpinleixing', - name='is_cross_enabled', - ), - ] diff --git a/rank/migrations/0001_initial.py b/rank/migrations/0001_initial.py index c672140..88e955a 100644 --- a/rank/migrations/0001_initial.py +++ b/rank/migrations/0001_initial.py @@ -1,111 +1,277 @@ -# Generated by Django 4.2.27 on 2026-05-12 02:17 - -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), - ('orders', '0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='Bankuai', - fields=[ - ('bankuai_id', models.AutoField(primary_key=True, serialize=False, verbose_name='板块ID')), - ('mingcheng', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='板块名称')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ], - options={ - 'verbose_name': '板块', - 'verbose_name_plural': '板块', - 'db_table': 'bankuai', - }, - ), - migrations.CreateModel( - name='Chenghao', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('mingcheng', models.CharField(max_length=50, unique=True, verbose_name='称号名称')), - ('leixing', models.CharField(choices=[('dashou', '打手'), ('boss', '老板'), ('shangjia', '商家'), ('guanshi', '管事'), ('zuzhang', '组长')], max_length=10, verbose_name='称号类型')), - ('tubiao_url', models.CharField(blank=True, max_length=200, null=True, verbose_name='称号图标相对URL')), - ('texiao_miaoshu', models.TextField(blank=True, null=True, verbose_name='特效描述(JSON)')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('bankuai', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块(空=全板块通用)')), - ], - options={ - 'verbose_name': '称号', - 'verbose_name_plural': '称号', - 'db_table': 'chenghao', - }, - ), - migrations.CreateModel( - name='YonghuChenghao', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('huode_time', models.DateTimeField(auto_now_add=True, verbose_name='获得时间')), - ('chenghao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.chenghao', verbose_name='称号')), - ('yonghu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chenghao_list', to=settings.AUTH_USER_MODEL, verbose_name='用户')), - ], - options={ - 'verbose_name': '用户称号关联', - 'verbose_name_plural': '用户称号关联', - 'db_table': 'yonghu_chenghao', - 'indexes': [models.Index(fields=['yonghu', 'chenghao'], name='yonghu_chen_yonghu__cac0a1_idx')], - 'unique_together': {('yonghu', 'chenghao')}, - }, - ), - migrations.CreateModel( - name='JingyanJilu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('yonghu_id', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), - ('yonghu_leixing', models.CharField(choices=[('dashou', '打手'), ('boss', '老板'), ('shangjia', '商家'), ('guanshi', '管事'), ('zuzhang', '组长')], max_length=10, verbose_name='用户类型')), - ('sudu_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='上线速度经验')), - ('shili_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='打手实力经验')), - ('taidu_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='服务态度经验')), - ('zonghe_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='综合经验')), - ('dingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联订单ID')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ('bankuai', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块')), - ], - options={ - 'verbose_name': '经验变动记录', - 'verbose_name_plural': '经验变动记录', - 'db_table': 'jingyan_jilu', - 'indexes': [models.Index(fields=['yonghu_id', 'bankuai', 'create_time'], name='jingyan_jil_yonghu__786992_idx')], - }, - ), - migrations.CreateModel( - name='DashouBiaoxian', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dashou_id', models.CharField(db_index=True, max_length=32, verbose_name='打手ID')), - ('shangxian_sudu', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='上线速度评价(1-5)')), - ('fuwu_taidu', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='服务态度评价(1-5)')), - ('fanche_cishu', models.PositiveIntegerField(blank=True, null=True, verbose_name='翻车次数')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('jiedan_time', models.DateTimeField(blank=True, null=True, verbose_name='接单时间')), - ('tijiao_time', models.DateTimeField(blank=True, null=True, verbose_name='提交时间')), - ('bankuai', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块')), - ('dingdan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='biaoxian', to='orders.dingdan', verbose_name='关联订单')), - ], - options={ - 'verbose_name': '打手订单表现', - 'verbose_name_plural': '打手订单表现', - 'db_table': 'dashou_biaoxian', - 'indexes': [models.Index(fields=['dashou_id', 'bankuai', 'create_time'], name='dashou_biao_dashou__36e1c3_idx')], - }, - ), - migrations.AddIndex( - model_name='chenghao', - index=models.Index(fields=['leixing', 'bankuai'], name='chenghao_leixing_8f4371_idx'), - ), - ] +# Generated by Django 4.2.27 on 2026-06-17 01:32 + +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), + ('orders', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Bankuai', + fields=[ + ('bankuai_id', models.AutoField(primary_key=True, serialize=False, verbose_name='板块ID')), + ('mingcheng', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='板块名称')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '板块', + 'verbose_name_plural': '板块', + 'db_table': 'bankuai', + }, + ), + migrations.CreateModel( + name='Chenghao', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mingcheng', models.CharField(max_length=50, unique=True, verbose_name='称号名称')), + ('leixing', models.CharField(choices=[('dashou', '打手'), ('boss', '老板'), ('shangjia', '商家'), ('guanshi', '管事'), ('zuzhang', '组长')], max_length=10, verbose_name='称号类型')), + ('tubiao_url', models.CharField(blank=True, max_length=200, null=True, verbose_name='称号图标相对URL')), + ('texiao_miaoshu', models.TextField(blank=True, null=True, verbose_name='特效描述(JSON)')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('kaohe_guize', models.TextField(blank=True, null=True, verbose_name='考核规则')), + ('kaioi_jinpai', models.BooleanField(default=False, verbose_name='是否同时开启金牌')), + ('bankuai', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块(空=全板块通用)')), + ], + options={ + 'verbose_name': '称号', + 'verbose_name_plural': '称号', + 'db_table': 'chenghao', + }, + ), + migrations.CreateModel( + name='KaohePayTemp', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dingdan_id', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='订单ID')), + ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), + ('tag_id', models.IntegerField(verbose_name='标签ID')), + ('game_nick', models.CharField(max_length=100, verbose_name='游戏昵称')), + ('remark', models.TextField(blank=True, verbose_name='备注')), + ('reapply', models.BooleanField(default=False, verbose_name='是否再次申请')), + ('jilu_id', models.CharField(blank=True, max_length=32, null=True, verbose_name='原记录ID(再次申请时)')), + ('shenheguan_id', models.CharField(blank=True, max_length=7, verbose_name='指定考核官ID')), + ('cishu', models.IntegerField(verbose_name='本次考核次数(预计算)')), + ('fee', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='本次费用(分账单位)')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '考核支付临时表', + 'verbose_name_plural': '考核支付临时表', + 'db_table': 'kaohe_pay_temp', + }, + ), + migrations.CreateModel( + name='ShenheJilu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('shenqingren_id', models.CharField(max_length=7, verbose_name='申请人用户ID')), + ('shenheguan_id', models.CharField(max_length=7, null=True, verbose_name='审核官用户ID')), + ('zhuangtai', models.IntegerField(choices=[(0, '审核中'), (1, '通过'), (2, '未通过'), (3, '待审核')], default=0, verbose_name='审核状态')), + ('cishu', models.IntegerField(default=1, verbose_name='第几次审核')), + ('jiaofei_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='更新时间')), + ('jilu_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='记录ID')), + ('guize_neirong', models.TextField(blank=True, null=True, verbose_name='规则内容')), + ('shenheguan_youxi_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='审核官游戏ID')), + ('dashou_youxi_id', models.CharField(blank=True, max_length=50, null=True, verbose_name='打手游戏ID')), + ('dashou_beizhu', models.TextField(blank=True, null=True, verbose_name='打手备注')), + ('bankuai', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='审核板块')), + ('chenghao', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.chenghao', verbose_name='审核标签')), + ], + options={ + 'verbose_name': '审核记录', + 'verbose_name_plural': '审核记录', + 'db_table': 'shenhe_jilu', + }, + ), + migrations.CreateModel( + name='KaoheJujueJilu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cishu', models.IntegerField(verbose_name='对应次数')), + ('shenheguan_id', models.CharField(max_length=7, verbose_name='考核官用户ID')), + ('yuanyin', models.TextField(verbose_name='拒绝原因')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('jilu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.shenhejilu', to_field='jilu_id', verbose_name='审核记录')), + ], + options={ + 'verbose_name': '拒绝原因记录', + 'verbose_name_plural': '拒绝原因记录', + 'db_table': 'kaohe_jujue_jilu', + }, + ), + migrations.CreateModel( + name='KaoheJiluFeiyong', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cishu', models.IntegerField(verbose_name='第几次考核')), + ('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='缴纳金额')), + ('jilu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.shenhejilu', to_field='jilu_id', verbose_name='考核记录')), + ], + options={ + 'verbose_name': '考核记录费用', + 'verbose_name_plural': '考核记录费用', + 'db_table': 'kaohe_jilu_feiyong', + }, + ), + migrations.CreateModel( + name='KaoheguanBankuai', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('kaoheguan_id', models.CharField(db_index=True, max_length=7, verbose_name='考核官用户ID')), + ('bankuai', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.bankuai', verbose_name='所属板块')), + ], + options={ + 'verbose_name': '考核官板块关联', + 'verbose_name_plural': '考核官板块关联', + 'db_table': 'kaoheguan_bankuai', + }, + ), + migrations.CreateModel( + name='KaoheCishuFeiyong', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cishu', models.IntegerField(verbose_name='第几次考核')), + ('feiyong', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='需缴纳金额')), + ('chenghao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.chenghao', verbose_name='标签')), + ], + options={ + 'verbose_name': '考核次数费用', + 'verbose_name_plural': '考核次数费用', + 'db_table': 'kaohe_cishu_feiyong', + }, + ), + migrations.CreateModel( + name='JingyanJilu', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('yonghu_id', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), + ('yonghu_leixing', models.CharField(choices=[('dashou', '打手'), ('boss', '老板'), ('shangjia', '商家'), ('guanshi', '管事'), ('zuzhang', '组长')], max_length=10, verbose_name='用户类型')), + ('sudu_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='上线速度经验')), + ('shili_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='打手实力经验')), + ('taidu_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='服务态度经验')), + ('zonghe_jingyan', models.DecimalField(decimal_places=2, default=0, max_digits=8, verbose_name='综合经验')), + ('dingdan_id', models.CharField(blank=True, db_index=True, max_length=32, null=True, verbose_name='关联订单ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('bankuai', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块')), + ], + options={ + 'verbose_name': '经验变动记录', + 'verbose_name_plural': '经验变动记录', + 'db_table': 'jingyan_jilu', + }, + ), + migrations.CreateModel( + name='DingdanBiaoqian', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('chenghao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.chenghao', verbose_name='标签')), + ('dingdan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='orders.dingdan', to_field='dingdan_id', verbose_name='订单')), + ], + options={ + 'verbose_name': '订单需求标签', + 'verbose_name_plural': '订单需求标签', + 'db_table': 'dingdan_biaoqian', + }, + ), + migrations.CreateModel( + name='DashouBiaoxian', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dashou_id', models.CharField(db_index=True, max_length=32, verbose_name='打手ID')), + ('shangxian_sudu', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='上线速度评价(1-5)')), + ('fuwu_taidu', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='服务态度评价(1-5)')), + ('fanche_cishu', models.PositiveIntegerField(blank=True, null=True, verbose_name='翻车次数')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('jiedan_time', models.DateTimeField(blank=True, null=True, verbose_name='接单时间')), + ('tijiao_time', models.DateTimeField(blank=True, null=True, verbose_name='提交时间')), + ('bankuai', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块')), + ('dingdan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='biaoxian', to='orders.dingdan', to_field='dingdan_id', verbose_name='关联订单')), + ], + options={ + 'verbose_name': '打手订单表现', + 'verbose_name_plural': '打手订单表现', + 'db_table': 'dashou_biaoxian', + }, + ), + migrations.CreateModel( + name='YonghuChenghao', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('huode_time', models.DateTimeField(auto_now_add=True, verbose_name='获得时间')), + ('chenghao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.chenghao', verbose_name='称号')), + ('yonghu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chenghao_list', to=settings.AUTH_USER_MODEL, verbose_name='用户')), + ], + options={ + 'verbose_name': '用户称号关联', + 'verbose_name_plural': '用户称号关联', + 'db_table': 'yonghu_chenghao', + 'indexes': [models.Index(fields=['yonghu', 'chenghao'], name='yonghu_chen_yonghu__cac0a1_idx')], + 'unique_together': {('yonghu', 'chenghao')}, + }, + ), + migrations.AddIndex( + model_name='shenhejilu', + index=models.Index(fields=['shenqingren_id', 'zhuangtai'], name='shenhe_jilu_shenqin_502e9b_idx'), + ), + migrations.AddIndex( + model_name='shenhejilu', + index=models.Index(fields=['shenheguan_id'], name='shenhe_jilu_shenheg_5c9959_idx'), + ), + migrations.AddIndex( + model_name='kaohejujuejilu', + index=models.Index(fields=['jilu_id', 'cishu'], name='kaohe_jujue_jilu_id_1f2b29_idx'), + ), + migrations.AlterUniqueTogether( + name='kaohejilufeiyong', + unique_together={('jilu', 'cishu')}, + ), + migrations.AddIndex( + model_name='kaoheguanbankuai', + index=models.Index(fields=['kaoheguan_id'], name='kaoheguan_b_kaohegu_00f7c5_idx'), + ), + migrations.AlterUniqueTogether( + name='kaoheguanbankuai', + unique_together={('kaoheguan_id', 'bankuai')}, + ), + migrations.AddIndex( + model_name='kaohecishufeiyong', + index=models.Index(fields=['chenghao', 'cishu'], name='kaohe_cishu_chengha_edc272_idx'), + ), + migrations.AlterUniqueTogether( + name='kaohecishufeiyong', + unique_together={('chenghao', 'cishu')}, + ), + migrations.AddIndex( + model_name='jingyanjilu', + index=models.Index(fields=['yonghu_id', 'bankuai', 'create_time'], name='jingyan_jil_yonghu__786992_idx'), + ), + migrations.AddIndex( + model_name='dingdanbiaoqian', + index=models.Index(fields=['dingdan'], name='dingdan_bia_dingdan_4d046b_idx'), + ), + migrations.AlterUniqueTogether( + name='dingdanbiaoqian', + unique_together={('dingdan', 'chenghao')}, + ), + migrations.AddIndex( + model_name='dashoubiaoxian', + index=models.Index(fields=['dashou_id', 'bankuai', 'create_time'], name='dashou_biao_dashou__36e1c3_idx'), + ), + migrations.AddIndex( + model_name='chenghao', + index=models.Index(fields=['leixing', 'bankuai'], name='chenghao_leixing_8f4371_idx'), + ), + ] diff --git a/rank/migrations/0002_alter_dashoubiaoxian_dingdan.py b/rank/migrations/0002_alter_dashoubiaoxian_dingdan.py deleted file mode 100644 index ba3c12e..0000000 --- a/rank/migrations/0002_alter_dashoubiaoxian_dingdan.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-12 02:25 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more'), - ('rank', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='dashoubiaoxian', - name='dingdan', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='biaoxian', to='orders.dingdan', to_field='dingdan_id', verbose_name='关联订单'), - ), - ] diff --git a/rank/migrations/0003_alter_dashoubiaoxian_bankuai.py b/rank/migrations/0003_alter_dashoubiaoxian_bankuai.py deleted file mode 100644 index 921d444..0000000 --- a/rank/migrations/0003_alter_dashoubiaoxian_bankuai.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-12 02:32 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0002_alter_dashoubiaoxian_dingdan'), - ] - - operations = [ - migrations.AlterField( - model_name='dashoubiaoxian', - name='bankuai', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='所属板块'), - ), - ] diff --git a/rank/migrations/0004_dingdanbiaoqian.py b/rank/migrations/0004_dingdanbiaoqian.py deleted file mode 100644 index 56a9f8b..0000000 --- a/rank/migrations/0004_dingdanbiaoqian.py +++ /dev/null @@ -1,26 +0,0 @@ -# dengji/migrations/0004_dingdanbiaoqian.py -from django.db import migrations - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more'), # 保持你之前的依赖 - ('rank', '0003_alter_dashoubiaoxian_bankuai'), - ] - - operations = [ - migrations.RunSQL( - sql=""" - CREATE TABLE IF NOT EXISTS dingdan_biaoqian ( - id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, - create_time DATETIME(6) NOT NULL, - chenghao_id BIGINT NOT NULL, - dingdan_id VARCHAR(32) NOT NULL, - CONSTRAINT fk_dingdanbiaoqian_chenghao FOREIGN KEY (chenghao_id) REFERENCES chenghao (id), - CONSTRAINT fk_dingdanbiaoqian_dingdan FOREIGN KEY (dingdan_id) REFERENCES dingdan (dingdan_id), - UNIQUE KEY uniq_dingdan_chenghao (dingdan_id, chenghao_id) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - """, - reverse_sql="DROP TABLE IF EXISTS dingdan_biaoqian;" - ), - ] \ No newline at end of file diff --git a/rank/migrations/0005_fix_state.py b/rank/migrations/0005_fix_state.py deleted file mode 100644 index beb2aea..0000000 --- a/rank/migrations/0005_fix_state.py +++ /dev/null @@ -1,36 +0,0 @@ -# dengji/migrations/0005_fix_state.py -from django.db import migrations, models -import django.db.models.deletion - -class Migration(migrations.Migration): - - dependencies = [ - ('orders', '0026_fadanfenhonglilv_alter_fadan_shenqingren_shenfen_and_more'), # 保持你之前的依赖 - ('rank', '0004_dingdanbiaoqian'), - ] - - operations = [ - migrations.SeparateDatabaseAndState( - database_operations=[], # 表已存在,不做任何数据库操作 - state_operations=[ - migrations.CreateModel( - name='DingdanBiaoqian', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('chenghao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.chenghao', verbose_name='标签')), - ('dingdan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='orders.dingdan', to_field='dingdan_id', verbose_name='订单')), - ], - options={ - 'verbose_name': '订单需求标签', - 'verbose_name_plural': '订单需求标签', - 'db_table': 'dingdan_biaoqian', - 'unique_together': {('dingdan', 'chenghao')}, - 'indexes': [ - models.Index(fields=['dingdan'], name='dingdan_bia_dingdan_4d046b_idx'), - ], - }, - ), - ], - ), - ] \ No newline at end of file diff --git a/rank/migrations/0006_shenhejilu.py b/rank/migrations/0006_shenhejilu.py deleted file mode 100644 index 60e1db8..0000000 --- a/rank/migrations/0006_shenhejilu.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-14 18:42 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0005_fix_state'), - ] - - operations = [ - migrations.CreateModel( - name='ShenheJilu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('shenqingren_id', models.CharField(max_length=7, verbose_name='申请人用户ID')), - ('shenheguan_id', models.CharField(max_length=7, null=True, verbose_name='审核官用户ID')), - ('zhuangtai', models.IntegerField(choices=[(0, '审核中'), (1, '通过'), (2, '未通过')], default=0, verbose_name='审核状态')), - ('cishu', models.IntegerField(default=1, verbose_name='第几次审核')), - ('jiaofei_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='更新时间')), - ('bankuai', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.bankuai', verbose_name='审核板块')), - ('chenghao', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='rank.chenghao', verbose_name='审核标签')), - ], - options={ - 'verbose_name': '审核记录', - 'verbose_name_plural': '审核记录', - 'db_table': 'shenhe_jilu', - 'indexes': [models.Index(fields=['shenqingren_id', 'zhuangtai'], name='shenhe_jilu_shenqin_502e9b_idx'), models.Index(fields=['shenheguan_id'], name='shenhe_jilu_shenheg_5c9959_idx')], - }, - ), - ] diff --git a/rank/migrations/0007_kaoheguanbankuai.py b/rank/migrations/0007_kaoheguanbankuai.py deleted file mode 100644 index 9b5a8bc..0000000 --- a/rank/migrations/0007_kaoheguanbankuai.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-15 00:31 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0006_shenhejilu'), - ] - - operations = [ - migrations.CreateModel( - name='KaoheguanBankuai', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('kaoheguan_id', models.CharField(db_index=True, max_length=7, verbose_name='考核官用户ID')), - ('bankuai', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.bankuai', verbose_name='所属板块')), - ], - options={ - 'verbose_name': '考核官板块关联', - 'verbose_name_plural': '考核官板块关联', - 'db_table': 'kaoheguan_bankuai', - 'indexes': [models.Index(fields=['kaoheguan_id'], name='kaoheguan_b_kaohegu_00f7c5_idx')], - 'unique_together': {('kaoheguan_id', 'bankuai')}, - }, - ), - ] diff --git a/rank/migrations/0008_chenghao_kaohe_guize_shenhejilu_dashou_beizhu_and_more.py b/rank/migrations/0008_chenghao_kaohe_guize_shenhejilu_dashou_beizhu_and_more.py deleted file mode 100644 index 544c853..0000000 --- a/rank/migrations/0008_chenghao_kaohe_guize_shenhejilu_dashou_beizhu_and_more.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-15 04:16 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0007_kaoheguanbankuai'), - ] - - operations = [ - migrations.AddField( - model_name='chenghao', - name='kaohe_guize', - field=models.TextField(blank=True, null=True, verbose_name='考核规则'), - ), - migrations.AddField( - model_name='shenhejilu', - name='dashou_beizhu', - field=models.TextField(blank=True, null=True, verbose_name='打手备注'), - ), - migrations.AddField( - model_name='shenhejilu', - name='dashou_youxi_id', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='打手游戏ID'), - ), - migrations.AddField( - model_name='shenhejilu', - name='guize_neirong', - field=models.TextField(blank=True, null=True, verbose_name='规则内容'), - ), - migrations.AddField( - model_name='shenhejilu', - name='jilu_id', - field=models.CharField(db_index=True, max_length=32, null=True, verbose_name='记录ID'), - ), - migrations.AddField( - model_name='shenhejilu', - name='shenheguan_youxi_id', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='审核官游戏ID'), - ), - migrations.AlterField( - model_name='shenhejilu', - name='zhuangtai', - field=models.IntegerField(choices=[(0, '审核中'), (1, '通过'), (2, '未通过'), (3, '待审核')], default=0, verbose_name='审核状态'), - ), - ] diff --git a/rank/migrations/0009_chenghao_kaioi_jinpai_alter_shenhejilu_jilu_id_and_more.py b/rank/migrations/0009_chenghao_kaioi_jinpai_alter_shenhejilu_jilu_id_and_more.py deleted file mode 100644 index 9854f9b..0000000 --- a/rank/migrations/0009_chenghao_kaioi_jinpai_alter_shenhejilu_jilu_id_and_more.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-15 13:20 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0008_chenghao_kaohe_guize_shenhejilu_dashou_beizhu_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='chenghao', - name='kaioi_jinpai', - field=models.BooleanField(default=False, verbose_name='是否同时开启金牌'), - ), - migrations.AlterField( - model_name='shenhejilu', - name='jilu_id', - field=models.CharField(db_index=True, default='Sh111', max_length=32, unique=True, verbose_name='记录ID'), - preserve_default=False, - ), - migrations.CreateModel( - name='KaoheJujueJilu', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cishu', models.IntegerField(verbose_name='对应次数')), - ('shenheguan_id', models.CharField(max_length=7, verbose_name='考核官用户ID')), - ('yuanyin', models.TextField(verbose_name='拒绝原因')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('jilu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.shenhejilu', to_field='jilu_id', verbose_name='审核记录')), - ], - options={ - 'verbose_name': '拒绝原因记录', - 'verbose_name_plural': '拒绝原因记录', - 'db_table': 'kaohe_jujue_jilu', - 'indexes': [models.Index(fields=['jilu_id', 'cishu'], name='kaohe_jujue_jilu_id_1f2b29_idx')], - }, - ), - migrations.CreateModel( - name='KaoheCishuFeiyong', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cishu', models.IntegerField(verbose_name='第几次考核')), - ('feiyong', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='需缴纳金额')), - ('chenghao', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.chenghao', verbose_name='标签')), - ], - options={ - 'verbose_name': '考核次数费用', - 'verbose_name_plural': '考核次数费用', - 'db_table': 'kaohe_cishu_feiyong', - 'indexes': [models.Index(fields=['chenghao', 'cishu'], name='kaohe_cishu_chengha_edc272_idx')], - 'unique_together': {('chenghao', 'cishu')}, - }, - ), - ] diff --git a/rank/migrations/0010_kaohejilufeiyong.py b/rank/migrations/0010_kaohejilufeiyong.py deleted file mode 100644 index 43d7128..0000000 --- a/rank/migrations/0010_kaohejilufeiyong.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-15 16:10 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0009_chenghao_kaioi_jinpai_alter_shenhejilu_jilu_id_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='KaoheJiluFeiyong', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cishu', models.IntegerField(verbose_name='第几次考核')), - ('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='缴纳金额')), - ('jilu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rank.shenhejilu', to_field='jilu_id', verbose_name='考核记录')), - ], - options={ - 'verbose_name': '考核记录费用', - 'verbose_name_plural': '考核记录费用', - 'db_table': 'kaohe_jilu_feiyong', - 'unique_together': {('jilu', 'cishu')}, - }, - ), - ] diff --git a/rank/migrations/0011_kaohepaytemp.py b/rank/migrations/0011_kaohepaytemp.py deleted file mode 100644 index d040f67..0000000 --- a/rank/migrations/0011_kaohepaytemp.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-19 13:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('rank', '0010_kaohejilufeiyong'), - ] - - operations = [ - migrations.CreateModel( - name='KaohePayTemp', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dingdan_id', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='订单ID')), - ('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')), - ('tag_id', models.IntegerField(verbose_name='标签ID')), - ('game_nick', models.CharField(max_length=100, verbose_name='游戏昵称')), - ('remark', models.TextField(blank=True, verbose_name='备注')), - ('reapply', models.BooleanField(default=False, verbose_name='是否再次申请')), - ('jilu_id', models.CharField(blank=True, max_length=32, null=True, verbose_name='原记录ID(再次申请时)')), - ('shenheguan_id', models.CharField(blank=True, max_length=7, verbose_name='指定考核官ID')), - ('cishu', models.IntegerField(verbose_name='本次考核次数(预计算)')), - ('fee', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='本次费用(分账单位)')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ], - options={ - 'verbose_name': '考核支付临时表', - 'verbose_name_plural': '考核支付临时表', - 'db_table': 'kaohe_pay_temp', - }, - ), - ] diff --git a/shop/migrations/0001_initial.py b/shop/migrations/0001_initial.py index 797a874..97656d0 100644 --- a/shop/migrations/0001_initial.py +++ b/shop/migrations/0001_initial.py @@ -1,92 +1,163 @@ -# Generated by Django 4.2.27 on 2026-04-21 12:36 - -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), - ('products', '0010_shangpinleixing_is_cross_enabled'), - ] - - operations = [ - migrations.CreateModel( - name='YonghuPingzheng', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键ID')), - ('zhanghao', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='登录账号')), - ('mima', models.CharField(max_length=255, verbose_name='密码')), - ('is_active', models.BooleanField(default=True, verbose_name='是否启用')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ('yonghu', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, to_field='yonghuid', verbose_name='关联用户ID')), - ], - options={ - 'verbose_name': '用户认证凭证', - 'verbose_name_plural': '用户认证凭证', - 'db_table': 'yonghu_pingzheng', - }, - ), - migrations.CreateModel( - name='Dianpu', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='店铺自增ID')), - ('dianpu_mingcheng', models.CharField(max_length=50, verbose_name='店铺名称')), - ('dianpu_touxiang', models.CharField(blank=True, max_length=500, null=True, verbose_name='店铺头像URL')), - ('lianxi_dianhua', models.CharField(blank=True, max_length=20, null=True, verbose_name='联系电话')), - ('weixinhao', models.CharField(blank=True, max_length=50, null=True, verbose_name='微信号')), - ('zhuangtai', models.IntegerField(choices=[(0, '封禁'), (1, '正常')], default=1, verbose_name='店铺状态')), - ('bangding_yonghushu', models.PositiveIntegerField(default=0, verbose_name='绑定用户总数')), - ('erweima_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='店铺二维码相对URL')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ('pingzheng', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='shop.yonghupingzheng', verbose_name='关联用户凭证')), - ], - options={ - 'verbose_name': '平台商家店铺', - 'verbose_name_plural': '平台商家店铺', - 'db_table': 'dianpu', - }, - ), - migrations.CreateModel( - name='YonghuDianpuBangding', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='绑定自增ID')), - ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ('dianpu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='关联店铺ID')), - ('yonghu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, to_field='yonghuid', verbose_name='用户ID')), - ], - options={ - 'verbose_name': '用户店铺绑定关系', - 'verbose_name_plural': '用户店铺绑定关系', - 'db_table': 'yonghu_dianpu_bangding', - 'unique_together': {('yonghu', 'dianpu')}, - }, - ), - migrations.CreateModel( - name='ShangpinLeixingDianpu', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='类型自增ID')), - ('jieshao', models.CharField(max_length=45, verbose_name='类型介绍')), - ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='类型图片URL')), - ('paixu', models.IntegerField(default=0, verbose_name='排序权重')), - ('shangjia_zhuangtai', models.BooleanField(default=True, verbose_name='是否上架')), - ('fengjin_zhuangtai', models.BooleanField(default=False, verbose_name='是否封禁')), - ('shenhe_zhuangtai', models.BooleanField(default=False, help_text='True=审核通过,False=未审核', verbose_name='平台审核状态')), - ('dianpu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='所属店铺')), - ('gonggong_leixing', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.shangpinleixing', verbose_name='映射的公共商品类型')), - ], - options={ - 'verbose_name': '店铺商品类型映射', - 'verbose_name_plural': '店铺商品类型映射', - 'db_table': 'shangdian_shangpin_leixing', - 'indexes': [models.Index(fields=['dianpu'], name='shangdian_s_dianpu__100f93_idx'), models.Index(fields=['gonggong_leixing'], name='shangdian_s_gonggon_88a9a0_idx')], - }, - ), - ] +# Generated by Django 4.2.27 on 2026-06-17 01:32 + +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), + ('products', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='DianpuMorenPeizhi', + fields=[ + ('id', models.PositiveSmallIntegerField(default=1, editable=False, primary_key=True, serialize=False)), + ('moren_choucheng_feilv', models.DecimalField(decimal_places=4, default=0.1, max_digits=5, verbose_name='默认订单抽成费率(小数,0.1000=10%)')), + ('moren_tixian_xiane', models.DecimalField(decimal_places=2, default=1000.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='更新时间')), + ], + options={ + 'verbose_name': '店铺默认配置', + 'verbose_name_plural': '店铺默认配置', + 'db_table': 'dianpu_moren_peizhi', + }, + ), + migrations.CreateModel( + name='DianpuShangpinShenheShezhi', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('kaiqi_shenhe', 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='更新时间')), + ], + options={ + 'verbose_name': '商品审核模式配置', + 'verbose_name_plural': '商品审核模式配置', + 'db_table': 'dianpu_shangpin_shenhe_shezhi', + }, + ), + migrations.CreateModel( + name='YonghuPingzheng', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键ID')), + ('yonghu', models.CharField(db_index=True, max_length=7, unique=True, verbose_name='关联用户ID')), + ('zhanghao', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='登录账号')), + ('mima', models.CharField(max_length=255, verbose_name='密码')), + ('is_active', models.BooleanField(default=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': 'yonghu_pingzheng', + }, + ), + migrations.CreateModel( + name='DianpuShouzhiMeiriTongji', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dianpu_id', models.PositiveIntegerField(db_index=True, verbose_name='店铺ID')), + ('riqi', models.DateField(db_index=True, verbose_name='统计日期')), + ('nian', models.PositiveSmallIntegerField(verbose_name='年份')), + ('yue', models.PositiveSmallIntegerField(verbose_name='月份')), + ('ri', models.PositiveSmallIntegerField(verbose_name='日')), + ('xiadan_zongliang', models.PositiveIntegerField(default=0, verbose_name='下单总量')), + ('xiadan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='下单总额')), + ('chengjiao_zongliang', models.PositiveIntegerField(default=0, verbose_name='成交总量')), + ('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总额')), + ('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')), + ('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')), + ('shouyi_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='更新时间')), + ('shangji_fenhong_cishu', models.PositiveIntegerField(default=0, verbose_name='作为上级获得分红次数')), + ('shangji_fenhong_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级获得分红总额')), + ('shangji_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='当天对应的上级店铺ID(若无则为空)')), + ('gei_shangji_cishu', models.PositiveIntegerField(default=0, verbose_name='给上级分红次数')), + ('gei_shangji_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='给上级分红总额')), + ], + options={ + 'verbose_name': '店铺每日收支统计', + 'verbose_name_plural': '店铺每日收支统计', + 'db_table': 'dianpu_shouzhi_meiri_tongji', + 'indexes': [models.Index(fields=['dianpu_id', 'riqi'], name='dianpu_shou_dianpu__bffdb2_idx'), models.Index(fields=['nian', 'yue', 'ri'], name='dianpu_shou_nian_a0f415_idx')], + 'unique_together': {('dianpu_id', 'riqi')}, + }, + ), + migrations.CreateModel( + name='Dianpu', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='店铺自增ID')), + ('dianpu_mingcheng', models.CharField(max_length=50, verbose_name='店铺名称')), + ('dianpu_touxiang', models.CharField(blank=True, max_length=500, null=True, verbose_name='店铺头像URL')), + ('lianxi_dianhua', models.CharField(blank=True, max_length=20, null=True, verbose_name='联系电话')), + ('weixinhao', models.CharField(blank=True, max_length=50, null=True, verbose_name='微信号')), + ('zhuangtai', models.IntegerField(choices=[(0, '封禁'), (1, '正常')], default=1, verbose_name='店铺状态')), + ('bangding_yonghushu', models.PositiveIntegerField(default=0, verbose_name='绑定用户总数')), + ('erweima_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='店铺二维码相对URL')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('kaiqi_shouyi_choucheng', models.BooleanField(default=False, verbose_name='是否开启店铺订单收益抽成')), + ('shouyi_choucheng_feilv', models.DecimalField(blank=True, decimal_places=4, default=0.0, max_digits=5, null=True, verbose_name='店铺订单收益抽成费率(小数,如0.1000=10%)')), + ('ketixian_yue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='店铺可提现余额')), + ('zhengqu_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='店铺赚取总额')), + ('meiri_tixian_xiane', models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='店铺每日提现限额')), + ('kaiqi_meiri_xiane', models.BooleanField(default=False, verbose_name='是否开启每日提现限额')), + ('yaoqing_dianpu_id', models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='邀请人店铺ID(上级)')), + ('fenhong_choucheng_feilv', models.DecimalField(blank=True, decimal_places=4, default=0.05, max_digits=5, null=True, verbose_name='上级分红抽成费率(默认5%)')), + ('shangji_fenhong_leiji', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级累计获得分红')), + ('shangji_ketixian_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级可提现分红余额')), + ('pingzheng', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='shop.yonghupingzheng', verbose_name='关联用户凭证')), + ], + options={ + 'verbose_name': '平台商家店铺', + 'verbose_name_plural': '平台商家店铺', + 'db_table': 'dianpu', + }, + ), + migrations.CreateModel( + name='YonghuDianpuBangding', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='绑定自增ID')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('dianpu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='关联店铺ID')), + ('yonghu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, to_field='YonghuID', verbose_name='用户ID')), + ], + options={ + 'verbose_name': '用户店铺绑定关系', + 'verbose_name_plural': '用户店铺绑定关系', + 'db_table': 'yonghu_dianpu_bangding', + 'unique_together': {('yonghu', 'dianpu')}, + }, + ), + migrations.CreateModel( + name='ShangpinLeixingDianpu', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='类型自增ID')), + ('jieshao', models.CharField(max_length=45, verbose_name='类型介绍')), + ('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='类型图片URL')), + ('paixu', models.IntegerField(default=0, verbose_name='排序权重')), + ('shangjia_zhuangtai', models.BooleanField(default=True, verbose_name='是否上架')), + ('fengjin_zhuangtai', models.BooleanField(default=False, verbose_name='是否封禁')), + ('shenhe_zhuangtai', models.BooleanField(default=False, help_text='True=审核通过,False=未审核', verbose_name='平台审核状态')), + ('dianpu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='所属店铺')), + ('gonggong_leixing', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='products.shangpinleixing', verbose_name='映射的公共商品类型')), + ], + options={ + 'verbose_name': '店铺商品类型映射', + 'verbose_name_plural': '店铺商品类型映射', + 'db_table': 'shangdian_shangpin_leixing', + 'indexes': [models.Index(fields=['dianpu'], name='shangdian_s_dianpu__100f93_idx'), models.Index(fields=['gonggong_leixing'], name='shangdian_s_gonggon_88a9a0_idx')], + }, + ), + ] diff --git a/shop/migrations/0002_alter_yonghupingzheng_yonghu.py b/shop/migrations/0002_alter_yonghupingzheng_yonghu.py deleted file mode 100644 index dc49c90..0000000 --- a/shop/migrations/0002_alter_yonghupingzheng_yonghu.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-21 13:04 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('shop', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='yonghupingzheng', - name='yonghu', - field=models.CharField(db_index=True, max_length=7, unique=True, verbose_name='关联用户ID'), - ), - ] diff --git a/shop/migrations/0003_dianpumorenpeizhi_dianpu_kaiqi_meiri_xiane_and_more.py b/shop/migrations/0003_dianpumorenpeizhi_dianpu_kaiqi_meiri_xiane_and_more.py deleted file mode 100644 index 22f7435..0000000 --- a/shop/migrations/0003_dianpumorenpeizhi_dianpu_kaiqi_meiri_xiane_and_more.py +++ /dev/null @@ -1,85 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-23 14:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('shop', '0002_alter_yonghupingzheng_yonghu'), - ] - - operations = [ - migrations.CreateModel( - name='DianpuMorenPeizhi', - fields=[ - ('id', models.PositiveSmallIntegerField(default=1, editable=False, primary_key=True, serialize=False)), - ('moren_choucheng_feilv', models.DecimalField(decimal_places=4, default=0.1, max_digits=5, verbose_name='默认订单抽成费率(小数,0.1000=10%)')), - ('moren_tixian_xiane', models.DecimalField(decimal_places=2, default=1000.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='更新时间')), - ], - options={ - 'verbose_name': '店铺默认配置', - 'verbose_name_plural': '店铺默认配置', - 'db_table': 'dianpu_moren_peizhi', - }, - ), - migrations.AddField( - model_name='dianpu', - name='kaiqi_meiri_xiane', - field=models.BooleanField(default=False, verbose_name='是否开启每日提现限额'), - ), - migrations.AddField( - model_name='dianpu', - name='kaiqi_shouyi_choucheng', - field=models.BooleanField(default=False, verbose_name='是否开启店铺订单收益抽成'), - ), - migrations.AddField( - model_name='dianpu', - name='ketixian_yue', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='店铺可提现余额'), - ), - migrations.AddField( - model_name='dianpu', - name='meiri_tixian_xiane', - field=models.DecimalField(blank=True, decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='店铺每日提现限额'), - ), - migrations.AddField( - model_name='dianpu', - name='shouyi_choucheng_feilv', - field=models.DecimalField(blank=True, decimal_places=4, default=0.0, max_digits=5, null=True, verbose_name='店铺订单收益抽成费率(小数,如0.1000=10%)'), - ), - migrations.AddField( - model_name='dianpu', - name='zhengqu_zonge', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='店铺赚取总额'), - ), - migrations.CreateModel( - name='DianpuShouzhiMeiriTongji', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('dianpu_id', models.PositiveIntegerField(db_index=True, verbose_name='店铺ID')), - ('riqi', models.DateField(db_index=True, verbose_name='统计日期')), - ('nian', models.PositiveSmallIntegerField(verbose_name='年份')), - ('yue', models.PositiveSmallIntegerField(verbose_name='月份')), - ('ri', models.PositiveSmallIntegerField(verbose_name='日')), - ('xiadan_zongliang', models.PositiveIntegerField(default=0, verbose_name='下单总量')), - ('xiadan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='下单总额')), - ('chengjiao_zongliang', models.PositiveIntegerField(default=0, verbose_name='成交总量')), - ('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总额')), - ('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')), - ('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')), - ('shouyi_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='更新时间')), - ], - options={ - 'verbose_name': '店铺每日收支统计', - 'verbose_name_plural': '店铺每日收支统计', - 'db_table': 'dianpu_shouzhi_meiri_tongji', - 'indexes': [models.Index(fields=['dianpu_id', 'riqi'], name='dianpu_shou_dianpu__bffdb2_idx'), models.Index(fields=['nian', 'yue', 'ri'], name='dianpu_shou_nian_a0f415_idx')], - 'unique_together': {('dianpu_id', 'riqi')}, - }, - ), - ] diff --git a/shop/migrations/0004_dianpushangpinshenheshezhi.py b/shop/migrations/0004_dianpushangpinshenheshezhi.py deleted file mode 100644 index a9adb9b..0000000 --- a/shop/migrations/0004_dianpushangpinshenheshezhi.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.2.27 on 2026-04-25 12:05 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('shop', '0003_dianpumorenpeizhi_dianpu_kaiqi_meiri_xiane_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='DianpuShangpinShenheShezhi', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('kaiqi_shenhe', 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='更新时间')), - ], - options={ - 'verbose_name': '商品审核模式配置', - 'verbose_name_plural': '商品审核模式配置', - 'db_table': 'dianpu_shangpin_shenhe_shezhi', - }, - ), - ] diff --git a/shop/migrations/0005_dianpu_fenhong_choucheng_feilv_and_more.py b/shop/migrations/0005_dianpu_fenhong_choucheng_feilv_and_more.py deleted file mode 100644 index 2265498..0000000 --- a/shop/migrations/0005_dianpu_fenhong_choucheng_feilv_and_more.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-05 10:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('shop', '0004_dianpushangpinshenheshezhi'), - ] - - operations = [ - migrations.AddField( - model_name='dianpu', - name='fenhong_choucheng_feilv', - field=models.DecimalField(blank=True, decimal_places=4, default=0.05, max_digits=5, null=True, verbose_name='上级分红抽成费率(默认5%)'), - ), - migrations.AddField( - model_name='dianpu', - name='shangji_fenhong_leiji', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级累计获得分红'), - ), - migrations.AddField( - model_name='dianpu', - name='shangji_ketixian_fenhong', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级可提现分红余额'), - ), - migrations.AddField( - model_name='dianpu', - name='yaoqing_dianpu_id', - field=models.PositiveIntegerField(blank=True, db_index=True, null=True, verbose_name='邀请人店铺ID(上级)'), - ), - ] diff --git a/shop/migrations/0006_dianpushouzhimeiritongji_gei_shangji_cishu_and_more.py b/shop/migrations/0006_dianpushouzhimeiritongji_gei_shangji_cishu_and_more.py deleted file mode 100644 index 16c33a4..0000000 --- a/shop/migrations/0006_dianpushouzhimeiritongji_gei_shangji_cishu_and_more.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 4.2.27 on 2026-05-10 18:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('shop', '0005_dianpu_fenhong_choucheng_feilv_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='dianpushouzhimeiritongji', - name='gei_shangji_cishu', - field=models.PositiveIntegerField(default=0, verbose_name='给上级分红次数'), - ), - migrations.AddField( - model_name='dianpushouzhimeiritongji', - name='gei_shangji_zonge', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='给上级分红总额'), - ), - migrations.AddField( - model_name='dianpushouzhimeiritongji', - name='shangji_fenhong_cishu', - field=models.PositiveIntegerField(default=0, verbose_name='作为上级获得分红次数'), - ), - migrations.AddField( - model_name='dianpushouzhimeiritongji', - name='shangji_fenhong_zonge', - field=models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级获得分红总额'), - ), - migrations.AddField( - model_name='dianpushouzhimeiritongji', - name='shangji_id', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='当天对应的上级店铺ID(若无则为空)'), - ), - ] diff --git a/shop/models.py b/shop/models.py index d3b8572..b1df7e1 100644 --- a/shop/models.py +++ b/shop/models.py @@ -148,8 +148,8 @@ class DianpuShouzhiMeiriTongji(QModel): class YonghuDianpuBangding(QModel): id = models.AutoField(primary_key=True, verbose_name='绑定自增ID') yonghu = models.ForeignKey( - 'users.UserMain', # 🔥 完整路径 - to_field='yonghuid', + 'gvsdsdk.User', + to_field='YonghuID', on_delete=models.CASCADE, db_index=True, verbose_name='用户ID' diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py index dbd1243..222d488 100644 --- a/users/migrations/0001_initial.py +++ b/users/migrations/0001_initial.py @@ -1,213 +1,393 @@ -# 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 01:32 + +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='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(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')], + }, + ), + 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(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')], + }, + ), + 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')], + }, + ), + migrations.CreateModel( + name='UserSensitiveData', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OpenID', models.CharField(blank=True, db_index=True, max_length=64, null=True, unique=True, verbose_name='微信OpenID')), + ('UnionID', models.CharField(blank=True, db_index=True, max_length=64, null=True, verbose_name='微信UnionID')), + ('Password', models.CharField(blank=True, max_length=200, null=True, verbose_name='本地密码')), + ('PhoneVerified', models.BooleanField(default=False, 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')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ('UserUUID', models.OneToOneField(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, related_name='sensitive_data', to=settings.AUTH_USER_MODEL, verbose_name='关联用户UUID')), + ], + options={ + 'verbose_name': '用户敏感数据', + 'verbose_name_plural': '用户敏感数据', + 'db_table': 'user_sensitive_data', + 'indexes': [models.Index(fields=['OpenID'], name='user_sensit_OpenID_41a0d1_idx'), models.Index(fields=['UnionID'], name='user_sensit_UnionID_bd018d_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(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')], + }, + ), + 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(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='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(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='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='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(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')], + }, + ), + ] diff --git a/users/migrations/0002_adminprofile_yaoqingma.py b/users/migrations/0002_adminprofile_yaoqingma.py deleted file mode 100644 index 7bb1ce2..0000000 --- a/users/migrations/0002_adminprofile_yaoqingma.py +++ /dev/null @@ -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='管理员邀请码'), - ), - ] diff --git a/users/migrations/0003_rankingrecord.py b/users/migrations/0003_rankingrecord.py deleted file mode 100644 index 49857bd..0000000 --- a/users/migrations/0003_rankingrecord.py +++ /dev/null @@ -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')}, - }, - ), - ] diff --git a/users/migrations/0004_alter_usermain_avatar.py b/users/migrations/0004_alter_usermain_avatar.py deleted file mode 100644 index 2ed5ea8..0000000 --- a/users/migrations/0004_alter_usermain_avatar.py +++ /dev/null @@ -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='头像'), - ), - ] diff --git a/users/migrations/0005_officialaccountuser_usermain_unionid.py b/users/migrations/0005_officialaccountuser_usermain_unionid.py deleted file mode 100644 index 7cbd851..0000000 --- a/users/migrations/0005_officialaccountuser_usermain_unionid.py +++ /dev/null @@ -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'), - ), - ] diff --git a/users/migrations/0006_alter_officialaccountuser_unionid.py b/users/migrations/0006_alter_officialaccountuser_unionid.py deleted file mode 100644 index 79f43ed..0000000 --- a/users/migrations/0006_alter_officialaccountuser_unionid.py +++ /dev/null @@ -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'), - ), - ] diff --git a/users/migrations/0007_userkefu.py b/users/migrations/0007_userkefu.py deleted file mode 100644 index a159dbf..0000000 --- a/users/migrations/0007_userkefu.py +++ /dev/null @@ -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')], - }, - ), - ] diff --git a/users/migrations/0008_userguanshi_fenghong_erci_and_more.py b/users/migrations/0008_userguanshi_fenghong_erci_and_more.py deleted file mode 100644 index 7ad4d6b..0000000 --- a/users/migrations/0008_userguanshi_fenghong_erci_and_more.py +++ /dev/null @@ -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='首次分红金额'), - ), - ] diff --git a/users/migrations/0009_userdashou_ewai_xiane_userdashou_jinritixian_jine_and_more.py b/users/migrations/0009_userdashou_ewai_xiane_userdashou_jinritixian_jine_and_more.py deleted file mode 100644 index 7c81b14..0000000 --- a/users/migrations/0009_userdashou_ewai_xiane_userdashou_jinritixian_jine_and_more.py +++ /dev/null @@ -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')], - }, - ), - ] diff --git a/users/migrations/0010_userguanshi_invite_qrcode_url.py b/users/migrations/0010_userguanshi_invite_qrcode_url.py deleted file mode 100644 index 36df9ed..0000000 --- a/users/migrations/0010_userguanshi_invite_qrcode_url.py +++ /dev/null @@ -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'), - ), - ] diff --git a/users/migrations/0011_usermain_shoujihao_renzheng.py b/users/migrations/0011_usermain_shoujihao_renzheng.py deleted file mode 100644 index 16e2dc4..0000000 --- a/users/migrations/0011_usermain_shoujihao_renzheng.py +++ /dev/null @@ -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='手机号是否已认证'), - ), - ] diff --git a/users/migrations/0012_usershenheguan.py b/users/migrations/0012_usershenheguan.py deleted file mode 100644 index 2975667..0000000 --- a/users/migrations/0012_usershenheguan.py +++ /dev/null @@ -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')], - }, - ), - ] diff --git a/users/migrations/0013_usershenheguan_is_renzheng.py b/users/migrations/0013_usershenheguan_is_renzheng.py deleted file mode 100644 index c78645a..0000000 --- a/users/migrations/0013_usershenheguan_is_renzheng.py +++ /dev/null @@ -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='是否认证'), - ), - ] diff --git a/users/migrations/0014_tixianautorecord_tixianshenhejilu_and_more.py b/users/migrations/0014_tixianautorecord_tixianshenhejilu_and_more.py deleted file mode 100644 index 6500e1e..0000000 --- a/users/migrations/0014_tixianautorecord_tixianshenhejilu_and_more.py +++ /dev/null @@ -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'), - ), - ] diff --git a/users/models.py b/users/models.py index f65d7bb..b35491c 100644 --- a/users/models.py +++ b/users/models.py @@ -1,72 +1,51 @@ # models.py from django.db import models -from django.contrib.auth.models import AbstractBaseUser from gvsdsdk.model_base import QModel -# ==================== 用户主表 ==================== -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') +# ==================== 用户敏感数据表(独立于 gvsdsdk.User) ==================== +class UserSensitiveData(QModel): + """用户敏感数据表——存储 OpenID、支付信息等敏感数据 - # 微信相关字段 - 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='用户类型' + 与 gvsdsdk.User 一对一关联,不继承 User 表。 + 所有敏感字段仅在此表中存储,实现数据隔离。 + """ + UserUUID = models.OneToOneField( + 'gvsdsdk.User', + on_delete=models.CASCADE, + db_column='UserUUID', + related_name='sensitive_data', + verbose_name='关联用户UUID' ) + # 微信相关 + OpenID = models.CharField(max_length=64, unique=True, null=True, blank=True, db_index=True, verbose_name='微信OpenID') + UnionID = models.CharField(max_length=64, null=True, blank=True, db_index=True, verbose_name='微信UnionID') + + # 认证相关 + Password = models.CharField(max_length=200, null=True, blank=True, verbose_name='本地密码') + PhoneVerified = models.BooleanField(default=False, 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='收款账号') + + # 安全相关 + IP = models.CharField(max_length=50, blank=True, null=True, verbose_name='来访用户IP') - # 状态和时间字段 - #is_active = models.BooleanField(default=True, verbose_name='是否激活') - #last_login = models.DateTimeField(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='更新时间') - # 邀请码字段 - #yaoqingma = models.CharField(max_length=20, blank=True, null=True, verbose_name='邀请码') - - # 只需要添加这3行 - USERNAME_FIELD = 'openid' # 用openid作为用户名 - REQUIRED_FIELDS = ['yonghuid'] # 必填字段 - class Meta: - db_table = 'user_main' - verbose_name = '用户主表' + db_table = 'user_sensitive_data' + 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=['create_time']), + models.Index(fields=['OpenID']), + models.Index(fields=['UnionID']), ] def __str__(self): - return f'{self.yonghuid}' + return f'敏感数据-{self.UserUUID}' @@ -90,7 +69,7 @@ class OfficialAccountUser(QModel): # ==================== 老板扩展表 ==================== class UserBoss(QModel): - user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='boss_profile', + user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='boss_profile', verbose_name='关联用户') nickname = models.CharField(max_length=50, verbose_name='老板昵称') zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='消费总额') @@ -107,7 +86,7 @@ class UserBoss(QModel): # ==================== 打手扩展表 ==================== class UserDashou(QModel): - user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='dashou_profile', + user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='dashou_profile', verbose_name='关联用户') nicheng = models.CharField(max_length=50, null=True, verbose_name='打手昵称') chenghao = models.CharField(max_length=50, null=True,verbose_name='打手称号') @@ -151,7 +130,7 @@ class UserDashou(QModel): # ==================== 商家扩展表 ==================== class UserShangjia(QModel): - user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='shop_profile', + user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='shop_profile', verbose_name='关联用户') nicheng = models.CharField(max_length=50, unique=True, db_index=True, verbose_name='商家昵称') zhuangtai = models.IntegerField(choices=[(0, '待审核'), (1, '正常'), (2, '禁用')], default=1, @@ -180,7 +159,7 @@ class UserShangjia(QModel): # ==================== 管事扩展表 ==================== class UserGuanshi(QModel): - user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='guanshi_profile', + user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='guanshi_profile', verbose_name='关联用户') 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='邀请码') @@ -223,7 +202,7 @@ class UserGuanshi(QModel): class UserZuzhang(QModel): """组长扩展表(与UserMain一对一关联)""" user = models.OneToOneField( - UserMain, + 'gvsdsdk.User', on_delete=models.CASCADE, related_name='zuzhang_profile', verbose_name='关联用户', @@ -276,7 +255,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) 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,7 +275,7 @@ class UserShenheguan(QModel): # ==================== 管理员扩展表 ==================== class AdminProfile(QModel): - user = models.OneToOneField(UserMain, on_delete=models.CASCADE, related_name='admin_profile', + user = models.OneToOneField('gvsdsdk.User', on_delete=models.CASCADE, related_name='admin_profile', verbose_name='关联用户') password = models.CharField(max_length=255, verbose_name='密码') wechat = models.CharField(max_length=50, blank=True, verbose_name='管理员微信') @@ -311,7 +290,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='关联用户') 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 +577,9 @@ class RankingRecord(QModel): return f"{self.tongji_date} {zhouqi_str}榜 {shenfen_map.get(self.shenfen)} 第{self.paiming}名" +# ==================== 兼容层 ==================== +# UserMain 已废弃,所有用户数据迁移到 gvsdsdk.User +# 此别名保持现有代码 from users.models import UserMain 可用 +from gvsdsdk.models import User as UserMain + +