修复了罚单履约与回退机制

This commit is contained in:
2026-07-10 15:18:45 +08:00
parent e123510185
commit 5eebbfbff1
3 changed files with 61 additions and 3 deletions

View File

@@ -205,17 +205,33 @@ def fulfill_fakuan(dingdan_id, paid_amount_yuan=None):
fadan = None fadan = None
m = re.search(r'#fadan:(\d+)', order.shuoming or '') m = re.search(r'#fadan:(\d+)', order.shuoming or '')
if m: if m:
fadan_id_str = m.group(1)
fadan = Penalty.query.filter( fadan = Penalty.query.filter(
id=int(m.group(1)), id=int(fadan_id_str),
PenalizedUserID=order.yonghuid, PenalizedUserID=order.yonghuid,
Status__in=[1, 3], Status__in=[1, 3],
).first() ).first()
if not fadan:
logger.warning(
'罚款订单 %s shuoming 标记罚单 %s 未找到(被处罚者=%s, 状态需为1/3)',
dingdan_id, fadan_id_str, order.yonghuid,
)
else:
logger.warning(
'罚款订单 %s shuoming 无 #fadan:xxx 标记,回退金额匹配: %s',
dingdan_id, order.shuoming,
)
if not fadan: if not fadan:
fadan = Penalty.query.filter( fadan = Penalty.query.filter(
PenalizedUserID=order.yonghuid, PenalizedUserID=order.yonghuid,
FineAmount=order.jine, FineAmount=order.jine,
Status__in=[1, 3], Status__in=[1, 3],
).order_by('-CreateTime').first() ).order_by('-CreateTime').first()
if fadan:
logger.warning(
'罚款订单 %s 回退金额匹配到罚单 %s(金额=%s',
dingdan_id, fadan.id, order.jine,
)
if fadan: if fadan:
fadan.Status = 2 fadan.Status = 2
fadan.save(update_fields=['Status']) fadan.save(update_fields=['Status'])
@@ -224,6 +240,11 @@ def fulfill_fakuan(dingdan_id, paid_amount_yuan=None):
logger.error('罚单 %s 分红处理失败: %s', fadan.id, msg) logger.error('罚单 %s 分红处理失败: %s', fadan.id, msg)
else: else:
logger.info('罚单 %s 分红处理完成: %s', fadan.id, msg) logger.info('罚单 %s 分红处理完成: %s', fadan.id, msg)
else:
logger.error(
'罚款订单 %s 未找到对应罚单,罚单状态未更新(被处罚者=%s, 金额=%s)',
dingdan_id, order.yonghuid, order.jine,
)
except Exception as exc: except Exception as exc:
logger.error('罚款罚单状态更新失败 dingdan=%s: %s', dingdan_id, exc, exc_info=True) logger.error('罚款罚单状态更新失败 dingdan=%s: %s', dingdan_id, exc, exc_info=True)

View File

@@ -602,7 +602,24 @@ class ShangjiaChenggong(APIView):
'message': '订单不存在或不属于当前用户' 'message': '订单不存在或不属于当前用户'
}, status=status.HTTP_400_BAD_REQUEST) }, status=status.HTTP_400_BAD_REQUEST)
# 3. 检查订单状态是否为已支付3 # 3. 订单未支付时,尝试补偿履约(回调延迟/失败时通过轮询兜底
if order.zhuangtai == 9:
from jituan.services.czjilu_fulfill import confirm_czjilu_paid, CzjiluFulfillError
try:
confirm_czjilu_paid(dingdanid, request.user.UserUID, expected_leixing=4)
order = Czjilu.query.get(
dingdan_id=dingdanid,
yonghuid=request.user.UserUID,
leixing=4
)
except CzjiluFulfillError as exc:
logger.info(f"商家充值确认未就绪 {dingdanid}: {exc}")
return Response({
'code': 400,
'message': '订单尚未支付完成'
}, status=status.HTTP_400_BAD_REQUEST)
# 4. 检查订单状态是否为已支付3
if order.zhuangtai != 3: if order.zhuangtai != 3:
logger.info(f"商家订单{dingdanid}尚未支付完成,当前状态: {order.zhuangtai}") logger.info(f"商家订单{dingdanid}尚未支付完成,当前状态: {order.zhuangtai}")
return Response({ return Response({
@@ -610,7 +627,7 @@ class ShangjiaChenggong(APIView):
'message': '订单尚未支付完成' 'message': '订单尚未支付完成'
}, status=status.HTTP_400_BAD_REQUEST) }, status=status.HTTP_400_BAD_REQUEST)
# 4. 获取商家余额(通过反向查询) # 5. 获取商家余额(通过反向查询)
try: try:
shangjia = request.user.ShopProfile shangjia = request.user.ShopProfile
yue = float(shangjia.yue) # 转为浮点数方便前端处理 yue = float(shangjia.yue) # 转为浮点数方便前端处理

View File

@@ -475,6 +475,16 @@ class FaKuanPayPollView(APIView):
return Response({'code': 400, 'message': '订单ID不能为空'}) return Response({'code': 400, 'message': '订单ID不能为空'})
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID) order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID)
# 订单未支付时,尝试补偿履约(回调延迟/失败时通过轮询兜底)
if order.zhuangtai == 9:
from jituan.services.czjilu_fulfill import confirm_czjilu_paid, CzjiluFulfillError
try:
confirm_czjilu_paid(dingdanid, request.user.UserUID, expected_leixing=6)
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID)
except CzjiluFulfillError as exc:
logger.info(f"罚款确认未就绪 {dingdanid}: {exc}")
return Response({'code': 400, 'message': '订单尚未支付'})
if order.zhuangtai == 3: if order.zhuangtai == 3:
return Response({'code': 200, 'message': '支付成功'}) return Response({'code': 200, 'message': '支付成功'})
else: else:
@@ -998,6 +1008,16 @@ class KaohePayPollView(APIView):
return Response({'code': 400, 'message': '订单ID不能为空'}) return Response({'code': 400, 'message': '订单ID不能为空'})
try: try:
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID, leixing=5) order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID, leixing=5)
# 订单未支付时,尝试补偿履约(回调延迟/失败时通过轮询兜底)
if order.zhuangtai == 9:
from jituan.services.czjilu_fulfill import confirm_czjilu_paid, CzjiluFulfillError
try:
confirm_czjilu_paid(dingdanid, request.user.UserUID, expected_leixing=5)
order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.UserUID, leixing=5)
except CzjiluFulfillError as exc:
logger.info(f"考核确认未就绪 {dingdanid}: {exc}")
return Response({'code': 400, 'message': '订单尚未支付'})
if order.zhuangtai == 3: if order.zhuangtai == 3:
return Response({'code': 200, 'message': '支付成功'}) return Response({'code': 200, 'message': '支付成功'})
return Response({'code': 400, 'message': '订单尚未支付'}) return Response({'code': 400, 'message': '订单尚未支付'})