package com.gkhy.safePlatform.doublePrevention.scheduls; import com.gkhy.safePlatform.commons.enums.ResultCodes; import com.gkhy.safePlatform.commons.exception.BusinessException; import com.gkhy.safePlatform.doublePrevention.entity.PreventDangerCheckTask; import com.gkhy.safePlatform.doublePrevention.entity.PreventDangerCheckWork; import com.gkhy.safePlatform.doublePrevention.enums.StatusEnum; import com.gkhy.safePlatform.doublePrevention.enums.WorkStatusEnum; import com.gkhy.safePlatform.doublePrevention.mq.msg.PreventCreateTaskMsg; import com.gkhy.safePlatform.doublePrevention.repository.param.CheckWorkAutoUpdateParams; import com.gkhy.safePlatform.doublePrevention.service.baseService.PreventDangerCheckTaskService; import com.gkhy.safePlatform.doublePrevention.service.baseService.PreventDangerCheckWorkService; import org.apache.commons.lang3.ObjectUtils; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.util.Calendar; import java.util.Date; import java.util.List; @Component public class PreventDangerCheckWorkSchedule { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private PreventDangerCheckWorkService preventDangerCheckWorkService; @Autowired private PreventDangerCheckTaskService preventDangerCheckTaskService; @Value("${rocketmq.topic.preventCreateTaskTopic}") private String preventCreateTaskTopic; @Autowired private RocketMQTemplate rocketMQTemplate; public PreventDangerCheckWorkSchedule() { } @Transactional //@Scheduled(cron = "0 0/5 * * * ?") // @PostConstruct public void createNewWorkTask() throws Exception { logger.info("【双重预防】定时任务开始执行......"); List checkWorkLists = preventDangerCheckWorkService.listScheduleCheckWork(); //当前存在开启状态的作业 if (checkWorkLists != null && checkWorkLists.size() > 0 ) { //遍历work集合 for (PreventDangerCheckWork checkWork : checkWorkLists) { Date date = new Date(); Date nextCheckTime = null; Date noticeTime = null; Byte ExecTaskTag; //TODO 排班改为在此处判断 暂无 //解析任务通知时间毫秒数 if (ObjectUtils.isNotEmpty(checkWork.getNextCheckTime())){ if (checkWork.getNoticeTimeUnit() == 1) { //如果时间单位是分钟 noticeTime = new Date(checkWork.getNextCheckTime().getTime() - checkWork.getNoticeTime() * 60 * 1000); }else if (checkWork.getNoticeTimeUnit() == 2) { //如果时间单位是小时 noticeTime = new Date(checkWork.getNextCheckTime().getTime() - checkWork.getNoticeTime() * 60 * 1000); }else if (checkWork.getNoticeTimeUnit() == 3) { //如果时间单位是日 noticeTime = new Date(checkWork.getNextCheckTime().getTime() - checkWork.getNoticeTime() * 24 * 60 * 60 * 1000); }else if (checkWork.getNoticeTimeUnit() == 4) { //如果时间单位是月 Calendar calendar = Calendar.getInstance(); calendar.setTime(checkWork.getNextCheckTime());//设置起时间 calendar.add(Calendar.MONTH, -checkWork.getNoticeTime());//增加N个月 noticeTime = calendar.getTime(); } nextCheckTime = checkWork.getNextCheckTime(); }else { //如果是第一次调度 if (checkWork.getNoticeTimeUnit() == 1) { //如果时间单位是分钟 noticeTime = new Date(checkWork.getFirstStartTime().getTime() - checkWork.getNoticeTime() * 60 * 1000); }else if (checkWork.getNoticeTimeUnit() == 2) { //如果时间单位是小时 noticeTime = new Date(checkWork.getFirstStartTime().getTime() - checkWork.getNoticeTime() * 60 * 1000); }else if (checkWork.getNoticeTimeUnit() == 3) { //如果时间单位是日 noticeTime = new Date(checkWork.getFirstStartTime().getTime() - checkWork.getNoticeTime() * 24 * 60 * 60 * 1000); }else if (checkWork.getNoticeTimeUnit() == 4) { //如果时间单位是月 Calendar calendar = Calendar.getInstance(); calendar.setTime(checkWork.getFirstStartTime());//设置起时间 calendar.add(Calendar.MONTH, -checkWork.getNoticeTime());//增加N个月 noticeTime = calendar.getTime(); } nextCheckTime = checkWork.getFirstStartTime(); } //检查当前作业产生的任务列表,如果存在待执行,执行中的任务,不生成下一条任务 List taskByCheckWorkId = preventDangerCheckTaskService.getTaskByCheckWorkId(checkWork.getId()); //判断作业配置的开始时间,是否处于发送成任务消息的时间区间--在通知前20分钟,把创建任务消息,发送给mq //添加判断,下次执行时间大于当前时间,作业状态为开启中 //TODO 根据任务判断,现在已经临时删除 if (checkWork.getCheckWorkStatus() == WorkStatusEnum.WORK_OPEN.getCode() && nextCheckTime.getTime() > date.getTime() && date.getTime() > noticeTime.getTime() - 20 * 60 * 1000 ) { //设置任务创建时间,在通知之前5分钟,创建任务 Date createTime = null; //如果 当前时间 - 通知时间 < 5分钟,任务立即创建。否则在通知前五分钟创建 if (date.getTime() - noticeTime.getTime() < 5 * 60 * 1000){ createTime = new Date(noticeTime.getTime() - 5 * 60 * 1000); }else { createTime = date; } //获取mq消息体 PreventCreateTaskMsg preventCreateTaskMsg = new PreventCreateTaskMsg(); preventCreateTaskMsg.setWorkId(checkWork.getId()); preventCreateTaskMsg.setCreateTaskTime(createTime); SendResult sendResult = rocketMQTemplate.syncSend(preventCreateTaskTopic, preventCreateTaskMsg); if (sendResult.getSendStatus() != SendStatus.SEND_OK) { throw new BusinessException(ResultCodes.BUSINESS_ERROR); } logger.info("\n【双重预防】创建巡检任务消息 " + " 已发送--->>" + " MSGID: " + sendResult.getMsgId() + " 创建时间: " + createTime); //将作业状态设置为已调度 CheckWorkAutoUpdateParams updateWorkParams = new CheckWorkAutoUpdateParams(); updateWorkParams.setCheckWorkStatus((byte) 5); updateWorkParams.setId(checkWork.getId()); preventDangerCheckWorkService.updateCheckWorkStatus(updateWorkParams); }else if(nextCheckTime.getTime() - date.getTime() < 0){ logger.info("【双重预防】当前存在作业开始时间不合理,此作业无法调度:" + checkWork.getCheckWorkName()); }else{ logger.info("【双重预防】当前存在作业未到调度时间"); } } }else { logger.info("\n【双重预防】当前---无可调度作业"); } } }