|
|
|
|
@ -21,9 +21,12 @@ import com.ruoyi.common.utils.StringUtils;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
@ -36,6 +39,9 @@ import java.util.stream.Collectors;
|
|
|
|
|
public class RyTask {
|
|
|
|
|
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(RyTask.class);
|
|
|
|
|
|
|
|
|
|
/** 温度连续超阈达到该分钟数后才写入报警 */
|
|
|
|
|
private static final int TEMPERATURE_ALARM_CONTINUOUS_MINUTES = 3;
|
|
|
|
|
@Autowired
|
|
|
|
|
private TArraytemperaturedataMapper tArraytemperaturedataMapper;
|
|
|
|
|
|
|
|
|
|
@ -113,20 +119,25 @@ public class RyTask {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 温度传感器报警
|
|
|
|
|
* 温度传感器报警:连续超阈 {@link #TEMPERATURE_ALARM_CONTINUOUS_MINUTES} 分钟后才写入报警
|
|
|
|
|
*/
|
|
|
|
|
public void temperatureAlarm() {
|
|
|
|
|
String nowTime = DateUtils.getTime();
|
|
|
|
|
String beginTime = LocalDateTime
|
|
|
|
|
.parse(nowTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
|
|
|
|
|
.plusMinutes(-30) // 加一分钟
|
|
|
|
|
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
|
|
|
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
LocalDateTime now = LocalDateTime.parse(nowTime, formatter);
|
|
|
|
|
// 多查几分钟历史,用于回溯连续超阈起点
|
|
|
|
|
String beginTime = now.plusMinutes(-(TEMPERATURE_ALARM_CONTINUOUS_MINUTES + 2))
|
|
|
|
|
.format(formatter);
|
|
|
|
|
|
|
|
|
|
T_W_Temperturedata selectData = new T_W_Temperturedata();
|
|
|
|
|
HashMap<String, Object> selectMap = new HashMap<>();
|
|
|
|
|
selectMap.put("beginTime", beginTime);
|
|
|
|
|
selectMap.put("endTime", nowTime);
|
|
|
|
|
selectMap.put("beginCollectTime", beginTime);
|
|
|
|
|
selectMap.put("endCollectTime", nowTime);
|
|
|
|
|
selectData.setParams(selectMap);
|
|
|
|
|
List<T_W_Temperturedata> dataList = tWTemperturedataMapper.selectT_W_Max_dataList(selectData);
|
|
|
|
|
List<T_W_Temperturedata> windowDataList = tWTemperturedataMapper.selectTemperatureAlarmWindowList(selectData);
|
|
|
|
|
Map<String, List<T_W_Temperturedata>> monitorDataMap = windowDataList.stream()
|
|
|
|
|
.filter(d -> d.getMonitorId() != null)
|
|
|
|
|
.collect(Collectors.groupingBy(T_W_Temperturedata::getMonitorId));
|
|
|
|
|
|
|
|
|
|
T_Alarm_Data alarmData = new T_Alarm_Data();
|
|
|
|
|
alarmData.setAlarmStatus(1); //0-已处理 1-未处理
|
|
|
|
|
@ -136,44 +147,92 @@ public class RyTask {
|
|
|
|
|
TSetmonitorthresholdvalue selectValue = new TSetmonitorthresholdvalue();
|
|
|
|
|
selectValue.setMonitorType(16);
|
|
|
|
|
List<TSetmonitorthresholdvalue> thresholdlist = setmonitorthresholdvalueMapper.selectTSetmonitorthresholdvalueList(selectValue);
|
|
|
|
|
for (T_W_Temperturedata data : dataList) {
|
|
|
|
|
String monitorId = data.getMonitorId();
|
|
|
|
|
if (alarmList.contains(monitorId)){
|
|
|
|
|
for (TSetmonitorthresholdvalue value : thresholdlist) {
|
|
|
|
|
String monitorId = value.getMonitorId();
|
|
|
|
|
if (monitorId == null || alarmList.contains(monitorId)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
List<TSetmonitorthresholdvalue> collect = thresholdlist.stream().filter(e -> e.getMonitorId().equals(monitorId)).collect(Collectors.toList());
|
|
|
|
|
if (collect.size() > 0){
|
|
|
|
|
TSetmonitorthresholdvalue value = collect.get(0);
|
|
|
|
|
if (value.getMonitorId().equals(monitorId)){
|
|
|
|
|
BigDecimal temperatureMax = value.getTemperatureMax();
|
|
|
|
|
BigDecimal temperatureMin = value.getTemperatureMin();
|
|
|
|
|
System.out.println("temperatureAlarm:monitorId" + monitorId + "|temperatureMax:" + temperatureMax + "|Tempreture:" + data.getTempreture());
|
|
|
|
|
if (StringUtils.isNotNull(temperatureMax) && data.getTempreture().compareTo(temperatureMax) > 0){
|
|
|
|
|
T_Alarm_Data insertData = new T_Alarm_Data();
|
|
|
|
|
insertData.setMonitorId(data.getMonitorId());
|
|
|
|
|
insertData.setCollectTime(DateUtils.getNowDate());
|
|
|
|
|
insertData.setAlarmType(0);//0-过高报警 1-过低报警
|
|
|
|
|
insertData.setMonitorType(16);
|
|
|
|
|
insertData.setAlarmStatus(1);
|
|
|
|
|
insertData.setAlarmData(data.getTempreture());
|
|
|
|
|
insertData.setCause(value.gettMaxIdea() != null ? value.gettMaxIdea() : "温度过高");
|
|
|
|
|
tAlarmDataMapper.insertT_Alarm_Data(insertData);
|
|
|
|
|
} else if (StringUtils.isNotNull(temperatureMin) && temperatureMin.compareTo(data.getTempreture()) > 0){
|
|
|
|
|
T_Alarm_Data insertData = new T_Alarm_Data();
|
|
|
|
|
insertData.setMonitorId(data.getMonitorId());
|
|
|
|
|
insertData.setCollectTime(DateUtils.getNowDate());
|
|
|
|
|
insertData.setAlarmType(1);//0-过高报警 1-过低报警
|
|
|
|
|
insertData.setMonitorType(16);
|
|
|
|
|
insertData.setAlarmStatus(1);
|
|
|
|
|
insertData.setAlarmData(data.getTempreture());
|
|
|
|
|
insertData.setCause(value.gettMinIdea() != null ? value.gettMinIdea() : "温度过底");
|
|
|
|
|
tAlarmDataMapper.insertT_Alarm_Data(insertData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
List<T_W_Temperturedata> records = monitorDataMap.getOrDefault(monitorId, new ArrayList<>());
|
|
|
|
|
if (records.isEmpty()) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
T_W_Temperturedata latest = records.get(records.size() - 1);
|
|
|
|
|
BigDecimal temperatureMax = value.getTemperatureMax();
|
|
|
|
|
BigDecimal temperatureMin = value.getTemperatureMin();
|
|
|
|
|
if (StringUtils.isNotNull(temperatureMax)
|
|
|
|
|
&& isContinuousHighTemperatureAlarm(records, temperatureMax)) {
|
|
|
|
|
log.info("temperatureAlarm: monitorId={}, temperatureMax={}, tempreture={}, continuousMinutes={}",
|
|
|
|
|
monitorId, temperatureMax, latest.getTempreture(), TEMPERATURE_ALARM_CONTINUOUS_MINUTES);
|
|
|
|
|
T_Alarm_Data insertData = new T_Alarm_Data();
|
|
|
|
|
insertData.setMonitorId(monitorId);
|
|
|
|
|
insertData.setCollectTime(DateUtils.getNowDate());
|
|
|
|
|
insertData.setAlarmType(0);//0-过高报警 1-过低报警
|
|
|
|
|
insertData.setMonitorType(16);
|
|
|
|
|
insertData.setAlarmStatus(1);
|
|
|
|
|
insertData.setAlarmData(latest.getTempreture());
|
|
|
|
|
insertData.setCause(value.gettMaxIdea() != null ? value.gettMaxIdea() : "温度过高");
|
|
|
|
|
tAlarmDataMapper.insertT_Alarm_Data(insertData);
|
|
|
|
|
} else if (StringUtils.isNotNull(temperatureMin)
|
|
|
|
|
&& isContinuousLowTemperatureAlarm(records, temperatureMin)) {
|
|
|
|
|
log.info("temperatureAlarm: monitorId={}, temperatureMin={}, tempreture={}, continuousMinutes={}",
|
|
|
|
|
monitorId, temperatureMin, latest.getTempreture(), TEMPERATURE_ALARM_CONTINUOUS_MINUTES);
|
|
|
|
|
T_Alarm_Data insertData = new T_Alarm_Data();
|
|
|
|
|
insertData.setMonitorId(monitorId);
|
|
|
|
|
insertData.setCollectTime(DateUtils.getNowDate());
|
|
|
|
|
insertData.setAlarmType(1);//0-过高报警 1-过低报警
|
|
|
|
|
insertData.setMonitorType(16);
|
|
|
|
|
insertData.setAlarmStatus(1);
|
|
|
|
|
insertData.setAlarmData(latest.getTempreture());
|
|
|
|
|
insertData.setCause(value.gettMinIdea() != null ? value.gettMinIdea() : "温度过底");
|
|
|
|
|
tAlarmDataMapper.insertT_Alarm_Data(insertData);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 从最新采集点向前回溯,判断高温是否已连续超阈达到指定分钟数
|
|
|
|
|
*/
|
|
|
|
|
private boolean isContinuousHighTemperatureAlarm(List<T_W_Temperturedata> records, BigDecimal temperatureMax) {
|
|
|
|
|
T_W_Temperturedata latest = records.get(records.size() - 1);
|
|
|
|
|
if (latest.getTempreture() == null || latest.getCollectTime() == null
|
|
|
|
|
|| latest.getTempreture().compareTo(temperatureMax) <= 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
Date streakStart = latest.getCollectTime();
|
|
|
|
|
for (int i = records.size() - 2; i >= 0; i--) {
|
|
|
|
|
T_W_Temperturedata record = records.get(i);
|
|
|
|
|
if (record.getTempreture() == null || record.getCollectTime() == null
|
|
|
|
|
|| record.getTempreture().compareTo(temperatureMax) <= 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
streakStart = record.getCollectTime();
|
|
|
|
|
}
|
|
|
|
|
return latest.getCollectTime().getTime() - streakStart.getTime()
|
|
|
|
|
>= TEMPERATURE_ALARM_CONTINUOUS_MINUTES * 60_000L;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 从最新采集点向前回溯,判断低温是否已连续低于阈值达到指定分钟数
|
|
|
|
|
*/
|
|
|
|
|
private boolean isContinuousLowTemperatureAlarm(List<T_W_Temperturedata> records, BigDecimal temperatureMin) {
|
|
|
|
|
T_W_Temperturedata latest = records.get(records.size() - 1);
|
|
|
|
|
if (latest.getTempreture() == null || latest.getCollectTime() == null
|
|
|
|
|
|| temperatureMin.compareTo(latest.getTempreture()) <= 0) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
Date streakStart = latest.getCollectTime();
|
|
|
|
|
for (int i = records.size() - 2; i >= 0; i--) {
|
|
|
|
|
T_W_Temperturedata record = records.get(i);
|
|
|
|
|
if (record.getTempreture() == null || record.getCollectTime() == null
|
|
|
|
|
|| temperatureMin.compareTo(record.getTempreture()) <= 0) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
streakStart = record.getCollectTime();
|
|
|
|
|
}
|
|
|
|
|
return latest.getCollectTime().getTime() - streakStart.getTime()
|
|
|
|
|
>= TEMPERATURE_ALARM_CONTINUOUS_MINUTES * 60_000L;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 振动传感器报警:温度、速度、位移
|
|
|
|
|
* 阈值来源:TSetmonitorthresholdvalue monitorType=20
|
|
|
|
|
|