PMFlow/backend/app/api/ai_steward_api/routes_workflow.py

150 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 "禁用"}'
}