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

82 lines
3.9 KiB
Python

# app/controllers/automation.py (继续追加)
from app.core.crud import CRUDBase
from typing import List, Optional, Dict, Any
from app.models.automation import Action
from app.models.enums import ActionType
from app.schemas.automation import ActionCreate, ActionUpdate
from app.utils.common import transform_pydantic_to_list
from app.schemas.automation import NotifyAction
class ActionController(CRUDBase[Action, ActionCreate, ActionUpdate]):
def __init__(self):
super().__init__(model=Action)
async def get_pending_actions_by_task(self, task_id: int) -> List[Action]:
"""获取某任务中未完成的动作"""
return await self.model.filter(task_id=task_id, done=False).all()
async def list_automation_actions(self) -> List[Dict[str, Any]]:
"""获取动作类型映射"""
ActionTypeMap = [
{"value": ActionType.CREATE_GROUP, "label": "创建群聊", "automation": True, "allowAutoExecute": False, "autoExecute": False, "enable": True},
{"value": ActionType.VIEW_ERP_LOG, "label": "查看ERP日志", "automation": False, "allowAutoExecute": False, "autoExecute": False, "enable": True},
{"value": ActionType.BIND_USER, "label": "绑定用户", "automation": False, "allowAutoExecute": False, "autoExecute": False, "enable": True},
{"value": ActionType.BIND_ORDER, "label": "绑定订单", "automation": False, "allowAutoExecute": False, "autoExecute": False, "enable": True},
{"value": ActionType.WRITE_REMARK, "label": "写ERP额外备注", "automation": True, "allowAutoExecute": True, "autoExecute": True, "enable": True},
{"value": ActionType.SEND_WECHAT_NOTIFY, "label": "发送通知", "automation": True, "allowAutoExecute": True, "autoExecute": True, "enable": True, "schema": transform_pydantic_to_list(NotifyAction)},
{"value": ActionType.CLEAN_GROUP, "label": "清理群聊", "automation": True, "allowAutoExecute": False, "autoExecute": True, "enable": True},
{"value": ActionType.SET_GROUP_ADMIN, "label": "设置群管理员", "automation": True, "allowAutoExecute": False, "autoExecute": True, "enable": True},
]
return [item for item in ActionTypeMap if item["automation"]]
async def mark_action_done(
self,
action_id: int,
userid: str,
username: str,
result: Dict[str, Any],
notes: Optional[str] = None
) -> Action:
"""标记动作为已完成"""
update_data = ActionUpdate(
done=True,
done_at=self.model._meta.db_fields.get("done_at").to_db_value(None, None), # 实际用 datetime.now()
userid=userid,
username=username,
result=result,
notes=notes
)
# Note: 建议在 service 层处理 done_at = datetime.utcnow()
return await self.update(action_id, update_data)
async def create_actions_for_task(self, task_id: int, actions_def: List[Dict]) -> List[Action]:
"""为任务批量创建动作实例"""
actions = []
for act in actions_def:
action_in = ActionCreate(
task_id=task_id,
type=act.get("type"),
detail=act.get("detail", {}),
done=False
)
action = await self.create(action_in)
actions.append(action)
return actions
async def trigger_scenarios(self, scenario_list: List[Action], event_data: Dict[str, Any]) -> None:
"""触发场景执行"""
for scenario in scenario_list:
if not scenario.enabled:
continue
for action in scenario.actions:
if not action.enabled:
continue
if action.type == ActionType.SEND_WECHAT_NOTIFY:
await self.trigger_scenarios_by_action(action, event_data)
action_controller = ActionController()