"""APScheduler 定时任务 —— 自动生成报告并推送飞书""" import asyncio import logging from apscheduler.schedulers.asyncio import AsyncIOScheduler from database import SessionLocal logger = logging.getLogger(__name__) scheduler = AsyncIOScheduler(timezone="Asia/Shanghai") async def _run_report_job(report_type: str): """通用报告任务执行器""" from services.report_service import ( generate_daily_report, generate_weekly_report, generate_monthly_report, ) from services.feishu_service import feishu logger.info(f"[定时任务] 开始生成{report_type}...") db = SessionLocal() try: if report_type == "日报": result = generate_daily_report(db) elif report_type == "周报": result = generate_weekly_report(db) elif report_type == "月报": result = generate_monthly_report(db) else: logger.error(f"未知报告类型: {report_type}") return logger.info(f"[定时任务] {report_type}生成完成,开始推送飞书...") push_result = await feishu.send_report_to_all(result["title"], result["content"]) logger.info(f"[定时任务] {report_type}推送完成: {push_result}") except Exception as e: logger.error(f"[定时任务] {report_type}生成/推送失败: {e}", exc_info=True) finally: db.close() async def daily_report_job(): await _run_report_job("日报") async def weekly_report_job(): await _run_report_job("周报") async def monthly_report_job(): await _run_report_job("月报") def setup_scheduler(): """配置并启动定时任务""" # 日报:每天 20:00 scheduler.add_job( daily_report_job, "cron", hour=20, minute=0, id="daily_report", replace_existing=True, ) # 周报:每周五 20:00 scheduler.add_job( weekly_report_job, "cron", day_of_week="fri", hour=20, minute=0, id="weekly_report", replace_existing=True, ) # 月报:每月1日 10:00 scheduler.add_job( monthly_report_job, "cron", day=1, hour=10, minute=0, id="monthly_report", replace_existing=True, ) scheduler.start() logger.info( "[定时任务] 已启动 — 日报:每天20:00 | 周报:周五20:00 | 月报:每月1日10:00" )