Przeglądaj źródła

修改 创建工单并发的 bug

suntianwu 3 lat temu
rodzic
commit
9b0ede9dc1

+ 1 - 1
src/main/java/com/care/bms/service/BmsEventOrderService.java

@@ -589,7 +589,7 @@ public class BmsEventOrderService {
         order.setStatus("0");
         order.setCreateTime(DateUtil.date());
         order.setModifyTime(DateUtil.date());
-        new Thread(() -> this.careEventOrderService.saveOrder(order)).start();
+        this.careEventOrderService.saveOrder(order);
     }
 
 

+ 1 - 1
src/main/java/com/care/common/service/CareEventOrderService.java

@@ -21,5 +21,5 @@ public interface CareEventOrderService extends IService<CareEventOrder> {
 
     boolean saveHisOrder(CareEventOrder order,CareEventOrder orderDb);
 
-    void saveOrder(CareEventOrder order);
+    boolean saveOrder(CareEventOrder order);
 }

+ 67 - 84
src/main/java/com/care/common/service/impl/CareEventOrderServiceImpl.java

@@ -18,7 +18,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.UUID;
 
 /**
  * 事件定单表(CareEventOrder)表服务实现类
@@ -112,95 +111,79 @@ public class CareEventOrderServiceImpl extends ServiceImpl<CareEventOrderMapper,
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void saveOrder(CareEventOrder order){
-        String key = RedisKeyConstant.CREATE_ORDER + ":" + order.getDevId();
-        String requestId = UUID.randomUUID().toString();
-        boolean result = redisUtil.tryLock(key,requestId,10);
-        try {
-            if (result) {
-                this.baseMapper.insert(order);
-                CareEventOrderHandleHis his = new CareEventOrderHandleHis();
-                his.setOrgId(order.getOrgId());
-                his.setStationId(order.getStationId());
-                his.setOrderId(order.getId());
-                his.setHouseId(order.getHouseId());
-                his.setOrderType(order.getOrderType());
-                if (OrderTypeEnum.ZHU_DONG_HU_JIAO.getValue().equals(order.getOrderType()) || OrderTypeEnum.HU_WAI_HU_JIAO.getValue().equals(order.getOrderType())) {
-                    his.setLogType(LogTypeEnum.OLDER_EVENT.getValue());
-                    his.setLogObjectId(order.getOlderId());
-                    his.setLogObjectName(order.getOlderName());
-                    his.setLogResult(OrderTypeEnum.getCodeToName(order.getOrderType()));
-                    his.setRelationTypeDesc(RelationTypeEnum.OLDER.getName());
-                } else {
-                    his.setLogType(LogTypeEnum.DEV_EVENT.getValue());
-                    his.setLogObjectId(order.getDevId());
-                    his.setLogObjectName(order.getDevName());
-                    his.setLogResult("发生" + OrderTypeEnum.getCodeToName(order.getOrderType()));
-                    his.setRelationTypeDesc(RelationTypeEnum.HOUSE.getName());
-                }
-                his.setCreateTime(order.getCreateTime());
+    public boolean saveOrder(CareEventOrder order){
+        this.baseMapper.insert(order);
+        CareEventOrderHandleHis his = new CareEventOrderHandleHis();
+        his.setOrgId(order.getOrgId());
+        his.setStationId(order.getStationId());
+        his.setOrderId(order.getId());
+        his.setHouseId(order.getHouseId());
+        his.setOrderType(order.getOrderType());
+        if (OrderTypeEnum.ZHU_DONG_HU_JIAO.getValue().equals(order.getOrderType()) || OrderTypeEnum.HU_WAI_HU_JIAO.getValue().equals(order.getOrderType())){
+            his.setLogType(LogTypeEnum.OLDER_EVENT.getValue());
+            his.setLogObjectId(order.getOlderId());
+            his.setLogObjectName(order.getOlderName());
+            his.setLogResult(OrderTypeEnum.getCodeToName(order.getOrderType()));
+            his.setRelationTypeDesc(RelationTypeEnum.OLDER.getName());
+        }else{
+            his.setLogType(LogTypeEnum.DEV_EVENT.getValue());
+            his.setLogObjectId(order.getDevId());
+            his.setLogObjectName(order.getDevName());
+            his.setLogResult("发生"+OrderTypeEnum.getCodeToName(order.getOrderType()));
+            his.setRelationTypeDesc(RelationTypeEnum.HOUSE.getName());
+        }
+        his.setCreateTime(order.getCreateTime());
 
-                addOlderToOrderOlder(order);
-                List<CareEventOrderChamb> chambList = addChamberlainToOrder(order);
-                List<CareEventOrderContactStatus> contacts = addContactToOrderContact(order);
-                Object switchSms = redisUtil.get(RedisKeyConstant.SWITCH_SMS);
-                if (switchSms != null) {
-                    //给联系人发送短信
-                    CareHouse house = this.careHouseService.getById(order.getHouseId());
-                    if (CollUtil.isNotEmpty(contacts)) {
+        addOlderToOrderOlder(order);
+        List<CareEventOrderChamb> chambList =  addChamberlainToOrder(order);
+        List<CareEventOrderContactStatus> contacts = addContactToOrderContact(order);
+        Object switchSms = redisUtil.get(RedisKeyConstant.SWITCH_SMS);
+        if (switchSms != null){
+            //给联系人发送短信
+            CareHouse house = this.careHouseService.getById(order.getHouseId());
+            if (CollUtil.isNotEmpty(contacts)){
 
-                        contacts.forEach(item -> {
-                            boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(), item.getContactPhone(), house.getName());
-                            if (smsResult) {
-                                CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
-                                his2.setOrgId(item.getOrgId());
-                                his2.setStationId(item.getStationId());
-                                his2.setOrderId(item.getOrderId());
-                                his2.setLogType(LogTypeEnum.SMS.getValue());
-                                his2.setLogObjectId(item.getContactId());
-                                his2.setLogObjectName(item.getContactName());
-                                his2.setLogResult("短信通知");
-                                his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
-                                his2.setCreateTime(DateUtil.date());
-                                his2.setRelationTypeDesc(item.getRelationTypeDesc());
-                                this.careEventOrderHandleHisService.save(his2);
-                            }
-                        });
+                contacts.forEach(item ->{
+                    boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(),item.getContactPhone(),house.getName());
+                    if (smsResult){
+                        CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
+                        his2.setOrgId(item.getOrgId());
+                        his2.setStationId(item.getStationId());
+                        his2.setOrderId(item.getOrderId());
+                        his2.setLogType(LogTypeEnum.SMS.getValue());
+                        his2.setLogObjectId(item.getContactId());
+                        his2.setLogObjectName(item.getContactName());
+                        his2.setLogResult("短信通知");
+                        his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
+                        his2.setCreateTime(DateUtil.date());
+                        his2.setRelationTypeDesc(item.getRelationTypeDesc());
+                        this.careEventOrderHandleHisService.save(his2);
                     }
-                    //给管家发短信
-                    if (CollUtil.isNotEmpty(chambList)) {
-                        chambList.forEach(item -> {
-                            boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(), item.getPhone(), house.getName());
-                            if (smsResult) {
-                                CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
-                                his2.setOrgId(item.getOrgId());
-                                his2.setStationId(item.getStationId());
-                                his2.setOrderId(item.getOrderId());
-                                his2.setLogType(LogTypeEnum.SMS.getValue());
-                                his2.setLogObjectId(item.getChambId());
-                                his2.setLogObjectName(item.getChambName());
-                                his2.setLogResult("短信通知");
-                                his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
-                                his2.setCreateTime(DateUtil.date());
-                                his2.setRelationTypeDesc("管家");
-                                this.careEventOrderHandleHisService.save(his2);
-                            }
-                        });
+                });
+            }
+            //给管家发短信
+            if (CollUtil.isNotEmpty(chambList)){
+                chambList.forEach(item ->{
+                    boolean smsResult = smsSendService.sendSmsToLianxiren(order.getOrderType(),item.getPhone(),house.getName());
+                    if (smsResult){
+                        CareEventOrderHandleHis his2 = new CareEventOrderHandleHis();
+                        his2.setOrgId(item.getOrgId());
+                        his2.setStationId(item.getStationId());
+                        his2.setOrderId(item.getOrderId());
+                        his2.setLogType(LogTypeEnum.SMS.getValue());
+                        his2.setLogObjectId(item.getChambId());
+                        his2.setLogObjectName(item.getChambName());
+                        his2.setLogResult("短信通知");
+                        his2.setOpUserRole(UserRoleEnum.SEAT.getValue());
+                        his2.setCreateTime(DateUtil.date());
+                        his2.setRelationTypeDesc("管家");
+                        this.careEventOrderHandleHisService.save(his2);
                     }
-                }
-                this.careEventOrderHandleHisService.save(his);
-            } else {
-                try {
-                    Thread.sleep(10000);
-                    saveOrder(order);
-                } catch (Exception e){
-                    e.printStackTrace();
-                }
-
+                });
             }
-        } finally {
-            redisUtil.releaseLock(key,requestId);
         }
+        this.careEventOrderHandleHisService.save(his);
+        return true;
     }
 
 

+ 1 - 1
src/main/java/com/care/mqtt/service/MqttMsgRedisService.java

@@ -151,7 +151,7 @@ public class MqttMsgRedisService {
             this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");
         }  else { //无未完成的告警事件
             //生成新的工单
-            new Thread(() -> this.careEventOrderService.saveOrder(order)).start();
+            this.careEventOrderService.saveOrder(order);
             //通知页面
             this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"orderAdd");
             this.bigScreenService.pushRtEventFlag(order.getStationId().toString(),order.getId().toString(),"bigscreenRefresh");

+ 110 - 89
src/main/java/com/care/mqtt/service/MqttMsgService.java

@@ -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){