refactor: 消除课程和套餐状态魔法值,统一使用 CourseStatus 枚举

- 完善 CourseStatus 枚举值:DRAFT, PENDING, REJECTED, PUBLISHED, ARCHIVED, APPROVED
- 替换 CoursePackageService 中的魔法值为 CourseStatus 枚举
- 替换 CourseServiceImpl 中的魔法值为 CourseStatus 枚举
- 替换 TeacherStatsServiceImpl 中的魔法值为 CourseStatus 枚举
- 适配前端状态值,使用大写枚举值

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
En 2026-03-16 16:04:26 +08:00
parent 05d075eefc
commit a766222733
4 changed files with 31 additions and 22 deletions

View File

@ -3,14 +3,17 @@ package com.reading.platform.common.enums;
import lombok.Getter;
/**
* Course Status Enum
* 课程状态枚举
*/
@Getter
public enum CourseStatus {
DRAFT("draft", "Draft"),
PUBLISHED("published", "PUBLISHED"),
ARCHIVED("archived", "Archived");
DRAFT("DRAFT", "草稿"),
PENDING("PENDING", "待审核"),
REJECTED("REJECTED", "已驳回"),
PUBLISHED("PUBLISHED", "已发布"),
ARCHIVED("ARCHIVED", "已下架"),
APPROVED("APPROVED", "审核通过");
private final String code;
private final String description;

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.reading.platform.common.enums.CourseStatus;
import com.reading.platform.common.exception.BusinessException;
import com.reading.platform.common.response.PageResult;
import com.reading.platform.dto.response.CoursePackageResponse;
@ -170,7 +171,7 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
pkg.setDiscountType(discountType);
// 存储为 JSON 数组格式
pkg.setGradeLevels(JSON.toJSONString(gradeLevels));
pkg.setStatus("DRAFT");
pkg.setStatus(CourseStatus.DRAFT.getCode());
pkg.setCourseCount(0);
pkg.setCreatedAt(LocalDateTime.now());
@ -289,7 +290,7 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
throw new BusinessException("套餐必须包含至少一个课程包");
}
pkg.setStatus("PENDING_REVIEW");
pkg.setStatus(CourseStatus.PENDING.getCode());
pkg.setSubmittedAt(LocalDateTime.now());
pkg.setSubmittedBy(userId);
packageMapper.updateById(pkg);
@ -308,12 +309,12 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
throw new BusinessException("套餐不存在");
}
if (!"PENDING_REVIEW".equals(pkg.getStatus())) {
if (!CourseStatus.PENDING.getCode().equals(pkg.getStatus())) {
log.warn("套餐审核失败状态不正确id={}, status={}", id, pkg.getStatus());
throw new BusinessException("只有待审核状态的套餐可以审核");
}
pkg.setStatus(approved ? "APPROVED" : "REJECTED");
pkg.setStatus(approved ? CourseStatus.APPROVED.getCode() : CourseStatus.REJECTED.getCode());
pkg.setReviewedAt(LocalDateTime.now());
pkg.setReviewedBy(userId);
pkg.setReviewComment(comment);
@ -333,12 +334,12 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
throw new BusinessException("套餐不存在");
}
if (!"APPROVED".equals(pkg.getStatus())) {
if (!CourseStatus.APPROVED.getCode().equals(pkg.getStatus())) {
log.warn("套餐发布失败状态不正确id={}, status={}", id, pkg.getStatus());
throw new BusinessException("只有已审核通过的套餐可以发布");
}
pkg.setStatus("PUBLISHED");
pkg.setStatus(CourseStatus.PUBLISHED.getCode());
pkg.setPublishedAt(LocalDateTime.now());
packageMapper.updateById(pkg);
log.info("套餐发布成功id={}", id);
@ -356,7 +357,7 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
throw new BusinessException("套餐不存在");
}
pkg.setStatus("OFFLINE");
pkg.setStatus(CourseStatus.ARCHIVED.getCode());
packageMapper.updateById(pkg);
log.info("套餐下线成功id={}", id);
}

View File

@ -3,6 +3,7 @@ package com.reading.platform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.reading.platform.common.enums.CourseStatus;
import com.reading.platform.common.enums.ErrorCode;
import com.reading.platform.common.exception.BusinessException;
import com.reading.platform.dto.request.CourseCreateRequest;
@ -49,7 +50,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
course.setDifficultyLevel(request.getDifficultyLevel());
course.setDurationMinutes(request.getDurationMinutes());
course.setObjectives(request.getObjectives());
course.setStatus("draft");
course.setStatus(CourseStatus.DRAFT.getCode());
course.setIsSystem(0);
// Course Package Fields
@ -110,7 +111,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
course.setDifficultyLevel(request.getDifficultyLevel());
course.setDurationMinutes(request.getDurationMinutes());
course.setObjectives(request.getObjectives());
course.setStatus("draft");
course.setStatus(CourseStatus.DRAFT.getCode());
course.setIsSystem(1);
// Course Package Fields
@ -357,9 +358,12 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
// 只过滤系统课程
wrapper.eq(Course::getIsSystem, 1);
// 审核管理页返回待审核和已驳回排除已通过/已发布
// 审核管理页过滤待审核和已驳回排除已通过/已发布
if (reviewOnly) {
wrapper.in(Course::getStatus, List.of("PENDING", "pending", "REJECTED", "rejected"));
wrapper.in(Course::getStatus, List.of(
CourseStatus.PENDING.getCode(),
CourseStatus.REJECTED.getCode()
));
}
if (StringUtils.hasText(keyword)) {
@ -394,7 +398,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
@Transactional
public void publishCourse(Long id) {
Course course = getCourseById(id);
course.setStatus("PUBLISHED");
course.setStatus(CourseStatus.PUBLISHED.getCode());
course.setPublishedAt(LocalDateTime.now());
courseMapper.updateById(course);
log.info("课程发布成功id={}", id);
@ -404,7 +408,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
@Transactional
public void archiveCourse(Long id) {
Course course = getCourseById(id);
course.setStatus("archived");
course.setStatus(CourseStatus.ARCHIVED.getCode());
courseMapper.updateById(course);
log.info("课程归档成功id={}", id);
}
@ -413,10 +417,10 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
@Transactional
public void rejectCourse(Long id, String comment) {
Course course = getCourseById(id);
if (!"PENDING".equalsIgnoreCase(course.getStatus()) && !"pending".equals(course.getStatus())) {
if (!CourseStatus.PENDING.getCode().equalsIgnoreCase(course.getStatus())) {
log.warn("课程状态非待审核无法驳回id={}, status={}", id, course.getStatus());
}
course.setStatus("REJECTED");
course.setStatus(CourseStatus.REJECTED.getCode());
course.setReviewComment(comment);
course.setReviewedAt(LocalDateTime.now());
course.setReviewedBy(1L); // TODO: SecurityUtils 获取当前用户
@ -433,7 +437,7 @@ public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course>
.or()
.eq(Course::getIsSystem, 1)
)
.eq(Course::getStatus, "PUBLISHED")
.eq(Course::getStatus, CourseStatus.PUBLISHED.getCode())
.orderByAsc(Course::getName)
);
}

View File

@ -1,6 +1,7 @@
package com.reading.platform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.reading.platform.common.enums.CourseStatus;
import com.reading.platform.entity.Clazz;
import com.reading.platform.entity.Course;
import com.reading.platform.entity.Lesson;
@ -78,7 +79,7 @@ public class TeacherStatsServiceImpl implements TeacherStatsService {
List<Course> recommendedCourses = courseMapper.selectList(
new LambdaQueryWrapper<Course>()
.eq(Course::getTenantId, tenantId)
.eq(Course::getStatus, "PUBLISHED")
.eq(Course::getStatus, CourseStatus.PUBLISHED.getCode())
.orderByDesc(Course::getUsageCount)
.last("LIMIT 5")
);
@ -132,7 +133,7 @@ public class TeacherStatsServiceImpl implements TeacherStatsService {
return courseMapper.selectList(
new LambdaQueryWrapper<Course>()
.eq(Course::getTenantId, tenantId)
.eq(Course::getStatus, "PUBLISHED")
.eq(Course::getStatus, CourseStatus.PUBLISHED.getCode())
.orderByDesc(Course::getUsageCount)
.last("LIMIT 10")
);