From 93d5c503b29c6c421b34d883f644e8740922b5e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E5=8F=B8git?= <240241002@qq.com> Date: Fri, 23 Jan 2026 17:46:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(app):=20=E4=BF=AE=E5=A4=8D=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=90=8C=E6=AD=A5=E5=BE=85=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E8=AE=A2=E5=8D=95=E7=9A=84=E4=B8=8A=E4=B8=8B=E6=96=87?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 sync_pending_orders 增加 app 参数以使用 Flask 应用上下文 - 在函数内部使用 app.app_context() 包裹数据库操作,避免上下文错误 - 保持原有逻辑查询并更新30分钟内的待支付订单状态 - 增加日志记录和异常捕获,确保任务稳定运行 - 调度器调用时传入 app 作为参数以支持上下文执行 --- app.py | 108 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 53 deletions(-) diff --git a/app.py b/app.py index 0996925..73cd714 100644 --- a/app.py +++ b/app.py @@ -15,64 +15,65 @@ import logging import models # 定时任务函数 -def sync_pending_orders(): +def sync_pending_orders(app): """定时任务: 检查并同步30分钟内的待支付订单""" - from models import Order, User, get_bj_now - from services.alipay_service import AlipayService - from services.logger import system_logger - from datetime import timedelta - - try: - # 查询最还30分钟内的待支付订单 - thirty_min_ago = get_bj_now() - timedelta(minutes=30) - pending_orders = Order.query.filter( - Order.status == 'PENDING', - Order.created_at >= thirty_min_ago - ).all() + with app.app_context(): + from models import Order, User, get_bj_now + from services.alipay_service import AlipayService + from services.logger import system_logger + from datetime import timedelta - if not pending_orders: - return - - alipay_service = AlipayService() - updated_count = 0 - - for order in pending_orders: - try: - # 查询订单状态 - alipay_result = alipay_service.query_order_status(order.out_trade_no) - - if alipay_result and alipay_result.get('trade_status') in ['TRADE_SUCCESS', 'TRADE_FINISHED']: - # 使用行级锁重新查询,防止并发问题 - order_locked = Order.query.filter_by(out_trade_no=order.out_trade_no).with_for_update().first() + try: + # 查询最还30分钟内的待支付订单 + thirty_min_ago = get_bj_now() - timedelta(minutes=30) + pending_orders = Order.query.filter( + Order.status == 'PENDING', + Order.created_at >= thirty_min_ago + ).all() + + if not pending_orders: + return + + alipay_service = AlipayService() + updated_count = 0 + + for order in pending_orders: + try: + # 查询订单状态 + alipay_result = alipay_service.query_order_status(order.out_trade_no) - # 二次校验状态,防止异步回调已经处理 - if order_locked and order_locked.status == 'PENDING': - # 更新订单 - order_locked.status = 'PAID' - order_locked.trade_no = alipay_result.get('trade_no') - if not order_locked.paid_at: - order_locked.paid_at = get_bj_now() + if alipay_result and alipay_result.get('trade_status') in ['TRADE_SUCCESS', 'TRADE_FINISHED']: + # 使用行级锁重新查询,防止并发问题 + order_locked = Order.query.filter_by(out_trade_no=order.out_trade_no).with_for_update().first() - # 增加用户积分 - user = db.session.get(User, order_locked.user_id) - if user: - user.points += order_locked.points - system_logger.info(f"定时任务-订单支付成功", order_id=order_locked.out_trade_no, points=order_locked.points, user_id=user.id) - updated_count += 1 - - db.session.commit() - elif order_locked and order_locked.status == 'PAID': - # 订单已经被处理,跳过 - logging.info(f"定时任务-订单 {order.out_trade_no} 已被处理,跳过") - except Exception as e: - db.session.rollback() - logging.error(f"定时任务处理订单 {order.out_trade_no} 失败: {str(e)}") + # 二次校验状态,防止异步回调已经处理 + if order_locked and order_locked.status == 'PENDING': + # 更新订单 + order_locked.status = 'PAID' + order_locked.trade_no = alipay_result.get('trade_no') + if not order_locked.paid_at: + order_locked.paid_at = get_bj_now() + + # 增加用户积分 + user = db.session.get(User, order_locked.user_id) + if user: + user.points += order_locked.points + system_logger.info(f"定时任务-订单支付成功", order_id=order_locked.out_trade_no, points=order_locked.points, user_id=user.id) + updated_count += 1 + + db.session.commit() + elif order_locked and order_locked.status == 'PAID': + # 订单已经被处理,跳过 + logging.info(f"定时任务-订单 {order.out_trade_no} 已被处理,跳过") + except Exception as e: + db.session.rollback() + logging.error(f"定时任务处理订单 {order.out_trade_no} 失败: {str(e)}") + + if updated_count > 0: + logging.info(f"定时任务完成,帮助更新了{updated_count}个订单") - if updated_count > 0: - logging.info(f"定时任务完成,帮助更新了{updated_count}个订单") - - except Exception as e: - logging.error(f"定时任务异常: {str(e)}", exc_info=True) + except Exception as e: + logging.error(f"定时任务异常: {str(e)}", exc_info=True) # 导入模律(必需在 db.create_all() 之前导入) @@ -181,6 +182,7 @@ def create_app(): # 每分钟检查一次待支付订单 scheduler.add_job( func=sync_pending_orders, + args=[app], trigger=IntervalTrigger(minutes=1), id='sync_pending_orders', name='同步待支付订单',