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