* 获取统计信息
()
| 587 | * 获取统计信息 |
| 588 | */ |
| 589 | public getStatistics() { |
| 590 | const tasks = Array.from(this.tasks.values()); |
| 591 | const totalTasks = tasks.length; |
| 592 | const completedTasks = tasks.filter(t => t.status === 'completed'); |
| 593 | const inProgressTasks = tasks.filter(t => t.status === 'in-progress'); |
| 594 | const blockedTasks = tasks.filter(t => t.status === 'blocked'); |
| 595 | |
| 596 | // 计算平均完成时间 |
| 597 | const completedWithTime = completedTasks.filter(t => t.actualTime); |
| 598 | const averageCompletionTime = |
| 599 | completedWithTime.length > 0 |
| 600 | ? Math.round( |
| 601 | completedWithTime.reduce((sum, t) => sum + (t.actualTime || 0), 0) / |
| 602 | completedWithTime.length |
| 603 | ) |
| 604 | : null; |
| 605 | |
| 606 | // 计算成功率 |
| 607 | const finishedTasks = tasks.filter(t => t.status === 'completed' || t.status === 'cancelled'); |
| 608 | const successRate = |
| 609 | finishedTasks.length > 0 |
| 610 | ? Math.round((completedTasks.length / finishedTasks.length) * 100) |
| 611 | : 0; |
| 612 | |
| 613 | // 计算当前负载 |
| 614 | const currentLoad = |
| 615 | this.config.maxConcurrentTasks > 0 |
| 616 | ? Math.round((inProgressTasks.length / this.config.maxConcurrentTasks) * 100) |
| 617 | : 0; |
| 618 | |
| 619 | return { |
| 620 | totalTasks, |
| 621 | todo: tasks.filter(t => t.status === 'todo').length, |
| 622 | inProgress: inProgressTasks.length, |
| 623 | completed: completedTasks.length, |
| 624 | blocked: blockedTasks.length, |
| 625 | cancelled: tasks.filter(t => t.status === 'cancelled').length, |
| 626 | averageCompletionTime: averageCompletionTime ? `${averageCompletionTime}min` : null, |
| 627 | successRate, |
| 628 | currentLoad, |
| 629 | executableTasks: this.getExecutableTasks().length, |
| 630 | }; |
| 631 | } |
| 632 | |
| 633 | /** |
| 634 | * 获取工作流报告 |
no test coverage detected