123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- 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<Course> 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<UserCourse> 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<UserOrderRecord> 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<CourseNo> courseNoList, Collection<UserCourseProgress> 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<CourseNo> courseNoList, Collection<UserCourseProgress> 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<UserCourseRecord> 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<CourseNo> 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<CourseData> courseDataList){
- // 处理权限
- if (user != null){
- Collection ids = Transform.getIds(courseDataList, CourseData.class, "id");
- List<UserOrderRecord> 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());
- }
- }
- }
- }
|