# backend/app/api/executions.py from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import Optional from datetime import datetime from ..database import get_db from ..models import TaskExecutionLog, Spider from ..schemas import TaskExecutionLog as TaskExecutionLogSchema, ListResponse, SuccessResponse # 修复:确保变量名是 router router = APIRouter(prefix="/api/executions", tags=["executions"]) @router.post("/spiders/{spider_id}/run") def run_spider(spider_id: int, db: Session = Depends(get_db)): spider = db.query(Spider).filter(Spider.id == spider_id).first() if not spider: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="脚本不存在" ) # 创建执行记录 execution_log = TaskExecutionLog( spider_id=spider_id, status="RUNNING", trigger_method="MANUAL", started_at=datetime.now() ) db.add(execution_log) db.commit() db.refresh(execution_log) # TODO: 调用Celery任务 # run_spider_task.delay(spider_id, "MANUAL") return SuccessResponse( success=True, message=f"脚本 {spider.name} 开始执行,执行ID: {execution_log.id}" ) @router.get("/spiders/{spider_id}", response_model=ListResponse) def get_spider_executions(spider_id: int, limit: Optional[int] = None, db: Session = Depends(get_db)): # 验证spider存在 spider = db.query(Spider).filter(Spider.id == spider_id).first() if not spider: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="脚本不存在" ) query = db.query(TaskExecutionLog).filter(TaskExecutionLog.spider_id == spider_id) if limit: query = query.limit(limit) executions = query.order_by(TaskExecutionLog.started_at.desc()).all() # 加载spider信息 for execution in executions: execution.spider return ListResponse(total=len(executions), items=executions) @router.get("/{execution_id}", response_model=TaskExecutionLogSchema) def get_execution_log(execution_id: int, db: Session = Depends(get_db)): execution = db.query(TaskExecutionLog).filter(TaskExecutionLog.id == execution_id).first() if not execution: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="执行记录不存在" ) execution.spider return execution