From 1fac835ad50e238cf9f0ac2b5342d06cc9d8bacd Mon Sep 17 00:00:00 2001 From: yinq Date: Thu, 2 Jul 2026 17:39:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?add=20-=20=E6=B8=A9=E5=BA=A6=E6=8A=A5?= =?UTF-8?q?=E8=AD=A6=E9=80=BB=E8=BE=91=E6=94=B9=E4=B8=BA=E8=BF=9E=E7=BB=AD?= =?UTF-8?q?3=E5=88=86=E9=92=9F=E5=BC=82=E5=B8=B8=E5=90=8E=E6=89=8D?= =?UTF-8?q?=E6=8A=A5=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 + + From 89f588d03d033d1310027713ea426ff2d09b2e62 Mon Sep 17 00:00:00 2001 From: yinq Date: Thu, 2 Jul 2026 17:41:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?add=20-=20=E6=B8=A9=E5=BA=A6=E6=95=B4?= =?UTF-8?q?=E7=82=B9=E6=95=B0=E6=8D=AE=E6=8A=A5=E8=A1=A8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=80=BB=E8=BE=91=E6=98=BE=E7=A4=BA=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/board/pointTimeSiteReport.html | 23 ++++++++------- .../service/impl/DataAnalysisServiceImpl.java | 29 ++++++++++++------- .../system/RepPointTempertureMapper.xml | 4 +-- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/ruoyi-admin/src/main/resources/templates/board/pointTimeSiteReport.html b/ruoyi-admin/src/main/resources/templates/board/pointTimeSiteReport.html index 18936e6..7018069 100644 --- a/ruoyi-admin/src/main/resources/templates/board/pointTimeSiteReport.html +++ b/ruoyi-admin/src/main/resources/templates/board/pointTimeSiteReport.html @@ -93,19 +93,20 @@ exportExcel(document.getElementById("bootstrap-table").outerHTML, "测控点整点报表.xls") } - function newSearh(){ - let dateList= getHoursBetween($("#laydate-demo-3").val(),$("#laydate-demo-4").val()); + function reloadTable() { + let startTime = $("#laydate-demo-3").val(); + let endTime = $("#laydate-demo-4").val(); + if (!startTime || !endTime) { + return; + } + let dateList = getHoursBetween(startTime, endTime); $('#bootstrap-table').bootstrapTable('destroy'); initTable(dateList); - // $.table.search(); } - $(function () { - const formattedDate = new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai', hour12: false }).slice(0, 13) + ':00:00'; - let dateList = getHoursBetween(formattedDate, formattedDate) - initTable(dateList); - }); - + function newSearh(){ + reloadTable(); + } function initTable(columns){ let timeList = []; @@ -172,7 +173,7 @@ function zOnClick(event, treeId, treeNode) { $("#monitorId").val(treeNode.id); - $.table.search(); + reloadTable(); } } @@ -230,6 +231,8 @@ trigger: 'click', value: formattedEnd // 为第二个选择器设置默认值为今天 }); + + reloadTable(); }); /* 测控点信息 */ diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DataAnalysisServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DataAnalysisServiceImpl.java index ddfab7d..b8eb027 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DataAnalysisServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/DataAnalysisServiceImpl.java @@ -208,20 +208,26 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { @Override public List> pointTimeSiteReport(Map map) { List> resultList = new ArrayList<>(); - if (String.valueOf(map.get("startTime")).equals("") || String.valueOf(map.get("endTime")).equals("")){ + Object startTime = map.get("startTime"); + Object endTime = map.get("endTime"); + if (startTime == null || endTime == null + || StringUtils.isEmpty(String.valueOf(startTime)) + || StringUtils.isEmpty(String.valueOf(endTime))) { return resultList; } - String monitorId = String.valueOf(map.get("monitorId")); - T_Monitor tMonitor = new T_Monitor(); - tMonitor.setpMonitorid(monitorId); - List tMonitors = t_MonitorMapper.selectT_MonitorList(tMonitor); - if (!tMonitors.isEmpty()) { - List monitorIdList = tMonitors.stream().map(T_Monitor::getMonitorId).collect(Collectors.toList()); - map.put("monitorIdList", monitorIdList); - map.remove(("monitorId")); + String monitorId = map.get("monitorId") == null ? "" : String.valueOf(map.get("monitorId")).trim(); + if (StringUtils.isNotEmpty(monitorId) && !"null".equalsIgnoreCase(monitorId)) { + T_Monitor tMonitor = new T_Monitor(); + tMonitor.setpMonitorid(monitorId); + List tMonitors = t_MonitorMapper.selectT_MonitorList(tMonitor); + if (!tMonitors.isEmpty()) { + List monitorIdList = tMonitors.stream().map(T_Monitor::getMonitorId).collect(Collectors.toList()); + map.put("monitorIdList", monitorIdList); + map.remove("monitorId"); + } } List> repPointTempertures = repPointTempertureMapper.selectpointTimeSiteReport(map); - resultList = transform(repPointTempertures); + resultList = transform(repPointTempertures); return resultList; } @@ -240,7 +246,8 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { String monitorId = originalMap.get("monitorId"); String monitorName = originalMap.get("monitorName"); String pointTime = String.valueOf(originalMap.get("pointTime")); - String expend = String.valueOf(originalMap.get("expend")); + Object expendValue = originalMap.get("expend"); + String expend = expendValue == null ? "" : String.valueOf(expendValue); resultMap.put("monitorId",monitorId); resultMap.put("monitorName",monitorName); resultMap.put("expend"+ pointTime,expend); diff --git a/ruoyi-system/src/main/resources/mapper/system/RepPointTempertureMapper.xml b/ruoyi-system/src/main/resources/mapper/system/RepPointTempertureMapper.xml index d259e24..28d830c 100644 --- a/ruoyi-system/src/main/resources/mapper/system/RepPointTempertureMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/RepPointTempertureMapper.xml @@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select TM.monitorName monitorName, pt.MonitorID monitorId, pt.Tempreture expend, - CONVERT(varchar(16), pt.beginTime, 120) + ':00' pointTime + CONVERT(varchar(13), pt.beginTime, 120) + ':00:00' pointTime from Rep_Point_Temperture pt left join T_Monitor TM on pt.MonitorID = TM.monitorId WHERE TM.monitorId IS NOT NULL @@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{monitorId} - order by pt.MonitorID + order by pt.MonitorID, pt.beginTime