From 1fac835ad50e238cf9f0ac2b5342d06cc9d8bacd Mon Sep 17 00:00:00 2001 From: yinq Date: Thu, 2 Jul 2026 17:39:01 +0800 Subject: [PATCH] =?UTF-8?q?add=20-=20=E6=B8=A9=E5=BA=A6=E6=8A=A5=E8=AD=A6?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=94=B9=E4=B8=BA=E8=BF=9E=E7=BB=AD3?= =?UTF-8?q?=E5=88=86=E9=92=9F=E5=BC=82=E5=B8=B8=E5=90=8E=E6=89=8D=E6=8A=A5?= =?UTF-8?q?=E8=AD=A6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/T_Alarm_DataController.java | 15 +- .../java/com/ruoyi/quartz/task/RyTask.java | 139 +++++++++++++----- .../mapper/T_W_TemperturedataMapper.java | 6 + .../mapper/system/T_Alarm_DataMapper.xml | 2 +- .../system/T_W_TemperturedataMapper.xml | 12 ++ 5 files changed, 126 insertions(+), 48 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/T_Alarm_DataController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/T_Alarm_DataController.java index 297c5ba..f40cc5d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/T_Alarm_DataController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/T_Alarm_DataController.java @@ -220,12 +220,13 @@ public class T_Alarm_DataController extends BaseController calendar.add(Calendar.MINUTE,-720); Long userId = ShiroUtils.getSysUser().getUserId(); List 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 alarmPromptDTOS = t_Alarm_DataService.selectAlarmPromptList(userId.toString(), simpleDateFormat.format(calendar.getTime()), resolveAlarmDeptId()); return JSONArray.toJSONString(alarmPromptDTOS); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java index 06ad5db..88fca79 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java @@ -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 selectMap = new HashMap<>(); - selectMap.put("beginTime", beginTime); - selectMap.put("endTime", nowTime); + selectMap.put("beginCollectTime", beginTime); + selectMap.put("endCollectTime", nowTime); selectData.setParams(selectMap); - List dataList = tWTemperturedataMapper.selectT_W_Max_dataList(selectData); + List windowDataList = tWTemperturedataMapper.selectTemperatureAlarmWindowList(selectData); + Map> 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 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 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 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 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 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 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/T_W_TemperturedataMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/T_W_TemperturedataMapper.java index 1df140a..be3a1c4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/T_W_TemperturedataMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/T_W_TemperturedataMapper.java @@ -86,6 +86,12 @@ public interface T_W_TemperturedataMapper public List selectT_W_illdataFirstList(T_W_Temperturedata t_W_Temperturedata); public List selectT_W_illdataList(T_W_Temperturedata t_W_Temperturedata); public List selectT_W_Max_dataList(T_W_Temperturedata t_W_Temperturedata); + + /** + * 查询时间窗口内温湿度采集序列(按测控点、采集时间升序,供连续超温报警判定) + */ + public List selectTemperatureAlarmWindowList(T_W_Temperturedata t_W_Temperturedata); + public List selectill_max_min_avg(T_W_Temperturedata t_W_Temperturedata); /** diff --git a/ruoyi-system/src/main/resources/mapper/system/T_Alarm_DataMapper.xml b/ruoyi-system/src/main/resources/mapper/system/T_Alarm_DataMapper.xml index 4dd1223..298e36c 100644 --- a/ruoyi-system/src/main/resources/mapper/system/T_Alarm_DataMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/T_Alarm_DataMapper.xml @@ -83,7 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" group by a.unitName,a.unitId --> + select t1.objid, t1.monitorId, t1.collectTime, t1.tempreture + from T_W_TempertureData t1 + + and t1.monitorId = #{monitorId} + + and t1.collectTime between #{params.beginCollectTime} and #{params.endCollectTime} + + + order by t1.monitorId, t1.collectTime asc + +