package com.qxgmat.service.extend; import com.nuliji.tools.Tools; import com.nuliji.tools.Transform; import com.nuliji.tools.exception.ParameterException; import com.qxgmat.data.constants.enums.QuestionSubject; import com.qxgmat.data.constants.enums.QuestionType; import com.qxgmat.data.constants.enums.module.ProductType; import com.qxgmat.data.constants.enums.module.VideoCourseType; import com.qxgmat.data.dao.entity.*; import com.qxgmat.data.relation.entity.UserRecordStatRelation; import com.qxgmat.service.inline.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; @Service public class CourseExtendService { @Autowired private CourseService courseService; @Autowired private UserCourseService userCourseService; @Autowired private UserOrderRecordService userOrderRecordService; @Autowired private UserCourseRecordService userCourseRecordService; @Resource private UserCourseProgressService userCourseProgressService; /** * 计算vs课程有效期 * @param vsNumber */ public int computeExpire(Integer vsNumber, Course course){ // day / 10 Integer expireDays = course.getExpirePreDays(); return Math.max(vsNumber / 10, 1) * expireDays; } /** * 获取video课程有效期 * @param course * @return */ public int computeExpire(Course course){ return course.getUseExpireDays(); } public void suspendCourse(Integer userId, Integer recordId){ UserOrderRecord record = userOrderRecordService.get(recordId); if (record == null){ throw new ParameterException("记录不存在"); } if (!record.getUserId().equals(userId)){ throw new ParameterException("记录不存在"); } if (record.getIsUsed() == 0){ throw new ParameterException("课程还未开通"); } if (record.getIsSuspend() > 0){ throw new ParameterException("已停课1次"); } userOrderRecordService.edit(UserOrderRecord.builder() .id(record.getId()) .isSuspend(1) .suspendTime(new Date()) .build()); } public void restoreCourse(Integer userId, Integer recordId){ UserOrderRecord record = userOrderRecordService.get(recordId); if (record == null){ throw new ParameterException("记录不存在"); } if (!record.getUserId().equals(userId)){ throw new ParameterException("记录不存在"); } if (record.getIsUsed() == 0){ throw new ParameterException("课程还未开通"); } if (record.getIsSuspend() == 0){ throw new ParameterException("无需恢复"); } if (record.getRestoreTime() != null){ throw new ParameterException("已恢复"); } userOrderRecordService.edit(UserOrderRecord.builder() .id(record.getId()) .restoreTime(new Date()) .useEndTime(Tools.addDate(record.getUseEndTime(), (int)((new Date().getTime() - record.getSuspendTime().getTime()) / 86400000))) .build()); } public void awardCourse(Integer userId, Integer recordId, Integer day){ UserOrderRecord record = userOrderRecordService.get(recordId); if (record == null){ throw new ParameterException("记录不存在"); } if (!record.getUserId().equals(userId)){ throw new ParameterException("记录不存在"); } if (record.getIsUsed() == 0){ throw new ParameterException("课程还未开通"); } if (record.getCourseAward() > 0){ throw new ParameterException("已奖励"); } userOrderRecordService.edit(UserOrderRecord.builder() .id(record.getId()) .courseAward(day) .useEndTime(Tools.addDate(record.getUseEndTime(), day)) .build()); } /** * 累计听课学习时间 * @param userId * @return */ public Integer studyTime(Integer userId, Date startTime, Date endTime){ UserRecordStatRelation record = userCourseRecordService.stat(userId, startTime != null? startTime.toString():null, endTime != null ? endTime.toString(): null); return record != null ? record.getUserTime() : 0; } /** * 全站平均听课时间 * @return */ public Integer studyAvgTime(Date startTime, Date endTime){ UserRecordStatRelation record = userCourseRecordService.statAvg(startTime != null? startTime.toString():null, endTime != null ? endTime.toString(): null); return record != null ? record.getUserTime() : 0; } public UserCourse userCourse(Integer userId, Integer courseId){ return userCourseService.getCourse(userId, courseId); } /** * 根据题目类型获取课程信息 * @param questionType * @return */ public Integer questionRelationCourse(Integer userId, QuestionType questionType){ QuestionSubject subject = QuestionSubject.FromType(questionType); // 只查询系统授课记录 List courseList = courseService.listByExtend(questionType.key, subject.key, VideoCourseType.SYSTEM.key); if (courseList.size()==0)return null; Collection ids = Transform.getIds(courseList, Course.class, "id"); List userCourseList = userCourseService.listByCourse(userId, ids); if (userCourseList.size() == 0) return null; if (userCourseList.size() == 1) return userCourseList.get(0).getRecordId(); // 获取回答时间最小的记录 Collection recordIds = Transform.getIds(userCourseList, UserCourse.class, "recordId"); List userOrderRecordList = userOrderRecordService.select(recordIds); int min = 0; Integer minId = null; for(UserOrderRecord userOrderRecord : userOrderRecordList){ if (minId == null || min > userOrderRecord.getAskTime()){ min = userOrderRecord.getAskTime(); minId = userOrderRecord.getId(); } } return minId; } /** * 获取已完成课时序号 * @param courseNoList * @param progressList * @return */ public int computeCourseNoFinish(Collection courseNoList, Collection progressList){ Map progressMap = Transform.getMap(progressList, UserCourseProgress.class, "courseNoId"); int min = 0; for(CourseNo no : courseNoList){ UserCourseProgress progress = (UserCourseProgress)progressMap.get(no.getId()); if(progress == null) continue; if (min != 0 && min > no.getNo()) continue; if (progress.getProgress() > 50) { min = no.getNo(); } } return min; } /** * 获取当前课时 * @param courseNoList * @param progressList * @return */ public int computeCourseNoCurrent(Collection courseNoList, Collection progressList){ Map progressMap = Transform.getMap(progressList, UserCourseProgress.class, "courseNoId"); int min = 0; for(CourseNo no : courseNoList){ // 如果进度不过半,按当前课时+下一课时 // 如果进度过半,下2次课时 UserCourseProgress progress = (UserCourseProgress)progressMap.get(no.getId()); if(progress == null) continue; if (min != 0 && min > no.getNo()) continue; min = no.getNo(); } return min; } /** * 计算用户该课程的总学习时长 * @param userCourseRecords * @return */ public int computeCourseTime(Collection userCourseRecords){ int time = 0; for(UserCourseRecord userCourseRecord:userCourseRecords){ time += userCourseRecord.getUserTime(); } return time; } /** * 计算用户该课程的总学习天数 * @param record * @return */ public int computeCourseDay(UserOrderRecord record){ if(record.getUseEndTime() == null){ return 0; } int suspend = 0; if(record.getIsSuspend() > 0){ if(record.getRestoreTime() == null){ suspend = (int)(Tools.day(new Date()).getTime() - Tools.day(record.getSuspendTime()).getTime())/86400000; }else{ suspend = (int)(Tools.day(record.getRestoreTime()).getTime() - Tools.day(record.getSuspendTime()).getTime())/86400000; } } if (record.getUseEndTime().before(new Date())){ return (int)(Tools.day(record.getUseEndTime()).getTime() - Tools.day(record.getUseStartTime()).getTime())/86400000 - suspend; }else{ return (int)(Tools.day(new Date()).getTime() - Tools.day(record.getUseStartTime()).getTime())/86400000 - suspend; } // Date min = null; // Date max = null; // for(UserCourseRecord userCourseRecord:userCourseRecords){ // if(min==null || min.after(userCourseRecord.getCreateTime())){ // min = userCourseRecord.getCreateTime(); // } // if (max == null || max.before(userCourseRecord.getCreateTime())){ // max = userCourseRecord.getCreateTime(); // } // } // int suspend = 0; // if (min == null) return 0; // return (int)((Tools.day(max).getTime() - Tools.day(min).getTime())/86400000) - suspend; } /** * 根据用户权限更新资源信息 * @param user * @param courseId * @param courseNoList */ public void refreshNoResource(User user, Integer courseId, List courseNoList){ if (user != null){ if (userCourseService.getCourse(user.getId(), courseId) == null){ for(CourseNo courseNo : courseNoList){ courseNo.setResource(courseNo.getTrailResource()); } } }else{ for(CourseNo courseNo : courseNoList){ courseNo.setResource(courseNo.getTrailResource()); } } } /** * 根据用户权限更新资源信息 * @param user * @param courseData */ public void refreshDataResource(User user, CourseData courseData){ // 处理权限 if (user != null){ if (!userOrderRecordService.hasData(user.getId(), courseData.getId())){ courseData.setResource(courseData.getTrailResource()); } }else{ courseData.setResource(courseData.getTrailResource()); } } /** * 根据用户权限更新资源信息 * @param user * @param courseDataList */ public void refreshDataResource(User user, List courseDataList){ // 处理权限 if (user != null){ Collection ids = Transform.getIds(courseDataList, CourseData.class, "id"); List records = userOrderRecordService.listWithUserData(user.getId(), ids); Map map = Transform.getMap(records, UserOrderRecord.class, "productId"); for(CourseData courseData : courseDataList){ if (!map.containsKey(courseData.getId())){ courseData.setResource(courseData.getTrailResource()); } } }else{ for(CourseData courseData : courseDataList){ courseData.setResource(courseData.getTrailResource()); } } } }