first commit
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# 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()
|
||||
Reference in New Issue
Block a user