|
@@ -1,10 +1,10 @@
|
|
|
package com.care.mqtt.service;
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
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;
|
|
@@ -16,13 +16,15 @@ import com.care.common.enums.OrderTypeEnum;
|
|
|
import com.care.common.service.CareDeviceService;
|
|
|
import com.care.common.service.CareEventOrderService;
|
|
|
import com.care.common.service.CareMqttMsgService;
|
|
|
+import com.care.common.vo.device.MqttMsgVO;
|
|
|
+import org.apache.commons.compress.utils.Lists;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Set;
|
|
|
-import java.util.UUID;
|
|
|
+
|
|
|
|
|
|
|
|
|
/**
|
|
@@ -53,24 +55,35 @@ public class MqttMsgRedisService {
|
|
|
public void init() {
|
|
|
|
|
|
//查询mqtt msg 表有延迟标记的未处理消息,放入线程池,等待延时时间结束执行创建工单
|
|
|
- QueryWrapper<CareMqttMsg> queryWrapper2 = new QueryWrapper<>();
|
|
|
- queryWrapper2.lambda().eq(CareMqttMsg::getStatus, MqttMsgStatusEnum.NO_HANDLE.getValue()).gt(CareMqttMsg::getDelayTime,0)
|
|
|
+ QueryWrapper<CareMqttMsg> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(CareMqttMsg::getStatus, MqttMsgStatusEnum.NO_HANDLE.getValue()).gt(CareMqttMsg::getDelayTime,0)
|
|
|
.orderByAsc(CareMqttMsg::getCreateTime);
|
|
|
|
|
|
- List<CareMqttMsg> mqttMsgList = careMqttMsgService.list(queryWrapper2);
|
|
|
+ List<CareMqttMsg> mqttMsgList = careMqttMsgService.list(queryWrapper);
|
|
|
if (CollUtil.isNotEmpty(mqttMsgList)) {
|
|
|
- for(CareMqttMsg careMqttMsg : mqttMsgList){
|
|
|
+ List<MqttMsgVO> list = Lists.newArrayList();
|
|
|
+
|
|
|
+ for(CareMqttMsg careMqttMsg : mqttMsgList) {
|
|
|
+ MqttMsgVO vo = new MqttMsgVO();
|
|
|
+ BeanUtil.copyProperties(careMqttMsg, vo);
|
|
|
+
|
|
|
+ Long createTime = vo.getCreateTime().getTime();
|
|
|
+ Long delayTime = vo.getDelayTime() * 60 * 1000L;
|
|
|
+ Long exeTime = createTime + delayTime;
|
|
|
+ vo.setExeTime(exeTime);
|
|
|
|
|
|
+ list.add(vo);
|
|
|
+ }
|
|
|
+ //按执行时间排序
|
|
|
+ List<MqttMsgVO> listNew = CollUtil.sortByProperty(list,"exeTime");
|
|
|
+ for(MqttMsgVO mqttMsgVO : listNew) {
|
|
|
Long now = System.currentTimeMillis();
|
|
|
- Long createTime = careMqttMsg.getCreateTime().getTime();
|
|
|
- Long delayTime = careMqttMsg.getDelayTime() * 60 * 1000L;
|
|
|
- Long execTime = createTime + delayTime;
|
|
|
|
|
|
- if(execTime <= now) { //立即执行
|
|
|
- exe(careMqttMsg);
|
|
|
+ if(mqttMsgVO.getExeTime() <= now) { //立即执行
|
|
|
+ exe(mqttMsgVO);
|
|
|
continue;
|
|
|
}
|
|
|
- addRedis(careMqttMsg,execTime);
|
|
|
+ addRedis(mqttMsgVO, mqttMsgVO.getExeTime());
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -80,12 +93,12 @@ public class MqttMsgRedisService {
|
|
|
|
|
|
/**
|
|
|
* 把延迟消息放入redis
|
|
|
- * @param careMqttMsg
|
|
|
- * @param execTime
|
|
|
+ * @param mqttMsgVO
|
|
|
+ * @param exeTime
|
|
|
*/
|
|
|
- public void addRedis(CareMqttMsg careMqttMsg, long execTime){
|
|
|
- String msg = String.valueOf(careMqttMsg.getId());
|
|
|
- redisUtil.zSetAdd(Constants.MQTT_MSG_LAG_KEY, msg, execTime);
|
|
|
+ public void addRedis(MqttMsgVO mqttMsgVO, long exeTime){
|
|
|
+ String msg = String.valueOf(mqttMsgVO.getId());
|
|
|
+ redisUtil.zSetAdd(Constants.MQTT_MSG_LAG_KEY, msg, exeTime);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -98,13 +111,30 @@ public class MqttMsgRedisService {
|
|
|
//查询符合时间条件下的集合
|
|
|
Set set = redisUtil.zSetRangeByScore(Constants.MQTT_MSG_LAG_KEY, startTime, endTime);
|
|
|
|
|
|
+
|
|
|
if (CollUtil.isNotEmpty(set)) {
|
|
|
//具体业务操作
|
|
|
+ List<MqttMsgVO> list = Lists.newArrayList();
|
|
|
set.forEach(item -> {
|
|
|
CareMqttMsg careMqttMsg = careMqttMsgService.getById(Long.parseLong(String.valueOf(item)));
|
|
|
- exe(careMqttMsg);
|
|
|
+ MqttMsgVO vo = new MqttMsgVO();
|
|
|
+ BeanUtil.copyProperties(careMqttMsg, vo);
|
|
|
+
|
|
|
+ Long createTime = vo.getCreateTime().getTime();
|
|
|
+ Long delayTime = vo.getDelayTime() * 60 * 1000L;
|
|
|
+ Long exeTime = createTime + delayTime;
|
|
|
+ vo.setExeTime(exeTime);
|
|
|
+
|
|
|
+ list.add(vo);
|
|
|
});
|
|
|
|
|
|
+ //按执行时间排序
|
|
|
+ List<MqttMsgVO> listNew = CollUtil.sortByProperty(list,"exeTime");
|
|
|
+
|
|
|
+ for(MqttMsgVO mqttMsgVO : listNew) {
|
|
|
+ exe(mqttMsgVO);
|
|
|
+ }
|
|
|
+
|
|
|
//移除集合
|
|
|
redisUtil.zSetRemoveRangeByScore(Constants.MQTT_MSG_LAG_KEY, startTime, endTime);
|
|
|
}
|
|
@@ -112,71 +142,59 @@ public class MqttMsgRedisService {
|
|
|
|
|
|
/**
|
|
|
* 执行创建工单动作
|
|
|
- * @param careMqttMsg
|
|
|
+ * @param mqttMsgVO
|
|
|
*/
|
|
|
|
|
|
- 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;
|
|
|
- }
|
|
|
+ private void exe(MqttMsgVO mqttMsgVO){
|
|
|
+ CareMqttMsg careMqttMsg = new CareMqttMsg();
|
|
|
+ BeanUtil.copyProperties(mqttMsgVO, careMqttMsg);
|
|
|
+
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断房屋是否有未完成的告警事件,不区分类型
|
|
|
+ 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);
|
|
|
|
|
|
- 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");
|
|
|
- }
|
|
|
-
|
|
|
- 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);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
}
|