feat: UFO 转盘购票与专区图标(不影响现有俱乐部点单)
新增转盘活动/奖品/机会表与 Czjilu leixing=7 履约;专区 tupian_url;hqsp/详情下发 shi_zhuanpan。普通点单与抢单主链路保持不变。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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')
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user