feat: UFO 转盘购票与专区图标(不影响现有俱乐部点单)

新增转盘活动/奖品/机会表与 Czjilu leixing=7 履约;专区 tupian_url;hqsp/详情下发 shi_zhuanpan。普通点单与抢单主链路保持不变。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-22 18:59:26 +08:00
parent dacd55bb1e
commit 6a107e873d
14 changed files with 953 additions and 11 deletions

View File

@@ -59,6 +59,10 @@ class Shangpin(QModel):
max_length=16, default='xq', db_index=True, verbose_name='所属俱乐部',
help_text='公共商品按俱乐部隔离;历史数据默认星阙 xq',
)
# 转盘购票商品标记True 时走转盘支付,不走普通点单进抢池;默认 Falsexq/xzj 不受影响
shi_zhuanpan = models.BooleanField(
default=False, db_index=True, verbose_name='是否转盘购票商品',
)
class Meta:
db_table = 'shangpin'
@@ -129,7 +133,11 @@ class ShangpinZhuanqu(QModel):
max_length=16, default='xq', db_index=True, verbose_name='所属俱乐部',
help_text='公共专区按俱乐部隔离;历史数据默认星阙 xq',
)
# UFO 等点单端专区横滑图标(相对 OSS 路径或完整 URLxq 可不填
tupian_url = models.CharField(
max_length=500, null=True, blank=True, default='',
verbose_name='专区图标URL',
)
class Meta:
db_table = 'shangpin_zhuanqu'
@@ -388,4 +396,85 @@ class ShangpinMeiriTongji(QModel):
def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)
super().save(*args, **kwargs)
# ===========================================================================
# 转盘单UFO 等俱乐部可选能力;未配置活动则接口无数据,不影响 xq/xzj
# ===========================================================================
class ZhuanpanHuodong(QModel):
"""转盘活动:一个俱乐部可有多个;购票价格取关联商品 jiage。"""
id = models.AutoField(primary_key=True)
club_id = models.CharField(max_length=16, db_index=True, verbose_name='俱乐部')
mingzi = models.CharField(max_length=64, default='幸运转盘', verbose_name='活动名')
shangpin_id = models.PositiveIntegerField(
db_index=True, verbose_name='购票商品ID',
help_text='对应 Shangpin.id且该商品建议 shi_zhuanpan=True',
)
qiyong = models.BooleanField(default=True, db_index=True, verbose_name='是否启用')
beizhu = models.CharField(max_length=200, blank=True, default='', verbose_name='备注')
CreateTime = models.DateTimeField(auto_now_add=True)
UpdateTime = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'zhuanpan_huodong'
verbose_name = '转盘活动'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['club_id', 'qiyong'])]
class ZhuanpanJiangpin(QModel):
"""转盘奖品格权重越高越易中shi_xiexie=True 表示谢谢参与(不生成订单)。"""
id = models.AutoField(primary_key=True)
huodong_id = models.PositiveIntegerField(db_index=True, verbose_name='活动ID')
mingzi = models.CharField(max_length=64, verbose_name='奖品名')
tupian_url = models.CharField(max_length=500, blank=True, default='', verbose_name='奖品图')
shangpin_id = models.PositiveIntegerField(
null=True, blank=True, db_index=True, verbose_name='中奖后履约商品ID',
)
quanzhong = models.PositiveIntegerField(default=1, verbose_name='中奖权重')
paixu = models.PositiveSmallIntegerField(default=0, verbose_name='格子序号')
shi_xiexie = models.BooleanField(default=False, verbose_name='是否谢谢参与')
CreateTime = models.DateTimeField(auto_now_add=True)
UpdateTime = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'zhuanpan_jiangpin'
verbose_name = '转盘奖品'
verbose_name_plural = verbose_name
indexes = [models.Index(fields=['huodong_id', 'paixu'])]
class ZhuanpanJihui(QModel):
"""转盘抽奖机会单:支付成功后待抽,不进抢单池;抽中后再写 Order。
zhuangtai: 9=待支付 1=已付待抽 2=已抽 3=关闭/作废
"""
id = models.AutoField(primary_key=True)
club_id = models.CharField(max_length=16, db_index=True, verbose_name='俱乐部')
yonghuid = models.CharField(max_length=32, db_index=True, verbose_name='用户UID')
huodong_id = models.PositiveIntegerField(db_index=True, verbose_name='活动ID')
czjilu_dingdan_id = models.CharField(
max_length=64, unique=True, db_index=True, verbose_name='支付流水单号',
)
jine = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='购票金额')
zhuangtai = models.PositiveSmallIntegerField(default=9, db_index=True, verbose_name='状态')
nicheng = models.CharField(max_length=50, blank=True, default='', verbose_name='游戏昵称')
beizhu = models.CharField(max_length=200, blank=True, default='', verbose_name='备注')
zhongjiang_jiangpin_id = models.PositiveIntegerField(null=True, blank=True, verbose_name='中奖奖品ID')
zhongjiang_shangpin_id = models.PositiveIntegerField(null=True, blank=True, verbose_name='中奖商品ID')
dingdan_id = models.CharField(
max_length=32, blank=True, default='', db_index=True,
verbose_name='中奖后生成的订单号',
)
CreateTime = models.DateTimeField(auto_now_add=True)
UpdateTime = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'zhuanpan_jihui'
verbose_name = '转盘抽奖机会'
verbose_name_plural = verbose_name
indexes = [
models.Index(fields=['club_id', 'yonghuid', 'zhuangtai']),
]