mirror of
https://git.oceanpay.cc/danial/kami_apple_exchage.git
synced 2025-12-18 22:29:09 +00:00
- 新增 CODEBUDDY.md、GEMINI.md、GEMINI_CN.md 等项目文档 - 更新 Dockerfile 和其他配置文件 - 优化部分代码结构,如 orders.py、tasks.py 等 - 新增 .dockerignore 文件
285 lines
9.5 KiB
Python
285 lines
9.5 KiB
Python
"""
|
||
任务服务层
|
||
处理任务相关的业务逻辑
|
||
"""
|
||
|
||
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
|