郑永安
2023-06-19 7a6abd05683528032687c75e80e0bd2030a3e46c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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<PreventDangerCheckWork> 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<PreventDangerCheckTask> 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【双重预防】当前---无可调度作业");
        }
    }
 
}