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

@@ -27,6 +27,64 @@ class CzjiluFulfillError(Exception):
self.code = code
@transaction.atomic
def fulfill_zhuanpan(dingdan_id, paid_amount_yuan=None):
"""转盘购票履约Czjilu 标已付 + 抽奖机会改为待抽。绝不创建抢单池 Order。"""
from products.czjilu_types import CZJILU_LEIXING_ZHUANPAN, CZJILU_PAID_STATUS
from products.models import ZhuanpanJihui
try:
order = Czjilu.query.select_for_update().get(dingdan_id=dingdan_id)
except Czjilu.DoesNotExist:
raise CzjiluFulfillError('订单不存在', 'not_found')
if order.leixing != CZJILU_LEIXING_ZHUANPAN:
raise CzjiluFulfillError('订单类型不是转盘购票', 'type_error')
if order.zhuangtai == CZJILU_PAID_STATUS:
return {'already_done': True, 'dingdan_id': dingdan_id, 'zhuangtai': CZJILU_PAID_STATUS}
if not is_czjilu_fulfillable_status(order.zhuangtai):
return {'already_done': True, 'dingdan_id': dingdan_id, 'zhuangtai': order.zhuangtai}
amount = Decimal(str(order.jine))
if paid_amount_yuan is not None:
paid = Decimal(str(paid_amount_yuan))
if abs(paid - amount) > Decimal('0.01'):
raise CzjiluFulfillError(f'支付金额{paid}与订单{amount}不一致', 'amount_mismatch')
jihui = ZhuanpanJihui.query.select_for_update().filter(
czjilu_dingdan_id=dingdan_id
).first()
if not jihui:
raise CzjiluFulfillError('转盘机会单不存在', 'not_found')
order.zhuangtai = CZJILU_PAID_STATUS
order.save(update_fields=['zhuangtai'])
if int(jihui.zhuangtai) == 9:
jihui.zhuangtai = 1 # 已付待抽
jihui.save(update_fields=['zhuangtai', 'UpdateTime'])
try:
from jituan.services.szjilu_accounting import repair_wechat_income_if_missing
repair_wechat_income_if_missing(
amount,
getattr(order, 'club_id', None) or CLUB_ID_DEFAULT,
biz_ref=f'cz:{dingdan_id}',
)
except Exception as exc:
logger.error('转盘购票补记收支失败 dingdan=%s: %s', dingdan_id, exc, exc_info=True)
logger.info('转盘购票履约完成 dingdan=%s jihui=%s', dingdan_id, jihui.id)
return {
'already_done': False,
'dingdan_id': dingdan_id,
'zhuangtai': CZJILU_PAID_STATUS,
'jihui_id': jihui.id,
}
@transaction.atomic
def fulfill_yajin_recharge(dingdan_id, paid_amount_yuan=None):
"""押金充值幂等履约:仅待履约状态(9/用户关单2)时入账;已付(3)直接跳过防多加。"""
@@ -422,6 +480,8 @@ def confirm_czjilu_paid(dingdan_id, yonghuid, expected_leixing):
return fulfill_kaohe(dingdan_id, paid_amount_yuan=paid)
if expected_leixing == 6:
return fulfill_fakuan(dingdan_id, paid_amount_yuan=paid)
if expected_leixing == 7:
return fulfill_zhuanpan(dingdan_id, paid_amount_yuan=paid)
raise CzjiluFulfillError('不支持的充值类型', 'type_error')