优化告警比较方法

This commit is contained in:
weitang 2025-04-24 18:16:04 +08:00
parent 545288051a
commit fcafc84f83

View File

@ -21,6 +21,7 @@ import com.yfd.platform.modules.auxcontrol.mapper.MeterDeviceMapper;
import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService; import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService;
import com.yfd.platform.system.domain.SysDictionaryItems; import com.yfd.platform.system.domain.SysDictionaryItems;
import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; import com.yfd.platform.system.mapper.SysDictionaryItemsMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -41,6 +42,7 @@ import java.util.regex.Pattern;
* @since 2025-04-23 * @since 2025-04-23
*/ */
@Service @Service
@Slf4j
public class DeviceAlarmRecordServiceImpl extends ServiceImpl<DeviceAlarmRecordMapper, DeviceAlarmRecord> implements IDeviceAlarmRecordService { public class DeviceAlarmRecordServiceImpl extends ServiceImpl<DeviceAlarmRecordMapper, DeviceAlarmRecord> implements IDeviceAlarmRecordService {
@Resource @Resource
@ -86,7 +88,7 @@ public class DeviceAlarmRecordServiceImpl extends ServiceImpl<DeviceAlarmRecordM
//如果信号类型是1 设备告警 //如果信号类型是1 设备告警
if ("1".equals(map.get("signalType").toString())) { if ("1".equals(map.get("signalType").toString())) {
//紧接者判断 value 1是告警 0是正常 status //紧接者判断 value 1是告警 0是正常 status
if (1 == Integer.parseInt(value)) { if ("1".equals(value)) {
//填充告警记录信息接口 //填充告警记录信息接口
DeviceAlarmRecord deviceAlarmRecord = FillingDeviceAlarmRecord(type, null, map, value); DeviceAlarmRecord deviceAlarmRecord = FillingDeviceAlarmRecord(type, null, map, value);
//首先判断 在不在时间范围之内 判断时间在不在时间范围之内接口 //首先判断 在不在时间范围之内 判断时间在不在时间范围之内接口
@ -100,7 +102,7 @@ public class DeviceAlarmRecordServiceImpl extends ServiceImpl<DeviceAlarmRecordM
this.removeById(alarmRecords.get(0).getRecordId()); this.removeById(alarmRecords.get(0).getRecordId());
} }
} else { } else {
//紧接者判断 value 1是告警 0是正常 status 同一信号监测到报警状态消除对当前信号所有未处理历史报警打上已处理标签并记录消除时间 //判断 value 1是告警 0是正常 status 同一信号监测到报警状态消除对当前信号所有未处理历史报警打上已处理标签并记录消除时间
LambdaQueryWrapper<DeviceAlarmRecord> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DeviceAlarmRecord> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DeviceAlarmRecord::getSignalId, map.get("signalId").toString()); queryWrapper.eq(DeviceAlarmRecord::getSignalId, map.get("signalId").toString());
queryWrapper.eq(DeviceAlarmRecord::getAlarmClass, "2"); queryWrapper.eq(DeviceAlarmRecord::getAlarmClass, "2");
@ -282,43 +284,37 @@ public class DeviceAlarmRecordServiceImpl extends ServiceImpl<DeviceAlarmRecordM
* false 没有触发告警规则 * false 没有触发告警规则
*/ */
public boolean TriggerAlarm(DeviceAlarmParameter deviceAlarmParameter, String value) { public boolean TriggerAlarm(DeviceAlarmParameter deviceAlarmParameter, String value) {
List<String> listSymbol = new ArrayList<>();
List<Double> values = new ArrayList<>();
// //获取告警触发条件 // //获取告警触发条件
String str = deviceAlarmParameter.getAlarmCondition(); String str = deviceAlarmParameter.getAlarmCondition();
// 定义正则表达式 // 定义正则表达式
String regex = "([0-9]+(\\.[0-9]+)?|value)([<>=!]{1,2})([0-9]+(\\.[0-9]+)?|value)"; String regex = "(\\d+)\\s*((?:==?|!=|<=?|>=?))\\s*value\\s*((?:==?|!=|<=?|>=?))\\s*(\\d+)";
Pattern pattern = Pattern.compile(regex); Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str); Matcher matcher = pattern.matcher(str);
// 查找并输出比较符号和数值 // 查找并输出比较符号和数值
while (matcher.find()) { if (matcher.find()) {
String value1 = matcher.group(1); try {
String operator = matcher.group(3); // 第一个数字
String value2 = matcher.group(4); String number1 = matcher.group(1);
// 第一个比较符
if ("value".equals(value1)) { String operator1 = matcher.group(2);
values.add(Double.parseDouble(value)); // 第二个比较符
} else { String operator2 = matcher.group(3);
values.add(Double.valueOf(value1)); // 第二个数字
String number2 = matcher.group(4);
Double aDouble = Double.valueOf(value);
boolean result = compare(Double.valueOf(number1), operator1, aDouble);
boolean resultTwo = compare(aDouble, operator2, Double.valueOf(number2));
return result && resultTwo;
} catch (Exception e) {
log.error(e.getMessage());
return false;
} }
listSymbol.add(operator);
if ("value".equals(value2)) {
values.add(Double.parseDouble(value));
} else {
values.add(Double.valueOf(value2));
}
} }
return false;
// 比较操作
boolean result = compare(values.get(0), listSymbol.get(0), values.get(1));
boolean resultTwo = true;
if (listSymbol.size() > 1) {
resultTwo = compare(values.get(1), listSymbol.get(1), values.get(2));
}
return result && resultTwo;
} }
private static boolean compare(Double value1, String operator, Double value2) { private static boolean compare(Double value1, String operator, Double value2) {
@ -364,26 +360,26 @@ public class DeviceAlarmRecordServiceImpl extends ServiceImpl<DeviceAlarmRecordM
* @return true 在区间范围之内 * @return true 在区间范围之内
* false 不在时间范围之内 * false 不在时间范围之内
*/ */
public Map<String, Object> getTimeInterval(int clock) { public Map<String, Object> getTimeInterval(int clockHour) {
int beforeclock = 0; int beforeclock = 0;
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>(10);
// 获取当前时间 // 获取当前时间
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
// 获取昨天的 7 // 获取昨天的 7
LocalDateTime yesterday7AM = LocalDateTime.of(now.minusDays(1).toLocalDate(), LocalTime.of(clock, 0)); LocalDateTime yesterdayClockAM = LocalDateTime.of(now.minusDays(1).toLocalDate(), LocalTime.of(clockHour, 0));
map.put("starttime", yesterday7AM); map.put("starttime", yesterdayClockAM);
// 获取今天的 7 // 获取今天的 7
LocalDateTime today7AM = LocalDateTime.of(now.toLocalDate(), LocalTime.of(clock, 0)); LocalDateTime todayClockAM = LocalDateTime.of(now.toLocalDate(), LocalTime.of(clockHour, 0));
LocalDateTime nextday7AM = LocalDateTime.of(now.plusDays(1).toLocalDate(), LocalTime.of(clock, 0)); LocalDateTime nextdayClockAM = LocalDateTime.of(now.plusDays(1).toLocalDate(), LocalTime.of(clockHour, 0));
map.put("endtime", today7AM);
map.put("endtime", todayClockAM);
// 判断时间是否在范围内 // 判断时间是否在范围内
if (now.isAfter(yesterday7AM) && now.isBefore(today7AM)) { if (now.isAfter(yesterdayClockAM) && now.isBefore(todayClockAM)) {
beforeclock = 1; beforeclock = 1;
} else { } else {
beforeclock = 0; map.put("starttime", todayClockAM);
map.put("starttime", today7AM); map.put("endtime", nextdayClockAM);
map.put("endtime", nextday7AM);
} }
map.put("beforeclock", beforeclock); map.put("beforeclock", beforeclock);
return map; return map;