|
@@ -26,6 +26,7 @@ import javax.annotation.Resource;
|
|
|
import java.util.Date;
|
|
|
|
|
|
import java.util.Map;
|
|
|
+import java.util.UUID;
|
|
|
|
|
|
/**
|
|
|
* @Author: stw
|
|
@@ -76,8 +77,6 @@ public class MqttMsgService {
|
|
|
private void handleOrderEventMessage(String topic, String mqttMessageStr) {
|
|
|
|
|
|
try {
|
|
|
-
|
|
|
-
|
|
|
Map map = JSON.parseObject(mqttMessageStr);
|
|
|
String type = (String) map.get("type");
|
|
|
|
|
@@ -130,111 +129,133 @@ public class MqttMsgService {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- CareEventOrder order = getNewOrder(careDevice);
|
|
|
- if(order == null){
|
|
|
- logger.error("设备没有配置房屋地址");
|
|
|
- return;
|
|
|
- }
|
|
|
- order.setCreateTime(date);
|
|
|
- order.setModifyTime(date);
|
|
|
-
|
|
|
- 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());
|
|
|
- }
|
|
|
+ new Thread(() -> handleOrderEvent(map,type,careDevice,date,careMqttMsg)).start();
|
|
|
|
|
|
- if ("FallDown".equals(type)) { //跌到
|
|
|
- order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
|
|
|
- } else if("StayTooLong".equals(type)){
|
|
|
- order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
|
|
|
- }
|
|
|
+ } catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- //判断房屋是否有未完成的告警事件,不区分类型
|
|
|
- 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) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
|
|
|
- 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);
|
|
|
- }
|
|
|
+ private void handleOrderEvent(Map map,String type,CareDevice careDevice,Date date, CareMqttMsg careMqttMsg){
|
|
|
+ String key = RedisKeyConstant.CREATE_ORDER + ":" + careDevice.getId();
|
|
|
+ String requestId = UUID.randomUUID().toString();
|
|
|
+ boolean result = redisUtil.tryLock(key,requestId,10);
|
|
|
+ try {
|
|
|
+ if (result) {
|
|
|
+ CareEventOrder order = getNewOrder(careDevice);
|
|
|
+ if (order == null) {
|
|
|
+ logger.error("设备没有配置房屋地址");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ order.setCreateTime(date);
|
|
|
+ order.setModifyTime(date);
|
|
|
+
|
|
|
+ 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());
|
|
|
+ }
|
|
|
|
|
|
+ if ("FallDown".equals(type)) { //跌到
|
|
|
+ order.setOrderType(OrderTypeEnum.DI_EDAO.getValue());
|
|
|
+ } else if ("StayTooLong".equals(type)) {
|
|
|
+ order.setOrderType(OrderTypeEnum.JIU_ZHI.getValue());
|
|
|
}
|
|
|
|
|
|
- } else { //无未完成的告警事件
|
|
|
- Integer delayTime = getDelayTime(type,careDevice);
|
|
|
- if (delayTime == null || delayTime == 0){ //没有配置响应时间,立即生成新的告警事件工单
|
|
|
- if(conf != 255) {
|
|
|
+ //判断房屋是否有未完成的告警事件,不区分类型
|
|
|
+ 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) { //有未完成的告警事件,不再生成新的告警工单,只作为子事件插入到当前工单的历史记录中。
|
|
|
+ if (conf != 255) {
|
|
|
careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
this.careMqttMsgService.save(careMqttMsg);
|
|
|
|
|
|
- //生成新的工单
|
|
|
- new Thread(() -> this.careEventOrderService.saveOrder(order)).start();
|
|
|
-
|
|
|
+ careEventOrderService.saveHisOrder(order, orderDb);
|
|
|
//通知页面
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
|
|
|
- this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
|
|
|
- } else { //取消 不处理工单
|
|
|
+ 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);
|
|
|
- }
|
|
|
|
|
|
- } else { //有配置响应时间,不处理工单,进行调度处理
|
|
|
- if(conf != 255) { //不是取消
|
|
|
- careMqttMsg.setStatus(MqttMsgStatusEnum.NO_HANDLE.getValue());
|
|
|
- careMqttMsg.setDelayTime(delayTime);
|
|
|
- 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);
|
|
|
+ }
|
|
|
|
|
|
- //进行调度处理
|
|
|
- mqttMsgRedisService.addRedis(careMqttMsg,date.getTime() + 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);
|
|
|
+ } else { //无未完成的告警事件
|
|
|
+ Integer delayTime = getDelayTime(type, careDevice);
|
|
|
+ if (delayTime == null || delayTime == 0) { //没有配置响应时间,立即生成新的告警事件工单
|
|
|
+ if (conf != 255) {
|
|
|
+ careMqttMsg.setStatus(MqttMsgStatusEnum.HANDLED.getValue());
|
|
|
+ this.careMqttMsgService.save(careMqttMsg);
|
|
|
+
|
|
|
+ //生成新的工单
|
|
|
+ this.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);
|
|
|
+
|
|
|
+ //进行调度处理
|
|
|
+ mqttMsgRedisService.addRedis(careMqttMsg, date.getTime() + 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);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ Thread.sleep(3000);
|
|
|
+ handleOrderEvent(map,type,careDevice,date,careMqttMsg);
|
|
|
+ } catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
|
|
|
- } catch (Exception e){
|
|
|
- e.printStackTrace();
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ redisUtil.releaseLock(key,requestId);
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
private CareDevice getCareDevice(String topic){
|