Source code for core.workflow_formatter

"""
工作流输出格式化器

将工作流对象格式化为不同的输出格式(Roadmap、Tasks、Detailed)
"""

import logging
from typing import Dict

from .workflow_models import (
    OutputFormat,
    PersonaType,
    Priority,
    Workflow,
    WorkflowMilestone,
    WorkflowPhase,
    WorkflowStep,
)


[docs] class WorkflowFormatter: """工作流格式化器"""
[docs] def __init__(self) -> None: self.logger = logging.getLogger("WorkflowFormatter")
[docs] def format_workflow(self, workflow: Workflow, output_format: OutputFormat) -> str: """格式化工作流为指定格式""" try: if output_format == OutputFormat.ROADMAP: return self._format_roadmap(workflow) elif output_format == OutputFormat.TASKS: return self._format_tasks(workflow) elif output_format == OutputFormat.DETAILED: return self._format_detailed(workflow) else: raise ValueError(f"不支持的输出格式: {output_format}") except Exception as e: self.logger.error(f"格式化工作流失败: {str(e)}") raise
def _format_roadmap(self, workflow: Workflow) -> str: """格式化为路线图格式""" try: output: list[str] = [] self._append_roadmap_overview(output, workflow) self._append_roadmap_metrics(output, workflow) # 阶段路线图 output.append("## 🚀 实施阶段") output.append("") current_week = 1 for phase in workflow.phases: phase_weeks = max(1, (phase.estimated_effort or 0) // 40) week_range = ( f"第 {current_week} 周" if phase_weeks == 1 else f"第 {current_week}-{current_week + phase_weeks - 1} 周" ) self._append_roadmap_phase(output, workflow, phase, week_range) current_week += phase_weeks self._append_roadmap_risks(output, workflow) self._append_parallel_streams(output, workflow) self._append_critical_path(output, workflow) return "\n".join(output) except Exception as e: self.logger.error(f"格式化路线图失败: {str(e)}") raise def _format_tasks(self, workflow: Workflow) -> str: """格式化为任务格式""" try: output: list[str] = [] # 标题和概述 output.append(f"# {workflow.name} - 实施任务清单") output.append("") output.append(f"**生成时间**: {workflow.created_at.strftime('%Y-%m-%d %H:%M:%S')}") output.append(f"**策略**: {workflow.strategy.value.title()}") output.append(f"**总任务数**: {sum(len(phase.milestones) for phase in workflow.phases)}") output.append(f"**预估总工作量**: {workflow.get_total_effort()} 小时") output.append("") # 任务概览 output.append("## 📊 任务概览") output.append("") # 按优先级统计 all_milestones = [m for phase in workflow.phases for m in phase.milestones] priority_stats: Dict[str, int] = {} for milestone in all_milestones: priority = milestone.priority.value priority_stats[priority] = priority_stats.get(priority, 0) + 1 for priority in ["high", "medium", "low"]: count = priority_stats.get(priority, 0) emoji = self._get_priority_emoji(Priority(priority)) output.append(f"- {emoji} **{priority.title()}优先级**: {count} 个任务") output.append("") # 按阶段列出任务 output.append("## 📋 分阶段任务") output.append("") for phase_idx, phase in enumerate(workflow.phases, 1): self._append_task_phase(output, phase, phase_idx) self._append_dependencies(output, workflow) return "\n".join(output) except Exception as e: self.logger.error(f"格式化任务清单失败: {str(e)}") raise def _format_detailed(self, workflow: Workflow) -> str: """格式化为详细格式""" try: output: list[str] = [] self._append_detailed_overview(output, workflow) self._append_detailed_requirements(output, workflow) self._append_technical_analysis(output, workflow) self._append_personas(output, workflow) self._append_mcp_results(output, workflow) # 详细实施步骤 output.append("## 🚀 详细实施步骤") output.append("") for phase_idx, phase in enumerate(workflow.phases, 1): self._append_detailed_phase(output, workflow, phase, phase_idx) self._append_quality_assurance(output, workflow) return "\n".join(output) except Exception as e: self.logger.error(f"格式化详细工作流失败: {str(e)}") raise def _append_step_resources(self, output: list[str], step: WorkflowStep) -> None: # 工具和示例 if step.tools_required: output.append("*所需工具*:") for tool in step.tools_required: output.append(f"- {tool}") output.append("") if step.code_examples: output.append("*代码示例*:") for example in step.code_examples: output.append(f"```\n{example}\n```") output.append("") if step.mcp_context: output.append("*MCP上下文*:") for server, context in step.mcp_context.items(): output.append(f"- **{server}**: {context}") output.append("") def _append_step_acceptance(self, output: list[str], step: WorkflowStep) -> None: # 交付物 if step.deliverables: output.append("*交付物*:") for deliverable in step.deliverables: output.append(f"- [ ] {deliverable}") output.append("") # 验收标准 if step.acceptance_criteria: output.append("*验收标准*:") for criteria in step.acceptance_criteria: output.append(f"- [ ] {criteria}") output.append("") def _append_detailed_step(self, output: list[str], step: WorkflowStep, step_idx: int) -> None: output.append(f"**步骤 {step_idx}: {step.name}**") if step.persona: output.append(f"*负责人*: {step.persona.value.title()}") if step.estimated_effort: output.append(f"*预估时间*: {step.estimated_effort} 小时") if step.complexity: output.append(f"*复杂度*: {step.complexity.value.title()}") output.append("") if step.description: output.append(step.description) output.append("") self._append_step_resources(output, step) self._append_step_acceptance(output, step) def _append_milestone_risks(self, output: list[str], workflow: Workflow, milestone: WorkflowMilestone) -> None: # 风险评估 if milestone.risks: milestone_risks = [r for r in workflow.risks if r.id in milestone.risks] if milestone_risks: output.append("**风险评估**:") for risk in milestone_risks: risk_level = f"{risk.likelihood.value.title()}/{risk.impact.value.title()}" output.append(f"- **{risk.name}** (概率/影响: {risk_level})") output.append(f" - {risk.description}") if risk.mitigation_strategies: output.append(f" - 缓解措施: {'; '.join(risk.mitigation_strategies)}") output.append("") def _append_detailed_milestone( self, output: list[str], workflow: Workflow, milestone: WorkflowMilestone, phase_idx: int, milestone_idx: int ) -> None: output.append(f"##### 里程碑 {phase_idx}.{milestone_idx}: {milestone.name}") priority_emoji = self._get_priority_emoji(milestone.priority) complexity_indicator = self._get_complexity_indicator(milestone.estimated_effort or 0) output.append(f"**优先级**: {priority_emoji} {milestone.priority.value.title()}") output.append(f"**预估工作量**: {milestone.estimated_effort or 0} 小时 {complexity_indicator}") if milestone.personas_involved: personas_str = ", ".join([p.value.title() for p in milestone.personas_involved]) output.append(f"**专家角色**: {personas_str}") if milestone.dependencies: output.append(f"**依赖项**: {len(milestone.dependencies)} 个") output.append("") if milestone.description: output.append(f"**描述**: {milestone.description}") output.append("") # 实施步骤 if milestone.steps: output.append("**实施步骤**:") output.append("") for step_idx, step in enumerate(milestone.steps, 1): self._append_detailed_step(output, step, step_idx) else: # 生成默认步骤 output.append("**实施步骤**:") output.append("") output.append("1. **需求分析和设计** (25%)") output.append(" - 详细分析功能需求") output.append(" - 制定技术方案") output.append(" - 设计接口和数据结构") output.append("") output.append("2. **核心开发** (50%)") output.append(" - 实现核心功能逻辑") output.append(" - 编写单元测试") output.append(" - 代码审查和优化") output.append("") output.append("3. **集成测试** (15%)") output.append(" - 集成测试和联调") output.append(" - 性能测试和优化") output.append(" - 缺陷修复") output.append("") output.append("4. **部署验收** (10%)") output.append(" - 部署到测试环境") output.append(" - 用户验收测试") output.append(" - 文档更新") output.append("") # 成功标准 if milestone.success_criteria: output.append("**成功标准**:") for criteria in milestone.success_criteria: output.append(f"- [ ] {criteria}") output.append("") self._append_milestone_risks(output, workflow, milestone) def _append_detailed_phase_overview(self, output: list[str], workflow: Workflow, phase: WorkflowPhase) -> None: # 阶段概述 output.append("#### 📋 阶段概述") output.append(f"- **描述**: {phase.description or '待补充描述'}") output.append(f"- **预估工作量**: {phase.estimated_effort or 0} 小时") if phase.estimated_effort: estimated_days = (phase.estimated_effort + 7) // 8 # 向上取整到天 output.append(f"- **预估工期**: {estimated_days} 工作日") if phase.personas_involved: personas_str = ", ".join([p.value.title() for p in phase.personas_involved]) output.append(f"- **涉及角色**: {personas_str}") if phase.dependencies: output.append(f"- **前置依赖**: {len(phase.dependencies)} 个") if phase.risks: phase_risks = [r for r in workflow.risks if r.id in phase.risks] high_risks = [r for r in phase_risks if r.likelihood.value == "high" or r.impact.value == "high"] if high_risks: output.append(f"- **高风险项**: {len(high_risks)} 个") output.append("") def _append_detailed_phase( self, output: list[str], workflow: Workflow, phase: WorkflowPhase, phase_idx: int ) -> None: output.append(f"### 阶段 {phase_idx}: {phase.name}") output.append("") self._append_detailed_phase_overview(output, workflow, phase) # 详细里程碑 if phase.milestones: output.append("#### 🎯 详细里程碑") output.append("") for milestone_idx, milestone in enumerate(phase.milestones, 1): self._append_detailed_milestone(output, workflow, milestone, phase_idx, milestone_idx) output.append("---") output.append("") def _append_detailed_overview(self, output: list[str], workflow: Workflow) -> None: # 标题和详细概述 output.append(f"# {workflow.name} - 详细实施工作流") output.append("") # 元数据部分 output.append("## 📋 项目元数据") output.append("") output.append(f"- **项目名称**: {workflow.name}") output.append(f"- **生成时间**: {workflow.created_at.strftime('%Y-%m-%d %H:%M:%S')}") output.append(f"- **工作流策略**: {workflow.strategy.value.title()}") output.append(f"- **版本**: {workflow.version}") if workflow.prd_structure: output.append(f"- **PRD标题**: {workflow.prd_structure.title}") if workflow.prd_structure.author: output.append(f"- **PRD作者**: {workflow.prd_structure.author}") output.append("") # 项目概述 if workflow.description or (workflow.prd_structure and workflow.prd_structure.overview): output.append("## 📖 项目概述") output.append("") if workflow.description: output.append(workflow.description) elif workflow.prd_structure and workflow.prd_structure.overview: output.append(workflow.prd_structure.overview) output.append("") def _append_detailed_requirements(self, output: list[str], workflow: Workflow) -> None: # 需求分析 if workflow.requirements: output.append("## 📝 需求分析") output.append("") output.append(f"**需求总数**: {len(workflow.requirements)}") if workflow.requirement_categories: output.append("") output.append("### 需求分类") cats = workflow.requirement_categories output.append(f"- **功能性需求**: {len(cats.functional_requirements)}") output.append(f"- **非功能性需求**: {len(cats.non_functional_requirements)}") output.append(f"- **UI需求**: {len(cats.ui_requirements)}") output.append(f"- **API需求**: {len(cats.api_requirements)}") output.append(f"- **数据需求**: {len(cats.data_requirements)}") output.append(f"- **安全需求**: {len(cats.security_requirements)}") output.append(f"- **性能需求**: {len(cats.performance_requirements)}") output.append("") output.append("### 核心需求详情") for i, req in enumerate(workflow.requirements[:5], 1): # 只显示前5个需求 priority_emoji = self._get_priority_emoji(req.priority) complexity_badge = req.complexity.value.title() output.append(f"#### {i}. {req.title}") output.append( f"**优先级**: {priority_emoji} {req.priority.value.title()} | " f"**复杂度**: {complexity_badge}" ) output.append("") output.append(req.description) if req.acceptance_criteria: output.append("") output.append("**验收标准**:") for criteria in req.acceptance_criteria: output.append(f"- {criteria}") output.append("") if len(workflow.requirements) > 5: output.append(f"*... 还有 {len(workflow.requirements) - 5} 个需求未显示*") output.append("") def _append_complexity_analysis(self, output: list[str], workflow: Workflow) -> None: if workflow.complexity_analysis: ca = workflow.complexity_analysis output.append("### 复杂度分析") output.append(f"- **整体复杂度**: {ca.overall_complexity.value.title()}") output.append(f"- **技术复杂度**: {ca.technical_complexity * 100:.1f}%") output.append(f"- **集成复杂度**: {ca.integration_complexity * 100:.1f}%") output.append(f"- **UI复杂度**: {ca.ui_complexity * 100:.1f}%") output.append(f"- **业务逻辑复杂度**: {ca.business_logic_complexity * 100:.1f}%") output.append(f"- **数据复杂度**: {ca.data_complexity * 100:.1f}%") if ca.complexity_factors: output.append("") output.append("**复杂度因子**:") for factor in ca.complexity_factors: output.append(f"- {factor}") if ca.simplification_opportunities: output.append("") output.append("**简化建议**:") for opportunity in ca.simplification_opportunities: output.append(f"- {opportunity}") output.append("") def _append_effort_analysis(self, output: list[str], workflow: Workflow) -> None: if workflow.effort_estimation: ee = workflow.effort_estimation output.append("### 工作量估算") output.append(f"- **总工作量**: {ee.total_hours} 小时") output.append(f"- **置信度**: {ee.confidence_level * 100:.0f}%") output.append(f"- **估算方法**: {ee.estimation_method}") output.append(f"- **缓冲比例**: {ee.buffer_percentage * 100:.0f}%") if ee.breakdown_by_persona: output.append("") output.append("**人员分工明细**:") for persona, hours in ee.breakdown_by_persona.items(): percentage = (hours / ee.total_hours) * 100 if ee.total_hours else 0.0 output.append(f"- **{persona.value.title()}**: {hours}h ({percentage:.1f}%)") output.append("") def _append_technical_analysis(self, output: list[str], workflow: Workflow) -> None: # 复杂度和工作量分析 if workflow.complexity_analysis or workflow.effort_estimation: output.append("## 📊 技术分析") output.append("") self._append_complexity_analysis(output, workflow) self._append_effort_analysis(output, workflow) def _append_personas(self, output: list[str], workflow: Workflow) -> None: # 专家人格激活 if workflow.activated_personas: output.append("## 👥 专家团队配置") output.append("") output.append("### 激活的专家人格") persona_descriptions = { PersonaType.FRONTEND: "负责UI/UX设计、用户体验优化、前端性能调优", PersonaType.BACKEND: "负责API设计、数据库架构、服务端性能优化", PersonaType.ARCHITECT: "负责系统架构设计、技术选型、扩展性规划", PersonaType.SECURITY: "负责安全架构设计、漏洞评估、合规性检查", PersonaType.DEVOPS: "负责CI/CD流程、基础设施管理、监控告警", PersonaType.QA: "负责测试策略制定、质量保证、自动化测试", PersonaType.SCRIBE: "负责文档编写、知识管理、培训材料制作", PersonaType.PERFORMANCE: "负责性能优化、瓶颈分析、监控指标设计", } for persona in workflow.activated_personas: description = persona_descriptions.get(persona, "专业领域专家") output.append(f"- **{persona.value.title()}**: {description}") if workflow.persona_recommendations: output.append("") output.append("### 专家建议") for persona, recommendation in workflow.persona_recommendations.items(): output.append(f"- **{persona.value.title()}**: {recommendation}") output.append("") def _append_mcp_results(self, output: list[str], workflow: Workflow) -> None: # MCP集成结果 if workflow.mcp_results: output.append("## 🔌 MCP服务集成结果") output.append("") mr = workflow.mcp_results if mr.context7_results: output.append("### Context7 框架模式分析") for key, value in mr.context7_results.items(): output.append(f"- **{key}**: {value}") output.append("") if mr.sequential_results: output.append("### Sequential 复杂分析结果") for key, value in mr.sequential_results.items(): output.append(f"- **{key}**: {value}") output.append("") if mr.magic_results: output.append("### Magic UI组件建议") for key, value in mr.magic_results.items(): output.append(f"- **{key}**: {value}") output.append("") if mr.integration_recommendations: output.append("### 集成建议") for recommendation in mr.integration_recommendations: output.append(f"- {recommendation}") output.append("") def _append_quality_assurance(self, output: list[str], workflow: Workflow) -> None: # 质量保证 if workflow.quality_gates or workflow.success_metrics: output.append("## ✅ 质量保证") output.append("") if workflow.quality_gates: output.append("### 质量门控") for gate in workflow.quality_gates: output.append(f"- [ ] {gate}") output.append("") if workflow.success_metrics: output.append("### 成功指标") for metric in workflow.success_metrics: output.append(f"- {metric}") output.append("") if workflow.validation_criteria: output.append("### 验证标准") for criteria in workflow.validation_criteria: output.append(f"- [ ] {criteria}") output.append("") def _append_task_steps(self, output: list[str], milestone: WorkflowMilestone) -> None: # 任务步骤 if milestone.steps: for step_idx, step in enumerate(milestone.steps, 1): persona_tag = f"({step.persona.value})" if step.persona else "" output.append(f"- [ ] **步骤 {step_idx}**: {step.name} {persona_tag}") if step.estimated_effort: output.append(f" - 预估: {step.estimated_effort}h") if step.description: output.append(f" - 描述: {step.description}") else: # 如果没有详细步骤,生成基础任务 output.append(f"- [ ] 设计和规划 ({(milestone.estimated_effort or 0) // 4 or 1}h)") output.append(f"- [ ] 开发实现 ({(milestone.estimated_effort or 0) // 2 or 2}h)") output.append(f"- [ ] 测试验证 ({(milestone.estimated_effort or 0) // 4 or 1}h)") def _append_task_milestone( self, output: list[str], milestone: WorkflowMilestone, phase_idx: int, milestone_idx: int ) -> None: priority_emoji = self._get_priority_emoji(milestone.priority) complexity_indicator = self._get_complexity_indicator(milestone.estimated_effort or 0) output.append(f"#### Story {phase_idx}.{milestone_idx}: {milestone.name}") output.append( f"**优先级**: {priority_emoji} {milestone.priority.value.title()} | " f"**工作量**: {milestone.estimated_effort or 0}h {complexity_indicator}" ) if milestone.dependencies: output.append(f"**依赖**: {len(milestone.dependencies)} 个前置条件") output.append("") if milestone.description: output.append(milestone.description) output.append("") self._append_task_steps(output, milestone) # 验收标准 if milestone.success_criteria: output.append("") output.append("**验收标准**:") for criteria in milestone.success_criteria: output.append(f"- [ ] {criteria}") output.append("") def _append_task_phase(self, output: list[str], phase: WorkflowPhase, phase_idx: int) -> None: output.append(f"### Epic {phase_idx}: {phase.name}") output.append("") output.append(f"**描述**: {phase.description or '待补充描述'}") output.append(f"**预估工作量**: {phase.estimated_effort or 0} 小时") if phase.personas_involved: personas_str = ", ".join([p.value.title() for p in phase.personas_involved]) output.append(f"**涉及角色**: {personas_str}") output.append("") # 阶段任务 for milestone_idx, milestone in enumerate(phase.milestones, 1): self._append_task_milestone(output, milestone, phase_idx, milestone_idx) def _append_dependencies(self, output: list[str], workflow: Workflow) -> None: # 依赖关系图 if workflow.dependencies: output.append("## 🔗 依赖关系") output.append("") external_deps = [d for d in workflow.dependencies if d.type == "external"] internal_deps = [d for d in workflow.dependencies if d.type == "internal"] if external_deps: output.append("### 外部依赖") for dep in external_deps: criticality_emoji = self._get_priority_emoji(dep.criticality) output.append(f"- {criticality_emoji} **{dep.name}**: {dep.description}") if dep.owner: output.append(f" - 负责人: {dep.owner}") if dep.estimated_resolution_time: output.append(f" - 预估解决时间: {dep.estimated_resolution_time}h") output.append("") if internal_deps: output.append("### 内部依赖") for dep in internal_deps: criticality_emoji = self._get_priority_emoji(dep.criticality) output.append(f"- {criticality_emoji} **{dep.name}**: {dep.description}") output.append("") def _append_roadmap_milestones(self, output: list[str], phase: WorkflowPhase) -> None: # 里程碑 if phase.milestones: output.append("#### 🎯 关键里程碑") for milestone in phase.milestones: priority_emoji = self._get_priority_emoji(milestone.priority) output.append(f"- [ ] {priority_emoji} {milestone.name} ({milestone.estimated_effort or 0}h)") if milestone.description: output.append(f" - {milestone.description}") output.append("") def _append_roadmap_success(self, output: list[str], phase: WorkflowPhase) -> None: # 成功标准 if phase.milestones and any(m.success_criteria for m in phase.milestones): output.append("#### ✅ 成功标准") for milestone in phase.milestones: if milestone.success_criteria: for criteria in milestone.success_criteria: output.append(f"- {criteria}") output.append("") def _append_roadmap_phase( self, output: list[str], workflow: Workflow, phase: WorkflowPhase, week_range: str ) -> None: output.append(f"### {phase.name} ({week_range})") output.append("") output.append(f"**预估工作量**: {phase.estimated_effort or 0} 小时") if phase.personas_involved: personas_str = ", ".join([p.value.title() for p in phase.personas_involved]) output.append(f"**涉及角色**: {personas_str}") if phase.dependencies: output.append(f"**依赖项**: {len(phase.dependencies)} 个") if phase.risks: high_risks = [r for r in workflow.risks if r.id in phase.risks and r.likelihood.value == "high"] if high_risks: output.append(f"**高风险项**: {len(high_risks)} 个") output.append("") if phase.description: output.append(phase.description) output.append("") self._append_roadmap_milestones(output, phase) self._append_roadmap_success(output, phase) def _append_roadmap_overview(self, output: list[str], workflow: Workflow) -> None: # 标题和概述 output.append(f"# {workflow.name} - 实施路线图") output.append("") output.append(f"**生成时间**: {workflow.created_at.strftime('%Y-%m-%d %H:%M:%S')}") output.append(f"**策略**: {workflow.strategy.value.title()}") output.append(f"**预估总工作量**: {workflow.get_total_effort()} 小时") if workflow.complexity_analysis: output.append(f"**复杂度级别**: {workflow.complexity_analysis.overall_complexity.value.title()}") if workflow.activated_personas: personas_str = ", ".join([p.value.title() for p in workflow.activated_personas]) output.append(f"**涉及专家**: {personas_str}") output.append("") if workflow.description: output.append("## 📋 项目概述") output.append(workflow.description) output.append("") def _append_roadmap_metrics(self, output: list[str], workflow: Workflow) -> None: # 关键指标 if workflow.complexity_analysis or workflow.effort_estimation: output.append("## 📊 关键指标") if workflow.effort_estimation: output.append(f"- **总工作量**: {workflow.effort_estimation.total_hours} 小时") output.append(f"- **置信度**: {workflow.effort_estimation.confidence_level * 100:.0f}%") if workflow.effort_estimation.breakdown_by_persona: output.append("- **人员分工**:") for persona, hours in workflow.effort_estimation.breakdown_by_persona.items(): output.append(f" - {persona.value.title()}: {hours} 小时") if workflow.complexity_analysis: output.append(f"- **技术复杂度**: {workflow.complexity_analysis.technical_complexity * 100:.0f}%") output.append(f"- **集成复杂度**: {workflow.complexity_analysis.integration_complexity * 100:.0f}%") output.append("") def _append_roadmap_risks(self, output: list[str], workflow: Workflow) -> None: # 风险和缓解措施 if workflow.risks: output.append("## ⚠️ 风险分析") output.append("") high_risks = [r for r in workflow.risks if r.likelihood.value == "high" or r.impact.value == "high"] medium_risks = [ r for r in workflow.risks if r not in high_risks and (r.likelihood.value == "medium" or r.impact.value == "medium") ] if high_risks: output.append("### 🔴 高风险项") for risk in high_risks: output.append(f"- **{risk.name}**: {risk.description}") if risk.mitigation_strategies: output.append(f" - 缓解策略: {'; '.join(risk.mitigation_strategies)}") output.append("") if medium_risks: output.append("### 🟡 中等风险项") for risk in medium_risks: output.append(f"- **{risk.name}**: {risk.description}") output.append("") def _append_parallel_streams(self, output: list[str], workflow: Workflow) -> None: # 并行工作流 if workflow.parallel_streams: output.append("## 🔄 并行工作流") output.append("") output.append("以下工作可以并行进行,以加速项目进度:") output.append("") for stream in workflow.parallel_streams: output.append(f"### {stream.name}") output.append(f"- **描述**: {stream.description}") if stream.estimated_effort: output.append(f"- **预估工作量**: {stream.estimated_effort} 小时") if stream.required_team_size > 1: output.append(f"- **需要团队规模**: {stream.required_team_size} 人") output.append("") def _append_critical_path(self, output: list[str], workflow: Workflow) -> None: # 关键路径 if workflow.critical_path: output.append("## 🎯 关键路径") output.append("") if workflow.critical_path.total_duration: days = workflow.critical_path.total_duration.days output.append(f"**关键路径总时长**: {days} 天") if workflow.critical_path.total_effort: output.append(f"**关键路径总工作量**: {workflow.critical_path.total_effort} 小时") if workflow.critical_path.bottlenecks: output.append("") output.append("### 🚧 潜在瓶颈") for bottleneck_id in workflow.critical_path.bottlenecks: bottleneck_phase = next((p for p in workflow.phases if p.id == bottleneck_id), None) if bottleneck_phase: output.append(f"- {bottleneck_phase.name}: 工作量较大,可能影响整体进度") output.append("") if workflow.critical_path.optimization_opportunities: output.append("### 💡 优化建议") for opportunity in workflow.critical_path.optimization_opportunities: output.append(f"- {opportunity}") output.append("") def _get_priority_emoji(self, priority: Priority) -> str: """获取优先级对应的emoji""" priority_emojis = {Priority.LOW: "🟢", Priority.MEDIUM: "🟡", Priority.HIGH: "🔴", Priority.CRITICAL: "🚨"} return priority_emojis.get(priority, "⚪") def _get_complexity_indicator(self, hours: int) -> str: """基于工作量获取复杂度指示符""" if hours <= 4: return "🟢" # 简单 elif hours <= 16: return "🟡" # 中等 elif hours <= 40: return "🔴" # 复杂 else: return "🚨" # 非常复杂