我发现问题了。我们需要修改两个地方:
- 在 TaskManager.js 中,我们需要修改 createTaskFromTemplate 函数,使其使用相同的 ID 生成方式:
// 修改 createTaskFromTemplate 函数
const createTaskFromTemplate = (template) => {
const taskCode = generateTaskCode(
selectedTaskType,
selectedYear,
selectedWeek,
template.name
);
const newTask = {
...template,
id: generateUniqueId('task'), // 使用相同的 ID 生成方式
year: selectedYear,
week: selectedWeek,
taskType: selectedTaskType,
code: taskCode,
processes: template.processes.map(process => ({
...process,
id: generateUniqueId('process'), // 使用相同的 ID 生成方式
status: 'pending'
}))
};
// 检查是否已存在相同的任务
const taskExists = tasks.some(task =>
task.name === template.name &&
task.year === selectedYear &&
task.week === selectedWeek &&
task.taskType === selectedTaskType
);
if (!taskExists) {
setTasks(prevTasks => [...prevTasks, newTask]);
}
};
- 修改 handleAddTask 函数,也使用相同的 ID 生成方式:
const handleAddTask = (newTask) => {
const taskCode = generateTaskCode(
selectedTaskType,
selectedYear,
selectedWeek,
newTask.name
);
const taskExists = tasks.some(task =>
task.name === newTask.name &&
task.year === selectedYear &&
task.week === selectedWeek &&
task.taskType === selectedTaskType
);
if (!taskExists) {
setTasks(prevTasks => [...prevTasks, {
...newTask,
id: generateUniqueId('task'),
year: selectedYear,
week: selectedWeek,
taskType: selectedTaskType,
code: taskCode,
processes: newTask.processes.map(process => ({
...process,
id: generateUniqueId('process'),
status: 'pending',
responsible: ''
}))
}]);
}
};
- 在 useEffect 中添加更严格的检查:
useEffect(() => {
// 检查当前年份和周数是否已经有任务
const existingTasks = tasks.filter(
task => task.year === selectedYear &&
task.week === selectedWeek &&
task.taskType === selectedTaskType
);
// 检查每个默认模板是否已经创建了对应的任务
const missingTemplates = defaultTemplates.filter(template =>
!existingTasks.some(task =>
task.name === template.name &&
task.taskType === selectedTaskType &&
task.year === selectedYear &&
task.week === selectedWeek &&
task.code === generateTaskCode(
selectedTaskType,
selectedYear,
selectedWeek,
template.name
)
)
);
// 只创建缺失的模板任务
if (missingTemplates.length > 0) {
const newTasks = missingTemplates.map(template => {
const taskCode = generateTaskCode(
selectedTaskType,
selectedYear,
selectedWeek,
template.name
);
return {
...template,
id: generateUniqueId('task'),
year: selectedYear,
week: selectedWeek,
taskType: selectedTaskType,
code: taskCode,
processes: template.processes.map(process => ({
...process,
id: generateUniqueId('process'),
status: 'pending'
}))
};
});
setTasks(prevTasks => [...prevTasks, ...newTasks]);
}
}, [selectedYear, selectedWeek, selectedTaskType, defaultTemplates]);
主要修改:
- 统一使用 generateUniqueId 生成 ID
- 在所有创建任务的地方添加重复检查
- 在 useEffect 中添加了任务编码的检查
- 使用函数式更新来确保状态更新的正确性
这些修改应该能解决任务重复创建的问题。需要我对某部分做进一步的调整或解释吗?