CourseExtendService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. package com.qxgmat.service.extend;
  2. import com.nuliji.tools.Tools;
  3. import com.nuliji.tools.Transform;
  4. import com.nuliji.tools.exception.ParameterException;
  5. import com.qxgmat.data.constants.enums.QuestionSubject;
  6. import com.qxgmat.data.constants.enums.QuestionType;
  7. import com.qxgmat.data.constants.enums.module.ProductType;
  8. import com.qxgmat.data.constants.enums.module.VideoCourseType;
  9. import com.qxgmat.data.dao.entity.*;
  10. import com.qxgmat.data.relation.entity.UserRecordStatRelation;
  11. import com.qxgmat.service.inline.*;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import javax.annotation.Resource;
  15. import java.util.*;
  16. @Service
  17. public class CourseExtendService {
  18. @Autowired
  19. private CourseService courseService;
  20. @Autowired
  21. private UserCourseService userCourseService;
  22. @Autowired
  23. private UserOrderRecordService userOrderRecordService;
  24. @Autowired
  25. private UserCourseRecordService userCourseRecordService;
  26. @Resource
  27. private UserCourseProgressService userCourseProgressService;
  28. /**
  29. * 计算vs课程有效期
  30. * @param vsNumber
  31. */
  32. public int computeExpire(Integer vsNumber, Course course){
  33. // day / 10
  34. Integer expireDays = course.getExpirePreDays();
  35. return Math.max(vsNumber / 10, 1) * expireDays;
  36. }
  37. /**
  38. * 获取video课程有效期
  39. * @param course
  40. * @return
  41. */
  42. public int computeExpire(Course course){
  43. return course.getUseExpireDays();
  44. }
  45. public void suspendCourse(Integer userId, Integer recordId){
  46. UserOrderRecord record = userOrderRecordService.get(recordId);
  47. if (record == null){
  48. throw new ParameterException("记录不存在");
  49. }
  50. if (!record.getUserId().equals(userId)){
  51. throw new ParameterException("记录不存在");
  52. }
  53. if (record.getIsUsed() == 0){
  54. throw new ParameterException("课程还未开通");
  55. }
  56. if (record.getIsSuspend() > 0){
  57. throw new ParameterException("已停课1次");
  58. }
  59. userOrderRecordService.edit(UserOrderRecord.builder()
  60. .id(record.getId())
  61. .isSuspend(1)
  62. .suspendTime(new Date())
  63. .build());
  64. }
  65. public void restoreCourse(Integer userId, Integer recordId){
  66. UserOrderRecord record = userOrderRecordService.get(recordId);
  67. if (record == null){
  68. throw new ParameterException("记录不存在");
  69. }
  70. if (!record.getUserId().equals(userId)){
  71. throw new ParameterException("记录不存在");
  72. }
  73. if (record.getIsUsed() == 0){
  74. throw new ParameterException("课程还未开通");
  75. }
  76. if (record.getIsSuspend() == 0){
  77. throw new ParameterException("无需恢复");
  78. }
  79. if (record.getRestoreTime() != null){
  80. throw new ParameterException("已恢复");
  81. }
  82. userOrderRecordService.edit(UserOrderRecord.builder()
  83. .id(record.getId())
  84. .restoreTime(new Date())
  85. .useEndTime(Tools.addDate(record.getUseEndTime(), (int)((new Date().getTime() - record.getSuspendTime().getTime()) / 86400000)))
  86. .build());
  87. }
  88. public void awardCourse(Integer userId, Integer recordId, Integer day){
  89. UserOrderRecord record = userOrderRecordService.get(recordId);
  90. if (record == null){
  91. throw new ParameterException("记录不存在");
  92. }
  93. if (!record.getUserId().equals(userId)){
  94. throw new ParameterException("记录不存在");
  95. }
  96. if (record.getIsUsed() == 0){
  97. throw new ParameterException("课程还未开通");
  98. }
  99. if (record.getCourseAward() > 0){
  100. throw new ParameterException("已奖励");
  101. }
  102. userOrderRecordService.edit(UserOrderRecord.builder()
  103. .id(record.getId())
  104. .courseAward(day)
  105. .useEndTime(Tools.addDate(record.getUseEndTime(), day))
  106. .build());
  107. }
  108. /**
  109. * 累计听课学习时间
  110. * @param userId
  111. * @return
  112. */
  113. public Integer studyTime(Integer userId, Date startTime, Date endTime){
  114. UserRecordStatRelation record = userCourseRecordService.stat(userId, startTime != null? startTime.toString():null, endTime != null ? endTime.toString(): null);
  115. return record != null ? record.getUserTime() : 0;
  116. }
  117. /**
  118. * 全站平均听课时间
  119. * @return
  120. */
  121. public Integer studyAvgTime(Date startTime, Date endTime){
  122. UserRecordStatRelation record = userCourseRecordService.statAvg(startTime != null? startTime.toString():null, endTime != null ? endTime.toString(): null);
  123. return record != null ? record.getUserTime() : 0;
  124. }
  125. public UserCourse userCourse(Integer userId, Integer courseId){
  126. return userCourseService.getCourse(userId, courseId);
  127. }
  128. /**
  129. * 根据题目类型获取课程信息
  130. * @param questionType
  131. * @return
  132. */
  133. public Integer questionRelationCourse(Integer userId, QuestionType questionType){
  134. QuestionSubject subject = QuestionSubject.FromType(questionType);
  135. // 只查询系统授课记录
  136. List<Course> courseList = courseService.listByExtend(questionType.key, subject.key, VideoCourseType.SYSTEM.key);
  137. if (courseList.size()==0)return null;
  138. Collection ids = Transform.getIds(courseList, Course.class, "id");
  139. List<UserCourse> userCourseList = userCourseService.listByCourse(userId, ids);
  140. if (userCourseList.size() == 0) return null;
  141. if (userCourseList.size() == 1) return userCourseList.get(0).getRecordId();
  142. // 获取回答时间最小的记录
  143. Collection recordIds = Transform.getIds(userCourseList, UserCourse.class, "recordId");
  144. List<UserOrderRecord> userOrderRecordList = userOrderRecordService.select(recordIds);
  145. int min = 0;
  146. Integer minId = null;
  147. for(UserOrderRecord userOrderRecord : userOrderRecordList){
  148. if (minId == null || min > userOrderRecord.getAskTime()){
  149. min = userOrderRecord.getAskTime();
  150. minId = userOrderRecord.getId();
  151. }
  152. }
  153. return minId;
  154. }
  155. /**
  156. * 获取已完成课时序号
  157. * @param courseNoList
  158. * @param progressList
  159. * @return
  160. */
  161. public int computeCourseNoFinish(Collection<CourseNo> courseNoList, Collection<UserCourseProgress> progressList){
  162. Map progressMap = Transform.getMap(progressList, UserCourseProgress.class, "courseNoId");
  163. int min = 0;
  164. for(CourseNo no : courseNoList){
  165. UserCourseProgress progress = (UserCourseProgress)progressMap.get(no.getId());
  166. if(progress == null) continue;
  167. if (min != 0 && min > no.getNo()) continue;
  168. if (progress.getProgress() > 50) {
  169. min = no.getNo();
  170. }
  171. }
  172. return min;
  173. }
  174. /**
  175. * 获取当前课时
  176. * @param courseNoList
  177. * @param progressList
  178. * @return
  179. */
  180. public int computeCourseNoCurrent(Collection<CourseNo> courseNoList, Collection<UserCourseProgress> progressList){
  181. Map progressMap = Transform.getMap(progressList, UserCourseProgress.class, "courseNoId");
  182. int min = 0;
  183. for(CourseNo no : courseNoList){
  184. // 如果进度不过半,按当前课时+下一课时
  185. // 如果进度过半,下2次课时
  186. UserCourseProgress progress = (UserCourseProgress)progressMap.get(no.getId());
  187. if(progress == null) continue;
  188. if (min != 0 && min > no.getNo()) continue;
  189. min = no.getNo();
  190. }
  191. return min;
  192. }
  193. /**
  194. * 计算用户该课程的总学习时长
  195. * @param userCourseRecords
  196. * @return
  197. */
  198. public int computeCourseTime(Collection<UserCourseRecord> userCourseRecords){
  199. int time = 0;
  200. for(UserCourseRecord userCourseRecord:userCourseRecords){
  201. time += userCourseRecord.getUserTime();
  202. }
  203. return time;
  204. }
  205. /**
  206. * 计算用户该课程的总学习天数
  207. * @param record
  208. * @return
  209. */
  210. public int computeCourseDay(UserOrderRecord record){
  211. if(record.getUseEndTime() == null){
  212. return 0;
  213. }
  214. int suspend = 0;
  215. if(record.getIsSuspend() > 0){
  216. if(record.getRestoreTime() == null){
  217. suspend = (int)(Tools.day(new Date()).getTime() - Tools.day(record.getSuspendTime()).getTime())/86400000;
  218. }else{
  219. suspend = (int)(Tools.day(record.getRestoreTime()).getTime() - Tools.day(record.getSuspendTime()).getTime())/86400000;
  220. }
  221. }
  222. if (record.getUseEndTime().before(new Date())){
  223. return (int)(Tools.day(record.getUseEndTime()).getTime() - Tools.day(record.getUseStartTime()).getTime())/86400000 - suspend;
  224. }else{
  225. return (int)(Tools.day(new Date()).getTime() - Tools.day(record.getUseStartTime()).getTime())/86400000 - suspend;
  226. }
  227. // Date min = null;
  228. // Date max = null;
  229. // for(UserCourseRecord userCourseRecord:userCourseRecords){
  230. // if(min==null || min.after(userCourseRecord.getCreateTime())){
  231. // min = userCourseRecord.getCreateTime();
  232. // }
  233. // if (max == null || max.before(userCourseRecord.getCreateTime())){
  234. // max = userCourseRecord.getCreateTime();
  235. // }
  236. // }
  237. // int suspend = 0;
  238. // if (min == null) return 0;
  239. // return (int)((Tools.day(max).getTime() - Tools.day(min).getTime())/86400000) - suspend;
  240. }
  241. /**
  242. * 根据用户权限更新资源信息
  243. * @param user
  244. * @param courseId
  245. * @param courseNoList
  246. */
  247. public void refreshNoResource(User user, Integer courseId, List<CourseNo> courseNoList){
  248. if (user != null){
  249. if (userCourseService.getCourse(user.getId(), courseId) == null){
  250. for(CourseNo courseNo : courseNoList){
  251. courseNo.setResource(courseNo.getTrailResource());
  252. }
  253. }
  254. }else{
  255. for(CourseNo courseNo : courseNoList){
  256. courseNo.setResource(courseNo.getTrailResource());
  257. }
  258. }
  259. }
  260. /**
  261. * 根据用户权限更新资源信息
  262. * @param user
  263. * @param courseData
  264. */
  265. public void refreshDataResource(User user, CourseData courseData){
  266. // 处理权限
  267. if (user != null){
  268. if (!userOrderRecordService.hasData(user.getId(), courseData.getId())){
  269. courseData.setResource(courseData.getTrailResource());
  270. }
  271. }else{
  272. courseData.setResource(courseData.getTrailResource());
  273. }
  274. }
  275. /**
  276. * 根据用户权限更新资源信息
  277. * @param user
  278. * @param courseDataList
  279. */
  280. public void refreshDataResource(User user, List<CourseData> courseDataList){
  281. // 处理权限
  282. if (user != null){
  283. Collection ids = Transform.getIds(courseDataList, CourseData.class, "id");
  284. List<UserOrderRecord> records = userOrderRecordService.listWithUserData(user.getId(), ids);
  285. Map map = Transform.getMap(records, UserOrderRecord.class, "productId");
  286. for(CourseData courseData : courseDataList){
  287. if (!map.containsKey(courseData.getId())){
  288. courseData.setResource(courseData.getTrailResource());
  289. }
  290. }
  291. }else{
  292. for(CourseData courseData : courseDataList){
  293. courseData.setResource(courseData.getTrailResource());
  294. }
  295. }
  296. }
  297. }