diff --git a/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java b/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java index 7a87095..bf065d7 100644 --- a/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java +++ b/src/main/java/com/techsor/datacenter/sender/dao/DashboardAlertDao.java @@ -153,13 +153,14 @@ public class DashboardAlertDao { public void insertAlertHistory(DynamodbEntity entity) { String sql = "INSERT INTO alert_history (" + - "device_id, receive_ts, retain_alert" + - ") VALUES (?, ?, ?)"; + "device_id, receive_ts, retain_alert, block_flag " + + ") VALUES (?, ?, ?, ?)"; jdbcTemplate.update(sql, entity.getDeviceId(), entity.getReceive_ts(), - entity.getRetainAlert() + entity.getRetainAlert(), + entity.getAlertBlock() ); } diff --git a/src/main/java/com/techsor/datacenter/sender/dao/DashboardBlockConfigDao.java b/src/main/java/com/techsor/datacenter/sender/dao/DashboardBlockConfigDao.java new file mode 100644 index 0000000..585b65d --- /dev/null +++ b/src/main/java/com/techsor/datacenter/sender/dao/DashboardBlockConfigDao.java @@ -0,0 +1,40 @@ +package com.techsor.datacenter.sender.dao; + +import com.techsor.datacenter.sender.dto.BlockConfigDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import jakarta.annotation.Resource; +import java.util.Collections; +import java.util.List; + +@Slf4j +@Component +public class DashboardBlockConfigDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + /** + * 根据楼宇ID查询有效的屏蔽配置(flag=0) + * @param buildingId 楼宇ID + * @return 屏蔽配置列表(start_time/end_time 为毫秒时间戳) + */ + public List queryActiveBlockConfigsByBuildingId(Long buildingId) { + if (buildingId == null) { + return Collections.emptyList(); + } + String sql = "SELECT id, building_id, start_time, end_time " + + "FROM dashboard_block_config " + + "WHERE building_id = ? AND flag = 0 AND status = 0 "; + return jdbcTemplate.query(sql, (rs, rowNum) -> { + BlockConfigDTO dto = new BlockConfigDTO(); + dto.setId(rs.getLong("id")); + dto.setBuildingId(rs.getLong("building_id")); + dto.setStartTime(rs.getLong("start_time")); + dto.setEndTime(rs.getLong("end_time")); + return dto; + }, buildingId); + } +} diff --git a/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java b/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java index 96330b5..135297b 100644 --- a/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java +++ b/src/main/java/com/techsor/datacenter/sender/dao/DeviceDao.java @@ -306,6 +306,7 @@ public class DeviceDao { item.setSpaceName(rs.getString("spaceName")); item.setFloorName(rs.getString("floorName")); item.setBuildingName(rs.getString("buildingName")); + item.setBuildingId(rs.getLong("buildingId")); item.setAssetName(rs.getString("assetName")); item.setCategory(rs.getString("category")); item.setMonitoringPointName(rs.getString("monitoringPointName")); diff --git a/src/main/java/com/techsor/datacenter/sender/dto/BlockConfigDTO.java b/src/main/java/com/techsor/datacenter/sender/dto/BlockConfigDTO.java new file mode 100644 index 0000000..d3ac30d --- /dev/null +++ b/src/main/java/com/techsor/datacenter/sender/dto/BlockConfigDTO.java @@ -0,0 +1,11 @@ +package com.techsor.datacenter.sender.dto; + +import lombok.Data; + +@Data +public class BlockConfigDTO { + private Long id; + private Long buildingId; + private Long startTime; + private Long endTime; +} diff --git a/src/main/java/com/techsor/datacenter/sender/dto/DeviceInfoVO.java b/src/main/java/com/techsor/datacenter/sender/dto/DeviceInfoVO.java index 838521c..3e6a659 100644 --- a/src/main/java/com/techsor/datacenter/sender/dto/DeviceInfoVO.java +++ b/src/main/java/com/techsor/datacenter/sender/dto/DeviceInfoVO.java @@ -35,6 +35,8 @@ public class DeviceInfoVO implements Serializable { // private String alertTypeName; + private Long buildingId; + private String buildingName; private String floorName; @@ -53,4 +55,6 @@ public class DeviceInfoVO implements Serializable { private Long categoryId; + private Integer alertBlock = 0; + } diff --git a/src/main/java/com/techsor/datacenter/sender/entitiy/DynamodbEntity.java b/src/main/java/com/techsor/datacenter/sender/entitiy/DynamodbEntity.java index f48aff4..82a57b5 100644 --- a/src/main/java/com/techsor/datacenter/sender/entitiy/DynamodbEntity.java +++ b/src/main/java/com/techsor/datacenter/sender/entitiy/DynamodbEntity.java @@ -139,4 +139,6 @@ public class DynamodbEntity implements Serializable { private Long categoryId; + private Integer alertBlock = 0; + } diff --git a/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java b/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java index 58e4b6e..c68397b 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java +++ b/src/main/java/com/techsor/datacenter/sender/service/AlarmDataPushLambda.java @@ -267,17 +267,21 @@ public class AlarmDataPushLambda { type = 1; if (!isInvalidAlarm) { - //roid - roid(companyId, receive_ts, currentRawJsonObject, type, redisAlarmDTO, deviceId, respObject, filterTargetSets, alertTriggerExpression, deviceInfoVO); - + if (1 != deviceInfoVO.getAlertBlock()) { + //roid + roid(companyId, receive_ts, currentRawJsonObject, type, redisAlarmDTO, deviceId, respObject, filterTargetSets, alertTriggerExpression, deviceInfoVO); + } + redisAlarmDTO.setStatus(status); this.alramRedisTemplate.opsForHash().put(REDIS_DEVICE_ALARM_KEY, deviceId, JSONObject.toJSONString(redisAlarmDTO)); //email // switchAlarmSendMail(companyId, receive_ts, currentRawJsonObject, type, deviceId, respObject, deviceInfoVO); - //slack、teams、email - sendAlarmNotifications(companyId, receive_ts, currentRawJsonObject, type, deviceId, respObject, deviceInfoVO); - //mqtt - iotcoreOpt(companyId, deviceId, currentRawJsonObject, deviceInfoVO, 1); + if (1 != deviceInfoVO.getAlertBlock()) { + //slack、teams、email + sendAlarmNotifications(companyId, receive_ts, currentRawJsonObject, type, deviceId, respObject, deviceInfoVO); + //mqtt + iotcoreOpt(companyId, deviceId, currentRawJsonObject, deviceInfoVO, 1); + } } } else if (!STATUS_ALARM.equalsIgnoreCase(status)) { @@ -320,14 +324,14 @@ public class AlarmDataPushLambda { if (!isInvalidAlarm) { //roid - if(-1 != type) { + if(-1 != type && 1 != deviceInfoVO.getAlertBlock()) { roid(companyId, receive_ts, currentRawJsonObject, type, redisAlarmDTO, deviceId, respObject, filterTargetSets, alertTriggerExpression, deviceInfoVO); } //设置redis状态 redisAlarmDTO.setStatus(status); this.alramRedisTemplate.opsForHash().put(REDIS_DEVICE_ALARM_KEY, deviceId, JSONObject.toJSONString(redisAlarmDTO)); - if(-1 != type) { + if(-1 != type && 1 != deviceInfoVO.getAlertBlock()) { //email // switchAlarmSendMail(companyId, receive_ts, currentRawJsonObject, type, deviceId, respObject, deviceInfoVO); //slack、teams、email diff --git a/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java b/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java index 3dbdbb8..e723a35 100644 --- a/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java +++ b/src/main/java/com/techsor/datacenter/sender/service/impl/DataProcessServiceImpl.java @@ -5,8 +5,6 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; import com.baidu.fsg.uid.UidGenerator; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; @@ -25,6 +23,7 @@ import com.techsor.datacenter.sender.dao.*; import com.techsor.datacenter.sender.disruptor.AccumulateService; import com.techsor.datacenter.sender.disruptor.AlertService; import com.techsor.datacenter.sender.disruptor.MeasureService; +import com.techsor.datacenter.sender.dto.BlockConfigDTO; import com.techsor.datacenter.sender.dto.DeviceAlertInfo; import com.techsor.datacenter.sender.dto.DeviceInfoVO; import com.techsor.datacenter.sender.entitiy.*; @@ -34,11 +33,7 @@ import com.techsor.datacenter.sender.entitiy.bastatus.BaStatusThirdReqEntity; import com.techsor.datacenter.sender.entitiy.bastatus.LatestValueBO; import com.techsor.datacenter.sender.entitiy.company.CompanyEntity; import com.techsor.datacenter.sender.entitiy.delta.DeltaNumEntity; -import com.techsor.datacenter.sender.entitiy.kingio.KingIODataItemEntity; import com.techsor.datacenter.sender.entitiy.kingio.KingIODbmEntity; -import com.techsor.datacenter.sender.entitiy.kingio.TrendLog1RawEntity; -import com.techsor.datacenter.sender.entitiy.kingio.TrendLog1RawEntity.LogBuffer; -import com.techsor.datacenter.sender.entitiy.st150.St150DataItem; import com.techsor.datacenter.sender.entitiy.st150.St150DbmEntity; import com.techsor.datacenter.sender.service.AlarmDataPushLambda; import com.techsor.datacenter.sender.service.DispatchService; @@ -53,30 +48,20 @@ import cn.hutool.core.collection.CollectionUtil; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang.StringUtils; -import org.eclipse.paho.client.mqttv3.MqttClient; -import org.eclipse.paho.client.mqttv3.MqttException; -import org.eclipse.paho.client.mqttv3.MqttMessage; -import org.eclipse.paho.client.mqttv3.MqttPersistenceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; -import lombok.val; import java.lang.reflect.Type; import java.math.BigDecimal; -import java.text.DecimalFormat; -import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.TimeUnit; @@ -201,6 +186,9 @@ public class DataProcessServiceImpl implements IDataProcessService { @Resource private DeviceForwardConfigDao deviceForwardConfigDao; + @Resource + private DashboardBlockConfigDao dashboardBlockConfigDao; + @Resource private RedisTemplate redisTemplate; @@ -642,6 +630,11 @@ public class DataProcessServiceImpl implements IDataProcessService { //设备信息 DeviceInfoVO deviceInfoVO = alarmDataPushLambda.queryDeviceInfoByDeviceId(deviceId); + + // 检查是否在告警屏蔽时段 + setAlertBlock(deviceInfoVO); + baseTransDataEntity.setAlertBlock(deviceInfoVO.getAlertBlock()); + try { log.debug("triggerAlertConditions:{} {} {}", content, JSON.toJSON(baseTransDataEntity), JSON.toJSON(currentDeviceAlertInfoBindTemplateLists)); triggerAlertConditions(companyId, content, currentDeviceAlertInfoBindTemplateLists, baseTransDataEntity,waitingTargetKeySets,currentDevice.getDeviceSN(), deviceInfoVO); @@ -702,6 +695,24 @@ public class DataProcessServiceImpl implements IDataProcessService { //更新 } + private void setAlertBlock(DeviceInfoVO deviceInfoVO) { + if (deviceInfoVO != null && deviceInfoVO.getBuildingId() != null) { + List blockConfigs = dashboardBlockConfigDao + .queryActiveBlockConfigsByBuildingId(deviceInfoVO.getBuildingId()); + long now = System.currentTimeMillis(); + boolean inBlockPeriod = blockConfigs.stream().anyMatch( + config -> config.getStartTime() != null + && config.getEndTime() != null + && now >= config.getStartTime() + && now <= config.getEndTime() + ); + deviceInfoVO.setAlertBlock(inBlockPeriod ? 1 : 0); + if (inBlockPeriod) { + log.debug("device {} building {} in alert block period", deviceInfoVO.getDeviceId(), deviceInfoVO.getBuildingId()); + } + } + } + // private void sysAlarmNotify(DynamodbEntity baseTransDataEntity, DeviceInfoVO deviceInfoVO) throws Exception { // String temp = "建物「{0}」の監視ポイント「{1}」でアラームが発生しました";