fix alert record
parent
328947a8a9
commit
838ac67842
@ -0,0 +1,27 @@
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.alert.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum AlertTypeEnum {
|
||||
|
||||
联动("联动"),
|
||||
属性("属性"),
|
||||
设备("设备"),
|
||||
产品("产品");
|
||||
|
||||
private final String value;
|
||||
|
||||
// 一个可选的方法,用于根据整数值获取对应的枚举实例
|
||||
public static AlertTypeEnum fromValue(String value) {
|
||||
for (AlertTypeEnum status : AlertTypeEnum.values()) {
|
||||
if (status.getValue().equals(value)) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown value: " + value);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,122 @@
|
||||
package cn.iocoder.yudao.module.iot.controller.admin.mqttdatarecord;
|
||||
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.alertrecord.vo.AlertRecordPageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.DevicePageReqVO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.alert.AlertDO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.alertrecord.AlertRecordDO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceAttributeDO;
|
||||
import cn.iocoder.yudao.module.iot.dal.dataobject.device.DeviceDO;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.alert.AlertMapper;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.alertrecord.AlertRecordMapper;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceAttributeMapper;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.device.DeviceMapper;
|
||||
import cn.iocoder.yudao.module.iot.dal.mysql.formula.FormulaRecordMapper;
|
||||
import cn.iocoder.yudao.module.iot.framework.constant.Constants;
|
||||
import cn.iocoder.yudao.module.iot.framework.constant.DeviceStatusEnum;
|
||||
import cn.iocoder.yudao.module.iot.framework.util.FormulaCalculator;
|
||||
import cn.iocoder.yudao.module.iot.service.device.DeviceService;
|
||||
import cn.iocoder.yudao.module.iot.service.mqttrecord.MqttRecordService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
@EnableAsync
|
||||
@EnableScheduling
|
||||
public class MqttDataService {
|
||||
@Resource
|
||||
private FormulaRecordMapper formulaRecordMapper;
|
||||
@Resource
|
||||
private DeviceService deviceService;
|
||||
@Resource
|
||||
private DeviceMapper deviceMapper;
|
||||
@Resource
|
||||
private MqttRecordService mqttRecordService;
|
||||
@Resource
|
||||
private DeviceAttributeMapper attributeMapper;
|
||||
@Resource
|
||||
private AlertMapper alertMapper;
|
||||
@Resource
|
||||
private AlertRecordMapper alertRecordMapper;
|
||||
/**定时检查设备状态*/
|
||||
//@Scheduled(fixedDelay = 2000)
|
||||
public void checkDeviceStatus() {
|
||||
DevicePageReqVO respVO = new DevicePageReqVO().setStatus(DeviceStatusEnum.在线.getValue()).setIsEnable(true);
|
||||
List<DeviceDO> deviceList = deviceService.selectList(respVO);
|
||||
for (DeviceDO device : deviceList) {
|
||||
if(device.getLastOnlineTime()==null){
|
||||
device.setStatus(DeviceStatusEnum.离线.getValue());
|
||||
deviceMapper.updateById(device);
|
||||
}else {
|
||||
Duration duration = Duration.between(device.getLastOnlineTime(), LocalDateTime.now());
|
||||
//long seconds = duration.getSeconds();
|
||||
long millis = duration.toMillis();
|
||||
long second = device.getOffLineDuration()==null? Constants.DEVICE_OFFLINE_SECOND : device.getOffLineDuration();
|
||||
if(millis > second*1000){//认为设备已经离线
|
||||
device.setStatus(DeviceStatusEnum.离线.getValue());
|
||||
deviceMapper.updateById(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@Async
|
||||
public void updateDeviceStatus(DeviceDO deviceDO){
|
||||
deviceDO.setStatus(DeviceStatusEnum.在线.getValue());
|
||||
deviceDO.setLastOnlineTime(LocalDateTime.now());
|
||||
deviceMapper.updateById(deviceDO);
|
||||
}
|
||||
@Async
|
||||
public void checkDeviceAlert(Map<String,String> value, DeviceDO deviceDO){
|
||||
DeviceAttributeDO reqVO = new DeviceAttributeDO().setDeviceId(deviceDO.getId()).setAlertId(1L).setIsEnable(true);
|
||||
List<DeviceAttributeDO> attributeList = attributeMapper.selectAlertList(reqVO);
|
||||
if(attributeList!=null){
|
||||
//拿到该设备关联有告警的属性,进行逻辑计算
|
||||
for (DeviceAttributeDO attr : attributeList) {
|
||||
if(StringUtils.isBlank(value.get(attr.getAttributeName())))continue;
|
||||
|
||||
AlertDO alertDO = alertMapper.selectById(attr.getAlertId());
|
||||
//告警设置有效
|
||||
if (alertDO!=null && alertDO.getIsEnable() && !alertDO.getConditionFormula().isEmpty()){
|
||||
//允许重复报警
|
||||
if(alertDO.getIsRepeat() || alertDO.getNoRepeatDuration()==null || alertDO.getNoRepeatDuration() < 1){
|
||||
insertRecord(value,alertDO,attr);
|
||||
}else{//不允许重复报警,检查下次报警间隔,以 告警id和属性id查找上次报警记录
|
||||
AlertRecordPageReqVO pageReqVO = new AlertRecordPageReqVO().setAlertId(alertDO.getId()).setDataId(attr.getId());
|
||||
AlertRecordDO last = alertRecordMapper.selectLastOne(pageReqVO);
|
||||
if(last==null){
|
||||
insertRecord(value,alertDO,attr);
|
||||
}else{
|
||||
Duration duration = Duration.between(last.getCreateTime(), LocalDateTime.now());
|
||||
//long seconds = duration.getSeconds();
|
||||
long millis = duration.toMillis();
|
||||
//可以继续报警了
|
||||
if(millis > alertDO.getNoRepeatDuration()*1000){
|
||||
insertRecord(value,alertDO,attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void insertRecord(Map<String,String> value, AlertDO alertDO,DeviceAttributeDO attr){
|
||||
boolean result = FormulaCalculator.calFormulaBoolean(alertDO.getConditionFormula(),
|
||||
Constants.DefaultFormulaVar,value.get(attr.getAttributeName()));
|
||||
//触发告警
|
||||
if(result){
|
||||
AlertRecordDO recordDO = new AlertRecordDO(alertDO);
|
||||
recordDO.setData(attr);
|
||||
recordDO.setDataValue(value.get(attr.getAttributeName()));
|
||||
alertRecordMapper.insert(recordDO);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package cn.iocoder.yudao.module.iot.framework.constant;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum DeviceStatusEnum {
|
||||
|
||||
不可用("3"),
|
||||
离线("2"),
|
||||
在线("1");
|
||||
|
||||
private final String value;
|
||||
|
||||
// 一个可选的方法,用于根据整数值获取对应的枚举实例
|
||||
public static DeviceStatusEnum fromValue(String value) {
|
||||
for (DeviceStatusEnum status : DeviceStatusEnum.values()) {
|
||||
if (status.getValue().equals(value)) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown value: " + value);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue