package com.zy.asrs.task;
|
|
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.zy.asrs.entity.Agv;
|
import com.zy.asrs.entity.AgvWarn;
|
import com.zy.asrs.mapper.AgvBasMapper;
|
import com.zy.asrs.service.AgvWarnService;
|
import com.zy.asrs.task.handler.AgvWarnHandler;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.system.entity.Config;
|
import com.zy.system.service.ConfigService;
|
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 java.io.IOException;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
|
/**
|
* Created by vincent on 2020/7/7
|
*/
|
@Component
|
public class AgvWarnScheduler {
|
|
private static final Logger log = LoggerFactory.getLogger(AgvWarnScheduler.class);
|
|
@Autowired
|
private AgvWarnHandler agvWarnHandler;
|
|
@Autowired
|
private AgvWarnService agvWarnService;
|
|
@Autowired
|
private ConfigService configService;
|
|
@Autowired
|
private AgvBasMapper agvBasMapper;
|
|
/**
|
* 超过一分钟没更新的,删除
|
*/
|
@Scheduled(fixedDelay = 10000)
|
private void del() {
|
String format = DateUtil.format(DateUtil.offsetMinute(new Date(), -1), "yyyy-MM-dd HH:mm:ss");
|
List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().le("modi_time", format));
|
for (AgvWarn agvWarn : agvWarnList) {
|
agvWarnHandler.start(agvWarn);
|
}
|
}
|
|
@Scheduled(fixedDelay = 20000)
|
private void report() {
|
List<Agv> agvs = agvBasMapper.selectList(new EntityWrapper<Agv>());
|
Config first = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE1"));
|
Config second = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE2"));
|
Config third = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE3"));
|
Config url = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_REPORT_URL"));
|
List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>());
|
StringBuffer buffer;
|
for (AgvWarn agvWarn : agvWarnList) {
|
Integer warnTime = getWarnTime(agvWarn.getTimes(), first.getValue(), second.getValue(), third.getValue());
|
DateTime begin = DateUtil.parse(agvWarn.getBeginTime(), "yyyy-MM-dd HH:mm:ss");
|
if (DateUtil.offsetMinute(new Date(), -warnTime).after(begin)) {
|
buffer = new StringBuffer();
|
buffer.append(processRegion(agvs, agvWarn.getRobotCode()) + "[" + agvWarn.getRobotCode() + "]号AGV小车报警了\n");
|
buffer.append("报警类型:" + agvWarn.getWarnContent() + "\n");
|
if (!Cools.isEmpty(agvWarn.getSourceLocNo())) {
|
buffer.append("从:[" + agvWarn.getSourceLocNo() + "]到[" + agvWarn.getLocNo() + "]\n");
|
}
|
buffer.append("开始时间:" + agvWarn.getBeginTime() + "\n");
|
int i = agvWarn.getTimes() + 1;
|
buffer.append("第[" + i + "]次报警");
|
HashMap<String, Object> param = new HashMap<>();
|
HashMap<String, Object> data = new HashMap<>();
|
data.put("content", buffer.toString());
|
param.put("msgtype", "text");
|
param.put("text", data);
|
log.info("发送报警信息:{}", JSON.toJSONString(param));
|
String response = null;
|
try {
|
response = new HttpHandler.Builder()
|
.setUri(url.getValue())
|
.setJson(JSON.toJSONString(param))
|
.setHttps(true)
|
.build()
|
.doPost();
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
JSONObject jsonObject = JSON.parseObject(response);
|
if (jsonObject.get("errmsg").equals("ok")) {
|
agvWarn.setTimes(agvWarn.getTimes() + 1);
|
agvWarnService.updateById(agvWarn);
|
//发送成功
|
return;
|
} else {
|
log.error("发送失败,错误信息:{}", jsonObject.get("errmsg"));
|
}
|
}
|
}
|
}
|
|
/**
|
* 若未配置数据,则5分钟一次
|
* @param times
|
* @return
|
*/
|
private Integer getWarnTime(Integer times, String first, String second, String thrid) {
|
switch (times) {
|
case 0:
|
return Integer.parseInt(first);
|
case 1:
|
return Integer.parseInt(second);
|
case 2:
|
return Integer.parseInt(thrid);
|
default:
|
return (times - 2) * Integer.parseInt(thrid) + Integer.parseInt(first) + Integer.parseInt(second) + Integer.parseInt(thrid);
|
}
|
}
|
|
private String processRegion(List<Agv> agvs, String agvNo) {
|
if (agvNo == null) {
|
return "未知小车";
|
}
|
for (Agv agv : agvs) {
|
if (agv.getAgvNo() != null && agv.getAgvNo().equals(agvNo)) {
|
return agv.getRegion();
|
}
|
}
|
return "未知";
|
}
|
|
}
|