Commit efd0cd65 by 李小龙

告警

parent 77fd3869
...@@ -92,6 +92,10 @@ public class RedisConst { ...@@ -92,6 +92,10 @@ public class RedisConst {
public static final String TENANT_PREFIX = "tenant:"; public static final String TENANT_PREFIX = "tenant:";
public static final String ALARM_DEVICE_ID = "alarm:device:id:";
public static final String ALARM_CONFIG_ORG_ID = "alram:config:org:id";
......
...@@ -36,23 +36,5 @@ public class MsgSendDTO { ...@@ -36,23 +36,5 @@ public class MsgSendDTO {
this.param = param; this.param = param;
} }
private void replaceParam(){
if(StringUtils.isNotBlank(sendContent)){
return;
}
Pattern p = Pattern.compile("\\[#\\d+\\]|\\[#[\\p{IsHan}]+\\]|\\[#[^\\]]*\\]");
Matcher m = p.matcher(oriContent);
StringBuffer sb = new StringBuffer();
if(!m.find()){
sendContent= oriContent;
}
m.reset();
int i = 0;
while (m.find()) {
m.appendReplacement(sb, param[i]);
i++;
}
m.appendTail(sb);
sendContent=sb.toString();
}
} }
...@@ -367,4 +367,6 @@ public class RedisUtil { ...@@ -367,4 +367,6 @@ public class RedisUtil {
public void setProjectName(String projectName) { public void setProjectName(String projectName) {
RedisUtil.projectName = projectName; RedisUtil.projectName = projectName;
} }
} }
...@@ -71,7 +71,7 @@ public class PlatUserUtil { ...@@ -71,7 +71,7 @@ public class PlatUserUtil {
public static PlatUserVO getSystemUser() { public static PlatUserVO getSystemUser() {
PlatUserVO platUserVO = new PlatUserVO(); PlatUserVO platUserVO = new PlatUserVO();
platUserVO.setId("1"); platUserVO.setId("1");
platUserVO.setName("system"); platUserVO.setUsername("system");
//tntUserVO.setTenantId(); //tntUserVO.setTenantId();
platUserVO.setIsTenant(CommonEnum.NO.getValue()); platUserVO.setIsTenant(CommonEnum.NO.getValue());
......
...@@ -11,8 +11,8 @@ import java.util.function.BiConsumer; ...@@ -11,8 +11,8 @@ import java.util.function.BiConsumer;
@Data @Data
public class PlatUserVO implements Serializable { public class PlatUserVO implements Serializable {
private String id; private String id;
private String name;
// private String username; private String username;
private String tenantId; private String tenantId;
...@@ -40,12 +40,12 @@ public class PlatUserVO implements Serializable { ...@@ -40,12 +40,12 @@ public class PlatUserVO implements Serializable {
public PlatUserVO(String id, String name, String tenantId) { public PlatUserVO(String id, String name, String tenantId) {
this.id = id; this.id = id;
this.tenantId = tenantId; this.tenantId = tenantId;
this.name = name; this.username = name;
} }
public PlatUserVO(String id, String name) { public PlatUserVO(String id, String name) {
this.id = id; this.id = id;
this.name = name; this.username = name;
} }
......
package com.makeit.dto.platform.alarm;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.space.PlatRoom;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class PlatAlaramCheckDTO {
private List<PlatElder> platElderList = new ArrayList<>();
private PlatRoom platRoom;
}
...@@ -155,6 +155,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe ...@@ -155,6 +155,8 @@ public class PlatAlarmRecordServiceImpl extends ServiceImpl<PlatAlarmRecordMappe
/** /**
* 设备告警调用 发送消息 * 设备告警调用 发送消息
*
* todo 异步
*/ */
@Transactional @Transactional
@Override @Override
......
...@@ -9,13 +9,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; ...@@ -9,13 +9,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.makeit.common.entity.BaseEntity; import com.makeit.common.entity.BaseEntity;
import com.makeit.common.page.PageReqDTO; import com.makeit.common.page.PageReqDTO;
import com.makeit.common.page.PageVO; import com.makeit.common.page.PageVO;
import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import com.makeit.entity.platform.auth.PlatOrg; import com.makeit.entity.platform.auth.PlatOrg;
import com.makeit.entity.platform.auth.PlatRole; import com.makeit.entity.platform.auth.PlatRole;
import com.makeit.entity.platform.auth.PlatRoleOrg; import com.makeit.entity.platform.auth.PlatRoleOrg;
import com.makeit.entity.platform.auth.PlatUserRole; import com.makeit.entity.platform.auth.PlatUserRole;
import com.makeit.enums.CommonEnum; import com.makeit.enums.CommonEnum;
import com.makeit.enums.id.TreeConst; import com.makeit.enums.id.TreeConst;
import com.makeit.exception.BusinessException;
import com.makeit.global.aspect.tenant.TenantIdUtil; import com.makeit.global.aspect.tenant.TenantIdUtil;
import com.makeit.mapper.platform.auth.PlatOrgMapper; import com.makeit.mapper.platform.auth.PlatOrgMapper;
import com.makeit.service.platform.alarm.PlatAlarmConfigService; import com.makeit.service.platform.alarm.PlatAlarmConfigService;
...@@ -273,7 +273,7 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg> ...@@ -273,7 +273,7 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg>
@Transactional @Transactional
@Override @Override
public String add(PlatOrg dto) { public String add(PlatOrg dto) {
check(dto);
dto.setTenantId(TenantIdUtil.getTenantId()); dto.setTenantId(TenantIdUtil.getTenantId());
if (StringUtils.isBlank(dto.getParentId())) { if (StringUtils.isBlank(dto.getParentId())) {
String tenantId = TenantIdUtil.getTenantId(); String tenantId = TenantIdUtil.getTenantId();
...@@ -287,10 +287,20 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg> ...@@ -287,10 +287,20 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg>
return dto.getId(); return dto.getId();
} }
private void check(PlatOrg dto) {
LambdaQueryWrapper<PlatOrg> platOrgLambdaQueryWrapper = new LambdaQueryWrapper<>();
platOrgLambdaQueryWrapper.eq(PlatOrg::getParentId, dto.getParentId())
.eq(StringUtils.isNotBlank(dto.getId()),PlatOrg::getName, dto.getName())
.eq(PlatOrg::getName, dto);
if(count(platOrgLambdaQueryWrapper)>0){
throw new BusinessException("名称重复");
}
}
@Transactional @Transactional
@Override @Override
public void edit(PlatOrg dto) { public void edit(PlatOrg dto) {
check(dto);
if (StringUtils.isBlank(dto.getParentId())||StringUtils.equals(dto.getParentId(),"1")) { if (StringUtils.isBlank(dto.getParentId())||StringUtils.equals(dto.getParentId(),"1")) {
String tenantId = TenantIdUtil.getTenantId(); String tenantId = TenantIdUtil.getTenantId();
dto.setParentId(tenantId); dto.setParentId(tenantId);
...@@ -512,6 +522,7 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg> ...@@ -512,6 +522,7 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg>
@Override @Override
public List<PlatOrg> subOrgList(PlatOrgQueryDTO platOrgQueryDTO) { public List<PlatOrg> subOrgList(PlatOrgQueryDTO platOrgQueryDTO) {
LambdaQueryWrapper<PlatOrg> queryWrapper = getLambdaQueryWrapper(platOrgQueryDTO); LambdaQueryWrapper<PlatOrg> queryWrapper = getLambdaQueryWrapper(platOrgQueryDTO);
return list(queryWrapper); return list(queryWrapper);
...@@ -523,6 +534,7 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg> ...@@ -523,6 +534,7 @@ public class PlatOrgServiceImpl extends ServiceImpl<PlatOrgMapper, PlatOrg>
* @param platOrg * @param platOrg
*/ */
@Override @Override
@Transactional
public void saveOrg(PlatOrg platOrg) { public void saveOrg(PlatOrg platOrg) {
save(platOrg); save(platOrg);
......
...@@ -79,7 +79,7 @@ public class IotSyncTask { ...@@ -79,7 +79,7 @@ public class IotSyncTask {
} }
@Scheduled(cron = "0 0/1 * * * ?") @Scheduled(cron = "0 0 */1 * * ?")
public void syncDeviceLog() { public void syncDeviceLog() {
log.info("开始同步设备日志"); log.info("开始同步设备日志");
......
package com.makeit.mqtt; package com.makeit.mqtt;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.makeit.common.entity.BaseEntity;
import com.makeit.dto.platform.alarm.PlatAlaramCheckDTO;
import com.makeit.dto.platform.alarm.PlatAlarmConfigBehaviorDTOVO;
import com.makeit.dto.platform.alarm.PlatAlarmConfigHeartDTOVO;
import com.makeit.dto.platform.alarm.PlatAlarmConfigRespiratoryDTOVO;
import com.makeit.entity.platform.alarm.PlatAlarmConfig;
import com.makeit.entity.platform.alarm.PlatAlarmRecord;
import com.makeit.entity.platform.device.PlatDevice;
import com.makeit.entity.platform.elder.PlatElder;
import com.makeit.entity.platform.space.PlatRoom;
import com.makeit.entity.platform.space.PlatRoomBedDevice;
import com.makeit.enums.redis.RedisConst;
import com.makeit.module.iot.vo.DeviceInfo; import com.makeit.module.iot.vo.DeviceInfo;
import com.makeit.service.platform.alarm.PlatAlarmConfigService;
import com.makeit.service.platform.alarm.PlatAlarmRecordService;
import com.makeit.service.platform.device.PlatDeviceService;
import com.makeit.service.platform.elder.PlatElderService;
import com.makeit.service.platform.space.PlatRoomBedDeviceService;
import com.makeit.service.platform.space.PlatRoomService;
import com.makeit.utils.data.convert.JsonUtil;
import com.makeit.utils.redis.RedisUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttMessage; import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@Component @Component
public class PushCallback implements MqttCallback { public class PushCallback implements MqttCallback {
...@@ -21,6 +55,15 @@ public class PushCallback implements MqttCallback { ...@@ -21,6 +55,15 @@ public class PushCallback implements MqttCallback {
private static MqttClient client; private static MqttClient client;
//todo 放到缓存
@Autowired
private PlatAlarmRecordService platAlarmRecordService;
@Autowired
private PlatDeviceService platDeviceService;
@Autowired
private PlatAlarmConfigService platAlarmConfigService;
@Override @Override
public void connectionLost(Throwable cause) { public void connectionLost(Throwable cause) {
logger.info("连接断开,可以重连"); logger.info("连接断开,可以重连");
...@@ -40,6 +83,8 @@ public class PushCallback implements MqttCallback { ...@@ -40,6 +83,8 @@ public class PushCallback implements MqttCallback {
// 解析数据 // 解析数据
DeviceInfo device = JSON.parseObject(payload, DeviceInfo.class); DeviceInfo device = JSON.parseObject(payload, DeviceInfo.class);
// todo // todo
checkAlarm(device);
} }
@Override @Override
...@@ -47,5 +92,199 @@ public class PushCallback implements MqttCallback { ...@@ -47,5 +92,199 @@ public class PushCallback implements MqttCallback {
logger.info("deliveryComplete--------------" + token.isComplete()); logger.info("deliveryComplete--------------" + token.isComplete());
} }
public void checkAlarm(DeviceInfo device) {
getDeviceAlarmConfigMap();
String deviceId = device.getDeviceId();
String propertiesStr = device.getProperties();
JSONObject properties = JSON.parseObject(propertiesStr);
//呼吸率
int br = (int) properties.get("br");
//心率
int hr = (int) properties.get("hr");
PlatDevice platDevice = platDeviceService.getById(deviceId);
String category = platDevice.getCategory();
LambdaQueryWrapper<PlatAlarmConfig> platAlarmConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
platAlarmConfigLambdaQueryWrapper.eq(PlatAlarmConfig::getOrgId, platDevice.getOrgId())
.in(PlatAlarmConfig::getAlarmType, deviceAlarmConfigMap.get(category))
;
List<PlatAlarmConfig> configList = platAlarmConfigService.list(platAlarmConfigLambdaQueryWrapper);
if (CollectionUtils.isEmpty(configList)) {
return;
}
RedissonClient redissonClient = RedisUtil.getClient();
for (PlatAlarmConfig config : configList) {
String alarmType = config.getAlarmType();
String ruleConfigStr = config.getRuleConfig();
//跌倒
if (StringUtils.equals(alarmType, "1")) {
PlatAlarmRecord platAlarmRecord = createFallPlatAlarmRecord(platDevice, config);
platAlarmRecordService.noticeDeviceAlarm(config, platAlarmRecord);
}
if (StringUtils.isBlank(ruleConfigStr)) {
continue;
}
//呼吸
if (StringUtils.equals(alarmType, "2")) {
PlatAlarmConfigRespiratoryDTOVO ruleConfig = JsonUtil.toObj(ruleConfigStr, PlatAlarmConfigRespiratoryDTOVO.class);
Integer start = ruleConfig.getRespiratoryRateStart();
Integer end = ruleConfig.getRespiratoryRateEnd();
Integer duration = ruleConfig.getDuration();
//计数
RAtomicLong atomicLong = redissonClient.getAtomicLong(RedisConst.ALARM_DEVICE_ID + deviceId);
if (!atomicLong.isExists()) {
atomicLong.set(0);
}
if (br > end || br < start) {
long count = atomicLong.incrementAndGet();
if (count >= duration) {
PlatAlarmRecord platAlarmRecord = createRespiratoryPlatAlarmRecord(platDevice, config);
platAlarmRecordService.noticeDeviceAlarm(config, platAlarmRecord);
atomicLong.set(0);
}
} else {
atomicLong.set(0);
}
}
//心率
if (StringUtils.equals(alarmType, "3")) {
PlatAlarmConfigHeartDTOVO ruleConfig = JsonUtil.toObj(ruleConfigStr, PlatAlarmConfigHeartDTOVO.class);
Integer start = ruleConfig.getHeartRateStart();
Integer end = ruleConfig.getHeartRateEnd();
Integer duration = ruleConfig.getDuration();
RAtomicLong atomicLong = redissonClient.getAtomicLong(RedisConst.ALARM_DEVICE_ID + deviceId);
if (!atomicLong.isExists()) {
atomicLong.set(0);
}
if (hr > end || hr < start) {
long count = atomicLong.incrementAndGet();
if (count >= duration) {
PlatAlarmRecord platAlarmRecord = createHeartPlatAlarmRecord(platDevice, config);
platAlarmRecordService.noticeDeviceAlarm(config, platAlarmRecord);
atomicLong.set(0);
}
} else {
atomicLong.set(0);
}
}
//行为
if (StringUtils.equals(alarmType, "4")) {
PlatAlarmConfigBehaviorDTOVO ruleConfig = JsonUtil.toObj(ruleConfigStr, PlatAlarmConfigBehaviorDTOVO.class);
Integer duration = ruleConfig.getDuration();
//todo
}
}
}
private PlatAlarmRecord createFallPlatAlarmRecord(PlatDevice platDevice, PlatAlarmConfig config) {
return createPlatAlarmRecord(platDevice, config, "房间名111");
}
private PlatAlarmRecord createRespiratoryPlatAlarmRecord(PlatDevice platDevice, PlatAlarmConfig config) {
return createPlatAlarmRecord(platDevice, config, "呼吸状态111");
}
private PlatAlarmRecord createHeartPlatAlarmRecord(PlatDevice platDevice, PlatAlarmConfig config) {
return createPlatAlarmRecord(platDevice, config, "心率状态111");
}
private PlatAlarmRecord createBehaviorPlatAlarmRecord(PlatDevice platDevice, PlatAlarmConfig config) {
return createPlatAlarmRecord(platDevice, config, "房间名");
}
private PlatAlarmRecord createPlatAlarmRecord(PlatDevice platDevice, PlatAlarmConfig config, String... param) {
PlatAlaramCheckDTO platAlaramCheckDTO = getElderListByDeviceId(platDevice.getId());
List<PlatElder> elderList = platAlaramCheckDTO.getPlatElderList();
String elderNameJoin = elderList.stream().map(PlatElder::getName).collect(Collectors.joining(" "));
PlatAlarmRecord platAlarmRecord = new PlatAlarmRecord();
platAlarmRecord.setAlarmId(config.getId());
platAlarmRecord.setAlarmType(config.getAlarmType());
platAlarmRecord.setAlarmDate(new Date());
platAlarmRecord.setStatus("0");
//todo
platAlarmRecord.setContent(replaceParam(elderNameJoin, param));
platAlarmRecord.setOrgId(platDevice.getOrgId());
platAlarmRecord.setNotifyUser(config.getNotifyUser());
platAlarmRecord.setDeviceId(platDevice.getId());
platAlarmRecord.setElderIds(elderList.stream().map(BaseEntity::getId).collect(Collectors.joining(",")));
platAlarmRecord.setTenantId(config.getTenantId());
return platAlarmRecord;
}
private static HashMap<String, Object> deviceAlarmConfigMap;
public static HashMap<String, Object> getDeviceAlarmConfigMap() {
if (deviceAlarmConfigMap != null) {
return deviceAlarmConfigMap;
}
HashMap<String, Object> map = new HashMap<>();
map.put("0", Arrays.asList("2", "3"));
map.put("1", Arrays.asList("4"));
map.put("2", Arrays.asList("1"));
deviceAlarmConfigMap = map;
return deviceAlarmConfigMap;
}
private String replaceParam(String oriContent, String... param) {
Pattern p = Pattern.compile("\\[#\\d+\\]|\\[#[\\p{IsHan}]+\\]|\\[#[^\\]]*\\]");
Matcher m = p.matcher(oriContent);
StringBuffer sb = new StringBuffer();
if (!m.find()) {
return oriContent;
}
m.reset();
int i = 0;
while (m.find()) {
m.appendReplacement(sb, param[i]);
i++;
}
m.appendTail(sb);
return sb.toString();
}
@Autowired
private PlatRoomBedDeviceService platRoomBedDeviceService;
@Autowired
private PlatElderService platElderService;
@Autowired
private PlatRoomService platRoomService;
private PlatAlaramCheckDTO getElderListByDeviceId(String deviceId) {
PlatAlaramCheckDTO result = new PlatAlaramCheckDTO();
LambdaQueryWrapper<PlatRoomBedDevice> roomBedDeviceLambdaQueryWrapper = new LambdaQueryWrapper<>();
roomBedDeviceLambdaQueryWrapper.eq(PlatRoomBedDevice::getDeviceId, deviceId);
PlatRoomBedDevice platRoomBedDevice = platRoomBedDeviceService.getOne(roomBedDeviceLambdaQueryWrapper, false);
PlatRoom platRoom = platRoomService.getById(platRoomBedDevice.getRoomId());
result.setPlatRoom(platRoom);
if (platRoomBedDevice == null) {
return result;
}
String bedId = platRoomBedDevice.getBedId();
if (StringUtils.isNotBlank(bedId)) {
LambdaQueryWrapper<PlatElder> elderLambdaQueryWrapper = new LambdaQueryWrapper<>();
elderLambdaQueryWrapper.eq(PlatElder::getBedId, bedId);
List<PlatElder> list = platElderService.list(elderLambdaQueryWrapper);
result.setPlatElderList(list);
return result;
}
String roomId = platRoomBedDevice.getRoomId();
if (StringUtils.isNotBlank(roomId)) {
LambdaQueryWrapper<PlatElder> elderLambdaQueryWrapper = new LambdaQueryWrapper<>();
elderLambdaQueryWrapper.eq(PlatElder::getRoomId, roomId);
List<PlatElder> list = platElderService.list(elderLambdaQueryWrapper);
result.setPlatElderList(list);
return result;
}
return result;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment