58 lines
5.1 KiB
Python
58 lines
5.1 KiB
Python
# 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')],
|
|
},
|
|
),
|
|
]
|