"""任务管理 API - 兼容 /api/v1/tasks 路径""" from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List from pathlib import Path from pydantic import BaseModel from ...database import get_db from ...models.job import Job, JobStatus from ...schemas.job import JobResponse from ...config import settings router = APIRouter() class TaskCreateRequest(BaseModel): """任务创建请求""" files: List[str] # 文件名列表 sequence_type: str = "nucl" min_identity: float = 0.8 min_coverage: float = 0.6 allow_unknown_families: bool = False require_index_hit: bool = True class QueuePosition(BaseModel): """队列位置信息""" position: int estimated_wait_minutes: int = None @router.post("/", response_model=JobResponse) async def create_task(request: TaskCreateRequest, db: Session = Depends(get_db)): """创建新任务(兼容前端)""" # 暂时复用 jobs 逻辑 # TODO: 实现完整的文件上传和处理 raise HTTPException(status_code=501, detail="Use POST /api/v1/jobs/create for now") @router.get("/{task_id}", response_model=JobResponse) async def get_task(task_id: str, db: Session = Depends(get_db)): """获取任务状态""" job = db.query(Job).filter(Job.id == task_id).first() if not job: raise HTTPException(status_code=404, detail="Task not found") return job @router.get("/{task_id}/queue") async def get_queue_position(task_id: str, db: Session = Depends(get_db)): """获取排队位置""" job = db.query(Job).filter(Job.id == task_id).first() if not job: raise HTTPException(status_code=404, detail="Task not found") if job.status not in [JobStatus.PENDING, JobStatus.QUEUED]: return {"position": 0, "message": "Task is not in queue"} # 计算排队位置 ahead_jobs = db.query(Job).filter( Job.id != task_id, Job.status.in_([JobStatus.PENDING, JobStatus.QUEUED]), Job.created_at < job.created_at ).count() position = ahead_jobs + 1 # 假设每个任务约5分钟 estimated_wait = position * 5 return QueuePosition(position=position, estimated_wait_minutes=estimated_wait)