116 lines
8.8 KiB
Python
116 lines
8.8 KiB
Python
# Generated by Django 5.2.12 on 2026-09-07 02:14
|
||
|
||
import django.db.models.deletion
|
||
from django.conf import settings
|
||
from django.db import migrations, models
|
||
|
||
|
||
class Migration(migrations.Migration):
|
||
|
||
initial = True
|
||
|
||
dependencies = [
|
||
('core', '0001_initial'),
|
||
('inventory', '0001_initial'),
|
||
('partner', '0001_initial'),
|
||
('sales', '0001_initial'),
|
||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||
]
|
||
|
||
operations = [
|
||
migrations.CreateModel(
|
||
name='ChannelAccount',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('is_deleted', models.BooleanField(default=False)),
|
||
('deleted_at', models.DateTimeField(blank=True, null=True)),
|
||
('ext_data', models.JSONField(blank=True, default=dict)),
|
||
('source_channel', models.CharField(blank=True, default='manual', max_length=32)),
|
||
('platform', models.CharField(choices=[('douyin', '抖音电商 / 抖店'), ('pinduoduo', '拼多多'), ('1688', '1688 阿里分销'), ('kuaishou', '快手小店'), ('custom', '自定义开放接口')], default='douyin', max_length=32)),
|
||
('shop_id', models.CharField(help_text='外部平台店铺ID', max_length=64)),
|
||
('shop_name', models.CharField(help_text='店铺名称', max_length=128)),
|
||
('app_key', models.CharField(blank=True, default='', max_length=128)),
|
||
('app_secret', models.CharField(blank=True, default='', max_length=255)),
|
||
('access_token', models.TextField(blank=True, default='')),
|
||
('refresh_token', models.TextField(blank=True, default='')),
|
||
('token_expires_at', models.DateTimeField(blank=True, null=True)),
|
||
('is_active', models.BooleanField(default=True)),
|
||
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
('default_customer', models.ForeignKey(blank=True, help_text='该店铺归属的客户(挂账往来)', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='partner.customer')),
|
||
('default_warehouse', models.ForeignKey(blank=True, help_text='该店铺订单默认出库仓库', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='inventory.warehouse')),
|
||
('org', models.ForeignKey(blank=True, help_text='所属组织(多机构预留)', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='core.org')),
|
||
('tenant', models.ForeignKey(help_text='所属租户', on_delete=django.db.models.deletion.PROTECT, related_name='+', to='core.tenant')),
|
||
('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
options={
|
||
'verbose_name_plural': '电商店铺配置',
|
||
'db_table': 'channel_account',
|
||
'ordering': ['platform', 'shop_name'],
|
||
'unique_together': {('tenant', 'platform', 'shop_id')},
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='WebhookEvent',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('is_deleted', models.BooleanField(default=False)),
|
||
('deleted_at', models.DateTimeField(blank=True, null=True)),
|
||
('ext_data', models.JSONField(blank=True, default=dict)),
|
||
('source_channel', models.CharField(blank=True, default='manual', max_length=32)),
|
||
('direction', models.CharField(choices=[('inbound', '外部推送回调'), ('outbound', '本系统向外推送')], default='inbound', max_length=16)),
|
||
('event_type', models.CharField(help_text='事件类型,如 order.paid, stock.changed', max_length=64)),
|
||
('source', models.CharField(default='douyin', help_text='来源系统或平台', max_length=32)),
|
||
('payload', models.JSONField(blank=True, default=dict)),
|
||
('status', models.CharField(choices=[('received', '已接收'), ('processed', '处理成功'), ('failed', '处理失败')], default='received', max_length=16)),
|
||
('error_message', models.TextField(blank=True, default='')),
|
||
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
('org', models.ForeignKey(blank=True, help_text='所属组织(多机构预留)', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='core.org')),
|
||
('tenant', models.ForeignKey(help_text='所属租户', on_delete=django.db.models.deletion.PROTECT, related_name='+', to='core.tenant')),
|
||
('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
options={
|
||
'verbose_name_plural': 'Webhook事件日志',
|
||
'db_table': 'channel_webhook_event',
|
||
'ordering': ['-created_at'],
|
||
},
|
||
),
|
||
migrations.CreateModel(
|
||
name='ChannelOrder',
|
||
fields=[
|
||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||
('updated_at', models.DateTimeField(auto_now=True)),
|
||
('is_deleted', models.BooleanField(default=False)),
|
||
('deleted_at', models.DateTimeField(blank=True, null=True)),
|
||
('ext_data', models.JSONField(blank=True, default=dict)),
|
||
('source_channel', models.CharField(blank=True, default='manual', max_length=32)),
|
||
('external_order_id', models.CharField(help_text='外部平台订单号', max_length=128)),
|
||
('order_status', models.CharField(default='', help_text='外部平台订单状态(如 PAID, SHIPPED)', max_length=64)),
|
||
('order_amount', models.DecimalField(decimal_places=4, default=0, max_digits=18)),
|
||
('buyer_name', models.CharField(blank=True, default='', max_length=64)),
|
||
('buyer_phone', models.CharField(blank=True, default='', max_length=32)),
|
||
('receiver_address', models.CharField(blank=True, default='', max_length=255)),
|
||
('sync_status', models.CharField(choices=[('pending', '待转单'), ('converted', '已转销售单'), ('failed', '转单失败'), ('ignored', '已忽略')], default='pending', max_length=16)),
|
||
('sync_error', models.TextField(blank=True, default='')),
|
||
('raw_payload', models.JSONField(blank=True, default=dict, help_text='外部原始订单 JSON')),
|
||
('channel_account', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='channel.channelaccount')),
|
||
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
('org', models.ForeignKey(blank=True, help_text='所属组织(多机构预留)', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='core.org')),
|
||
('sales_order', models.ForeignKey(blank=True, help_text='关联的内部销售订单', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='channel_orders', to='sales.salesorder')),
|
||
('tenant', models.ForeignKey(help_text='所属租户', on_delete=django.db.models.deletion.PROTECT, related_name='+', to='core.tenant')),
|
||
('updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||
],
|
||
options={
|
||
'verbose_name_plural': '渠道订单',
|
||
'db_table': 'channel_order',
|
||
'ordering': ['-created_at'],
|
||
'indexes': [models.Index(fields=['tenant', 'sync_status'], name='channel_ord_tenant__78f581_idx'), models.Index(fields=['tenant', 'external_order_id'], name='channel_ord_tenant__b39995_idx')],
|
||
'unique_together': {('tenant', 'channel_account', 'external_order_id')},
|
||
},
|
||
),
|
||
]
|