Files
kami_apple_exchage/backend/app/services/task_service.py
danial 5c486e34d3 docs(项目): 添加项目文档并进行代码调整
- 新增 CODEBUDDY.md、GEMINI.md、GEMINI_CN.md 等项目文档
- 更新 Dockerfile 和其他配置文件
- 优化部分代码结构,如 orders.py、tasks.py 等
- 新增 .dockerignore 文件
2025-09-12 19:38:24 +08:00

285 lines
9.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
任务服务层
处理任务相关的业务逻辑
"""
import traceback
from typing import Any, Optional
from datetime import datetime
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.state_manager import StateType, TaskState, task_state_manager
from app.core.log import get_logger
from app.schemas.task import (
TaskListItem,
TaskListResponse,
TaskUserInfo,
TaskLinkInfo,
TaskCardInfo,
GiftCardSubmissionRequest,
GiftCardSubmissionResponse,
)
from app.repositories.task_repository import TaskRepository
from app.enums.task import OrderTaskStatus
logger = get_logger(__name__)
class TaskService:
"""任务服务类"""
def __init__(self, db: AsyncSession):
self.db = db
self.task_repo = TaskRepository(db)
async def get_task_list(self) -> TaskListResponse:
"""
获取任务列表
Returns:
TaskListResponse: 任务列表响应
"""
try:
# 获取所有任务状态
all_tasks: list[TaskState] = (
await task_state_manager.state_manager.list_states(StateType.TASK)
)
task_list = []
for task in all_tasks:
# 创建任务列表项
task_item = TaskListItem(
task_id=task.identifier,
worker_id=task.worker_id,
order_id=task.worker_id,
status=task.status,
progress=task.progress,
created_at=task.created_at,
updated_at=task.updated_at,
completed_at=task.completed_at,
failed_at=task.failed_at,
error_message=task.error_message,
)
# 如果有订单ID获取关联的用户、链接和礼品卡信息
order_id = task_item.order_id
if order_id:
await self._enrich_task_with_order_data(task_item, order_id)
task_list.append(task_item)
logger.info(f"获取任务列表成功,共{len(task_list)}个任务")
return TaskListResponse(
success=True,
tasks=task_list,
total=len(task_list),
message="获取任务列表成功",
)
except Exception as e:
logger.error(f"获取任务列表失败: {traceback.format_exc()}")
raise
async def _enrich_task_with_order_data(
self, task_item: TaskListItem, order_id: str
) -> None:
"""
使用订单数据丰富任务信息
Args:
task_item: 任务项
order_id: 订单ID
"""
try:
# 查询订单及其所有关联数据
order = await self.task_repo.get_order_with_all_relations(order_id)
if not order:
return
# 获取用户信息
if order.user_data:
user_data = order.user_data
task_item.user_info = TaskUserInfo(
first_name=user_data.first_name,
last_name=user_data.last_name,
email=user_data.email,
phone=user_data.phone,
street_address=user_data.street_address,
city=user_data.city,
state=user_data.state,
zip_code=user_data.zip_code,
)
# 获取链接信息
if order.links:
link = order.links
task_item.link_info = TaskLinkInfo(
url=link.url, amount=link.amount, code=link.id # 使用链接ID作为代码
)
# 获取礼品卡信息
if order.gift_cards:
gift_card = order.gift_cards[0] # 取第一个礼品卡
task_item.card_info = TaskCardInfo(
card_number=gift_card.card_code,
status=gift_card.status.value,
failure_reason=gift_card.failure_reason,
)
except Exception as e:
logger.error(f"获取订单关联数据失败: {e}")
async def submit_gift_card(
self, request: GiftCardSubmissionRequest
) -> GiftCardSubmissionResponse:
"""
提交礼品卡信息并更新任务状态
Args:
request: 礼品卡提交请求
Returns:
GiftCardSubmissionResponse: 操作结果
"""
try:
# 获取现有任务
task = await task_state_manager.get_task_state(request.task_id)
if not task:
raise ValueError("任务不存在")
# 更新任务结果,包含礼品卡信息
updated_result = task.result.copy() if task.result else {}
updated_result.update(
{
"card_code": request.card_code,
"card_value": request.card_value,
"submitted_at": datetime.now().isoformat(),
}
)
# 更新任务状态为已接收礼品卡
success = await task_state_manager.update_task_state(
task_id=request.task_id,
status=OrderTaskStatus.GIFT_CARD_RECEIVED,
result=updated_result,
)
if success:
logger.info(f"礼品卡提交成功任务ID: {request.task_id}")
return GiftCardSubmissionResponse(
success=True, task_id=request.task_id, message="礼品卡提交成功"
)
else:
raise RuntimeError("更新任务状态失败")
except Exception as e:
logger.error(f"提交礼品卡失败: {e}")
raise
async def get_task_by_id(self, task_id: str) -> Optional[TaskListItem]:
"""
根据任务ID获取任务详情
Args:
task_id: 任务ID
Returns:
TaskListItem | None: 任务详情
"""
try:
task = await task_state_manager.get_task_state(task_id)
if not task:
return None
# 获取任务基础信息
task_dict = (
task.model_dump()
if hasattr(task, "model_dump")
else task.dict() if hasattr(task, "dict") else vars(task)
)
# 创建任务列表项
task_item = TaskListItem(
task_id=task_dict.get("identifier", ""),
worker_id=task_dict.get("worker_id"),
order_id=(
task_dict.get("result", {}).get("order_id")
if task_dict.get("result")
else None
),
status=task_dict.get("status", ""),
progress=task_dict.get("progress", 0.0),
created_at=task_dict.get("created_at", ""),
updated_at=task_dict.get("updated_at", ""),
completed_at=task_dict.get("completed_at"),
failed_at=task_dict.get("failed_at"),
error_message=task_dict.get("error_message"),
)
# 如果有订单ID获取关联的用户、链接和礼品卡信息
order_id = task_item.order_id
if order_id:
await self._enrich_task_with_order_data(task_item, order_id)
return task_item
except Exception as e:
logger.error(f"获取任务详情失败: {e}")
raise
async def get_tasks_by_status(self, status: str) -> list[TaskListItem]:
"""
根据状态获取任务列表
Args:
status: 任务状态
Returns:
list[TaskListItem]: 任务列表
"""
try:
all_tasks = await task_state_manager.state_manager.list_states(
task_state_manager.state_manager.StateType.TASK
)
filtered_tasks = []
for task in all_tasks:
task_dict = (
task.model_dump()
if hasattr(task, "model_dump")
else task.dict() if hasattr(task, "dict") else vars(task)
)
if task_dict.get("status") == status:
task_item = TaskListItem(
task_id=task_dict.get("identifier", ""),
worker_id=task_dict.get("worker_id"),
order_id=(
task_dict.get("result", {}).get("order_id")
if task_dict.get("result")
else None
),
status=task_dict.get("status", ""),
progress=task_dict.get("progress", 0.0),
created_at=task_dict.get("created_at", ""),
updated_at=task_dict.get("updated_at", ""),
completed_at=task_dict.get("completed_at"),
failed_at=task_dict.get("failed_at"),
error_message=task_dict.get("error_message"),
)
# 如果有订单ID获取关联的用户、链接和礼品卡信息
order_id = task_item.order_id
if order_id:
await self._enrich_task_with_order_data(task_item, order_id)
filtered_tasks.append(task_item)
return filtered_tasks
except Exception as e:
logger.error(f"根据状态获取任务失败: {e}")
raise