Compare commits

...

2 Commits

Author SHA1 Message Date
En
27cb883b23 feat: Flyway 迁移脚本更新课程包统计数据
V10__update_course_package_stats.sql:
- 根据 lesson 表实际数据更新 usage_count (status != 'cancelled')
- 根据 lesson 表实际数据更新 teacher_count (status = 'completed' 去重教师)
2026-03-20 14:38:26 +08:00
En
4ec61e48ca fix: 课程包统计逻辑修正
1. CoursePackageMapper: 新增 decrementUsageCount 方法
   - 课程取消时减少使用次数

2. LessonServiceImpl: 完善课程状态变更时的统计
   - cancelLesson: 取消时 usage_count -1
   - startLesson: 设置 startDatetime
   - completeLesson: 完成时设置 endDatetime

统计口径:
- usage_count: status != 'cancelled' 的课程数(创建时 +1,取消时 -1)
- teacher_count: status = 'completed' 的课程中去重教师数
2026-03-20 14:38:26 +08:00
3 changed files with 52 additions and 0 deletions

View File

@ -16,6 +16,13 @@ public interface CoursePackageMapper extends BaseMapper<CoursePackage> {
@Update("UPDATE course_package SET usage_count = usage_count + 1 WHERE id = #{coursePackageId}")
void incrementUsageCount(@Param("coursePackageId") Long coursePackageId);
/**
* 减少课程包使用次数课程取消时调用
* @param coursePackageId 课程包 ID
*/
@Update("UPDATE course_package SET usage_count = GREATEST(usage_count - 1, 0) WHERE id = #{coursePackageId}")
void decrementUsageCount(@Param("coursePackageId") Long coursePackageId);
/**
* 更新课程包教师数量去重统计已完成课程的教师
* @param coursePackageId 课程包 ID

View File

@ -174,6 +174,7 @@ public class LessonServiceImpl extends ServiceImpl<LessonMapper, Lesson>
public void startLesson(Long id) {
Lesson lesson = getLessonById(id);
lesson.setStatus(LessonStatus.IN_PROGRESS.getCode());
lesson.setStartDatetime(LocalDateTime.now());
lessonMapper.updateById(lesson);
log.info("课程开始id={}", id);
}
@ -183,6 +184,7 @@ public class LessonServiceImpl extends ServiceImpl<LessonMapper, Lesson>
public void completeLesson(Long id) {
Lesson lesson = getLessonById(id);
lesson.setStatus(LessonStatus.COMPLETED.getCode());
lesson.setEndDatetime(LocalDateTime.now());
lessonMapper.updateById(lesson);
log.info("课程完成id={}", id);
@ -200,6 +202,12 @@ public class LessonServiceImpl extends ServiceImpl<LessonMapper, Lesson>
lesson.setStatus(LessonStatus.CANCELLED.getCode());
lessonMapper.updateById(lesson);
log.info("课程取消id={}", id);
// 更新课程包统计使用次数 -1取消的课程不计入使用
if (lesson.getCourseId() != null) {
coursePackageMapper.decrementUsageCount(lesson.getCourseId());
log.info("课程包使用次数 -1: courseId={}", lesson.getCourseId());
}
}
@Override

View File

@ -0,0 +1,37 @@
-- -----------------------------------------------------
-- V10: 更新课程包统计数据
-- 说明:根据 lesson 表实际数据更新 course_package 的 usage_count 和 teacher_count
-- 时间2026-03-20
-- -----------------------------------------------------
-- 1. 更新 usage_count统计 status != 'cancelled' 的课程数
UPDATE course_package cp
SET usage_count = (
SELECT COUNT(*)
FROM lesson l
WHERE l.course_id = cp.id
AND l.status != 'cancelled'
AND l.deleted = 0
)
WHERE cp.deleted = 0;
-- 2. 更新 teacher_count统计 status = 'completed' 的课程中去重教师数
UPDATE course_package cp
SET teacher_count = (
SELECT COUNT(DISTINCT l.teacher_id)
FROM lesson l
WHERE l.course_id = cp.id
AND l.status = 'completed'
AND l.teacher_id IS NOT NULL
AND l.deleted = 0
)
WHERE cp.deleted = 0;
-- 3. 处理 NULL 值,确保字段为 0 而不是 NULL
UPDATE course_package cp
SET usage_count = 0
WHERE usage_count IS NULL AND deleted = 0;
UPDATE course_package cp
SET teacher_count = 0
WHERE teacher_count IS NULL AND deleted = 0;