package com.skua.modules.quartz; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.googlecode.aviator.AviatorEvaluator; import com.googlecode.aviator.Expression; import com.skua.modules.alarmtmp.entity.AlarmRecordHistory; import com.skua.modules.alarmtmp.entity.AlarmRuleLevelConfigTemplate; import com.skua.modules.alarmtmp.service.AlarmMessageHistoryService; import com.skua.modules.alarmtmp.service.AlarmRecordHistoryService; import com.skua.modules.alarmtmp.service.IAlarmRuleLevelConfigTemplateService; import com.skua.modules.alarmtmp.vo.SystemNoticeVO; import com.skua.core.util.DateUtils; import com.skua.modules.system.service.IPgService; import com.skua.modules.system.service.ISysDepartService; import com.skua.modules.system.service.ISysUserService; import com.skua.modules.util.SystemNoticeUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @program: skboot * @description: 关联报警 * @author: xie chao * @create: 2021-09-03 16:03 */ @Slf4j @Component public class XjRelevanceAlarmJob implements Job { @Autowired private IAlarmRuleLevelConfigTemplateService alarmRuleLevelConfigTemplateService; @Autowired private ISysDepartService sysDepartService; @Autowired private AlarmRecordHistoryService alarmRecordHistoryService; @Autowired private AlarmMessageHistoryService alarmMessageHistoryService; @Autowired private IPgService pgService; @Autowired private ISysUserService sysUserService; @Autowired private SystemNoticeUtils systemNoticeUtils; //${start}采集数据${conent}触发关联报警,请注意! private static String prefix = "【金控数矿】"; private static String departNameTemplete = "${departName}"; private static String contentTemplete = "${conent}"; private static String suffix = "触发关联报警,请注意!"; //添加到报警记录表,用于移动端审批的使用 private static String tableName = "alarm_record_history"; @Override public void execute(JobExecutionContext context) throws JobExecutionException { try { log.info("关联报警任务开始"); //仪表 Map<String, Object> excessAlarmPgList = checkPgRelevanceAlarm(); //设备 Map<String, Object> excessEquipAlarmPgList = checkPgRelevanceAlarmEquip(); //自动恢复 dealStatus(excessAlarmPgList, excessEquipAlarmPgList); if (!excessAlarmPgList.isEmpty()) { sendMessage(excessAlarmPgList); } if (!excessEquipAlarmPgList.isEmpty()) { sendMessageEquip(excessEquipAlarmPgList); } log.info("关联报警任务开始结束"); } catch (Exception e) { log.info("关联报警任务异常" + e); } } private void sendMessageEquip(Map<String, Object> excessEquipAlarmPgList) { List<AlarmRuleLevelConfigTemplate> alarmsList = (List<AlarmRuleLevelConfigTemplate>) excessEquipAlarmPgList.get("alarmsList"); if (alarmsList != null && alarmsList.size() > 0) { String date = DateUtils.getDate("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); alarmsList.forEach(v -> { //查询质量报警配置 String departId = v.getDepartId(); String content = ""; String departName = departNameTemplete.replace("${departName}", sysDepartService.queryDepartNameById(departId)); content = contentTemplete.replace("${conent}", v.getYexpression()); //查询短信上一条报警是否处理,未处理就不新增报警记录 //TODO 先从数据库中获取,后期优化放redis中 QueryWrapper<AlarmRecordHistory> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("depart_id", departId); queryWrapper.eq("alarm_rule_type", "7"); queryWrapper.eq("alarm_rule_level_id", v.getId()); queryWrapper.eq("depart_id", departId); queryWrapper.orderByDesc("record_time").last("limit 1"); AlarmRecordHistory alarmRecordHistoryOne = alarmRecordHistoryService.getOne(queryWrapper); //如果没有上条记录或者处理状态(0:未处理,1:已处理)为已处理 if ((alarmRecordHistoryOne == null || alarmRecordHistoryOne.getHandleStatus() == 1)) { AlarmRecordHistory alarmRecordHistory = new AlarmRecordHistory(); //手动创建UUID,用于报警自动送审 String uuid = UUID.randomUUID().toString().replaceAll("-", ""); alarmRecordHistory.setId(uuid); alarmRecordHistory.setAlarmRuleLevelName(v.getAlarmTemplateLevelName()); alarmRecordHistory.setAlarmRuleType("7"); alarmRecordHistory.setAlarmParamType(v.getAlarmTemplateName()); alarmRecordHistory.setAlarmRuleLevelId(v.getId()); try { alarmRecordHistory.setRecordTime(simpleDateFormat1.parse(date)); } catch (ParseException e) { e.printStackTrace(); } alarmRecordHistory.setDepartId(departId); alarmRecordHistory.setActualAvgValue(v.getYexpression()); alarmRecordHistory.setHandleStatus(0); alarmRecordHistory.setDelFlag(1); alarmRecordHistory.setAlarmContent(prefix + departName + "采集数据设备" + content + suffix); // alarmRecordHistory.setTableName(tableName); alarmRecordHistory.setCreateBy("admin"); alarmRecordHistoryService.save(alarmRecordHistory); //判断是否需要发送系统通知 (内容跟报警记录信息相同) if ("1".equals(v.getIsSendNotice())) { if (StringUtils.isNotBlank(v.getAlarmNoticeRecipient())) { SystemNoticeVO systemNoticeVO = new SystemNoticeVO(v.getAlarmNoticeRecipient(), v.getAlarmTemplateLevelName(), departName + "采集数据设备" + content + suffix, departId, "7a'p"); systemNoticeUtils.dealNoticeMessage(systemNoticeVO); } } } }); } } private Map<String, Object> checkPgRelevanceAlarmEquip() { Map<String, Object> resultList = Maps.newHashMap(); //查询模版中需要关联报警的数据 QueryWrapper<AlarmRuleLevelConfigTemplate> alarmRuleLevelConfigTemplateQueryWrapper = new QueryWrapper<>(); alarmRuleLevelConfigTemplateQueryWrapper.eq("alarm_template_type", "3"); alarmRuleLevelConfigTemplateQueryWrapper.eq("alarm_type", "1"); alarmRuleLevelConfigTemplateQueryWrapper.ne("alarm_template_name", "日均值流量报警配置"); List<AlarmRuleLevelConfigTemplate> alarmRuleLevelConfigTemplateList = alarmRuleLevelConfigTemplateService.list(alarmRuleLevelConfigTemplateQueryWrapper); if (alarmRuleLevelConfigTemplateList != null && alarmRuleLevelConfigTemplateList.size() > 0) { //保存厂和关联公式数据 StringBuilder stringBuilder = new StringBuilder(); alarmRuleLevelConfigTemplateList.forEach(v -> { String expression = v.getExpression().replaceAll(";", ",").replaceAll("-", ","); stringBuilder.append(expression + ","); }); Map<String, Object> dataMap = pgService.queryMonitorByXTFeildsEquipTime(stringBuilder.toString()); if (!dataMap.isEmpty()) { List<AlarmRuleLevelConfigTemplate> alars = Lists.newArrayList(); for (AlarmRuleLevelConfigTemplate alarmRuleLevelConfigTemplate : alarmRuleLevelConfigTemplateList) { String expressions = alarmRuleLevelConfigTemplate.getExpression(); String zexpressions = alarmRuleLevelConfigTemplate.getZexpression(); String[] expressionsArr = expressions.split(";"); String[] zexpressionsArr = zexpressions.split(";"); String conditions = alarmRuleLevelConfigTemplate.getConditions(); if ("or".equals(conditions)) { label: for (int i = 0; i < expressionsArr.length; i++) { String[] split = expressionsArr[i].split("-"); String stat = split[1]; if (StringUtils.isNotBlank(stat)) { Integer orDefault = (Integer) dataMap.get(stat); if (orDefault == 1) { alarmRuleLevelConfigTemplate.setYexpression(zexpressionsArr[i]); alars.add(alarmRuleLevelConfigTemplate); } } else { //获取运行点 Integer orDefault = (Integer) dataMap.get(split[0]); if (orDefault == 0) { alarmRuleLevelConfigTemplate.setYexpression(zexpressionsArr[i]); alars.add(alarmRuleLevelConfigTemplate); } } } } else { boolean flag = true; label: for (int i = 0; i < expressionsArr.length; i++) { String[] split = expressionsArr[i].split(","); String stat = split[1]; if (StringUtils.isNotBlank(stat) && !stat.equals("null")) { Integer orDefault = (Integer) dataMap.get(stat); if (orDefault == 0) { flag = false; break label; } } else { //获取运行点 Integer orDefault = (Integer) dataMap.get(split[0]); if (orDefault == 1) { flag = false; break label; } } } if (flag) { //报警 alarmRuleLevelConfigTemplate.setYexpression(zexpressions); alars.add(alarmRuleLevelConfigTemplate); } } } if (alars.size() > 0) { resultList.put("alarmsList", alars); } } } return resultList; } //自动恢复 private void dealStatus(Map<String, Object> excessAlarmPgList, Map<String, Object> excessAlarmPgListEquip) { List<AlarmRuleLevelConfigTemplate> alarmsList = (List<AlarmRuleLevelConfigTemplate>) excessAlarmPgList.get("alarmsList"); List<AlarmRuleLevelConfigTemplate> alarmsListEquip = (List<AlarmRuleLevelConfigTemplate>) excessAlarmPgListEquip.get("alarmsList"); List<AlarmRuleLevelConfigTemplate> result = Lists.newArrayList(); if (alarmsListEquip != null && alarmsListEquip.size() > 0) { result.addAll(alarmsListEquip); } if (alarmsList != null && alarmsList.size() > 0) { result.addAll(alarmsList); } UpdateWrapper<AlarmRecordHistory> updateWrapper = new UpdateWrapper<>(); if (result != null && result.size() > 0) { //日均值流量报警配置 List<String> names = Lists.newArrayList(); result.forEach(v -> { names.add(v.getId()); }); updateWrapper.notIn("alarm_rule_level_id", names); } updateWrapper.eq("alarm_rule_type", "7"); updateWrapper.ne("alarm_param_type", "日均值流量报警配置"); updateWrapper.eq("handle_status", 0); AlarmRecordHistory alarmRecordHistory = new AlarmRecordHistory(); alarmRecordHistory.setHandleUser("admin"); alarmRecordHistory.setHandleTime(DateUtils.getDate()); alarmRecordHistory.setHandleStatus(1); alarmRecordHistoryService.update(alarmRecordHistory, updateWrapper); } private Map<String, Object> checkPgRelevanceAlarm() { Map<String, Object> resultList = Maps.newHashMap(); //查询模版中需要关联报警的数据 QueryWrapper<AlarmRuleLevelConfigTemplate> alarmRuleLevelConfigTemplateQueryWrapper = new QueryWrapper<>(); alarmRuleLevelConfigTemplateQueryWrapper.eq("alarm_template_type", "3"); alarmRuleLevelConfigTemplateQueryWrapper.eq("alarm_type", "0"); alarmRuleLevelConfigTemplateQueryWrapper.ne("alarm_template_name", "日均值流量报警配置"); List<AlarmRuleLevelConfigTemplate> alarmRuleLevelConfigTemplateList = alarmRuleLevelConfigTemplateService.list(alarmRuleLevelConfigTemplateQueryWrapper); if (alarmRuleLevelConfigTemplateList != null && alarmRuleLevelConfigTemplateList.size() > 0) { //保存厂和关联公式数据 StringBuilder stringBuilder = new StringBuilder(); alarmRuleLevelConfigTemplateList.forEach(v -> { String expression = v.getExpression().replaceAll(";", ","); stringBuilder.append(expression + ","); }); Map<String, Object> dataMap = pgService.queryMonitorByXTFeildsTime(stringBuilder.toString()); if (!dataMap.isEmpty()) { List<AlarmRuleLevelConfigTemplate> alars = Lists.newArrayList(); for (AlarmRuleLevelConfigTemplate alarmRuleLevelConfigTemplate : alarmRuleLevelConfigTemplateList) { String expressions = alarmRuleLevelConfigTemplate.getExpression(); String zexpressions = alarmRuleLevelConfigTemplate.getZexpression(); String[] expressionsArr = expressions.split(";"); String[] zexpressionsArr = zexpressions.split(";"); String conditions = alarmRuleLevelConfigTemplate.getConditions(); if ("or".equals(conditions)) { label: for (int i = 0; i < expressionsArr.length; i++) { String expression = expressionsArr[i].replaceAll(",", ""); Expression compiledExp = AviatorEvaluator.compile(expression); Boolean res = (Boolean) compiledExp.execute(dataMap); if (res == true) { StringBuilder stringBuilder1 = new StringBuilder(); String[] ids = expressionsArr[i].split(","); for (String id : ids) { Double orDefault = (Double) dataMap.get(id); if (orDefault == null) { stringBuilder1.append(id); } else { stringBuilder1.append(orDefault.doubleValue()); } } alarmRuleLevelConfigTemplate.setYexpression(zexpressionsArr[i] + "(" + stringBuilder1.toString() + ")"); alars.add(alarmRuleLevelConfigTemplate); break label; } } } else { boolean flag = true; StringBuilder stringBuilder1 = new StringBuilder(); label: for (int i = 0; i < expressionsArr.length; i++) { String expression = expressionsArr[i].replaceAll(",", ""); Expression compiledExp = AviatorEvaluator.compile(expression); Boolean res = (Boolean) compiledExp.execute(dataMap); if (res == false) { flag = false; break label; } else { String[] ids = expressionsArr[i].split(","); for (String id : ids) { Double orDefault = (Double) dataMap.get(id); if (orDefault == null) { stringBuilder1.append(id); } else { stringBuilder1.append(orDefault.doubleValue()); } } stringBuilder1.append(";"); } } if (flag) { alarmRuleLevelConfigTemplate.setYexpression(zexpressions + "(" + stringBuilder1.toString() + ")"); alars.add(alarmRuleLevelConfigTemplate); } } } if (alars.size() > 0) { resultList.put("alarmsList", alars); } } } return resultList; } private void sendMessage(Map<String, Object> excessAlarmPgList) { List<AlarmRuleLevelConfigTemplate> alarmsList = (List<AlarmRuleLevelConfigTemplate>) excessAlarmPgList.get("alarmsList"); if (alarmsList != null && alarmsList.size() > 0) { String date = DateUtils.getDate("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); alarmsList.forEach(v -> { //查询质量报警配置 String departId = v.getDepartId(); String content = ""; String departName = departNameTemplete.replace("${departName}", sysDepartService.queryDepartNameById(departId)); content = contentTemplete.replace("${conent}", v.getYexpression()); //查询短信上一条报警是否处理,未处理就不新增报警记录 //TODO 先从数据库中获取,后期优化放redis中 QueryWrapper<AlarmRecordHistory> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("depart_id", departId); queryWrapper.eq("alarm_rule_type", "7"); queryWrapper.eq("alarm_rule_level_id", v.getId()); queryWrapper.eq("depart_id", departId); queryWrapper.orderByDesc("record_time").last("limit 1"); AlarmRecordHistory alarmRecordHistoryOne = alarmRecordHistoryService.getOne(queryWrapper); //如果没有上条记录或者处理状态(0:未处理,1:已处理)为已处理 if ((alarmRecordHistoryOne == null || alarmRecordHistoryOne.getHandleStatus() == 1)) { AlarmRecordHistory alarmRecordHistory = new AlarmRecordHistory(); //手动创建UUID,用于报警自动送审 String uuid = UUID.randomUUID().toString().replaceAll("-", ""); alarmRecordHistory.setId(uuid); alarmRecordHistory.setAlarmRuleLevelName(v.getAlarmTemplateLevelName()); alarmRecordHistory.setAlarmRuleType("7"); alarmRecordHistory.setAlarmParamType(v.getAlarmTemplateName()); alarmRecordHistory.setAlarmRuleLevelId(v.getId()); try { alarmRecordHistory.setRecordTime(simpleDateFormat1.parse(date)); } catch (ParseException e) { e.printStackTrace(); } alarmRecordHistory.setDepartId(departId); alarmRecordHistory.setActualAvgValue(v.getYexpression()); alarmRecordHistory.setHandleStatus(0); alarmRecordHistory.setDelFlag(1); alarmRecordHistory.setAlarmContent(prefix + departName + "采集数据" + content + suffix); // alarmRecordHistory.setTableName(tableName); alarmRecordHistory.setCreateBy("admin"); alarmRecordHistoryService.save(alarmRecordHistory); } }); } } public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) { if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) { return true; } Calendar date = Calendar.getInstance(); date.setTime(nowTime); Calendar begin = Calendar.getInstance(); begin.setTime(startTime); Calendar end = Calendar.getInstance(); end.setTime(endTime); if (date.after(begin) && date.before(end)) { return true; } else { return false; } } }