package com.qxgmat.task; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.Page; import com.nuliji.tools.Tools; import com.nuliji.tools.Transform; import com.nuliji.tools.third.OauthData; import com.qxgmat.data.constants.enums.SettingKey; import com.qxgmat.data.constants.enums.module.CourseModule; import com.qxgmat.data.constants.enums.status.MessageStatus; import com.qxgmat.data.dao.entity.*; import com.qxgmat.data.relation.entity.UserPrepareRelation; import com.qxgmat.help.WechatHelp; import com.qxgmat.service.UserPaperService; import com.qxgmat.service.UsersService; import com.qxgmat.service.extend.CourseExtendService; import com.qxgmat.service.extend.MessageExtendService; import com.qxgmat.service.extend.PreviewService; import com.qxgmat.service.inline.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.tools.Tool; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * Created by gaojie on 2017/11/20. */ @Component public class ScheduledTask { private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class); @Autowired private AsyncTask asyncTask; @Autowired private SettingService settingService; @Autowired private UsersService usersService; @Autowired private WechatHelp wechatHelp; @Autowired private MessageTemplateService messageTemplateService; @Autowired private MessageExtendService messageExtendService; @Autowired private CourseService courseService; @Autowired private CourseNoService courseNoService; @Autowired private PreviewService previewService; @Autowired private PreviewAssignService previewAssignService; @Autowired private UserPaperService userPaperService; @Autowired private UserCourseAppointmentService userCourseAppointmentService; @Autowired private UserOrderRecordService userOrderRecordService; @Autowired private CourseExtendService courseExtendService; @Autowired private UserCourseProgressService userCourseProgressService; @Autowired private UserCourseRecordService userCourseRecordService; /** * cron表达式:* * * * * *(共6位,使用空格隔开,具体如下) * cron表达式:*(秒0-59) *(分钟0-59) *(小时0-23) *(日期1-31) *(月份1-12或是JAN-DEC) *(星期1-7或是SUN-SAT) * 注意: 30 * * * * * 表示每分钟的第30秒执行,而(*斜杠30)表示每30秒执行 * * */ // 每小时刷新快过期用户的accessToken @Scheduled(cron="0 0 * * * *") public void refreshWechatToken(){ logger.info("Start refresh Wechat token"); int page = 1; int size = 100; Date date = new Date(); Page userList; do{ userList = usersService.listByWechatExpire(page, size, date); for(User user : userList){ OauthData data = wechatHelp.refreshNative(user.getWechatRefreshToken()); usersService.edit(User.builder() .id(user.getId()) .wechatAccessToken(data.getAccessToken()) .wechatRefreshToken(data.getRefreshToken()) .wechatExpireTime(data.getExpiresTime()) .build() ); } }while(userList.size() >= size); } // 每小时刷新备考统计信息 @Scheduled(cron="0 0 * * * *") public void refreshPrepare(){ logger.info("Start refresh Prepare"); JSONObject value = new JSONObject(); // 分别统计不同信息 List relations = null; // 身份 relations = usersService.statPrepareStatus(); JSONArray status = new JSONArray(); for(UserPrepareRelation relation : relations){ JSONObject one = new JSONObject(); one.put("key", relation.getS()); one.put("value", relation.getNumber()); status.add(one); } value.put("status", status); // 考分 relations = usersService.statPrepareGoal(); JSONArray goal = new JSONArray(); for(UserPrepareRelation relation : relations){ JSONObject one = new JSONObject(); one.put("key", relation.getI()); one.put("value", relation.getNumber()); goal.add(one); } value.put("goal", goal); // 考试时间 relations = usersService.statPrepareExaminationTime(); JSONArray examinationTime = new JSONArray(); for(UserPrepareRelation relation : relations){ JSONObject one = new JSONObject(); one.put("key", relation.getS()); one.put("value", relation.getNumber()); examinationTime.add(one); } value.put("examinationTime", examinationTime); // 出分时间 relations = usersService.statPrepareScoreTime(); JSONArray scoreTime = new JSONArray(); for(UserPrepareRelation relation : relations){ JSONObject one = new JSONObject(); one.put("key", relation.getS()); one.put("value", relation.getNumber()); scoreTime.add(one); } value.put("scoreTime", scoreTime); Setting setting = Setting.builder().value(value).build(); settingService.editByKey(SettingKey.PREPARE_INFO, setting); } // 每小时判断发送消息 @Scheduled(cron="0 0 * * * *") public void autoSendMessage(){ logger.info("Start auto Send message"); List list = messageTemplateService.listCustomerExpire(); for(MessageTemplate message : list){ Map params = new HashMap<>(); messageTemplateService.edit(MessageTemplate.builder() .id(message.getId()) .sendStatus(MessageStatus.SENDING.index) .build()); int number = 0; int page = 1; int size = 20; List userList; do{ userList = usersService.listAdmin(page, size, null, null, null, null, null, null, null, null); for(User user : userList){ messageExtendService.sendCustom(user, message, params); number += 1; } }while(userList.size()>= size); messageTemplateService.edit(MessageTemplate.builder() .id(message.getId()) .sendNumber(number) .sendStatus(MessageStatus.SENDED.index) .build()); } } // 每天判断是否自动组卷 @Scheduled(cron="0 1 0 * * *") public void autoExercisePaper() throws ParseException { Setting setting = settingService.getByKey(SettingKey.EXERCISE_PAPER_AUTO); JSONObject value = setting.getValue(); String dateString = value.getString("date"); if (dateString == null) { logger.info("auto Exercise Paper stop, date is empty"); return; } Date date = DateFormat.getDateTimeInstance().parse(dateString); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String param = sdf.format(date); String now = sdf.format(new Date()); if(param.equals(now)){ // 当天 logger.info("auto Exercise Paper start"); asyncTask.autoExercisePaperError(); logger.info("auto Exercise Paper finish"); } } // 每小时判断发送预习作业消息:发送预习作业到期通知:6小时,去除夜间12-7点 @Scheduled(cron="0 0 * * * *") public void autoSendPreviewMessage(){ // 只考虑assign设定到期时间的作业 Date now = new Date(); Date startTime = Tools.addHour(now, 5); Date endTime = Tools.addHour(now, 6); int hour = Tools.hour(endTime); if (hour == 0){ endTime = Tools.addHour(endTime, 7); }else if(hour >0 && hour <= 7){ startTime = Tools.addHour(startTime, 7); endTime = Tools.addHour(endTime, 7); }else if(hour > 7 && hour <= 14){ // 8-14已经提早播报,暂停 return; } logger.info("Start auto Send Preview message"); List previewAssignList = previewAssignService.listAppointmentExpire(startTime.toString(), endTime.toString()); for(PreviewAssign previewAssign : previewAssignList){ Course course = courseService.get(previewAssign.getCourseId()); if (previewAssign.getCourseAppointment() > 0){ // 1v1,查找对应预约用户 UserCourseAppointment appointment = userCourseAppointmentService.get(previewAssign.getCourseAppointment()); User user = usersService.get(appointment.getUserId()); // 替换课程题目 course.setTitle(appointment.getTitle()); messageExtendService.sendPreviewNotice(user, course, previewAssign); } // if (previewAssign.getCourseTime() > 0){ // previewService.replaceTitle(previewAssign); // // 小班课,查找时间段用户 // List userOrderRecordList = userOrderRecordService.listByOnline(previewAssign.getCourseId(), previewAssign.getCourseTime()); // for(UserOrderRecord record : userOrderRecordList){ // User user = usersService.get(record.getUserId()); // messageExtendService.sendPreviewNotice(user, course, previewAssign); // } // } } logger.info("End auto Send Preview message"); } // 课程到期:判断延期奖励,听课频率<=2天/作业100%->10天,90%以上7天 @Scheduled(cron="0 0 * * * *") public void awardCourseExpire(){ // 下一小时内到期的课程 Date startTime = new Date(); Date endTime = Tools.addHour(startTime, 1); List recordList = userOrderRecordService.allCourseExpire(startTime.toString(), endTime.toString()); for(UserOrderRecord record : recordList){ Course course = courseService.get(record.getId()); if (CourseModule.ValueOf(course.getCourseModule()) != CourseModule.VIDEO){ continue; } List courseNoList = courseNoService.allCourse(course.getId()); Collection courseNoIds = Transform.getIds(courseNoList, CourseNo.class, "id"); // 听课频率 List progressList = userCourseProgressService.listCourse(record.getId(), course.getId()); List records = userCourseRecordService.allWithRecord(record.getId()); Integer currentNo = courseExtendService.computeCourseNoCurrent(courseNoList, progressList); Integer days = courseExtendService.computeCourseDay(records); if (days/currentNo > 2){ continue; } // 获取所有作业进度 List previewAssignList = previewAssignService.listByCourseNos(course.getId(), courseNoIds); Collection assignIds = Transform.getIds(previewAssignList, PreviewAssign.class, "id"); List userPaperList = userPaperService.listWithCourse(record.getUserId(), assignIds, record.getId()); // Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id"); // List userReportList = userReportService.listByPaper(paperIds); int finish = 0; for(UserPaper userPaper: userPaperList){ if (userPaper.getTimes() > 0){ finish += 1; } } int percent = finish * 100 / assignIds.size(); if (percent <90){ continue; } int day = 7; if (percent == 100){ day = 10; } courseExtendService.awardCourse(record.getUserId(), record.getId(), day); } } // 每天判断是否恢复停课: 最多30就需要恢复停课 @Scheduled(cron="0 1 0 * * *") public void restoreSuspendCourse() { Date endTime = Tools.today(); Date startTime = Tools.addDate(endTime, 30); List recordList = userOrderRecordService.allSuspendExpire(startTime.toString(), endTime.toString()); for(UserOrderRecord record : recordList){ courseExtendService.restoreCourse(record.getUserId(), record.getId()); } } }