This commit is contained in:
Your Name
2026-02-12 18:22:02 +08:00
parent a12bc92351
commit c030902c0a
6 changed files with 72 additions and 97 deletions

View File

@@ -1,32 +1,28 @@
# -*- coding: utf-8 -*-
"""
任务提交与查询 API。
任务提交与查询 API(需要登录)
"""
from __future__ import annotations
from typing import List, Optional
from fastapi import APIRouter, HTTPException
from fastapi import APIRouter, Depends, HTTPException
from common.protocol import TaskStatus
from server.models import TaskCreate, TaskOut
from server.core.worker_manager import worker_manager
from server.core.task_dispatcher import task_dispatcher
from server.api.deps import require_auth
router = APIRouter(prefix="/api/tasks", tags=["tasks"])
router = APIRouter(prefix="/api/tasks", tags=["tasks"], dependencies=[Depends(require_auth)])
@router.post("", response_model=TaskOut, status_code=201)
async def create_task(req: TaskCreate):
"""
提交一个新任务。
路由规则(优先级从高到低):
1. 如果指定了 worker_id → 直接发到该 Worker
2. 如果指定了 account_name → 查找拥有该浏览器的 Worker
3. 两者都没有 → 400 错误
路由规则worker_id > account_name。
"""
# 确定目标 worker_id
target_worker_id = req.worker_id
if not target_worker_id and req.account_name:
@@ -38,23 +34,14 @@ async def create_task(req: TaskCreate):
)
if not target_worker_id:
raise HTTPException(
status_code=400,
detail="请指定 worker_id 或 account_name",
)
raise HTTPException(status_code=400, detail="请指定 worker_id 或 account_name")
# 检查 Worker 是否在线
if not worker_manager.is_online(target_worker_id):
raise HTTPException(
status_code=503,
detail=f"Worker {target_worker_id} 不在线",
)
raise HTTPException(status_code=503, detail=f"Worker {target_worker_id} 不在线")
# 创建任务
req.worker_id = target_worker_id
task = task_dispatcher.create_task(req)
# 通过 WebSocket 派发
ws = worker_manager.get_ws(target_worker_id)
if not ws:
task.status = TaskStatus.FAILED
@@ -65,9 +52,7 @@ async def create_task(req: TaskCreate):
if not success:
raise HTTPException(status_code=503, detail=f"任务派发失败: {task.error}")
# 更新 Worker 当前任务
worker_manager.set_current_task(target_worker_id, task.task_id)
return _to_out(task)