__init__.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """定时任务模块"""
  2. import logging
  3. from apscheduler.schedulers.background import BackgroundScheduler
  4. from apscheduler.triggers.interval import IntervalTrigger
  5. from app.tasks.delivery_warning import check_delivery_warnings, cleanup_expired_warnings
  6. from app.tasks.order_payment_timeout import run_close_timeout_online_orders
  7. from app.tasks.order_auto_confirm_receive import run_auto_confirm_receive_job
  8. logger = logging.getLogger(__name__)
  9. scheduler = BackgroundScheduler()
  10. def init_scheduled_tasks(get_db_session):
  11. """初始化定时任务
  12. Args:
  13. get_db_session: 数据库会话获取函数(从 app.core.database 导入)
  14. """
  15. # 配送时效预警检查 - 每5分钟执行一次
  16. scheduler.add_job(
  17. func=_run_delivery_warning_check,
  18. trigger=IntervalTrigger(minutes=5),
  19. args=[get_db_session],
  20. id="delivery_warning_check",
  21. name="配送时效预警检查",
  22. replace_existing=True
  23. )
  24. # 清理过期预警记录 - 每天凌晨2点执行
  25. scheduler.add_job(
  26. func=_run_cleanup_expired_warnings,
  27. trigger=IntervalTrigger(hours=24),
  28. args=[get_db_session],
  29. id="cleanup_expired_warnings",
  30. name="清理过期预警记录",
  31. replace_existing=True
  32. )
  33. # 线上订单超时未支付关闭 - 每1分钟执行
  34. scheduler.add_job(
  35. func=_run_close_timeout_online_orders,
  36. trigger=IntervalTrigger(minutes=1),
  37. args=[get_db_session],
  38. id="close_timeout_online_orders",
  39. name="线上超时未支付订单关闭",
  40. replace_existing=True
  41. )
  42. # 送达后超时未确认收货 - 每小时执行
  43. scheduler.add_job(
  44. func=_run_auto_confirm_receive_overdue,
  45. trigger=IntervalTrigger(hours=1),
  46. args=[get_db_session],
  47. id="auto_confirm_receive_overdue",
  48. name="送达超时自动确认收货",
  49. replace_existing=True
  50. )
  51. scheduler.start()
  52. logger.info("定时任务调度器已启动")
  53. def _run_delivery_warning_check(get_db_session):
  54. """执行配送时效预警检查(定时任务包装)"""
  55. from app.core.database import SessionLocal
  56. db = SessionLocal()
  57. try:
  58. result = check_delivery_warnings(db)
  59. logger.info(f"配送时效预警检查完成: 检查了 {result.get('checked', 0)} 个任务,"
  60. f"创建了 {result.get('warnings_created', 0)} 个预警")
  61. except Exception as e:
  62. logger.error(f"配送时效预警检查失败: {str(e)}")
  63. finally:
  64. db.close()
  65. def _run_cleanup_expired_warnings(get_db_session):
  66. """清理过期预警记录(定时任务包装)"""
  67. from app.core.database import SessionLocal
  68. db = SessionLocal()
  69. try:
  70. count = cleanup_expired_warnings(db, days=7)
  71. logger.info(f"清理过期预警记录完成: 删除了 {count} 条记录")
  72. except Exception as e:
  73. logger.error(f"清理过期预警记录失败: {str(e)}")
  74. finally:
  75. db.close()
  76. def _run_close_timeout_online_orders(get_db_session):
  77. """关闭线上超时未支付订单(定时任务包装)"""
  78. from app.core.database import SessionLocal
  79. db = SessionLocal()
  80. try:
  81. run_close_timeout_online_orders(db)
  82. except Exception as e:
  83. logger.error(f"线上超时未支付订单关闭失败: {str(e)}")
  84. finally:
  85. db.close()
  86. def _run_auto_confirm_receive_overdue(get_db_session):
  87. from app.core.database import SessionLocal
  88. db = SessionLocal()
  89. try:
  90. run_auto_confirm_receive_job(db)
  91. except Exception as e:
  92. logger.error(f"自动确认收货任务失败: {str(e)}")
  93. finally:
  94. db.close()
  95. def shutdown_scheduler():
  96. """关闭定时任务调度器"""
  97. if scheduler.running:
  98. scheduler.shutdown(wait=False)
  99. logger.info("定时任务调度器已关闭")
  100. __all__ = [
  101. "check_delivery_warnings",
  102. "cleanup_expired_warnings",
  103. "scheduler",
  104. "init_scheduled_tasks",
  105. "shutdown_scheduler"
  106. ]