11

44 阅读1分钟

这个问题是由于 useEffect 的依赖项和检查逻辑导致的。在 TaskManager.js 中,我们需要修改一下检查逻辑,确保不会重复创建任务:

// 当年份、周数或默认模板发生变化时,自动创建默认任务
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
    )
  );

  // 只创建缺失的模板任务
  if (missingTemplates.length > 0) {
    const newTasks = missingTemplates.map(template => {
      const taskCode = generateTaskCode(
        selectedTaskType,
        selectedYear,
        selectedWeek,
        template.name
      );

      return {
        ...template,
        id: Date.now() + Math.random(),
        year: selectedYear,
        week: selectedWeek,
        taskType: selectedTaskType,
        code: taskCode,
        processes: template.processes.map(process => ({
          ...process,
          id: Date.now() + Math.random(),
          status: 'pending'
        }))
      };
    });

    setTasks(prevTasks => [...prevTasks, ...newTasks]);
  }
}, [selectedYear, selectedWeek, selectedTaskType, defaultTemplates]);

主要修改:

  1. 使用 filter 而不是 some 来获取所有现有任务
  2. 检查每个默认模板是否已经创建了对应的任务
  3. 只创建那些还没有创建的模板任务

这样修改后:

  1. 每个默认模板在每个周期只会创建一次任务
  2. 刷新页面不会导致重复创建任务
  3. 切换周期时仍然会正确创建默认任务

需要我对某部分做进一步的调整或解释吗?