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;
|
name: string;
|
||||||
gradeLevel: string;
|
gradeLevel: string;
|
||||||
sortOrder: number;
|
sortOrder: number;
|
||||||
|
scheduleRefData?: string;
|
||||||
}>;
|
}>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -405,7 +405,29 @@ const handleCollectionChange = async (collectionId: number) => {
|
|||||||
const selectPackage = async (packageId: number) => {
|
const selectPackage = async (packageId: number) => {
|
||||||
formData.packageId = packageId;
|
formData.packageId = packageId;
|
||||||
formData.courseId = undefined;
|
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);
|
await loadLessonTypes(packageId);
|
||||||
@ -414,31 +436,6 @@ const selectPackage = async (packageId: number) => {
|
|||||||
// 选择课程
|
// 选择课程
|
||||||
const selectCourse = (courseId: number) => {
|
const selectCourse = (courseId: number) => {
|
||||||
formData.courseId = courseId;
|
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 = "排序号")
|
@Schema(description = "排序号")
|
||||||
private Integer sortOrder;
|
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.common.response.PageResult;
|
||||||
import com.reading.platform.dto.response.CourseCollectionResponse;
|
import com.reading.platform.dto.response.CourseCollectionResponse;
|
||||||
import com.reading.platform.dto.response.CoursePackageResponse;
|
import com.reading.platform.dto.response.CoursePackageResponse;
|
||||||
|
import com.reading.platform.entity.Course;
|
||||||
import com.reading.platform.entity.CourseCollection;
|
import com.reading.platform.entity.CourseCollection;
|
||||||
import com.reading.platform.entity.CourseCollectionPackage;
|
import com.reading.platform.entity.CourseCollectionPackage;
|
||||||
import com.reading.platform.entity.CoursePackage;
|
import com.reading.platform.entity.CoursePackage;
|
||||||
|
import com.reading.platform.entity.CoursePackageCourse;
|
||||||
import com.reading.platform.entity.TenantPackage;
|
import com.reading.platform.entity.TenantPackage;
|
||||||
import com.reading.platform.mapper.CourseCollectionMapper;
|
import com.reading.platform.mapper.CourseCollectionMapper;
|
||||||
import com.reading.platform.mapper.CourseCollectionPackageMapper;
|
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.CoursePackageMapper;
|
||||||
import com.reading.platform.mapper.TenantPackageMapper;
|
import com.reading.platform.mapper.TenantPackageMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -39,6 +43,8 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
|||||||
private final CourseCollectionPackageMapper collectionPackageMapper;
|
private final CourseCollectionPackageMapper collectionPackageMapper;
|
||||||
private final CoursePackageMapper packageMapper;
|
private final CoursePackageMapper packageMapper;
|
||||||
private final TenantPackageMapper tenantPackageMapper;
|
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) {
|
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()
|
return CoursePackageResponse.builder()
|
||||||
.id(pkg.getId())
|
.id(pkg.getId())
|
||||||
.name(pkg.getName())
|
.name(pkg.getName())
|
||||||
@ -333,7 +376,7 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
|||||||
.price(pkg.getPrice())
|
.price(pkg.getPrice())
|
||||||
.discountPrice(pkg.getDiscountPrice())
|
.discountPrice(pkg.getDiscountPrice())
|
||||||
.discountType(pkg.getDiscountType())
|
.discountType(pkg.getDiscountType())
|
||||||
.gradeLevels(pkg.getGradeLevels() != null ? pkg.getGradeLevels().split(",") : new String[0])
|
.gradeLevels(gradeLevelsArray)
|
||||||
.courseCount(pkg.getCourseCount())
|
.courseCount(pkg.getCourseCount())
|
||||||
.status(pkg.getStatus())
|
.status(pkg.getStatus())
|
||||||
.submittedAt(pkg.getSubmittedAt())
|
.submittedAt(pkg.getSubmittedAt())
|
||||||
@ -344,6 +387,7 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
|
|||||||
.publishedAt(pkg.getPublishedAt())
|
.publishedAt(pkg.getPublishedAt())
|
||||||
.createdAt(pkg.getCreatedAt())
|
.createdAt(pkg.getCreatedAt())
|
||||||
.updatedAt(pkg.getUpdatedAt())
|
.updatedAt(pkg.getUpdatedAt())
|
||||||
|
.courses(courseItems)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -153,6 +153,7 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
|
|||||||
item.setName(course.getName());
|
item.setName(course.getName());
|
||||||
item.setGradeLevel(pkc.getGradeLevel());
|
item.setGradeLevel(pkc.getGradeLevel());
|
||||||
item.setSortOrder(pkc.getSortOrder());
|
item.setSortOrder(pkc.getSortOrder());
|
||||||
|
item.setScheduleRefData(course.getScheduleRefData());
|
||||||
return item;
|
return item;
|
||||||
})
|
})
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user