优化学员最近学习记录api

This commit is contained in:
none 2023-03-27 17:26:28 +08:00
parent c6edf48fb0
commit 9778f1c06a
8 changed files with 49 additions and 13 deletions

View File

@ -37,6 +37,9 @@ public class UserController {
@Autowired @Autowired
private CourseService courseService; private CourseService courseService;
@Autowired
private CourseHourService hourService;
@Autowired @Autowired
private UserCourseRecordService userCourseRecordService; private UserCourseRecordService userCourseRecordService;
@ -166,11 +169,16 @@ public class UserController {
@GetMapping("/latest-learn") @GetMapping("/latest-learn")
public JsonResponse latestLearn() { public JsonResponse latestLearn() {
// 读取当前学员最近100条学习的线上课 // 读取当前学员最近100条学习的线上课
List<Integer> courseIds = userCourseHourRecordService.getLatestCourseIds(FCtx.getId(), 100); List<UserCourseHourRecord> userCourseHourRecords = userCourseHourRecordService.getLatestCourseIds(FCtx.getId(), 100);
if (courseIds == null || courseIds.size() == 0) { if (userCourseHourRecords == null || userCourseHourRecords.size() == 0) {
return JsonResponse.data(new ArrayList<>()); return JsonResponse.data(new ArrayList<>());
} }
List<Integer> courseIds = userCourseHourRecords.stream().map(UserCourseHourRecord::getCourseId).toList();
List<Integer> hourIds = userCourseHourRecords.stream().map(UserCourseHourRecord::getHourId).toList();
Map<Integer, UserCourseHourRecord> hour2Record = userCourseHourRecords.stream().collect(Collectors.toMap(UserCourseHourRecord::getHourId, e -> e));
Map<Integer, Integer> course2hour = userCourseHourRecords.stream().collect(Collectors.toMap(UserCourseHourRecord::getCourseId, UserCourseHourRecord::getHourId));
// 线上课 // 线上课
Map<Integer, Course> courses = courseService.chunks(courseIds, new ArrayList<>() {{ Map<Integer, Course> courses = courseService.chunks(courseIds, new ArrayList<>() {{
add("id"); add("id");
@ -181,15 +189,24 @@ public class UserController {
add("is_required"); add("is_required");
}}).stream().collect(Collectors.toMap(Course::getId, e -> e)); }}).stream().collect(Collectors.toMap(Course::getId, e -> e));
// 线上课课时
Map<Integer, CourseHour> hours = hourService.chunk(hourIds).stream().collect(Collectors.toMap(CourseHour::getId, e -> e));
// 获取学员的线上课进度 // 获取学员的线上课进度
Map<Integer, UserCourseRecord> records = userCourseRecordService.chunk(FCtx.getId(), courseIds).stream().collect(Collectors.toMap(UserCourseRecord::getCourseId, e -> e)); Map<Integer, UserCourseRecord> records = userCourseRecordService.chunk(FCtx.getId(), courseIds).stream().collect(Collectors.toMap(UserCourseRecord::getCourseId, e -> e));
List<UserLatestLearn> userLatestLearns = new ArrayList<>(); List<UserLatestLearn> userLatestLearns = new ArrayList<>();
for (Integer courseId : courseIds) { for (Integer courseId : courseIds) {
UserCourseRecord record = records.get(courseId); UserCourseRecord record = records.get(courseId);//线上课学习进度
Course tmpCourse = courses.get(courseId); Course tmpCourse = courses.get(courseId);//线上课
Integer tmpHourId = course2hour.get(courseId);//最近学习的课时id
UserCourseHourRecord tmpUserCourseHourRecord = hour2Record.get(tmpHourId);//课时学习进度
CourseHour tmpHour = hours.get(tmpHourId);//课时
userLatestLearns.add(new UserLatestLearn() {{ userLatestLearns.add(new UserLatestLearn() {{
setCourse(tmpCourse); setCourse(tmpCourse);
setUserCourseRecord(record); setUserCourseRecord(record);
setHourRecord(tmpUserCourseHourRecord);
setLastLearnHour(tmpHour);
}}); }});
} }

View File

@ -14,7 +14,7 @@ import java.util.List;
*/ */
@Mapper @Mapper
public interface UserCourseHourRecordMapper extends BaseMapper<UserCourseHourRecord> { public interface UserCourseHourRecordMapper extends BaseMapper<UserCourseHourRecord> {
List<Integer> getLatestCourseIds(Integer userId, Integer size); List<UserCourseHourRecord> getUserLatestRecords(Integer userId, Integer size);
} }

View File

@ -30,4 +30,6 @@ public interface CourseHourService extends IService<CourseHour> {
void updateSort(List<Integer> ids, Integer cid); void updateSort(List<Integer> ids, Integer cid);
List<Integer> getRidsByCourseId(Integer courseId, String type); List<Integer> getRidsByCourseId(Integer courseId, String type);
List<CourseHour> chunk(List<Integer> hourIds);
} }

View File

@ -19,5 +19,5 @@ public interface UserCourseHourRecordService extends IService<UserCourseHourReco
List<UserCourseHourRecord> getRecords(Integer userId, Integer courseId); List<UserCourseHourRecord> getRecords(Integer userId, Integer courseId);
List<Integer> getLatestCourseIds(Integer userId, Integer size); List<UserCourseHourRecord> getLatestCourseIds(Integer userId, Integer size);
} }

View File

@ -99,6 +99,11 @@ public class CourseHourServiceImpl extends ServiceImpl<CourseHourMapper, CourseH
public List<Integer> getRidsByCourseId(Integer courseId, String type) { public List<Integer> getRidsByCourseId(Integer courseId, String type) {
return list(query().getWrapper().eq("course_id", courseId).eq("type", type)).stream().map(CourseHour::getRid).toList(); return list(query().getWrapper().eq("course_id", courseId).eq("type", type)).stream().map(CourseHour::getRid).toList();
} }
@Override
public List<CourseHour> chunk(List<Integer> hourIds) {
return list(query().getWrapper().in("id", hourIds));
}
} }

View File

@ -90,8 +90,8 @@ public class UserCourseHourRecordServiceImpl extends ServiceImpl<UserCourseHourR
} }
@Override @Override
public List<Integer> getLatestCourseIds(Integer userId, Integer size) { public List<UserCourseHourRecord> getLatestCourseIds(Integer userId, Integer size) {
return getBaseMapper().getLatestCourseIds(userId, size); return getBaseMapper().getUserLatestRecords(userId, size);
} }
} }

View File

@ -3,6 +3,8 @@ package xyz.playedu.api.types.response;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import xyz.playedu.api.domain.Course; import xyz.playedu.api.domain.Course;
import xyz.playedu.api.domain.CourseHour;
import xyz.playedu.api.domain.UserCourseHourRecord;
import xyz.playedu.api.domain.UserCourseRecord; import xyz.playedu.api.domain.UserCourseRecord;
/** /**
@ -15,4 +17,8 @@ public class UserLatestLearn {
private Course course; private Course course;
@JsonProperty("record") @JsonProperty("record")
private UserCourseRecord userCourseRecord; private UserCourseRecord userCourseRecord;
@JsonProperty("last_learn_hour")
private CourseHour lastLearnHour;
@JsonProperty("hour_record")
private UserCourseHourRecord hourRecord;
} }

View File

@ -26,10 +26,16 @@
created_at,updated_at created_at,updated_at
</sql> </sql>
<select id="getLatestCourseIds" resultType="java.lang.Integer"> <select id="getUserLatestRecords" resultType="xyz.playedu.api.domain.UserCourseHourRecord">
select distinct `user_course_hour_records`.`course_id` select `t1`.*
from `user_course_hour_records` from `user_course_hour_records` as `t1`
where `user_course_hour_records`.`user_id` = #{userId} inner join (select `course_id`, max(`updated_at`) as `latest_at`
order by `user_course_hour_records`.`updated_at` desc limit #{size}; from `user_course_hour_records`
group by `course_id`) as `t2`
on `t2`.`course_id` = `t1`.`course_id` and
`t2`.`latest_at` = `t1`.`updated_at`
where `t1`.`user_id` = #{userId}
order by `t1`.`updated_at` desc
limit #{size};
</select> </select>
</mapper> </mapper>