feat: 添加课程包排课计划参考数据返回
后端改动: 1. CoursePackageResponse.CoursePackageCourseItem 添加 scheduleRefData 和 lessonType 字段 2. CoursePackageService.toResponse() 填充 scheduleRefData 和 lessonType 3. CourseCollectionService.toPackageResponse() 重写以包含课程列表和排课计划参考 4. 添加必要的 mapper 依赖注入 前端改动: 1. school.ts CoursePackage 接口添加 scheduleRefData 字段 2. CreateScheduleModal.vue 优化 selectPackage() 方法,直接从响应数据中提取排课计划参考 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
1d7ade9d90
commit
2e3143affb
@ -301,6 +301,7 @@ export interface CoursePackage {
|
||||
name: string;
|
||||
gradeLevel: string;
|
||||
sortOrder: number;
|
||||
scheduleRefData?: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
|
||||
@ -405,7 +405,29 @@ const handleCollectionChange = async (collectionId: number) => {
|
||||
const selectPackage = async (packageId: number) => {
|
||||
formData.packageId = packageId;
|
||||
formData.courseId = undefined;
|
||||
scheduleRefData.value = [];
|
||||
|
||||
// 加载排课计划参考(从选中的课程包中获取)
|
||||
if (selectedCollection.value?.packages) {
|
||||
const selectedPkg = selectedCollection.value.packages.find((p: any) => p.id === packageId);
|
||||
if (selectedPkg?.courses && selectedPkg.courses.length > 0) {
|
||||
// 取第一门课程的排课计划参考作为模板
|
||||
const firstCourse = selectedPkg.courses[0];
|
||||
if (firstCourse.scheduleRefData) {
|
||||
try {
|
||||
const parsedData = JSON.parse(firstCourse.scheduleRefData);
|
||||
scheduleRefData.value = Array.isArray(parsedData) ? parsedData : [];
|
||||
console.log('✅ 排课计划参考数据:', scheduleRefData.value);
|
||||
} catch (e) {
|
||||
console.error('解析排课数据失败:', e);
|
||||
scheduleRefData.value = [];
|
||||
}
|
||||
} else {
|
||||
scheduleRefData.value = [];
|
||||
}
|
||||
} else {
|
||||
scheduleRefData.value = [];
|
||||
}
|
||||
}
|
||||
|
||||
// 加载课程类型列表
|
||||
await loadLessonTypes(packageId);
|
||||
@ -414,31 +436,6 @@ const selectPackage = async (packageId: number) => {
|
||||
// 选择课程
|
||||
const selectCourse = (courseId: number) => {
|
||||
formData.courseId = courseId;
|
||||
// 加载该课程的排课计划参考
|
||||
loadScheduleRefData(courseId);
|
||||
};
|
||||
|
||||
// 加载排课计划参考数据
|
||||
const loadScheduleRefData = async (courseId: number) => {
|
||||
try {
|
||||
// TODO: 调用获取课程详情的API
|
||||
// const course = await getCourseDetail(courseId);
|
||||
// if (course?.scheduleRefData) {
|
||||
// try {
|
||||
// const parsedData = JSON.parse(course.scheduleRefData);
|
||||
// scheduleRefData.value = Array.isArray(parsedData) ? parsedData : [];
|
||||
// } catch (e) {
|
||||
// console.error('Failed to parse scheduleRefData:', e);
|
||||
// scheduleRefData.value = [];
|
||||
// }
|
||||
// } else {
|
||||
// scheduleRefData.value = [];
|
||||
// }
|
||||
scheduleRefData.value = [];
|
||||
} catch (error) {
|
||||
console.error('Failed to load course detail:', error);
|
||||
scheduleRefData.value = [];
|
||||
}
|
||||
};
|
||||
|
||||
// 加载课程类型列表
|
||||
|
||||
@ -98,5 +98,11 @@ public class CoursePackageResponse {
|
||||
|
||||
@Schema(description = "排序号")
|
||||
private Integer sortOrder;
|
||||
|
||||
@Schema(description = "排课计划参考数据(JSON)")
|
||||
private String scheduleRefData;
|
||||
|
||||
@Schema(description = "课程类型")
|
||||
private String lessonType;
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,12 +8,16 @@ import com.reading.platform.common.enums.TenantPackageStatus;
|
||||
import com.reading.platform.common.response.PageResult;
|
||||
import com.reading.platform.dto.response.CourseCollectionResponse;
|
||||
import com.reading.platform.dto.response.CoursePackageResponse;
|
||||
import com.reading.platform.entity.Course;
|
||||
import com.reading.platform.entity.CourseCollection;
|
||||
import com.reading.platform.entity.CourseCollectionPackage;
|
||||
import com.reading.platform.entity.CoursePackage;
|
||||
import com.reading.platform.entity.CoursePackageCourse;
|
||||
import com.reading.platform.entity.TenantPackage;
|
||||
import com.reading.platform.mapper.CourseCollectionMapper;
|
||||
import com.reading.platform.mapper.CourseCollectionPackageMapper;
|
||||
import com.reading.platform.mapper.CourseMapper;
|
||||
import com.reading.platform.mapper.CoursePackageCourseMapper;
|
||||
import com.reading.platform.mapper.CoursePackageMapper;
|
||||
import com.reading.platform.mapper.TenantPackageMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -39,6 +43,8 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
||||
private final CourseCollectionPackageMapper collectionPackageMapper;
|
||||
private final CoursePackageMapper packageMapper;
|
||||
private final TenantPackageMapper tenantPackageMapper;
|
||||
private final CoursePackageCourseMapper packageCourseMapper;
|
||||
private final CourseMapper courseMapper;
|
||||
|
||||
/**
|
||||
* 查询租户的课程套餐列表
|
||||
@ -323,9 +329,46 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为课程包响应对象(简化版)
|
||||
* 转换为课程包响应对象(包含课程列表和排课计划参考)
|
||||
*/
|
||||
private CoursePackageResponse toPackageResponse(CoursePackage pkg) {
|
||||
// 解析 gradeLevels
|
||||
String[] gradeLevelsArray = new String[0];
|
||||
if (pkg.getGradeLevels() != null && !pkg.getGradeLevels().isEmpty()) {
|
||||
try {
|
||||
gradeLevelsArray = pkg.getGradeLevels().split(",");
|
||||
} catch (Exception e) {
|
||||
gradeLevelsArray = new String[0];
|
||||
}
|
||||
}
|
||||
|
||||
List<CoursePackageResponse.CoursePackageCourseItem> courseItems = new ArrayList<>();
|
||||
|
||||
// 查询课程包关联的课程
|
||||
List<CoursePackageCourse> packageCourses = packageCourseMapper.selectList(
|
||||
new LambdaQueryWrapper<CoursePackageCourse>()
|
||||
.eq(CoursePackageCourse::getPackageId, pkg.getId())
|
||||
.orderByAsc(CoursePackageCourse::getSortOrder)
|
||||
);
|
||||
|
||||
if (!packageCourses.isEmpty()) {
|
||||
courseItems = packageCourses.stream()
|
||||
.map(pkc -> {
|
||||
CoursePackageResponse.CoursePackageCourseItem item = new CoursePackageResponse.CoursePackageCourseItem();
|
||||
// 从 CoursePackageCourse 获取课程信息
|
||||
Course course = courseMapper.selectById(pkc.getCourseId());
|
||||
if (course != null) {
|
||||
item.setId(course.getId());
|
||||
item.setName(course.getName());
|
||||
item.setScheduleRefData(course.getScheduleRefData());
|
||||
}
|
||||
item.setGradeLevel(pkc.getGradeLevel());
|
||||
item.setSortOrder(pkc.getSortOrder());
|
||||
return item;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
return CoursePackageResponse.builder()
|
||||
.id(pkg.getId())
|
||||
.name(pkg.getName())
|
||||
@ -333,7 +376,7 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
||||
.price(pkg.getPrice())
|
||||
.discountPrice(pkg.getDiscountPrice())
|
||||
.discountType(pkg.getDiscountType())
|
||||
.gradeLevels(pkg.getGradeLevels() != null ? pkg.getGradeLevels().split(",") : new String[0])
|
||||
.gradeLevels(gradeLevelsArray)
|
||||
.courseCount(pkg.getCourseCount())
|
||||
.status(pkg.getStatus())
|
||||
.submittedAt(pkg.getSubmittedAt())
|
||||
@ -344,6 +387,7 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
||||
.publishedAt(pkg.getPublishedAt())
|
||||
.createdAt(pkg.getCreatedAt())
|
||||
.updatedAt(pkg.getUpdatedAt())
|
||||
.courses(courseItems)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,6 +153,7 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
|
||||
item.setName(course.getName());
|
||||
item.setGradeLevel(pkc.getGradeLevel());
|
||||
item.setSortOrder(pkc.getSortOrder());
|
||||
item.setScheduleRefData(course.getScheduleRefData());
|
||||
return item;
|
||||
})
|
||||
.filter(Objects::nonNull)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user