feat: 跨俱乐部资产迁移(计划/令牌/流水 + 用户与后台 API)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
174
jituan/migrations/0021_club_migrate.py
Normal file
174
jituan/migrations/0021_club_migrate.py
Normal file
@@ -0,0 +1,174 @@
|
||||
# Generated manually for club migrate module
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('jituan', '0020_order_deal_config_stats'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ClubMigratePlan',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('plan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='计划ID')),
|
||||
('name', models.CharField(blank=True, default='', max_length=64, verbose_name='计划名称')),
|
||||
('from_club_id', models.CharField(db_index=True, max_length=16, verbose_name='源俱乐部')),
|
||||
('to_club_id', models.CharField(db_index=True, max_length=16, verbose_name='目标俱乐部')),
|
||||
('enabled', models.BooleanField(db_index=True, default=False, verbose_name='是否启用')),
|
||||
('start_at', models.DateTimeField(blank=True, null=True, verbose_name='开始时间')),
|
||||
('end_at', models.DateTimeField(blank=True, null=True, verbose_name='结束时间')),
|
||||
('asset_whitelist', models.JSONField(blank=True, default=list, verbose_name='资产白名单')),
|
||||
('condition_json', models.JSONField(blank=True, default=dict, verbose_name='门槛条件')),
|
||||
('force_intercept', models.BooleanField(default=True, verbose_name='源店强制迁移页')),
|
||||
('force_roles', models.JSONField(blank=True, default=list, verbose_name='强制角色列表')),
|
||||
('default_once_per_user', models.BooleanField(default=True, verbose_name='默认每人成功一次')),
|
||||
('remark', models.CharField(blank=True, default='', max_length=255)),
|
||||
('updated_by', models.CharField(blank=True, default='', max_length=32)),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True)),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '跨店资产迁移计划',
|
||||
'db_table': 'club_migrate_plan',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ClubMigrateToken',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('token', models.CharField(db_index=True, max_length=64, unique=True, verbose_name='令牌')),
|
||||
('plan_id', models.CharField(db_index=True, max_length=32)),
|
||||
('from_club_id', models.CharField(db_index=True, max_length=16)),
|
||||
('to_club_id', models.CharField(db_index=True, max_length=16)),
|
||||
('from_uid', models.CharField(db_index=True, max_length=16, verbose_name='源UserUID')),
|
||||
('password_hash', models.CharField(blank=True, default='', max_length=128, verbose_name='转移密码哈希')),
|
||||
('password_salt', models.CharField(blank=True, default='', max_length=32)),
|
||||
('status', models.SmallIntegerField(db_index=True, default=0)),
|
||||
('fail_count', models.PositiveIntegerField(default=0, verbose_name='验密失败次数')),
|
||||
('asset_snapshot', models.JSONField(blank=True, default=dict, verbose_name='发码时资产快照')),
|
||||
('qrcode_url', models.CharField(blank=True, default='', max_length=512, verbose_name='目标店小程序码URL')),
|
||||
('expire_at', models.DateTimeField(blank=True, db_index=True, null=True)),
|
||||
('consumed_at', models.DateTimeField(blank=True, null=True)),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True)),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '跨店迁移令牌',
|
||||
'db_table': 'club_migrate_token',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ClubMigrateConsumption',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('plan_id', models.CharField(db_index=True, max_length=32)),
|
||||
('from_uid', models.CharField(db_index=True, max_length=16)),
|
||||
('success_count', models.PositiveIntegerField(default=0)),
|
||||
('last_ledger_id', models.BigIntegerField(blank=True, null=True)),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True)),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '跨店迁移占用',
|
||||
'db_table': 'club_migrate_consumption',
|
||||
'unique_together': {('plan_id', 'from_uid')},
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ClubMigrateUserQuota',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('plan_id', models.CharField(db_index=True, max_length=32)),
|
||||
('from_uid', models.CharField(db_index=True, max_length=16)),
|
||||
('max_extra_times', models.PositiveIntegerField(default=1, verbose_name='额外成功次数')),
|
||||
('reason', models.CharField(blank=True, default='', max_length=255)),
|
||||
('updated_by', models.CharField(blank=True, default='', max_length=32)),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True)),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '跨店迁移二次白名单',
|
||||
'db_table': 'club_migrate_user_quota',
|
||||
'unique_together': {('plan_id', 'from_uid')},
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ClubMigrateLedger',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('plan_id', models.CharField(db_index=True, max_length=32)),
|
||||
('token', models.CharField(blank=True, db_index=True, default='', max_length=64)),
|
||||
('from_club_id', models.CharField(db_index=True, max_length=16)),
|
||||
('to_club_id', models.CharField(db_index=True, max_length=16)),
|
||||
('from_uid', models.CharField(db_index=True, max_length=16)),
|
||||
('to_uid', models.CharField(db_index=True, max_length=16)),
|
||||
('migrate_seq', models.PositiveIntegerField(default=1, verbose_name='本计划第几次')),
|
||||
('status', models.SmallIntegerField(db_index=True, default=1)),
|
||||
('summary_json', models.JSONField(blank=True, default=dict, verbose_name='摘要')),
|
||||
('client_meta', models.JSONField(blank=True, default=dict)),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, db_index=True)),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '跨店迁移流水主单',
|
||||
'db_table': 'club_migrate_ledger',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ClubMigrateLedgerItem',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('ledger_id', models.BigIntegerField(db_index=True)),
|
||||
('plan_id', models.CharField(db_index=True, max_length=32)),
|
||||
('item_type', models.CharField(db_index=True, default='balance', max_length=16)),
|
||||
('role', models.CharField(db_index=True, max_length=16)),
|
||||
('field', models.CharField(blank=True, default='', max_length=32, verbose_name='字段名')),
|
||||
('amount', models.DecimalField(decimal_places=2, default=Decimal('0'), max_digits=14)),
|
||||
('before_src', models.CharField(blank=True, default='', max_length=64)),
|
||||
('after_src', models.CharField(blank=True, default='', max_length=64)),
|
||||
('before_dst', models.CharField(blank=True, default='', max_length=64)),
|
||||
('after_dst', models.CharField(blank=True, default='', max_length=64)),
|
||||
('huiyuan_id', models.CharField(blank=True, db_index=True, default='', max_length=16)),
|
||||
('meta_json', models.JSONField(blank=True, default=dict)),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '跨店迁移流水明细',
|
||||
'db_table': 'club_migrate_ledger_item',
|
||||
},
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigrateplan',
|
||||
index=models.Index(fields=['from_club_id', 'enabled'], name='idx_cmp_from_en'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigrateplan',
|
||||
index=models.Index(fields=['to_club_id', 'enabled'], name='idx_cmp_to_en'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigratetoken',
|
||||
index=models.Index(fields=['plan_id', 'from_uid', 'status'], name='idx_cmt_plan_uid_st'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigrateledger',
|
||||
index=models.Index(fields=['from_uid', 'plan_id'], name='idx_cml_from_plan'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigrateledger',
|
||||
index=models.Index(fields=['to_uid', 'plan_id'], name='idx_cml_to_plan'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigrateledger',
|
||||
index=models.Index(fields=['from_club_id', 'to_club_id', 'CreateTime'], name='idx_cml_clubs_t'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='clubmigrateledgeritem',
|
||||
index=models.Index(fields=['ledger_id', 'role'], name='idx_cmli_led_role'),
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user