v2.0.0-preview.1 - 重构TaskList部分
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
import type { Task } from '../../../models/classes/Task'
|
||||
|
||||
/**
|
||||
* 父任务数据计算逻辑
|
||||
* 负责计算父任务的进度和日期范围
|
||||
*/
|
||||
|
||||
/**
|
||||
* 计算父级任务的进度和日期范围
|
||||
*/
|
||||
export function calculateParentTaskData(
|
||||
task: Task,
|
||||
): { progress: number; startDate: string; endDate: string } {
|
||||
if (!task.children || task.children.length === 0) {
|
||||
return {
|
||||
progress: task.progress || 0,
|
||||
startDate: task.startDate || '',
|
||||
endDate: task.endDate || '',
|
||||
}
|
||||
}
|
||||
|
||||
// 递归收集所有子任务
|
||||
const allChildTasks: Task[] = []
|
||||
const collectChildTasks = (tasks: Task[]) => {
|
||||
tasks.forEach(childTask => {
|
||||
allChildTasks.push(childTask)
|
||||
if (childTask.children && childTask.children.length > 0) {
|
||||
collectChildTasks(childTask.children)
|
||||
}
|
||||
})
|
||||
}
|
||||
collectChildTasks(task.children)
|
||||
|
||||
// 计算进度:所有子任务进度的平均值
|
||||
const totalProgress = allChildTasks.reduce((sum, childTask) => {
|
||||
return sum + (childTask.progress || 0)
|
||||
}, 0)
|
||||
const averageProgress =
|
||||
allChildTasks.length > 0 ? Math.round(totalProgress / allChildTasks.length) : 0
|
||||
|
||||
// 计算日期范围:最早开始日期和最晚结束日期
|
||||
const validTasks = allChildTasks.filter(childTask => childTask.startDate && childTask.endDate)
|
||||
if (validTasks.length === 0) {
|
||||
return {
|
||||
progress: averageProgress,
|
||||
startDate: task.startDate || '',
|
||||
endDate: task.endDate || '',
|
||||
}
|
||||
}
|
||||
|
||||
const startDates = validTasks.map(childTask => new Date(childTask.startDate!))
|
||||
const endDates = validTasks.map(childTask => new Date(childTask.endDate!))
|
||||
|
||||
const earliestStart = new Date(Math.min(...startDates.map(date => date.getTime())))
|
||||
const latestEnd = new Date(Math.max(...endDates.map(date => date.getTime())))
|
||||
|
||||
return {
|
||||
progress: averageProgress,
|
||||
startDate: earliestStart.toISOString().split('T')[0],
|
||||
endDate: latestEnd.toISOString().split('T')[0],
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新所有父级任务的进度和日期范围
|
||||
*/
|
||||
export function updateParentTasksData(tasks: Task[] | undefined) {
|
||||
if (!tasks) return
|
||||
|
||||
const updateParentTask = (taskList: Task[]): void => {
|
||||
taskList.forEach(task => {
|
||||
if (task.children && task.children.length > 0) {
|
||||
// 先更新子任务
|
||||
updateParentTask(task.children)
|
||||
|
||||
// 计算父级任务的进度和日期范围
|
||||
const parentData = calculateParentTaskData(task)
|
||||
task.progress = parentData.progress
|
||||
task.startDate = parentData.startDate
|
||||
task.endDate = parentData.endDate
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
updateParentTask(tasks)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有任务的扁平化列表(包括子任务)
|
||||
*/
|
||||
export function getAllTasks(taskList: Task[]): Task[] {
|
||||
const allTasks: Task[] = []
|
||||
|
||||
const collectTasks = (tasks: Task[]) => {
|
||||
tasks.forEach(task => {
|
||||
allTasks.push(task)
|
||||
if (task.children && task.children.length > 0) {
|
||||
collectTasks(task.children)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
collectTasks(taskList)
|
||||
return allTasks
|
||||
}
|
||||
Reference in New Issue
Block a user