From 5ef98ef5b346a8dff1ae70491c1d235664f7cc3f Mon Sep 17 00:00:00 2001 From: DXC Date: Tue, 12 May 2026 14:16:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(scheduler):=20=E5=A2=9E=E5=8A=A0=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E9=A2=84=E8=AD=A6=E6=AF=8F=E6=97=A5=209:30=20?= =?UTF-8?q?=E5=AE=9A=E6=97=B6=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/requirements.txt | 6 +++++- inventory-backend/run.py | 32 +++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/inventory-backend/requirements.txt b/inventory-backend/requirements.txt index 484a116..076490f 100644 --- a/inventory-backend/requirements.txt +++ b/inventory-backend/requirements.txt @@ -17,4 +17,8 @@ qrcode[pil]>=7.4.2 # [新增] 必须添加,用于处理 token 登录 Flask-JWT-Extended==4.6.0 # [新增] Excel 处理库 (解决 No module named 'openpyxl' 报错) -openpyxl>=3.1.2 \ No newline at end of file +openpyxl>=3.1.2 +# [新增] 定时任务调度器 (库存预警每日邮件) +APScheduler==3.10.4 +# [新增] 时区处理 (APScheduler 需要) +pytz \ No newline at end of file diff --git a/inventory-backend/run.py b/inventory-backend/run.py index 97a8841..8fdbca0 100644 --- a/inventory-backend/run.py +++ b/inventory-backend/run.py @@ -1,9 +1,39 @@ # inventory-backend/run.py from app import create_app -# Gunicorn 或 uWSGI 会寻找名为 'app' 的实例 app = create_app() +# ========================================================= +# 启动时注册库存预警定时任务(每天 9:30 北京时) +# ========================================================= +from apscheduler.schedulers.background import BackgroundScheduler +from apscheduler.triggers.cron import CronTrigger +import pytz + +beijing_tz = pytz.timezone('Asia/Shanghai') + + +def _run_warning_job(): + with app.app_context(): + try: + from app.services.inventory_task import InventoryWarningService + result = InventoryWarningService.check_and_send_warning_emails() + print(f"[Scheduler] 库存预警扫描完成: red={result['red_count']}, yellow={result['yellow_count']}") + except Exception as e: + print(f"[Scheduler] 库存预警任务失败: {e}") + + +scheduler = BackgroundScheduler(timezone=beijing_tz) +scheduler.add_job( + func=_run_warning_job, + trigger=CronTrigger(hour=9, minute=30, tzinfo=beijing_tz), + id='inventory_warning_daily', + name='库存预警每日邮件发送', + replace_existing=True +) +scheduler.start() +print("✅ 库存预警定时任务已启动(每天 9:30 北京时间执行)") + if __name__ == '__main__': # ================================================= # 路由打印调试 (启动时会在控制台列出所有 URL)