ScheduledTask.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. package com.qxgmat.task;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.github.pagehelper.Page;
  5. import com.nuliji.tools.Tools;
  6. import com.nuliji.tools.Transform;
  7. import com.nuliji.tools.third.OauthData;
  8. import com.qxgmat.data.constants.enums.SettingKey;
  9. import com.qxgmat.data.constants.enums.module.CourseModule;
  10. import com.qxgmat.data.constants.enums.status.MessageStatus;
  11. import com.qxgmat.data.dao.entity.*;
  12. import com.qxgmat.data.relation.entity.UserPrepareRelation;
  13. import com.qxgmat.help.WechatHelp;
  14. import com.qxgmat.service.UserPaperService;
  15. import com.qxgmat.service.UsersService;
  16. import com.qxgmat.service.extend.CourseExtendService;
  17. import com.qxgmat.service.extend.MessageExtendService;
  18. import com.qxgmat.service.extend.PreviewService;
  19. import com.qxgmat.service.inline.*;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.scheduling.annotation.Scheduled;
  24. import org.springframework.stereotype.Component;
  25. import javax.tools.Tool;
  26. import java.text.DateFormat;
  27. import java.text.ParseException;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. /**
  31. * Created by gaojie on 2017/11/20.
  32. */
  33. @Component
  34. public class ScheduledTask {
  35. private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
  36. @Autowired
  37. private AsyncTask asyncTask;
  38. @Autowired
  39. private SettingService settingService;
  40. @Autowired
  41. private UsersService usersService;
  42. @Autowired
  43. private WechatHelp wechatHelp;
  44. @Autowired
  45. private MessageTemplateService messageTemplateService;
  46. @Autowired
  47. private MessageExtendService messageExtendService;
  48. @Autowired
  49. private CourseService courseService;
  50. @Autowired
  51. private CourseNoService courseNoService;
  52. @Autowired
  53. private PreviewService previewService;
  54. @Autowired
  55. private PreviewAssignService previewAssignService;
  56. @Autowired
  57. private UserPaperService userPaperService;
  58. @Autowired
  59. private UserCourseAppointmentService userCourseAppointmentService;
  60. @Autowired
  61. private UserOrderRecordService userOrderRecordService;
  62. @Autowired
  63. private CourseExtendService courseExtendService;
  64. @Autowired
  65. private UserCourseProgressService userCourseProgressService;
  66. @Autowired
  67. private UserCourseRecordService userCourseRecordService;
  68. /**
  69. * cron表达式:* * * * * *(共6位,使用空格隔开,具体如下)
  70. * cron表达式:*(秒0-59) *(分钟0-59) *(小时0-23) *(日期1-31) *(月份1-12或是JAN-DEC) *(星期1-7或是SUN-SAT)
  71. * 注意: 30 * * * * * 表示每分钟的第30秒执行,而(*斜杠30)表示每30秒执行
  72. *
  73. * */
  74. // 每小时刷新快过期用户的accessToken
  75. @Scheduled(cron="0 0 * * * *")
  76. public void refreshWechatToken(){
  77. logger.info("Start refresh Wechat token");
  78. int page = 1;
  79. int size = 100;
  80. Date date = new Date();
  81. Page<User> userList;
  82. do{
  83. userList = usersService.listByWechatExpire(page, size, date);
  84. for(User user : userList){
  85. OauthData data = wechatHelp.refreshNative(user.getWechatRefreshToken());
  86. usersService.edit(User.builder()
  87. .id(user.getId())
  88. .wechatAccessToken(data.getAccessToken())
  89. .wechatRefreshToken(data.getRefreshToken())
  90. .wechatExpireTime(data.getExpiresTime())
  91. .build()
  92. );
  93. }
  94. }while(userList.size() >= size);
  95. }
  96. // 每小时刷新备考统计信息
  97. @Scheduled(cron="0 0 * * * *")
  98. public void refreshPrepare(){
  99. logger.info("Start refresh Prepare");
  100. JSONObject value = new JSONObject();
  101. // 分别统计不同信息
  102. List<UserPrepareRelation> relations = null;
  103. // 身份
  104. relations = usersService.statPrepareStatus();
  105. JSONArray status = new JSONArray();
  106. for(UserPrepareRelation relation : relations){
  107. JSONObject one = new JSONObject();
  108. one.put("key", relation.getS());
  109. one.put("value", relation.getNumber());
  110. status.add(one);
  111. }
  112. value.put("status", status);
  113. // 考分
  114. relations = usersService.statPrepareGoal();
  115. JSONArray goal = new JSONArray();
  116. for(UserPrepareRelation relation : relations){
  117. JSONObject one = new JSONObject();
  118. one.put("key", relation.getI());
  119. one.put("value", relation.getNumber());
  120. goal.add(one);
  121. }
  122. value.put("goal", goal);
  123. // 考试时间
  124. relations = usersService.statPrepareExaminationTime();
  125. JSONArray examinationTime = new JSONArray();
  126. for(UserPrepareRelation relation : relations){
  127. JSONObject one = new JSONObject();
  128. one.put("key", relation.getS());
  129. one.put("value", relation.getNumber());
  130. examinationTime.add(one);
  131. }
  132. value.put("examinationTime", examinationTime);
  133. // 出分时间
  134. relations = usersService.statPrepareScoreTime();
  135. JSONArray scoreTime = new JSONArray();
  136. for(UserPrepareRelation relation : relations){
  137. JSONObject one = new JSONObject();
  138. one.put("key", relation.getS());
  139. one.put("value", relation.getNumber());
  140. scoreTime.add(one);
  141. }
  142. value.put("scoreTime", scoreTime);
  143. Setting setting = Setting.builder().value(value).build();
  144. settingService.editByKey(SettingKey.PREPARE_INFO, setting);
  145. }
  146. // 每小时判断发送消息
  147. @Scheduled(cron="0 0 * * * *")
  148. public void autoSendMessage(){
  149. logger.info("Start auto Send message");
  150. List<MessageTemplate> list = messageTemplateService.listCustomerExpire();
  151. for(MessageTemplate message : list){
  152. Map<String, String> params = new HashMap<>();
  153. messageTemplateService.edit(MessageTemplate.builder()
  154. .id(message.getId())
  155. .sendStatus(MessageStatus.SENDING.index)
  156. .build());
  157. int number = 0;
  158. int page = 1;
  159. int size = 20;
  160. List<User> userList;
  161. do{
  162. userList = usersService.listAdmin(page, size, null, null, null, null, null, null, null, null);
  163. for(User user : userList){
  164. messageExtendService.sendCustom(user, message, params);
  165. number += 1;
  166. }
  167. }while(userList.size()>= size);
  168. messageTemplateService.edit(MessageTemplate.builder()
  169. .id(message.getId())
  170. .sendNumber(number)
  171. .sendStatus(MessageStatus.SENDED.index)
  172. .build());
  173. }
  174. }
  175. // 每天判断是否自动组卷
  176. @Scheduled(cron="0 1 0 * * *")
  177. public void autoExercisePaper() throws ParseException {
  178. Setting setting = settingService.getByKey(SettingKey.EXERCISE_PAPER_AUTO);
  179. JSONObject value = setting.getValue();
  180. String dateString = value.getString("date");
  181. if (dateString == null) {
  182. logger.info("auto Exercise Paper stop, date is empty");
  183. return;
  184. }
  185. Date date = DateFormat.getDateTimeInstance().parse(dateString);
  186. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  187. String param = sdf.format(date);
  188. String now = sdf.format(new Date());
  189. if(param.equals(now)){
  190. // 当天
  191. logger.info("auto Exercise Paper start");
  192. asyncTask.autoExercisePaperError();
  193. logger.info("auto Exercise Paper finish");
  194. }
  195. }
  196. // 每小时判断发送预习作业消息:发送预习作业到期通知:6小时,去除夜间12-7点
  197. @Scheduled(cron="0 0 * * * *")
  198. public void autoSendPreviewMessage(){
  199. // 只考虑assign设定到期时间的作业
  200. Date now = new Date();
  201. Date startTime = Tools.addHour(now, 5);
  202. Date endTime = Tools.addHour(now, 6);
  203. int hour = Tools.hour(endTime);
  204. if (hour == 0){
  205. endTime = Tools.addHour(endTime, 7);
  206. }else if(hour >0 && hour <= 7){
  207. startTime = Tools.addHour(startTime, 7);
  208. endTime = Tools.addHour(endTime, 7);
  209. }else if(hour > 7 && hour <= 14){
  210. // 8-14已经提早播报,暂停
  211. return;
  212. }
  213. logger.info("Start auto Send Preview message");
  214. List<PreviewAssign> previewAssignList = previewAssignService.listAppointmentExpire(startTime.toString(), endTime.toString());
  215. for(PreviewAssign previewAssign : previewAssignList){
  216. Course course = courseService.get(previewAssign.getCourseId());
  217. if (previewAssign.getCourseAppointment() > 0){
  218. // 1v1,查找对应预约用户
  219. UserCourseAppointment appointment = userCourseAppointmentService.get(previewAssign.getCourseAppointment());
  220. User user = usersService.get(appointment.getUserId());
  221. // 替换课程题目
  222. course.setTitle(appointment.getTitle());
  223. messageExtendService.sendPreviewNotice(user, course, previewAssign);
  224. }
  225. // if (previewAssign.getCourseTime() > 0){
  226. // previewService.replaceTitle(previewAssign);
  227. // // 小班课,查找时间段用户
  228. // List<UserOrderRecord> userOrderRecordList = userOrderRecordService.listByOnline(previewAssign.getCourseId(), previewAssign.getCourseTime());
  229. // for(UserOrderRecord record : userOrderRecordList){
  230. // User user = usersService.get(record.getUserId());
  231. // messageExtendService.sendPreviewNotice(user, course, previewAssign);
  232. // }
  233. // }
  234. }
  235. logger.info("End auto Send Preview message");
  236. }
  237. // 课程到期:判断延期奖励,听课频率<=2天/作业100%->10天,90%以上7天
  238. @Scheduled(cron="0 0 * * * *")
  239. public void awardCourseExpire(){
  240. // 下一小时内到期的课程
  241. Date startTime = new Date();
  242. Date endTime = Tools.addHour(startTime, 1);
  243. List<UserOrderRecord> recordList = userOrderRecordService.allCourseExpire(startTime.toString(), endTime.toString());
  244. for(UserOrderRecord record : recordList){
  245. Course course = courseService.get(record.getId());
  246. if (CourseModule.ValueOf(course.getCourseModule()) != CourseModule.VIDEO){
  247. continue;
  248. }
  249. List<CourseNo> courseNoList = courseNoService.allCourse(course.getId());
  250. Collection courseNoIds = Transform.getIds(courseNoList, CourseNo.class, "id");
  251. // 听课频率
  252. List<UserCourseProgress> progressList = userCourseProgressService.listCourse(record.getId(), course.getId());
  253. List<UserCourseRecord> records = userCourseRecordService.allWithRecord(record.getId());
  254. Integer currentNo = courseExtendService.computeCourseNoCurrent(courseNoList, progressList);
  255. Integer days = courseExtendService.computeCourseDay(records);
  256. if (days/currentNo > 2){
  257. continue;
  258. }
  259. // 获取所有作业进度
  260. List<PreviewAssign> previewAssignList = previewAssignService.listByCourseNos(course.getId(), courseNoIds);
  261. Collection assignIds = Transform.getIds(previewAssignList, PreviewAssign.class, "id");
  262. List<UserPaper> userPaperList = userPaperService.listWithCourse(record.getUserId(), assignIds, record.getId());
  263. // Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
  264. // List<UserReport> userReportList = userReportService.listByPaper(paperIds);
  265. int finish = 0;
  266. for(UserPaper userPaper: userPaperList){
  267. if (userPaper.getTimes() > 0){
  268. finish += 1;
  269. }
  270. }
  271. int percent = finish * 100 / assignIds.size();
  272. if (percent <90){
  273. continue;
  274. }
  275. int day = 7;
  276. if (percent == 100){
  277. day = 10;
  278. }
  279. courseExtendService.awardCourse(record.getUserId(), record.getId(), day);
  280. }
  281. }
  282. // 每天判断是否恢复停课: 最多30就需要恢复停课
  283. @Scheduled(cron="0 1 0 * * *")
  284. public void restoreSuspendCourse() {
  285. Date endTime = Tools.today();
  286. Date startTime = Tools.addDate(endTime, 30);
  287. List<UserOrderRecord> recordList = userOrderRecordService.allSuspendExpire(startTime.toString(), endTime.toString());
  288. for(UserOrderRecord record : recordList){
  289. courseExtendService.restoreCourse(record.getUserId(), record.getId());
  290. }
  291. }
  292. }