200306-修复后台用户任务进度编辑页面条件丢失问题.md 3.3 KB

修复后台用户任务进度编辑页面条件丢失问题

📋 任务信息

  • 任务时间: 2025年7月20日 03:06
  • 任务类型: Bug修复
  • 影响模块: Task模块 - 用户任务进度管理
  • 问题描述: 后台 /admin/task-user-progress 页面编辑正常任务时,条件会丢失

🐛 问题分析

问题现象

  1. 在后台用户任务进度管理页面编辑任务进度时
  2. "达成条件ID"字段显示为空或"未知条件"
  3. 编辑保存后条件信息丢失

根本原因

TaskUserProgressController 的表单配置中,achievement_condition_id 字段的选项配置错误:

错误代码:

$form->select('achievement_condition_id', '达成条件ID')->options(function () {
    return \App\Module\Task\Models\TaskCondition::pluck('name', 'id');
})->required();

问题分析:

  • 使用了 TaskCondition::pluck('name', 'id') 获取选项
  • achievement_condition_id 字段实际关联的是 task_achievement_conditions
  • 而不是 task_conditions
  • 导致表单无法找到匹配的选项,条件显示为空

数据结构说明

  • task_user_progress.achievement_condition_idtask_achievement_conditions.id
  • task_achievement_conditions.condition_idtask_conditions.id

🔧 解决方案

修复代码

修改 app/Module/Task/AdminControllers/TaskUserProgressController.php 第154-156行:

修复后代码:

$form->select('achievement_condition_id', '达成条件ID')->options(function () {
    return \App\Module\Task\Models\TaskAchievementCondition::with('condition')
        ->get()
        ->pluck('condition.name', 'id');
})->required();

修复说明

  1. 使用 TaskAchievementCondition 模型而不是 TaskCondition
  2. 通过 with('condition') 预加载关联的条件信息
  3. 使用 pluck('condition.name', 'id') 获取正确的选项映射
  4. 确保表单能正确显示和保存条件信息

🧪 测试验证

测试步骤

  1. 访问后台用户任务进度管理页面 /admin/task-user-progress
  2. 点击编辑正常的任务进度记录
  3. 检查"达成条件ID"字段是否正确显示条件名称
  4. 修改其他字段并保存
  5. 确认条件信息没有丢失

测试结果

修复前: "达成条件ID"字段显示为空或"未知条件"
修复后: "达成条件ID"字段正确显示"宠物经验累计"等条件名称
编辑保存: 条件信息正确保留,不会丢失

数据清理

发现并清理了一条错误的数据记录:

  • 删除了 achievement_condition_id=6 的错误记录(应该是TaskAchievementCondition的ID,不是TaskCondition的ID)
  • 保留了正确的 achievement_condition_id=1 的记录

📁 修改文件

  • app/Module/Task/AdminControllers/TaskUserProgressController.php

🎯 影响范围

  • 正面影响: 修复了后台编辑任务进度时条件丢失的问题
  • 风险评估: 低风险,仅修改表单选项配置,不影响数据结构
  • 兼容性: 完全向后兼容

📝 总结

成功修复了后台用户任务进度编辑页面条件丢失的问题。问题的根本原因是表单字段配置错误,使用了错误的模型获取选项数据。通过修正模型关联和选项配置,确保了表单能正确显示和保存条件信息。