fix: 教师端课程包按 学校->套餐->课程包 层级查询

- 新增 getTenantPackageCoursePage 方法实现层级分页查询
- TeacherCourseController 使用新方法替代直接按 tenant_id 查询
- 修复 /api/v1/teacher/courses 无数据问题

Made-with: Cursor
This commit is contained in:
zhonghua 2026-03-19 14:20:49 +08:00
parent ccce7e66bb
commit c652cda7a8
3 changed files with 82 additions and 3 deletions

View File

@ -69,16 +69,21 @@ public class TeacherCourseController {
@RequestParam(required = false) String keyword,
@RequestParam(required = false) String category) {
Long tenantId = SecurityUtils.getCurrentTenantId();
Page<CoursePackage> page = courseService.getCoursePage(tenantId, pageNum, pageSize, keyword, category, CourseStatus.PUBLISHED.getCode());
// 学校 -> 套餐 -> 课程包 层级查询教师可用课程
Page<CoursePackage> page = courseService.getTenantPackageCoursePage(
tenantId, pageNum, pageSize, keyword, category, CourseStatus.PUBLISHED.getCode());
List<CourseResponse> voList = courseMapper.toVO(page.getRecords());
return Result.success(PageResult.of(voList, page.getTotal(), page.getCurrent(), page.getSize()));
}
@Operation(summary = "获取所有课程")
@GetMapping("/courses/all")
public Result<List<CourseResponse>> getAllCourses() {
public Result<List<CourseResponse>> getAllCourses(
@RequestParam(required = false) String keyword,
@RequestParam(required = false) String category) {
Long tenantId = SecurityUtils.getCurrentTenantId();
List<CoursePackage> courses = courseService.getCoursesByTenantId(tenantId);
// 学校 -> 套餐 -> 课程包 层级查询
List<CoursePackage> courses = courseService.getTenantPackageCourses(tenantId, keyword, category);
return Result.success(courseMapper.toVO(courses));
}

View File

@ -65,4 +65,18 @@ public interface CoursePackageService extends com.baomidou.mybatisplus.extension
*/
List<CoursePackage> getTenantPackageCourses(Long tenantId, String keyword, String grade);
/**
* 学校 -> 套餐 -> 课程包 层级分页查询教师可用课程
* 教师端课程中心应使用此方法通过租户已购买的套餐获取课程包
*
* @param tenantId 租户学校ID
* @param pageNum 页码
* @param pageSize 每页数量
* @param keyword 关键词课程名称绘本名称可选
* @param grade 年级/领域筛选可选
* @param status 课程状态 PUBLISHED
*/
Page<CoursePackage> getTenantPackageCoursePage(Long tenantId, Integer pageNum, Integer pageSize,
String keyword, String grade, String status);
}

View File

@ -275,6 +275,66 @@ public class CoursePackageServiceImpl extends ServiceImpl<CoursePackageMapper, C
return coursePackageMapper.selectList(wrapper);
}
@Override
public Page<CoursePackage> getTenantPackageCoursePage(Long tenantId, Integer pageNum, Integer pageSize,
String keyword, String grade, String status) {
int current = pageNum != null && pageNum > 0 ? pageNum : 1;
int size = pageSize != null && pageSize > 0 ? pageSize : 10;
// 1. 学校 -> 套餐查询租户已购买的套餐collection
List<Long> collectionIds = tenantPackageMapper.selectList(
new LambdaQueryWrapper<TenantPackage>()
.eq(TenantPackage::getTenantId, tenantId)
.eq(TenantPackage::getStatus, TenantPackageStatus.ACTIVE.getCode())
.isNotNull(TenantPackage::getCollectionId))
.stream()
.map(TenantPackage::getCollectionId)
.distinct()
.collect(Collectors.toList());
if (collectionIds.isEmpty()) {
return new Page<>(current, size, 0);
}
// 2. 套餐 -> 课程包查询套餐下的课程包 ID
List<Long> packageIds = collectionPackageMapper.selectList(
new LambdaQueryWrapper<CourseCollectionPackage>()
.in(CourseCollectionPackage::getCollectionId, collectionIds))
.stream()
.map(CourseCollectionPackage::getPackageId)
.distinct()
.collect(Collectors.toList());
if (packageIds.isEmpty()) {
return new Page<>(current, size, 0);
}
// 3. 分页查询课程包
Page<CoursePackage> page = new Page<>(current, size);
LambdaQueryWrapper<CoursePackage> wrapper = new LambdaQueryWrapper<>();
wrapper.in(CoursePackage::getId, packageIds)
.eq(CoursePackage::getStatus, status != null ? status : CourseStatus.PUBLISHED.getCode());
if (StringUtils.hasText(keyword)) {
wrapper.and(w -> w
.like(CoursePackage::getName, keyword)
.or().like(CoursePackage::getPictureBookName, keyword)
.or().like(CoursePackage::getCode, keyword));
}
if (StringUtils.hasText(grade)) {
String gradeLower = grade.toLowerCase();
wrapper.and(w -> w
.like(CoursePackage::getGradeTags, grade)
.or().like(CoursePackage::getGradeTags, gradeLower)
.or().like(CoursePackage::getGradeTags, "\"" + grade + "\"")
.or().like(CoursePackage::getGradeTags, "\"" + gradeLower + "\"")
.or().like(CoursePackage::getDomainTags, grade)
.or().like(CoursePackage::getDomainTags, gradeLower));
}
wrapper.orderByDesc(CoursePackage::getUsageCount);
return coursePackageMapper.selectPage(page, wrapper);
}
private CoursePackage buildEntityFromRequest(CourseCreateRequest request) {
CoursePackage entity = new CoursePackage();
entity.setName(request.getName());