188 lines
5.9 KiB
Python
188 lines
5.9 KiB
Python
# app/api/v1/automation.py
|
|
|
|
import logging
|
|
from typing import Dict, Any
|
|
from app.http_base import unified_resp
|
|
from fastapi import APIRouter, Query, Depends
|
|
from tortoise.expressions import Q
|
|
from app.controllers.automation.scenario import automation_scenario_controller
|
|
from app.controllers.automation.task import task_controller
|
|
from app.controllers.automation.action import action_controller
|
|
from app.schemas.automation import (
|
|
ScenarioCreate,
|
|
ScenarioUpdate,
|
|
ScenarioCopy,
|
|
TaskUpdate,
|
|
ActionUpdate,
|
|
)
|
|
from app.schemas.base import Success, SuccessExtra, Fail
|
|
from app.schemas.apis import Paginate
|
|
from ..weixin.base import get_weixin_user
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
# ============================
|
|
# Scenario 路由
|
|
# ============================
|
|
|
|
@router.get("/scenario/list", summary="查看场景列表")
|
|
@unified_resp
|
|
async def list_automation_scenario(
|
|
pagination: Paginate = Depends(),
|
|
title: str = Query("", description="场景标题,用于搜索"),
|
|
is_global: bool = Query(None, description="是否全局场景"),
|
|
enabled: bool = Query(None, description="是否启用"),
|
|
owner_user_id: str = Query("", description="归属用户ID(非全局时)"),
|
|
):
|
|
q = Q(visible=True)
|
|
if title:
|
|
q &= Q(title__contains=title)
|
|
if is_global is not None:
|
|
q &= Q(is_global=is_global)
|
|
if enabled is not None:
|
|
q &= Q(enabled=enabled)
|
|
if owner_user_id:
|
|
q &= Q(owner_user_id=owner_user_id)
|
|
|
|
total, scenario_objs = await automation_scenario_controller.list(
|
|
page=pagination.page, page_size=pagination.page_size, search=q, order=["-created_at"]
|
|
)
|
|
data = [await obj.to_dict() for obj in scenario_objs]
|
|
return {"count": total, "lists": data, "page": pagination.page, "page_size": pagination.page_size}
|
|
|
|
|
|
@router.get("/scenario/event_and_action", summary="查看场景事件和动作")
|
|
@unified_resp
|
|
async def list_event_and_action():
|
|
actions = await action_controller.list_automation_actions()
|
|
events = await automation_scenario_controller.list_automation_events()
|
|
return {"events": events, "actions": actions}
|
|
|
|
|
|
@router.get("/scenario/get/{id}", summary="查看场景详情")
|
|
@unified_resp
|
|
async def get_automation_scenario(id: int):
|
|
obj = await automation_scenario_controller.get(id=id)
|
|
return await obj.to_dict()
|
|
|
|
|
|
@router.post("/scenario/create", summary="创建场景")
|
|
@unified_resp
|
|
async def create_automation_scenario(
|
|
scenario_in: ScenarioCreate,
|
|
weixin_user: dict = Depends(get_weixin_user)
|
|
):
|
|
obj = await automation_scenario_controller.new_scenario(scenario_in, weixin_user.userid)
|
|
return await obj.to_dict()
|
|
|
|
|
|
@router.post("/scenario/copy", summary="复制场景")
|
|
@unified_resp
|
|
async def copy_automation_scenario(
|
|
scenario_in: ScenarioCopy,
|
|
):
|
|
def handler(obj_dict: Dict[str, Any]) -> Dict[str, Any]:
|
|
obj_dict["title"] = f"复制:{obj_dict['title']}"
|
|
obj_dict["enabled"] = False
|
|
return obj_dict
|
|
|
|
obj = await automation_scenario_controller.copy(id=scenario_in.id, handler=handler)
|
|
return await obj.to_dict()
|
|
|
|
|
|
@router.post("/scenario/update", summary="更新场景")
|
|
@unified_resp
|
|
async def update_automation_scenario(
|
|
scenario_in: ScenarioUpdate,
|
|
weixin_user: dict = Depends(get_weixin_user)
|
|
):
|
|
obj = await automation_scenario_controller.update_scenario(scenario_in=scenario_in, user_id=weixin_user.userid)
|
|
return await obj.to_dict()
|
|
|
|
|
|
@router.delete("/scenario/delete", summary="删除场景")
|
|
@unified_resp
|
|
async def delete_automation_scenario(
|
|
id: int = Query(..., description="场景ID"),
|
|
):
|
|
await automation_scenario_controller.remove_scenario(scenario_id=id)
|
|
return Success(msg="Deleted Successfully")
|
|
|
|
|
|
# ============================
|
|
# Task 路由
|
|
# ============================
|
|
|
|
@router.get("/task/list", summary="查看待办列表")
|
|
@unified_resp
|
|
async def list_task(
|
|
pagination: Paginate = Depends(),
|
|
assignee_user_id: str = Query("", description="指派人用户ID"),
|
|
status: str = Query("", description="任务状态"),
|
|
related_customer_id: str = Query("", description="关联客户ID"),
|
|
):
|
|
q = Q()
|
|
if assignee_user_id:
|
|
q &= Q(assignee_user_id=assignee_user_id)
|
|
if status:
|
|
q &= Q(status=status)
|
|
if related_customer_id:
|
|
q &= Q(related_customer_id=related_customer_id)
|
|
|
|
total, task_objs = await task_controller.list(
|
|
page=pagination.page, page_size=pagination.page_size, search=q
|
|
# , order=["-created_at"]
|
|
)
|
|
data = [await obj.to_dict() for obj in task_objs]
|
|
return {"count": total, "lists": data, "page": pagination.page, "page_size": pagination.page_size}
|
|
|
|
|
|
@router.get("/task/get", summary="查看待办详情")
|
|
@unified_resp
|
|
async def get_task(
|
|
id: int = Query(..., description="待办ID"),
|
|
):
|
|
obj = await task_controller.get(id=id)
|
|
return await obj.to_dict()
|
|
|
|
|
|
@router.post("/task/update", summary="更新待办")
|
|
@unified_resp
|
|
async def update_task(
|
|
task_in: TaskUpdate,
|
|
):
|
|
obj = await task_controller.update(id=task_in.id, obj_in=task_in)
|
|
return await obj.to_dict()
|
|
|
|
|
|
# ============================
|
|
# Action 路由
|
|
# ============================
|
|
|
|
@router.get("/action/list", summary="查看动作列表(按任务)")
|
|
@unified_resp
|
|
async def list_action(
|
|
task_id: int = Query(..., description="所属任务ID"),
|
|
):
|
|
actions = await action_controller.model.filter(task_id=task_id).all()
|
|
data = [await act.to_dict() for act in actions]
|
|
return data
|
|
|
|
|
|
# @router.get("/action/type", summary="查看动作类型列表(按任务)")
|
|
# @unified_resp
|
|
# async def list_action_type():
|
|
# actions = await action_controller.list_automation_actions()
|
|
# return actions
|
|
|
|
|
|
@router.post("/action/update", summary="更新动作(如标记完成)")
|
|
@unified_resp
|
|
async def update_action(
|
|
action_in: ActionUpdate,
|
|
):
|
|
obj = await action_controller.update(id=action_in.id, obj_in=action_in)
|
|
return await obj.to_dict() |