add - 温度报警逻辑改为连续3分钟异常后才报警。

worktree-temp-progress-bar-color
yinq 5 days ago
parent 9311dfd29e
commit 1fac835ad5

@ -220,12 +220,13 @@ public class T_Alarm_DataController extends BaseController
calendar.add(Calendar.MINUTE,-720);
Long userId = ShiroUtils.getSysUser().getUserId();
List<AlarmPromptDTO> alarmPromptDTOList = t_Alarm_DataService.selectAlarmPromptDataList(userId.toString(), simpleDateFormat.format(calendar.getTime()), resolveAlarmDeptId());
int alarmCount = 0;
if(alarmPromptDTOList.size() > 0){
alarmCount = alarmPromptDTOList.size();
}
return alarmCount;
// 按测控点去重统计与弹窗「X个点位」语义一致
long alarmCount = alarmPromptDTOList.stream()
.map(AlarmPromptDTO::getMonitorId)
.filter(Objects::nonNull)
.distinct()
.count();
return (int) alarmCount;
}
/**
@ -239,7 +240,7 @@ public class T_Alarm_DataController extends BaseController
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.MINUTE,-1);
calendar.add(Calendar.MINUTE, -720);
Long userId = ShiroUtils.getSysUser().getUserId();
List<AlarmPromptDTO> alarmPromptDTOS = t_Alarm_DataService.selectAlarmPromptList(userId.toString(), simpleDateFormat.format(calendar.getTime()), resolveAlarmDeptId());
return JSONArray.toJSONString(alarmPromptDTOS);

@ -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

@ -86,6 +86,12 @@ public interface T_W_TemperturedataMapper
public List<T_W_Temperturedata> selectT_W_illdataFirstList(T_W_Temperturedata t_W_Temperturedata);
public List<T_W_Temperturedata> selectT_W_illdataList(T_W_Temperturedata t_W_Temperturedata);
public List<T_W_Temperturedata> selectT_W_Max_dataList(T_W_Temperturedata t_W_Temperturedata);
/**
* 湿
*/
public List<T_W_Temperturedata> selectTemperatureAlarmWindowList(T_W_Temperturedata t_W_Temperturedata);
public List<T_W_Temperturedata> selectill_max_min_avg(T_W_Temperturedata t_W_Temperturedata);
/**

@ -83,7 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
group by a.unitName,a.unitId
-->
<select id="selectAlarmPromptList" parameterType="AlarmPromptDTO" resultMap="AlarmPromptDTOResult">
SELECT COUNT(1) AS alarmCount
SELECT COUNT(DISTINCT t4.monitorId) AS alarmCount
FROM T_Alarm_Data t4
LEFT JOIN T_Monitor t5 ON t4.monitorId = t5.monitorId
WHERE t4.alarmStatus = 1

@ -295,4 +295,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</delete>
<select id="selectTemperatureAlarmWindowList" parameterType="T_W_Temperturedata" resultMap="T_W_TemperturedataResult">
select t1.objid, t1.monitorId, t1.collectTime, t1.tempreture
from T_W_TempertureData t1
<where>
<if test="monitorId != null and monitorId != ''">and t1.monitorId = #{monitorId}</if>
<if test="params.beginCollectTime != null and params.beginCollectTime != '' and params.endCollectTime != null and params.endCollectTime != ''">
and t1.collectTime between #{params.beginCollectTime} and #{params.endCollectTime}
</if>
</where>
order by t1.monitorId, t1.collectTime asc
</select>
</mapper>

Loading…
Cancel
Save