123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- 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<User> 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<UserPrepareRelation> 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<MessageTemplate> list = messageTemplateService.listCustomerExpire();
- for(MessageTemplate message : list){
- Map<String, String> 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<User> 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<PreviewAssign> 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<UserOrderRecord> 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<UserOrderRecord> 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<CourseNo> courseNoList = courseNoService.allCourse(course.getId());
- Collection courseNoIds = Transform.getIds(courseNoList, CourseNo.class, "id");
- // 听课频率
- List<UserCourseProgress> progressList = userCourseProgressService.listCourse(record.getId(), course.getId());
- List<UserCourseRecord> records = userCourseRecordService.allWithRecord(record.getId());
- Integer currentNo = courseExtendService.computeCourseNoCurrent(courseNoList, progressList);
- Integer days = courseExtendService.computeCourseDay(records);
- if (days/currentNo > 2){
- continue;
- }
- // 获取所有作业进度
- List<PreviewAssign> previewAssignList = previewAssignService.listByCourseNos(course.getId(), courseNoIds);
- Collection assignIds = Transform.getIds(previewAssignList, PreviewAssign.class, "id");
- List<UserPaper> userPaperList = userPaperService.listWithCourse(record.getUserId(), assignIds, record.getId());
- // Collection paperIds = Transform.getIds(userPaperList, UserPaper.class, "id");
- // List<UserReport> 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<UserOrderRecord> recordList = userOrderRecordService.allSuspendExpire(startTime.toString(), endTime.toString());
- for(UserOrderRecord record : recordList){
- courseExtendService.restoreCourse(record.getUserId(), record.getId());
- }
- }
- }
|