| | |
| | | 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; |
| | |
| | | private AgvWarnService agvWarnService; |
| | | |
| | | @Autowired |
| | | private AgvWarnLogService agvWarnLogService; |
| | | |
| | | @Autowired |
| | | private ConfigService configService; |
| | | |
| | | @Autowired |
| | | private AgvBasMapper agvBasMapper; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 超过 |
| | | * 删除告警日志 |
| | | */ |
| | | @Scheduled(fixedDelay = 30000) |
| | | @Scheduled(cron = "0 0 1 * * ? ") |
| | | private void delWarnLog() { |
| | | String format = DateUtil.format(DateUtil.offsetMonth(new Date(), -1), "yyyy-MM-dd HH:mm:ss"); |
| | | List<AgvWarnLog> agvWarnList = agvWarnLogService.selectList(new EntityWrapper<AgvWarnLog>().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(), -3), "yyyy-MM-dd HH:mm:ss"); |
| | | List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().ge("modi_time", format)); |
| | | 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 = 10000) |
| | | @Scheduled(fixedDelay = 20000) |
| | | private void report() { |
| | | List<Config> config = configService.selectList(new EntityWrapper<Config>().eq("code", "AGV_WARN_REPORT_URL")); |
| | | 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; |
| | | HashMap<String, Object> sendData = new HashMap<>(); |
| | | for (AgvWarn agvWarn : agvWarnList) { |
| | | Integer warnTime = getWarnTime(agvWarn.getTimes()); |
| | | DateTime begin = DateUtil.parse(agvWarn.getBeginTime(), "yyyy-MM-dd HH:mm:ss"); |
| | | if (DateUtil.offsetMinute(begin, warnTime).after(new Date())) { |
| | | Integer warnTime = getWarnTime(agvWarn.getTimes(), first.getValue(), second.getValue(), third.getValue()); |
| | | Date begin = DateUtil.parse(agvWarn.getBeginTime(), "yyyy-MM-dd HH:mm:ss"); |
| | | if (DateUtil.offsetMinute(agvWarn.getAppeTime(), -3).after(begin)) { |
| | | begin = agvWarn.getAppeTime(); |
| | | } |
| | | if (DateUtil.offsetMinute(new Date(), -warnTime).after(begin)) { |
| | | buffer = new StringBuffer(); |
| | | buffer.append(agvWarn.getRobotCode() + "号AGV小车报警:"); |
| | | buffer.append(agvWarn.getWarnContent()); |
| | | String s = processRegion(agvs, agvWarn.getRobotCode()); |
| | | if (s == null) { |
| | | continue; |
| | | } |
| | | buffer.append(s + "[" + 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(begin) + "\n"); |
| | | buffer.append("当前时间:" + DateUtil.formatDateTime(new Date())); |
| | | //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); |
| | | sendData.put(agvWarn.getRobotCode() + agvWarn.getWarnContent(), param); |
| | | } |
| | | for (HashMap.Entry<String, Object> entry : sendData.entrySet()) { |
| | | log.info("发送报警信息:{}", JSON.toJSONString(entry.getValue())); |
| | | String response = null; |
| | | try { |
| | | response = new HttpHandler.Builder() |
| | | .setUri(config.get(0).getValue()) |
| | | .setJson(JSON.toJSONString(param)) |
| | | .setHttps(true) |
| | | .build() |
| | | .doPost(); |
| | | 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")) { |
| | | //发送成功 |
| | | return; |
| | | agvWarn.setTimes(agvWarn.getTimes() + 1); |
| | | agvWarn.setModiTime(new Date()); |
| | | agvWarnService.updateById(agvWarn); |
| | | } else { |
| | | log.error("发送失败,错误信息:{}", jsonObject.get("errmsg")); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | * @param times |
| | | * @return |
| | | */ |
| | | private Integer getWarnTime(Integer times) { |
| | | try { |
| | | List<Config> config = configService.selectList(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE1")); |
| | | if (!Cools.isEmpty(config)) { |
| | | String value = config.get(0).getValue(); |
| | | if (Cools.isEmpty(value)) { |
| | | return 5; |
| | | } else { |
| | | String[] split = value.split(","); |
| | | if (split.length < times + 1) { |
| | | Config config2 = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE2")); |
| | | int t = 0; |
| | | for (String s : split) { |
| | | t = t + Integer.parseInt(s); |
| | | } |
| | | return t + Integer.parseInt(config2.getValue()) * (times + 1 - split.length); |
| | | } else { |
| | | return Integer.parseInt(split[times]); |
| | | } |
| | | } |
| | | } |
| | | return 5; |
| | | } catch (Exception e) { |
| | | return 5; |
| | | 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<Agv> agvs, String agvNo) { |
| | | if (agvNo == null) { |
| | | return "未知小车"; |
| | | } |
| | | for (Agv agv : agvs) { |
| | | if (agv.getAgvNo() != null && agv.getAgvNo().equals(agvNo)) { |
| | | if (!Cools.isEmpty(agv.getFlag()) && agv.getFlag() == 1) { |
| | | return null; |
| | | } |
| | | return agv.getRegion(); |
| | | } |
| | | } |
| | | return "未知"; |
| | | } |
| | | |
| | | } |