150 lines
4.2 KiB
Python
150 lines
4.2 KiB
Python
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 "禁用"}'
|
||
}
|
||
|