From a9e85a5d6270ab8126b24c271e6f08c862f0cb9a Mon Sep 17 00:00:00 2001 From: shangfangjian Date: Mon, 21 Sep 2026 01:45:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3:=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=83=A8=E5=88=86=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PUT /schedules/{id} 原来要求完整 ScheduleIn(所有字段必传), 前端只传 {enabled} 时因缺少 task/cron 校验失败。 → 新增 ScheduleUpdate schema(所有字段可选) → update_schedule 仅更新提供的字段 → 使用最终值同步调度器 Co-Authored-By: new-provider/LongCat-2.0 <> ) --- src/api/routes/schedules.py | 22 +++++++++++++--------- src/api/schemas.py | 7 +++++++ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/api/routes/schedules.py b/src/api/routes/schedules.py index c006b09..0b98486 100644 --- a/src/api/routes/schedules.py +++ b/src/api/routes/schedules.py @@ -8,7 +8,7 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select, delete from src.api.deps import require_admin -from src.api.schemas import ScheduleIn, ScheduleOut +from src.api.schemas import ScheduleIn, ScheduleUpdate, ScheduleOut from src.core.scheduler import scheduler from src.data.bzzoiro import ingest_bzzoiro_event_stats, ingest_bzzoiro_standings from src.data.sources import get_source @@ -98,21 +98,25 @@ async def create_schedule(req: ScheduleIn, db: AsyncSession = Depends(get_db_rea @router.put("/schedules/{schedule_id}") -async def update_schedule(schedule_id: str, req: ScheduleIn, db: AsyncSession = Depends(get_db_read)): - """更新定时任务。""" +async def update_schedule(schedule_id: str, req: ScheduleUpdate, db: AsyncSession = Depends(get_db_read)): + """更新定时任务(部分更新)。""" stmt = select(Schedule).where(Schedule.id == schedule_id) sched = (await db.execute(stmt)).scalar_one_or_none() if sched is None: raise HTTPException(404, "定时任务不存在") - sched.task = req.task - sched.cron = req.cron - sched.leagues = ",".join(req.leagues) if req.leagues else None - sched.enabled = req.enabled + if req.task is not None: + sched.task = req.task + if req.cron is not None: + sched.cron = req.cron + if req.leagues is not None: + sched.leagues = ",".join(req.leagues) if req.leagues else None + if req.enabled is not None: + sched.enabled = req.enabled await db.commit() - # 更新调度器 - scheduler.register(schedule_id, req.task, lambda: _run_scheduled_task(schedule_id), enabled=req.enabled) + # 更新调度器(使用最终值) + scheduler.register(schedule_id, sched.task, lambda: _run_scheduled_task(schedule_id), enabled=sched.enabled) return {"ok": True} diff --git a/src/api/schemas.py b/src/api/schemas.py index 0a581bd..9fc8993 100644 --- a/src/api/schemas.py +++ b/src/api/schemas.py @@ -129,6 +129,13 @@ class ScheduleIn(BaseModel): enabled: bool = True +class ScheduleUpdate(BaseModel): + task: str | None = None + cron: str | None = None + leagues: list[str] | None = None + enabled: bool | None = None + + class ScheduleOut(BaseModel): id: str task: str