Files
vue-fastapi-admin/app/controllers/automation/task.py
T
2026-06-25 17:41:06 +08:00

77 lines
2.9 KiB
Python

# app/controllers/automation.py (继续追加)
from app.core.crud import CRUDBase
from typing import List, Optional, Dict, Any, Tuple
from tortoise.expressions import Q
from app.models.automation import Task, Scenario, ScenarioScope
from app.schemas.automation import TaskCreate, TaskUpdate
from datetime import datetime, timedelta
class TaskController(CRUDBase[Task, TaskCreate, TaskUpdate]):
def __init__(self):
super().__init__(model=Task)
async def get_user_tasks(
self,
user_id: str,
status: Optional[str] = None,
page: int = 1,
page_size: int = 20
) -> Tuple[int, List[Task]]:
"""分页获取某用户的待办(支持按状态过滤)"""
query = Q(assignee_user_id=user_id)
if status:
query &= Q(status=status)
return await self.list(page=page, page_size=page_size, search=query, order=["-created_at"])
async def get_tasks_by_customer(self, customer_id: str) -> List[Task]:
"""获取与某客户相关的所有待办(用于侧边栏上下文)"""
return await self.model.filter(related_customer_id=customer_id).order_by("-created_at").all()
async def create_from_scenario(
self,
scenario: Scenario,
event_data: Optional[Dict[str, Any]] = None,
assignee_user_id: Optional[str] = None,
assignee_username: Optional[str] = None,
reason: Optional[str] = None,
) -> Task:
"""根据场景模板创建待办任务"""
# 计算截止时间(示例:场景中定义的 due_days 天后)
due_at = scenario.due_days and (datetime.now() + timedelta(days=scenario.due_days)) or None
owner_user_id = None
if scenario.scope == ScenarioScope.ALL:
owner_user_id = ScenarioScope.ALL
elif scenario.scope == ScenarioScope.PERSONAL:
owner_user_id = scenario.owner_user_id
task_in = TaskCreate(
title=scenario.title,
reason=reason,
notes=scenario.notes,
event_data=event_data or {},
source_scenario=scenario,
source_scenario_id=scenario.id,
owner_user_id=owner_user_id,
assignee_user_id=assignee_user_id,
assignee_username=assignee_username,
due_at=due_at,
status="pending",
auto_closeable=True,
)
return await self.create(task_in)
async def auto_close_by_event(self, event_type: str, payload: Dict[str, Any]) -> List[Task]:
"""
根据事件自动关闭匹配的待办(用于自动消除)
例如:当 group_id 匹配且动作含 create_group 时,关闭待办
"""
# 示例逻辑:后续可扩展为规则引擎
closed_tasks = []
# 这里可遍历 pending 任务,检查 content 中的动作是否已被事件满足
# 为简化,此处留作扩展点
return closed_tasks
task_controller = TaskController()