ForcePilot/server/routers/task_router.py
Wenjie Zhang 43ec5a4a71 feat: 实现异步任务管理系统和任务中心UI
## 后端变更

  ### 任务管理核心
  - 新增 tasker 服务,支持异步任务队列和工作线程池
  - 添加任务执行时间追踪(started_at, completed_at)
  - 实现任务状态持久化(JSON文件存储)
  - 支持任务取消和进度更新

  ### 知识库导入优化
  - 将知识库文档导入改为异步任务处理
  - 逐个处理文档并实时更新进度(5% → 95%)
  - 支持任务取消检测

  ### API接口
  - 新增任务列表、详情、取消等REST API
  - 任务API需要管理员权限

  ### 测试
  - 添加任务路由集成测试

  ## 前端变更

  ### 任务中心UI
  - 新增任务中心抽屉组件,采用简洁的卡片式设计
  - 支持任务状态筛选(全部/进行中/已完成/失败)
  - 进行中任务显示实时进度条
  - 已完成任务显示执行时长和完成状态徽章
  - 支持相对时间显示(如:5分钟前)

  ### 状态管理
  - 新增 tasker store,管理任务列表和轮询
  - 支持任务注册、刷新、取消操作

  ### 交互优化
  - 在状态栏和侧边栏添加任务中心入口
  - 显示活跃任务数量徽章
  - 知识库导入自动注册到任务中心
2025-10-11 15:02:24 +08:00

36 lines
1.2 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query
from src.storage.db.models import User
from server.services.tasker import tasker
from server.utils.auth_middleware import get_admin_user
tasks = APIRouter(prefix="/tasks", tags=["tasks"])
@tasks.get("")
async def list_tasks(
status: str | None = Query(default=None),
current_user: User = Depends(get_admin_user),
):
"""List tasks, optionally filtered by status."""
task_list = await tasker.list_tasks(status=status)
return {"tasks": task_list}
@tasks.get("/{task_id}")
async def get_task(task_id: str, current_user: User = Depends(get_admin_user)):
"""Retrieve a single task by id."""
task = await tasker.get_task(task_id)
if not task:
raise HTTPException(status_code=404, detail="Task not found")
return {"task": task}
@tasks.post("/{task_id}/cancel")
async def cancel_task(task_id: str, current_user: User = Depends(get_admin_user)):
"""Request cancellation of a task."""
success = await tasker.cancel_task(task_id)
if not success:
raise HTTPException(status_code=400, detail="Task cannot be cancelled")
return {"task_id": task_id, "status": "cancelled"}