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.entity.AgvWarnLog; import com.zy.asrs.mapper.AgvBasMapper; import com.zy.asrs.service.AgvWarnLogService; 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 AgvWarnLogService agvWarnLogService; @Autowired private ConfigService configService; @Autowired private AgvBasMapper agvBasMapper; /** * 删除告警日志 */ @Scheduled(cron = "0 0 1 * * ? ") private void delWarnLog() { String format = DateUtil.format(DateUtil.offsetMonth(new Date(), -1), "yyyy-MM-dd HH:mm:ss"); List agvWarnList = agvWarnLogService.selectList(new EntityWrapper().le("modi_time", format)); for (AgvWarnLog agvWarn : agvWarnList) { agvWarnLogService.deleteById(agvWarn); } } /** * 超过一分钟没更新的,删除 */ @Scheduled(fixedDelay = 10000) private void del() { String format = DateUtil.format(DateUtil.offsetMinute(new Date(), -1), "yyyy-MM-dd HH:mm:ss"); List agvWarnList = agvWarnService.selectList(new EntityWrapper().le("modi_time", format)); for (AgvWarn agvWarn : agvWarnList) { agvWarnHandler.start(agvWarn); } } @Scheduled(fixedDelay = 20000) private void report() { List agvs = agvBasMapper.selectList(new EntityWrapper()); Config first = configService.selectOne(new EntityWrapper().eq("code", "AGV_WARN_RATE1")); Config second = configService.selectOne(new EntityWrapper().eq("code", "AGV_WARN_RATE2")); Config third = configService.selectOne(new EntityWrapper().eq("code", "AGV_WARN_RATE3")); Config url = configService.selectOne(new EntityWrapper().eq("code", "AGV_WARN_REPORT_URL")); List agvWarnList = agvWarnService.selectList(new EntityWrapper()); StringBuffer buffer; HashMap sendData = new HashMap<>(); 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"); buffer.append("当前时间:" + DateUtil.formatDateTime(new Date()) + "\n"); int i = agvWarn.getTimes() + 1; //buffer.append("第[" + i + "]次报警"); HashMap param = new HashMap<>(); HashMap data = new HashMap<>(); data.put("content", buffer.toString()); param.put("msgtype", "text"); param.put("text", data); //log.info("发送报警信息:{}", JSON.toJSONString(param)); sendData.put(agvWarn.getRobotCode() + agvWarn.getWarnContent(), param); } for (HashMap.Entry entry : sendData.entrySet()) { String response = null; try { response = new HttpHandler.Builder().setUri(url.getValue()).setJson(JSON.toJSONString(entry.getValue())).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(first) + Integer.parseInt(second); case 2: return Integer.parseInt(first) + Integer.parseInt(second) + Integer.parseInt(thrid); default: return (times - 2) * Integer.parseInt(thrid) + Integer.parseInt(first) + Integer.parseInt(second) + Integer.parseInt(thrid); } } private String processRegion(List agvs, String agvNo) { if (agvNo == null) { return "未知小车"; } for (Agv agv : agvs) { if (agv.getAgvNo() != null && agv.getAgvNo().equals(agvNo)) { return agv.getRegion(); } } return "未知"; } }