|
@@ -4,6 +4,7 @@ package com.care.mqtt.service;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.care.bigscreen.service.BigScreenService;
|
|
|
+import com.care.common.cache.RedisKeyConstant;
|
|
|
import com.care.common.cache.RedisUtil;
|
|
|
import com.care.common.constant.Constants;
|
|
|
import com.care.common.entity.CareDevice;
|
|
@@ -21,6 +22,7 @@ import javax.annotation.Resource;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Set;
|
|
|
+import java.util.UUID;
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -114,52 +116,67 @@ public class MqttMsgRedisService {
|
|
|
*/
|
|
|
|
|
|
private void exe(CareMqttMsg careMqttMsg){
|
|
|
+ String key = RedisKeyConstant.CREATE_ORDER + ":" + careMqttMsg.getDevId();
|
|
|
+ String requestId = UUID.randomUUID().toString();
|
|
|
+ boolean result = redisUtil.tryLock(key,requestId,10);
|
|
|
+ try {
|
|
|
+ if (result) {
|
|
|
+ String status = careMqttMsg.getStatus();
|
|
|
+ if(!MqttMsgStatusEnum.NO_HANDLE.getValue().equals(status)){ //不是未处理,不执行。
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- String status = careMqttMsg.getStatus();
|
|
|
- if(!MqttMsgStatusEnum.NO_HANDLE.getValue().equals(status)){ //不是未处理,不执行。
|
|
|
- return;
|
|
|
- }
|
|
|
+ CareDevice careDevice = careDeviceService.getById(careMqttMsg.getDevId());
|
|
|
+ CareEventOrder order = mqttMsgService.getNewOrder(careDevice);
|
|
|
+ if(order == null){
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ careMqttMsg.setModifyTime(new Date());
|
|
|
+ this.careMqttMsgService.updateById(careMqttMsg);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ order.setCreateTime(careMqttMsg.getCreateTime());
|
|
|
+ order.setModifyTime(careMqttMsg.getCreateTime());
|
|
|
+ order.setStatus(OrderStatusEnum.TODO.getValue());
|
|
|
+ if ("FallDown".equals(careMqttMsg.getType())) { //跌到
|
|
|
+ order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
|
|
|
+ } else if("StayTooLong".equals(careMqttMsg.getType())){ //久滞
|
|
|
+ order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
|
|
|
+ }
|
|
|
|
|
|
- CareDevice careDevice = careDeviceService.getById(careMqttMsg.getDevId());
|
|
|
- CareEventOrder order = mqttMsgService.getNewOrder(careDevice);
|
|
|
- if(order == null){
|
|
|
- careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
- careMqttMsg.setModifyTime(new Date());
|
|
|
- this.careMqttMsgService.updateById(careMqttMsg);
|
|
|
- return;
|
|
|
- }
|
|
|
- order.setCreateTime(careMqttMsg.getCreateTime());
|
|
|
- order.setModifyTime(careMqttMsg.getCreateTime());
|
|
|
- order.setStatus(OrderStatusEnum.TODO.getValue());
|
|
|
- if ("FallDown".equals(careMqttMsg.getType())) { //跌到
|
|
|
- order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
|
|
|
- } else if("StayTooLong".equals(careMqttMsg.getType())){ //久滞
|
|
|
- order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
|
|
|
- }
|
|
|
+ //判断房屋是否有未完成的告警事件,不区分类型
|
|
|
+ QueryWrapper<CareEventOrder> queryWrapper2 = new QueryWrapper<>();
|
|
|
+ queryWrapper2.lambda().eq(CareEventOrder::getDevId,careDevice.getId()).and(
|
|
|
+ wrapper-> wrapper.eq(CareEventOrder::getStatus, OrderStatusEnum.TODO.getValue())
|
|
|
+ .or().eq(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue()));
|
|
|
+
|
|
|
+ CareEventOrder orderDb = careEventOrderService.getOne(queryWrapper2);
|
|
|
+ if(orderDb != null) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
|
|
|
+ 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 { //无未完成的告警事件
|
|
|
+ //生成新的工单
|
|
|
+ this.careEventOrderService.saveOrder(order);
|
|
|
+ //通知页面
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
|
|
|
+ this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
+ }
|
|
|
|
|
|
- //判断房屋是否有未完成的告警事件,不区分类型
|
|
|
- QueryWrapper<CareEventOrder> queryWrapper2 = new QueryWrapper<>();
|
|
|
- queryWrapper2.lambda().eq(CareEventOrder::getDevId,careDevice.getId()).and(
|
|
|
- wrapper-> wrapper.eq(CareEventOrder::getStatus, OrderStatusEnum.TODO.getValue())
|
|
|
- .or().eq(CareEventOrder::getStatus,OrderStatusEnum.DOING.getValue()));
|
|
|
-
|
|
|
- CareEventOrder orderDb = careEventOrderService.getOne(queryWrapper2);
|
|
|
- if(orderDb != null) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
|
|
|
- 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 { //无未完成的告警事件
|
|
|
- //生成新的工单
|
|
|
- this.careEventOrderService.saveOrder(order);
|
|
|
- //通知页面
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ careMqttMsg.setModifyTime(new Date());
|
|
|
+ this.careMqttMsgService.updateById(careMqttMsg);
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ Thread.sleep(3000);
|
|
|
+ exe(careMqttMsg);
|
|
|
+ } catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(key,requestId);
|
|
|
}
|
|
|
-
|
|
|
- careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
- careMqttMsg.setModifyTime(new Date());
|
|
|
- this.careMqttMsgService.updateById(careMqttMsg);
|
|
|
}
|
|
|
|
|
|
}
|