82 lines
3.9 KiB
Python
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() |