修复定时任务更新接口:支持部分更新

PUT /schedules/{id} 原来要求完整 ScheduleIn(所有字段必传),
前端只传 {enabled} 时因缺少 task/cron 校验失败。
→ 新增 ScheduleUpdate schema(所有字段可选)
→ update_schedule 仅更新提供的字段
→ 使用最终值同步调度器

Co-Authored-By: new-provider/LongCat-2.0 <<EMAIL>>
)
This commit is contained in:
shangfangjian
2026-09-21 01:45:19 +08:00
parent 7a4e61ebc4
commit a9e85a5d62
2 changed files with 20 additions and 9 deletions
+13 -9
View File
@@ -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}