from __future__ import annotations from .shared import * from .schemas import WorkflowTriggerRequest @router.post("/workflow/trigger") async def trigger_workflow( request: WorkflowTriggerRequest, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id) ): """ 触发事件驱动工作流 支持的事件类型: - high_impact_signal: 高影响信号到达 - blocker_detected: 阻塞检测 - cognitive_conflict: 认知冲突 - tech_stack_change: 技术栈变更 - competitor_update: 竞品动态 - task_completed: 任务完成 - task_blocked: 任务阻塞 - project_risk: 项目风险 工作流会自动: 1. 调整项目优先级 2. 创建响应任务 3. 通知相关角色 4. 更新依赖关系 """ try: engine = get_event_workflow_engine(db) result = await engine.trigger_workflow( event_type=request.event_type, event_data=request.event_data, tenant_id=tenant_id ) return result except Exception as e: raise HTTPException( status_code=500, detail=f"工作流触发失败: {str(e)}" ) @router.post("/workflow/signal/{signal_id}") async def trigger_signal_workflow( signal_id: int, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id) ): """ 当接收到高影响信号时自动触发工作流 检查信号的 impact_score,如果超过阈值(0.85), 自动触发工作流来调整相关项目的优先级 """ from ...models import Signal from sqlalchemy.future import select signal_result = await db.execute( select(Signal).where( Signal.id == signal_id, Signal.tenant_id == tenant_id ) ) signal = signal_result.scalar_one_or_none() if not signal: raise HTTPException(status_code=404, detail="信号不存在") # 检查是否达到阈值 if signal.impact_score < 0.85: return { 'status': 'ignored', 'reason': f'信号影响分数 {signal.impact_score} 低于阈值 0.85' } # 触发高影响信号工作流 engine = get_event_workflow_engine(db) result = await engine.trigger_workflow( event_type=WorkflowEventType.HIGH_IMPACT_SIGNAL, event_data={'signal_id': signal_id}, tenant_id=tenant_id ) return result @router.get("/workflow/status") async def get_workflow_status( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id) ): """ 获取工作流状态 显示最近触发的工作流及其结果 """ from ...models import AICallLog from sqlalchemy.future import select # 获取最近的工作流记录 # 这里简化处理,实际应该有专门的工作流记录表 return { 'active_workflows': [], 'recent_triggers': [], 'message': '工作流状态追踪' } @router.post("/workflow/auto-enable") async def enable_auto_workflow( project_id: int, enable: bool = True, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id) ): """ 启用/禁用项目的自动工作流 启用后,当以下情况发生时会自动触发工作流: - 高影响信号到达(>0.85) - 任务阻塞检测 - 认知冲突检测 """ from ...models import Project from sqlalchemy.future import select project_result = await db.execute( select(Project).where( Project.id == project_id, Project.tenant_id == tenant_id ) ) project = project_result.scalar_one_or_none() if not project: raise HTTPException(status_code=404, detail="项目不存在") # 这里应该设置项目的 auto_workflow 标志 # 由于 Project 模型可能没有这个字段,暂时返回成功 return { 'project_id': project_id, 'auto_workflow': enable, 'message': f'自动工作流已{"启用" if enable else "禁用"}' }