|
@@ -1,21 +1,27 @@
|
|
|
package com.care.bms.service;
|
|
|
|
|
|
+
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.care.bigscreen.service.BigScreenService;
|
|
|
-import com.care.common.entity.CareDevice;
|
|
|
-import com.care.common.entity.CareEventOrder;
|
|
|
-import com.care.common.entity.CareHouse;
|
|
|
-import com.care.common.entity.CareMqttMsg;
|
|
|
+
|
|
|
+import com.care.common.entity.*;
|
|
|
+
|
|
|
+import com.care.common.enums.ChambOrderStatusEnum;
|
|
|
+import com.care.common.enums.MqttMsgStatusEnum;
|
|
|
import com.care.common.enums.OrderStatusEnum;
|
|
|
import com.care.common.enums.OrderTypeEnum;
|
|
|
import com.care.common.service.*;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+
|
|
|
import java.util.Map;
|
|
|
|
|
|
/**
|
|
@@ -39,167 +45,194 @@ public class MqttMsgService {
|
|
|
private BigScreenService bigScreenService;
|
|
|
@Resource
|
|
|
private CareMqttMsgService careMqttMsgService;
|
|
|
+ @Resource
|
|
|
+ private CareEventOrderChambService careEventOrderChambService;
|
|
|
+ @Resource
|
|
|
+ private MqttThreadPoolInitService MqttThreadPoolInitService;
|
|
|
|
|
|
+ private static Logger logger = LoggerFactory.getLogger(MqttMsgService.class);
|
|
|
|
|
|
- public void handleMessage(Map<String,Thread> threadMap,String topic, String mqttMessageStr) throws Exception {
|
|
|
+ /**
|
|
|
+ * 处理mqtt消息
|
|
|
+ * @param topic
|
|
|
+ * @param mqttMessageStr
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public void handleMessage(String topic, String mqttMessageStr) throws Exception {
|
|
|
try {
|
|
|
+
|
|
|
+ Map map = JSON.parseObject(mqttMessageStr);
|
|
|
+ String type = (String) map.get("type");
|
|
|
+
|
|
|
+ if(StringUtils.isEmpty(type)){
|
|
|
+ logger.error("不是正确格式的消息");
|
|
|
+ return;
|
|
|
+ }
|
|
|
QueryWrapper<CareDevice> queryWrapper = new QueryWrapper<>();
|
|
|
queryWrapper.lambda().eq(CareDevice::getTopic,topic);
|
|
|
CareDevice careDevice = careDeviceService.getOne(queryWrapper);
|
|
|
- if(careDevice != null) {
|
|
|
- CareMqttMsg careMqttMsg = new CareMqttMsg();
|
|
|
- careMqttMsg.setMqttMessage(mqttMessageStr);
|
|
|
- careMqttMsg.setTopic(topic);
|
|
|
- careMqttMsg.setDevId(careDevice.getId());
|
|
|
- careMqttMsg.setCreateTime(new Date());
|
|
|
- this.careMqttMsgService.save(careMqttMsg);
|
|
|
- } else {
|
|
|
- System.out.println("数据库中没找到对应设备");
|
|
|
+ if(careDevice == null) {
|
|
|
+ logger.error("数据库中没找到对应设备");
|
|
|
return;
|
|
|
}
|
|
|
+ Date date = DateUtil.date();
|
|
|
+
|
|
|
+ CareMqttMsg careMqttMsg = new CareMqttMsg();
|
|
|
+ careMqttMsg.setMqttMessage(mqttMessageStr);
|
|
|
+ careMqttMsg.setTopic(topic);
|
|
|
+ careMqttMsg.setDevId(careDevice.getId());
|
|
|
+ careMqttMsg.setType(type);
|
|
|
+ careMqttMsg.setCreateTime(date);
|
|
|
|
|
|
- Map map = JSON.parseObject(mqttMessageStr);
|
|
|
- String type = (String) map.get("type");
|
|
|
- Map msgMap = (Map)map.get("msg");
|
|
|
if ("BreathHeartRate".equals(type)) {
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
Map msg = (Map) map.get("msg");
|
|
|
Integer breath = (Integer) msg.get("breath");
|
|
|
Integer heart = (Integer) msg.get("heart");
|
|
|
careDevice.setBreathRate(breath);
|
|
|
careDevice.setHeartRate(heart);
|
|
|
careDeviceService.updateById(careDevice);
|
|
|
- } else if ("FallDown".equals(type)) { //跌到
|
|
|
- Integer conf = (Integer)msgMap.get("conf");
|
|
|
- if(conf == 255){ //取消
|
|
|
- threadMap.forEach((key,value) -> {
|
|
|
- if(key.startsWith("FallDown")) {
|
|
|
- if(!value.isInterrupted()){
|
|
|
- value.interrupt();//停止线程
|
|
|
- threadMap.remove(key);
|
|
|
- value = null;
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- } else {
|
|
|
- Integer fallResponseTime = careDevice.getFallResponseTime();
|
|
|
- MyThread myThread = new MyThread();
|
|
|
- myThread.setCareDevice(careDevice);
|
|
|
- myThread.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
|
|
|
- myThread.setSleepTime(fallResponseTime);
|
|
|
- myThread.setDate(DateUtil.date());
|
|
|
- threadMap.put("FallDown-" + System.currentTimeMillis(),myThread);
|
|
|
- myThread.start();
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- } else if ("StayTooLong".equals(type)) { //久滞
|
|
|
- Integer conf = (Integer)msgMap.get("conf");
|
|
|
- if(conf == 255){ //取消
|
|
|
- threadMap.forEach((key,value) -> {
|
|
|
- if(key.startsWith("StayTooLong")) {
|
|
|
- if(!value.isInterrupted()){
|
|
|
- value.interrupt();//停止线程
|
|
|
- threadMap.remove(key);
|
|
|
- value = null;
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- } else {
|
|
|
- Integer longlagResponseTime = careDevice.getLonglagResponseTime();
|
|
|
- MyThread myThread = new MyThread();
|
|
|
- myThread.setCareDevice(careDevice);
|
|
|
- myThread.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
|
|
|
- myThread.setSleepTime(longlagResponseTime);
|
|
|
- myThread.setDate(DateUtil.date());
|
|
|
- threadMap.put("StayTooLong-" + System.currentTimeMillis(),myThread);
|
|
|
- myThread.start();
|
|
|
- }
|
|
|
-
|
|
|
+ return;
|
|
|
}
|
|
|
- } catch (Exception e){
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
- System.out.println(topic);
|
|
|
- }
|
|
|
-
|
|
|
- private void saveOrder(CareDevice careDevice,String orderType,Date date){
|
|
|
- CareHouse careHouse = careHouseService.getById(careDevice.getHouseId());
|
|
|
-
|
|
|
- CareEventOrder order = new CareEventOrder();
|
|
|
- order.setOrgId(careHouse.getOrgId());
|
|
|
- order.setOrgName(careOrganizationService.getById(careHouse.getOrgId()).getName());
|
|
|
- order.setStationId(careHouse.getStationId());
|
|
|
- order.setStationName(careStationService.getById(careHouse.getStationId()).getName());
|
|
|
- order.setHouseId(careHouse.getId());
|
|
|
- order.setDevId(careDevice.getId());
|
|
|
- order.setDevName(careDevice.getDevName());
|
|
|
- order.setHouseName(careHouse.getName());
|
|
|
- order.setMemberId(careDevice.getMemberId());
|
|
|
- order.setTitle(careHouse.getAddr());
|
|
|
- order.setOrderType(orderType);
|
|
|
- order.setStatus(OrderStatusEnum.TODO.getValue());
|
|
|
- order.setCreateTime(date);
|
|
|
- order.setModifyTime(date);
|
|
|
-
|
|
|
- //判断房屋是否有未完成的告警事件
|
|
|
- QueryWrapper<CareEventOrder> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(CareEventOrder::getHouseId,order.getHouseId()).and(
|
|
|
- wrapper-> wrapper.eq(CareEventOrder::getStatus, OrderStatusEnum.TODO.getValue())
|
|
|
- .or().eq(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue()));
|
|
|
-
|
|
|
- CareEventOrder orderDb = careEventOrderService.getOne(queryWrapper);
|
|
|
- careEventOrderService.saveOrder(order,orderDb);
|
|
|
- if(orderDb != null){//有,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
|
|
|
- //通知页面
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderUpdate");
|
|
|
- } else { //新增,生成新的告警事件工单
|
|
|
- //通知页面
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
|
|
|
- }
|
|
|
-
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
- }
|
|
|
|
|
|
- class MyThread extends Thread {
|
|
|
- private CareDevice careDevice;
|
|
|
- private String orderType;
|
|
|
- private Integer sleepTime; //分钟
|
|
|
- private Date date;
|
|
|
-
|
|
|
- public Date getDate() {
|
|
|
- return date;
|
|
|
- }
|
|
|
+ if( careDevice.getHouseId() == null ) {
|
|
|
+ logger.error("设备没有配置房屋地址");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- public void setDate(Date date) {
|
|
|
- this.date = date;
|
|
|
- }
|
|
|
+ CareEventOrder order = getNewOrder(careDevice);
|
|
|
+ order.setCreateTime(date);
|
|
|
+ order.setModifyTime(date);
|
|
|
|
|
|
- public void setCareDevice(CareDevice careDevice) {
|
|
|
- this.careDevice = careDevice;
|
|
|
- }
|
|
|
+ Map msgMap = (Map)map.get("msg");
|
|
|
+ Integer conf = (Integer)msgMap.get("conf");
|
|
|
+ if(conf != 255) {
|
|
|
+ order.setStatus(OrderStatusEnum.TODO.getValue());
|
|
|
+ } else {//取消
|
|
|
+ order.setStatus(OrderStatusEnum.CANCEL.getValue());
|
|
|
+ }
|
|
|
|
|
|
- public void setOrderType(String orderType) {
|
|
|
- this.orderType = orderType;
|
|
|
- }
|
|
|
+ if ("FallDown".equals(type)) { //跌到
|
|
|
+ order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
|
|
|
+ } else if("StayTooLong".equals(type)){
|
|
|
+ order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
|
|
|
+ }
|
|
|
|
|
|
- public void setSleepTime(Integer sleepTime) {
|
|
|
- this.sleepTime = sleepTime;
|
|
|
- }
|
|
|
+ //判断房屋是否有未完成的告警事件,不区分类型
|
|
|
+ QueryWrapper<CareEventOrder> queryWrapper2 = new QueryWrapper<>();
|
|
|
+ queryWrapper2.lambda().eq(CareEventOrder::getHouseId,careDevice.getHouseId()).and(
|
|
|
+ wrapper-> wrapper.eq(CareEventOrder::getStatus, OrderStatusEnum.TODO.getValue())
|
|
|
+ .or().eq(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue()));
|
|
|
+ CareEventOrder orderDb = careEventOrderService.getOne(queryWrapper2);
|
|
|
+
|
|
|
+ if(orderDb != null) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
|
|
|
+ if(conf != 255) {
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
+ careEventOrderService.saveHisOrder(order,orderDb);
|
|
|
+ //通知页面
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderUpdate");
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
+ } else { //取消
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
+ if(orderDb.getOrderType().equals(order.getOrderType())){//看取消的类型,和当前一致,则 更新当前的工单状态为取消,记录一条取消his,管家工单标记为取消
|
|
|
+ //更新当前的工单状态为取消
|
|
|
+ orderDb.setStatus(OrderStatusEnum.CANCEL.getValue());
|
|
|
+ this.careEventOrderService.updateById(orderDb);
|
|
|
+
|
|
|
+ //管家工单标记为取消
|
|
|
+ CareEventOrderChamb careEventOrderChamb = this.careEventOrderChambService.getChambOrderByOrderId(orderDb.getId());
|
|
|
+ careEventOrderChamb.setStatus(ChambOrderStatusEnum.CANCEL.getValue());
|
|
|
+ this.careEventOrderChambService.updateById(careEventOrderChamb);
|
|
|
+ //记录一条取消his
|
|
|
+ careEventOrderService.saveHisOrder(order,orderDb);
|
|
|
+ //通知页面
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderUpdate");
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
+ } else { // 不一致,则只记录一条取消his
|
|
|
+ //记录一条取消his
|
|
|
+ careEventOrderService.saveHisOrder(order,orderDb);
|
|
|
+ }
|
|
|
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- public void run(){
|
|
|
- try {
|
|
|
- if(sleepTime != null && sleepTime > 0){
|
|
|
- Thread.sleep(sleepTime * 60 * 1000);
|
|
|
+ } else { //无未完成的告警事件
|
|
|
+ Integer delayTime = getDelayTime(type,careDevice);
|
|
|
+ if (delayTime == null || delayTime == 0){ //没有配置响应时间,立即生成新的告警事件工单
|
|
|
+ if(conf != 255) {
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
+ //生成新的工单
|
|
|
+ careEventOrderService.saveOrder(order);
|
|
|
+ //通知页面
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
+ } else { //取消 不处理工单
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ } else { //有配置响应时间,不处理工单,进行调度处理
|
|
|
+ if(conf != 255) { //不是取消
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.NO_HANDLE.getValue());
|
|
|
+ careMqttMsg.setDelayTime(delayTime);
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
+ //进行调度处理
|
|
|
+ MqttThreadPoolInitService.addScheduled(careMqttMsg,careMqttMsg.getDelayTime() * 60 * 1000);
|
|
|
+ } else { //取消: 更新mqtt消息为已取消,等待执行的调度到时会取消执行
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
+ //更新mqtt消息为已取消
|
|
|
+ UpdateWrapper<CareMqttMsg> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().eq(CareMqttMsg::getDevId,careDevice.getId()).eq(CareMqttMsg::getType,type).eq(CareMqttMsg::getStatus,MqttMsgStatusEnum.NO_HANDLE.getValue())
|
|
|
+ .set(CareMqttMsg::getStatus,MqttMsgStatusEnum.CANCEL.getValue());
|
|
|
+ this.careMqttMsgService.update(updateWrapper);
|
|
|
+ }
|
|
|
}
|
|
|
- saveOrder(careDevice,orderType,date);
|
|
|
- } catch (Exception e){
|
|
|
- e.printStackTrace();
|
|
|
}
|
|
|
|
|
|
+ } catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
+
|
|
|
+ private Integer getDelayTime(String type, CareDevice careDevice) {
|
|
|
+ if ("FallDown".equals(type)) { //跌到
|
|
|
+ return careDevice.getFallResponseTime();
|
|
|
+ } else if ("StayTooLong".equals(type)) { //久滞
|
|
|
+ return careDevice.getLonglagResponseTime();
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ public CareEventOrder getNewOrder(CareDevice careDevice) {
|
|
|
+ CareHouse careHouse = careHouseService.getById(careDevice.getHouseId());
|
|
|
+ if (careHouse == null){
|
|
|
+ logger.error("设备没有配置房屋地址");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ CareEventOrder order = new CareEventOrder();
|
|
|
+ order.setOrgId(careDevice.getOrgId());
|
|
|
+ order.setOrgName(careOrganizationService.getById(careDevice.getOrgId()).getName());
|
|
|
+ order.setStationId(careDevice.getStationId());
|
|
|
+ order.setStationName(careStationService.getById(careDevice.getStationId()).getName());
|
|
|
+ order.setHouseId(careHouse.getId());
|
|
|
+ order.setDevId(careDevice.getId());
|
|
|
+ order.setDevName(careDevice.getDevName());
|
|
|
+ order.setHouseName(careHouse.getName());
|
|
|
+ order.setMemberId(careDevice.getMemberId());
|
|
|
+ order.setTitle(careHouse.getAddr());
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+
|
|
|
}
|