# Generated by Django 5.2.15 on 2026-07-21 03:25 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('licensing', '0003_alter_licenseevent_action_legacymigrationgrant_and_more'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.AlterField( model_name='licenseevent', name='action', field=models.CharField(choices=[('granted', '人工授予'), ('renewed', '续期'), ('revoked', '撤销'), ('seat_assigned', '绑定席位'), ('seat_released', '解绑席位'), ('migration_granted', '迁移资格授予'), ('credential_issued', '设备凭证签发'), ('credential_revoked', '设备凭证吊销'), ('order_fulfilled', '套餐订单权益发放')], max_length=32, verbose_name='动作'), ), migrations.CreateModel( name='SoftwareOrder', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('order_no', models.CharField(editable=False, max_length=64, unique=True, verbose_name='软件订单号')), ('product_code', models.CharField(choices=[('cmshopee', '虾皮圈优化助手')], max_length=32, verbose_name='产品代码')), ('plan_name', models.CharField(max_length=120, verbose_name='套餐名称快照')), ('plan_duration_days', models.PositiveIntegerField(verbose_name='套餐有效天数快照')), ('plan_price', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='套餐价格快照')), ('plan_device_limit', models.PositiveSmallIntegerField(verbose_name='设备数量快照')), ('plan_grace_days', models.PositiveSmallIntegerField(default=0, verbose_name='宽限天数快照')), ('amount_money', models.DecimalField(decimal_places=2, max_digits=12, verbose_name='支付金额')), ('currency', models.CharField(default='CNY', max_length=8, verbose_name='币种')), ('pay_method', models.CharField(choices=[('weixin', '微信')], max_length=20, verbose_name='支付方式')), ('status', models.CharField(choices=[('pending', '待支付'), ('paid', '已支付'), ('failed', '下单失败'), ('expired', '已过期')], default='pending', max_length=20, verbose_name='订单状态')), ('code_url', models.TextField(blank=True, verbose_name='二维码票据')), ('expires_at', models.DateTimeField(blank=True, null=True, verbose_name='支付票据过期时间')), ('payment_txn_no', models.CharField(blank=True, max_length=128, null=True, verbose_name='支付交易号')), ('paid_at', models.DateTimeField(blank=True, null=True, verbose_name='支付时间')), ('fulfilled_at', models.DateTimeField(blank=True, null=True, verbose_name='权益发放时间')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('entitlement', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='software_orders', to='licensing.softwareentitlement', verbose_name='发放权益')), ('fulfillment_event', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='software_order', to='licensing.licenseevent', verbose_name='权益发放事件')), ('source_plan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='software_orders', to='licensing.softwareplan', verbose_name='来源套餐')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='software_orders', to=settings.AUTH_USER_MODEL, verbose_name='用户')), ], options={ 'verbose_name': '软件套餐订单', 'verbose_name_plural': '软件套餐订单', 'db_table': 'software_order', 'ordering': ('-created_at', '-id'), 'indexes': [models.Index(fields=['user', 'product_code', 'status'], name='software_or_user_id_1781fe_idx'), models.Index(fields=['status', 'expires_at'], name='software_or_status_7eb559_idx')], 'constraints': [models.UniqueConstraint(fields=('pay_method', 'payment_txn_no'), name='software_order_pay_method_txn_unique'), models.CheckConstraint(condition=models.Q(('plan_duration_days__gt', 0)), name='software_order_duration_positive'), models.CheckConstraint(condition=models.Q(('plan_price__gt', 0)), name='software_order_plan_price_positive'), models.CheckConstraint(condition=models.Q(('plan_device_limit__gt', 0)), name='software_order_device_limit_positive'), models.CheckConstraint(condition=models.Q(('amount_money__gt', 0)), name='software_order_amount_positive')], }, ), ]