From 5eebbfbff1530bc030227a8fdd6d5817d29b390e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 10 Jul 2026 15:18:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E7=BD=9A=E5=8D=95?= =?UTF-8?q?=E5=B1=A5=E7=BA=A6=E4=B8=8E=E5=9B=9E=E9=80=80=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jituan/services/czjilu_fulfill.py | 23 ++++++++++++++++++++++- products/views/chongzhi_payment.py | 21 +++++++++++++++++++-- users/views/pay.py | 20 ++++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/jituan/services/czjilu_fulfill.py b/jituan/services/czjilu_fulfill.py index dfa1110..1d4446d 100644 --- a/jituan/services/czjilu_fulfill.py +++ b/jituan/services/czjilu_fulfill.py @@ -205,17 +205,33 @@ def fulfill_fakuan(dingdan_id, paid_amount_yuan=None): fadan = None m = re.search(r'#fadan:(\d+)', order.shuoming or '') if m: + fadan_id_str = m.group(1) fadan = Penalty.query.filter( - id=int(m.group(1)), + id=int(fadan_id_str), PenalizedUserID=order.yonghuid, Status__in=[1, 3], ).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: fadan = Penalty.query.filter( PenalizedUserID=order.yonghuid, FineAmount=order.jine, Status__in=[1, 3], ).order_by('-CreateTime').first() + if fadan: + logger.warning( + '罚款订单 %s 回退金额匹配到罚单 %s(金额=%s)', + dingdan_id, fadan.id, order.jine, + ) if fadan: fadan.Status = 2 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) else: logger.info('罚单 %s 分红处理完成: %s', fadan.id, msg) + else: + logger.error( + '罚款订单 %s 未找到对应罚单,罚单状态未更新(被处罚者=%s, 金额=%s)', + dingdan_id, order.yonghuid, order.jine, + ) except Exception as exc: logger.error('罚款罚单状态更新失败 dingdan=%s: %s', dingdan_id, exc, exc_info=True) diff --git a/products/views/chongzhi_payment.py b/products/views/chongzhi_payment.py index 4cacfaa..a727a08 100644 --- a/products/views/chongzhi_payment.py +++ b/products/views/chongzhi_payment.py @@ -602,7 +602,24 @@ class ShangjiaChenggong(APIView): 'message': '订单不存在或不属于当前用户' }, 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: logger.info(f"商家订单{dingdanid}尚未支付完成,当前状态: {order.zhuangtai}") return Response({ @@ -610,7 +627,7 @@ class ShangjiaChenggong(APIView): 'message': '订单尚未支付完成' }, status=status.HTTP_400_BAD_REQUEST) - # 4. 获取商家余额(通过反向查询) + # 5. 获取商家余额(通过反向查询) try: shangjia = request.user.ShopProfile yue = float(shangjia.yue) # 转为浮点数方便前端处理 diff --git a/users/views/pay.py b/users/views/pay.py index 452073f..06b1d8c 100644 --- a/users/views/pay.py +++ b/users/views/pay.py @@ -475,6 +475,16 @@ class FaKuanPayPollView(APIView): return Response({'code': 400, 'message': '订单ID不能为空'}) 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: return Response({'code': 200, 'message': '支付成功'}) else: @@ -998,6 +1008,16 @@ class KaohePayPollView(APIView): return Response({'code': 400, 'message': '订单ID不能为空'}) try: 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: return Response({'code': 200, 'message': '支付成功'}) return Response({'code': 400, 'message': '订单尚未支付'})