增加课时观看进度记录

This commit is contained in:
none
2023-03-20 17:52:24 +08:00
parent 84bd4fdb55
commit efb3a69498
8 changed files with 248 additions and 26 deletions

View File

@@ -4,10 +4,14 @@ import xyz.playedu.api.domain.UserCourseHourRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author tengteng
* @description 针对表【user_course_hour_records】的数据库操作Service
* @createDate 2023-03-20 16:41:08
*/
* @author tengteng
* @description 针对表【user_course_hour_records】的数据库操作Service
* @createDate 2023-03-20 16:41:08
*/
public interface UserCourseHourRecordService extends IService<UserCourseHourRecord> {
UserCourseHourRecord find(Integer userId, Integer courseId, Integer hourId);
UserCourseHourRecord storeOrUpdate(Integer userId, Integer courseId, Integer hourId, Integer duration, Integer totalDuration);
Integer getFinishedHourCount(Integer userId, Integer courseId);
}

View File

@@ -4,10 +4,13 @@ import xyz.playedu.api.domain.UserCourseRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author tengteng
* @description 针对表【user_course_records】的数据库操作Service
* @createDate 2023-03-20 16:41:04
*/
* @author tengteng
* @description 针对表【user_course_records】的数据库操作Service
* @createDate 2023-03-20 16:41:04
*/
public interface UserCourseRecordService extends IService<UserCourseRecord> {
UserCourseRecord find(Integer userId, Integer courseId);
void storeOrUpdate(Integer userId, Integer courseId, Integer hourCount, Integer finishedCount);
}

View File

@@ -1,20 +1,86 @@
package xyz.playedu.api.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import xyz.playedu.api.domain.UserCourseHourRecord;
import xyz.playedu.api.event.UserCourseHourFinishedEvent;
import xyz.playedu.api.service.UserCourseHourRecordService;
import xyz.playedu.api.mapper.UserCourseHourRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author tengteng
* @description 针对表【user_course_hour_records】的数据库操作Service实现
* @createDate 2023-03-20 16:41:08
*/
@Service
public class UserCourseHourRecordServiceImpl extends ServiceImpl<UserCourseHourRecordMapper, UserCourseHourRecord>
implements UserCourseHourRecordService{
import java.util.Date;
/**
* @author tengteng
* @description 针对表【user_course_hour_records】的数据库操作Service实现
* @createDate 2023-03-20 16:41:08
*/
@Service
public class UserCourseHourRecordServiceImpl extends ServiceImpl<UserCourseHourRecordMapper, UserCourseHourRecord> implements UserCourseHourRecordService {
@Autowired
private ApplicationContext ctx;
@Override
public UserCourseHourRecord find(Integer userId, Integer courseId, Integer hourId) {
return getOne(query().getWrapper().eq("user_id", userId).eq("course_id", courseId).eq("hour_id", hourId));
}
@Override
public UserCourseHourRecord storeOrUpdate(Integer userId, Integer courseId, Integer hourId, Integer duration, Integer totalDuration) {
UserCourseHourRecord record = find(userId, courseId, hourId);
// 已看完
if (record != null && record.getIsFinished() == 1) {
return record;
}
// 是否看完
boolean isFinished = duration >= totalDuration;
Date finishedAt = isFinished ? new Date() : null;
if (record == null) {
UserCourseHourRecord insertRecord = new UserCourseHourRecord();
insertRecord.setUserId(userId);
insertRecord.setCourseId(courseId);
insertRecord.setHourId(hourId);
insertRecord.setTotalDuration(totalDuration);
insertRecord.setFinishedDuration(duration);
insertRecord.setIsFinished(isFinished ? 1 : 0);
insertRecord.setFinishedAt(finishedAt);
insertRecord.setCreatedAt(new Date());
insertRecord.setUpdatedAt(new Date());
save(insertRecord);
record = insertRecord;
} else {
// 未看完 && 大于存在的观看记录时长
if (record.getFinishedDuration() < duration) {
UserCourseHourRecord updateRecord = new UserCourseHourRecord();
updateRecord.setId(record.getId());
updateRecord.setTotalDuration(totalDuration);
updateRecord.setFinishedDuration(duration);
updateRecord.setIsFinished(isFinished ? 1 : 0);
updateRecord.setFinishedAt(finishedAt);
updateById(updateRecord);
record = updateRecord;
}
}
if (isFinished) {
ctx.publishEvent(new UserCourseHourFinishedEvent(this, record.getUserId(), record.getCourseId(), record.getHourId()));
}
return record;
}
@Override
public Integer getFinishedHourCount(Integer userId, Integer courseId) {
return Math.toIntExact(count(query().getWrapper().eq("user_id", userId).eq("course_id", courseId).eq("is_finished", 1)));
}
}

View File

@@ -6,15 +6,64 @@ import xyz.playedu.api.service.UserCourseRecordService;
import xyz.playedu.api.mapper.UserCourseRecordMapper;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* @author tengteng
* @description 针对表【user_course_records】的数据库操作Service实现
* @createDate 2023-03-20 16:41:04
*/
* @author tengteng
* @description 针对表【user_course_records】的数据库操作Service实现
* @createDate 2023-03-20 16:41:04
*/
@Service
public class UserCourseRecordServiceImpl extends ServiceImpl<UserCourseRecordMapper, UserCourseRecord>
implements UserCourseRecordService{
implements UserCourseRecordService {
@Override
public UserCourseRecord find(Integer userId, Integer courseId) {
return getOne(query().getWrapper().eq("user_id", userId).eq("course_id", courseId));
}
@Override
public void storeOrUpdate(Integer userId, Integer courseId, Integer hourCount, Integer finishedCount) {
if (hourCount == 0) {
return;
}
UserCourseRecord record = find(userId, courseId);
// 已看完
if (record != null && record.getIsFinished() == 1) {
return;
}
boolean isFinished = finishedCount >= hourCount;
Date finishedAt = isFinished ? new Date() : null;
Integer progress = finishedCount * 100 / hourCount * 100;
if (record == null) {
UserCourseRecord insertRecord = new UserCourseRecord();
insertRecord.setUserId(userId);
insertRecord.setCourseId(courseId);
insertRecord.setHourCount(hourCount);
insertRecord.setFinishedCount(finishedCount);
insertRecord.setFinishedAt(finishedAt);
insertRecord.setIsFinished(isFinished ? 1 : 0);
insertRecord.setProgress(progress);
insertRecord.setCreatedAt(new Date());
insertRecord.setUpdatedAt(new Date());
save(insertRecord);
} else {
UserCourseRecord updateRecord = new UserCourseRecord();
updateRecord.setId(record.getId());
updateRecord.setHourCount(hourCount);
updateRecord.setFinishedCount(finishedCount);
updateRecord.setFinishedAt(finishedAt);
updateRecord.setIsFinished(isFinished ? 1 : 0);
updateRecord.setProgress(progress);
updateById(updateRecord);
}
}
}