12

46 阅读1分钟

我发现问题了。我们需要修改两个地方:

  1. 在 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]);
  }
};
  1. 修改 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: ''
      }))
    }]);
  }
};
  1. 在 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]);

主要修改:

  1. 统一使用 generateUniqueId 生成 ID
  2. 在所有创建任务的地方添加重复检查
  3. 在 useEffect 中添加了任务编码的检查
  4. 使用函数式更新来确保状态更新的正确性

这些修改应该能解决任务重复创建的问题。需要我对某部分做进一步的调整或解释吗?