-- 修复课件时长问题 -- 问题:课件duration字段为0或NULL,导致学习进度计算不准确 -- 解决:根据实际视频文件更新时长,或手动设置合理的时长 -- 1. 查看当前课件时长情况 SELECT id, courseware_name AS 课件名称, type AS 类型, duration AS 当前时长秒, CASE WHEN duration IS NULL OR duration = 0 THEN '❌ 需要修复' ELSE '✅ 正常' END AS 状态, file_path AS 文件路径 FROM study_courseware WHERE course_id = 1 -- 修改为你要检查的课程ID ORDER BY courseware_order; -- 2. 手动更新课件时长(根据实际视频时长) -- 示例:假设你的视频实际时长如下 -- 更新课件ID=883的时长为60秒(请根据实际情况修改) UPDATE study_courseware SET duration = 60 WHERE id = 883; -- 更新课件ID=884的时长为120秒 UPDATE study_courseware SET duration = 120 WHERE id = 884; -- 更新课件ID=885的时长为90秒 UPDATE study_courseware SET duration = 90 WHERE id = 885; -- 更新课件ID=886的时长为150秒 UPDATE study_courseware SET duration = 150 WHERE id = 886; -- 更新课件ID=887的时长为180秒 UPDATE study_courseware SET duration = 180 WHERE id = 887; -- 3. 批量更新:为所有duration为0或NULL的视频课件设置默认时长(60秒) -- ⚠️ 慎用!建议先查看具体视频再设置准确时长 -- UPDATE study_courseware -- SET duration = 60 -- WHERE type = 'video' -- AND (duration IS NULL OR duration = 0); -- 4. 验证更新结果 SELECT id, courseware_name AS 课件名称, duration AS 时长秒, ROUND(duration / 60, 2) AS 时长分钟, file_path AS 文件路径 FROM study_courseware WHERE course_id = 1 -- 修改为你的课程ID AND type = 'video' ORDER BY courseware_order; -- 5. 重新计算学习进度(更新课件时长后,需要触发进度重算) -- 方法A: 删除学习记录,让用户重新学习时自动计算 -- DELETE FROM study_learning_record WHERE student_id = 452 AND course_id = 1; -- 方法B: 保留学习记录,手动更新进度为0,下次学习时会重新计算 -- UPDATE study_learning_record -- SET progress = 0 -- WHERE student_id = 452 AND course_id = 1; -- 6. 查看学习详情,检查是否有异常数据 SELECT sld.id, sld.courseware_id AS 课件ID, sc.courseware_name AS 课件名称, sc.duration AS 课件时长秒, sld.video_position AS 播放位置秒, CASE WHEN sc.duration > 0 THEN ROUND(sld.video_position * 100.0 / sc.duration, 2) ELSE NULL END AS 播放进度百分比, CASE WHEN sld.video_position >= sc.duration * 0.9 THEN '✅ 已完成' WHEN sld.video_position == ( SELECT MAX(video_position) FROM study_learning_detail WHERE courseware_id = sld.courseware_id AND student_id = sld.student_id ) AND sld.video_position >= 3 THEN '✅ 已完成(到达最远位置)' ELSE '⏸️ 未完成' END AS 完成状态 FROM study_learning_detail sld LEFT JOIN study_courseware sc ON sld.courseware_id = sc.id WHERE sld.student_id = 452 -- 修改为你的学生ID AND sld.course_id = 1 -- 修改为你的课程ID ORDER BY sld.courseware_id, sld.video_position DESC; -- 注意事项: -- 1. 执行UPDATE语句前,请务必先备份数据库 -- 2. 根据实际视频时长设置duration值(单位:秒) -- 3. 更新后,下次学习时系统会自动重新计算进度 -- 4. 可以在APP中重新进入课程,触发进度重新计算