task_router.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. """
  2. 任务管理V2路由
  3. 提供统一的任务查询和管理API端点
  4. """
  5. from typing import List
  6. from fastapi import APIRouter, Depends, HTTPException
  7. from sqlalchemy.orm import Session
  8. from app.database import get_db
  9. from app.models.user import User
  10. from app.middleware import get_current_user_from_request
  11. from app.schemas.model_schema import ApiResponse
  12. from app.schemas.audio_v2 import (
  13. TaskStatusResponse,
  14. BatchDeleteRequest,
  15. BatchDeleteResponse,
  16. UserAudioStatisticsResponse
  17. )
  18. from app.services.audio_v2 import TaskManager
  19. router = APIRouter(prefix="/tasks", tags=["任务管理V2"])
  20. @router.get("/{task_id}/status", response_model=ApiResponse[TaskStatusResponse])
  21. def get_task_status(
  22. task_id: str,
  23. db: Session = Depends(get_db),
  24. current_user: User = Depends(get_current_user_from_request)
  25. ):
  26. """
  27. 查询任务状态(跨所有任务类型)
  28. 根据task_id查询任务状态,自动识别任务类型
  29. Args:
  30. task_id: 任务ID
  31. Returns:
  32. 任务状态信息(包含状态、进度、错误信息等)
  33. """
  34. manager = TaskManager(db, current_user.id)
  35. result = manager.get_task_status(task_id)
  36. return ApiResponse(
  37. code=200,
  38. message="success",
  39. data=result
  40. )
  41. @router.delete("/{task_id}/cancel", response_model=ApiResponse[bool])
  42. def cancel_task(
  43. task_id: str,
  44. db: Session = Depends(get_db),
  45. current_user: User = Depends(get_current_user_from_request)
  46. ):
  47. """
  48. 取消任务(仅PENDING状态可取消)
  49. Args:
  50. task_id: 任务ID
  51. Returns:
  52. 是否成功取消
  53. """
  54. manager = TaskManager(db, current_user.id)
  55. result = manager.cancel_task(task_id)
  56. return ApiResponse(
  57. code=200,
  58. message="任务已取消",
  59. data=result
  60. )
  61. @router.delete("/{task_id}", response_model=ApiResponse[bool])
  62. def delete_task(
  63. task_id: str,
  64. db: Session = Depends(get_db),
  65. current_user: User = Depends(get_current_user_from_request)
  66. ):
  67. """
  68. 删除任务记录
  69. Args:
  70. task_id: 任务ID
  71. Returns:
  72. 是否成功删除
  73. """
  74. manager = TaskManager(db, current_user.id)
  75. result = manager.delete_task(task_id)
  76. return ApiResponse(
  77. code=200,
  78. message="任务已删除",
  79. data=result
  80. )
  81. @router.post("/batch-delete", response_model=ApiResponse[BatchDeleteResponse])
  82. def batch_delete_tasks(
  83. request: BatchDeleteRequest,
  84. db: Session = Depends(get_db),
  85. current_user: User = Depends(get_current_user_from_request)
  86. ):
  87. """
  88. 批量删除任务
  89. Args:
  90. request: 批量删除请求(包含task_ids列表)
  91. Returns:
  92. 删除结果统计(成功数、失败数、失败详情)
  93. """
  94. manager = TaskManager(db, current_user.id)
  95. result = manager.batch_delete_tasks(request.task_ids)
  96. return ApiResponse(
  97. code=200,
  98. message=f"批量删除完成,成功{result['success_count']}个,失败{result['failed_count']}个",
  99. data=BatchDeleteResponse(**result)
  100. )
  101. @router.get("/statistics", response_model=ApiResponse[UserAudioStatisticsResponse])
  102. def get_user_statistics(
  103. db: Session = Depends(get_db),
  104. current_user: User = Depends(get_current_user_from_request)
  105. ):
  106. """
  107. 获取用户语音统计信息
  108. 包含语音识别、语音合成、声音克隆、长文本转音频的统计数据
  109. Returns:
  110. 用户语音统计信息(各类任务的数量、费用等)
  111. """
  112. manager = TaskManager(db, current_user.id)
  113. result = manager.get_user_statistics()
  114. return ApiResponse(
  115. code=200,
  116. message="success",
  117. data=result
  118. )