|
|
@@ -1,18 +1,17 @@
|
|
|
package com.inspur.elevator.service;
|
|
|
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
-import com.inspur.elevator.bean.HnAlarmMsg;
|
|
|
-import com.inspur.elevator.bean.HnEleInfoMsg;
|
|
|
-import com.inspur.elevator.bean.HnMsg;
|
|
|
-import com.inspur.elevator.bean.HnStatisticSingleMsg;
|
|
|
+import com.alibaba.fastjson2.JSONObject;
|
|
|
+import com.alibaba.fastjson2.util.DateUtils;
|
|
|
+import com.inspur.elevator.bean.*;
|
|
|
import com.inspur.elevator.bean.elevator.DeviceAlarm;
|
|
|
import com.inspur.elevator.bean.elevator.DeviceEvent;
|
|
|
import com.inspur.elevator.bean.elevator.DeviceStatistics;
|
|
|
import com.inspur.elevator.config.Constant;
|
|
|
import com.inspur.elevator.mq.MqttMsgPublisher;
|
|
|
+import com.inspur.elevator.mq.MqttMsgPublisherDahua;
|
|
|
import com.inspur.elevator.utils.RedisUtil;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
-import org.apache.tomcat.util.bcel.Const;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
@@ -21,7 +20,6 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
-import java.time.LocalDateTime;
|
|
|
import java.time.ZoneOffset;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
@@ -42,12 +40,15 @@ public class AsyncTaskService {
|
|
|
|
|
|
@Autowired
|
|
|
private MqttMsgPublisher publisher;
|
|
|
+ @Autowired
|
|
|
+ private MqttMsgPublisherDahua publisherDahua;
|
|
|
|
|
|
@Autowired
|
|
|
private RedisUtil redisUtil;
|
|
|
|
|
|
/**
|
|
|
* 设备报警消息
|
|
|
+ *
|
|
|
* @param hnMsg
|
|
|
*/
|
|
|
@Async
|
|
|
@@ -69,12 +70,59 @@ public class AsyncTaskService {
|
|
|
String topic = "ele/" + sn + "/event/device_alarm_info/post";
|
|
|
String payload = JSON.toJSONString(deviceAlarm);
|
|
|
this.publisher.publishMsg(topic, payload);
|
|
|
- logger.info("推送主题-->{},推送消息-->{}", topic, payload);
|
|
|
+ logger.info("推送海纳云设备告警主题-->{},推送消息-->{}", topic, payload);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 电梯报警信息上报 - 大华
|
|
|
+ *
|
|
|
+ * @param faultMsg
|
|
|
+ * @param deviceSn
|
|
|
+ */
|
|
|
+ @Async
|
|
|
+ public void handleDhAlarmMsg(DhLiftFault faultMsg, String deviceSn) {
|
|
|
+ logger.info("handleDhAlarmMsg:{}", faultMsg);
|
|
|
+ // 获取报警信息
|
|
|
+ DhErrorBean errorBean = faultMsg.getErrorListBean().get(0);
|
|
|
+ Integer faultType = errorBean.getFaultType();
|
|
|
+ String faultBeginTime = errorBean.getFaultBeginTime();
|
|
|
+ String faultEndTime = errorBean.getFaultEndTime();
|
|
|
+ // 如果是进入检修的错误码,更新维保标识
|
|
|
+ if (DhLiftFault.FAULTCODE_TAKECARE.equals(faultType)) {
|
|
|
+ // 结束时间为空 说明未结束
|
|
|
+ if (StringUtils.isEmpty(faultEndTime)) {
|
|
|
+ redisUtil.set(Constant.REDIS_KEY_MT + deviceSn, "1");
|
|
|
+ } else {
|
|
|
+ redisUtil.set(Constant.REDIS_KEY_MT + deviceSn, "0");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 添加故障码
|
|
|
+ if (Constant.FAULTCODE_MAP_DAHUA.containsKey(Integer.toString(faultType)) && StringUtils.isEmpty(faultEndTime)) {
|
|
|
+ // 对应的电梯安全平台的错误码
|
|
|
+ String faultCodeElevator = Constant.FAULTCODE_MAP_DAHUA.get(Integer.toString(faultType));
|
|
|
+ redisUtil.addSetData(Constant.REDIS_KEY_FAULTCODE + deviceSn, faultCodeElevator);
|
|
|
+ }
|
|
|
+ // 删除故障码
|
|
|
+ if (Constant.FAULTCODE_MAP_DAHUA.containsKey(Integer.toString(faultType)) && !StringUtils.isEmpty(faultEndTime)) {
|
|
|
+ // 对应的电梯安全平台的错误码
|
|
|
+ String faultCodeElevator = Constant.FAULTCODE_MAP_DAHUA.get(Integer.toString(faultType));
|
|
|
+ redisUtil.delSetData(Constant.REDIS_KEY_FAULTCODE + deviceSn, faultCodeElevator);
|
|
|
+ }
|
|
|
+ List<String> alarmCodeList = new ArrayList<>(getDeviceFaultCode(deviceSn));
|
|
|
+ // 构造电梯安全应急平台的消息报文,并发送
|
|
|
+ DeviceAlarm deviceAlarm = new DeviceAlarm(deviceSn, Long.toString(System.currentTimeMillis()),
|
|
|
+ alarmCodeList.stream().reduce("", (a, b) -> a + (StringUtils.isNotEmpty(a) ? a + "," : "") + b));
|
|
|
+ String topic = "ele/" + deviceSn + "/event/device_alarm_info/post";
|
|
|
+ String payload = JSON.toJSONString(deviceAlarm);
|
|
|
+ this.publisher.publishMsg(topic, payload);
|
|
|
+ logger.info("推送大华设备告警主题-->{},推送消息-->{}", topic, payload);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新设备当前的错误码
|
|
|
+ *
|
|
|
* @param hnAlarmMsg
|
|
|
* @return
|
|
|
*/
|
|
|
@@ -132,7 +180,7 @@ public class AsyncTaskService {
|
|
|
String topic = "ele/" + sn + "/event/property/post";
|
|
|
String payload = JSON.toJSONString(deviceEvent);
|
|
|
this.publisher.publishMsg(topic, payload);
|
|
|
- logger.info("推送主题-->{},推送消息-->{}", topic, payload);
|
|
|
+ logger.info("推送海纳云实时数据主题-->{},推送消息-->{}", topic, payload);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -172,8 +220,43 @@ public class AsyncTaskService {
|
|
|
return deviceEvent;
|
|
|
}
|
|
|
|
|
|
+ private DeviceEvent syncDhDeviceEventData(String deviceSn, DhLiftState stateMsg) {
|
|
|
+ DeviceEvent deviceEvent = new DeviceEvent();
|
|
|
+ deviceEvent.setId(deviceSn);
|
|
|
+ // 时间 2025-06-25 14:30:28 转换成时间戳
|
|
|
+ Long ts = DateUtils.parseMillis(stateMsg.getFaultTime());
|
|
|
+ deviceEvent.setTs(String.valueOf(ts));
|
|
|
+ deviceEvent.setFl(stateMsg.getCurrentFloor());
|
|
|
+ // 两边的开关门状态定义是相反的
|
|
|
+ deviceEvent.setOd(stateMsg.getDoorStatus().equals(0) ? 1 : 0);
|
|
|
+ deviceEvent.setDi(stateMsg.getRunningDirection());
|
|
|
+ // 速度cm/s -> m/s
|
|
|
+ deviceEvent.setV(Double.valueOf(stateMsg.getCurrentSpeed()));
|
|
|
+ // 加速度单位 大华没有
|
|
|
+ deviceEvent.setAx(0.0);
|
|
|
+ deviceEvent.setAy(0.0);
|
|
|
+ deviceEvent.setAz(0.0);
|
|
|
+ // 偏移角度,大华没有
|
|
|
+ deviceEvent.setDfb(0.0);
|
|
|
+ deviceEvent.setDlr(0.0);
|
|
|
+ deviceEvent.setPc(stateMsg.getPersonInLift());
|
|
|
+ // 抖动频率
|
|
|
+ deviceEvent.setFj(stateMsg.getJitterFrequency());
|
|
|
+ // 抖动加速度
|
|
|
+ deviceEvent.setFa(stateMsg.getJitterAcceleration());
|
|
|
+ deviceEvent.setTe(stateMsg.getTemperature());
|
|
|
+ // 湿度,大华没有
|
|
|
+ deviceEvent.setHu(0.0);
|
|
|
+ // 亮度
|
|
|
+ deviceEvent.setBr(stateMsg.getLightVariationAmplitude());
|
|
|
+ deviceEvent.setMt(redisUtil.hasKey(Constant.REDIS_KEY_MT + deviceSn) ? Integer.parseInt(redisUtil.getString(Constant.REDIS_KEY_MT + deviceSn)) : 0);
|
|
|
+ deviceEvent.setBpv(0.0);
|
|
|
+ return deviceEvent;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 加速度单位转换,m/s2 -> mg
|
|
|
+ *
|
|
|
* @param ms2
|
|
|
* @return
|
|
|
*/
|
|
|
@@ -223,7 +306,76 @@ public class AsyncTaskService {
|
|
|
String topic = "ele/" + sn + "/event/device_statistics_info/post";
|
|
|
String payload = JSON.toJSONString(deviceStatistics);
|
|
|
this.publisher.publishMsg(topic, payload);
|
|
|
- logger.info("推送主题-->{},推送消息-->{}", topic, payload);
|
|
|
+ logger.info("推送海纳云单次运行主题-->{},推送消息-->{}", topic, payload);
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 电梯实时运行状态上报 - 大华
|
|
|
+ *
|
|
|
+ * @param stateMsg
|
|
|
+ * @param deviceSn
|
|
|
+ */
|
|
|
+ @Async
|
|
|
+ public void handleDhEleInfoMsg(DhLiftState stateMsg, String deviceSn) {
|
|
|
+ logger.info("handleDhEleInfoMsg:{}", stateMsg);
|
|
|
+ // 构造电梯安全应急平台的消息报文,并发送
|
|
|
+ DeviceEvent deviceEvent = syncDhDeviceEventData(deviceSn, stateMsg);
|
|
|
+ String topic = "ele/" + deviceSn + "/event/property/post";
|
|
|
+ String payload = JSON.toJSONString(deviceEvent);
|
|
|
+ this.publisher.publishMsg(topic, payload);
|
|
|
+ logger.info("推送大华实时数据主题-->{},推送消息-->{}", topic, payload);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 电梯单次运行状态上报 - 大华
|
|
|
+ *
|
|
|
+ * @param runInfoMsg
|
|
|
+ * @param deviceSn
|
|
|
+ */
|
|
|
+ @Async
|
|
|
+ public void handleDhSingleDataMsg(DhRunInfo runInfoMsg, String deviceSn) {
|
|
|
+ logger.info("handleDhSingleDataMsg:{}", runInfoMsg);
|
|
|
+ if (runInfoMsg != null) {
|
|
|
+ // 构造电梯安全应急平台的消息报文,并发送
|
|
|
+ DeviceStatistics deviceStatistics = new DeviceStatistics();
|
|
|
+ deviceStatistics.setId(deviceSn);
|
|
|
+ deviceStatistics.setRc(1);
|
|
|
+ deviceStatistics.setFrom(runInfoMsg.getRunBeginFloor());
|
|
|
+ deviceStatistics.setTo(runInfoMsg.getRunEndFloor());
|
|
|
+ // 运行距离
|
|
|
+ deviceStatistics.setRd(Double.valueOf(runInfoMsg.getRunningMileageTotal()));
|
|
|
+ deviceStatistics.setRt(Double.valueOf(runInfoMsg.getRunningTimeTotal()));
|
|
|
+ deviceStatistics.setEbc(0);
|
|
|
+ deviceStatistics.setPc(runInfoMsg.getMannedNum());
|
|
|
+ deviceStatistics.setFt(String.valueOf(runInfoMsg.getRunBeginTimeStamp()));
|
|
|
+ deviceStatistics.setLt(String.valueOf(runInfoMsg.getRunEndTimeStamp()));
|
|
|
+ deviceStatistics.setTe(runInfoMsg.getTemperature());
|
|
|
+ deviceStatistics.setHu(0);
|
|
|
+ deviceStatistics.setBr(runInfoMsg.getLightVariationAmplitude());
|
|
|
+ String topic = "ele/" + deviceSn + "/event/device_statistics_info/post";
|
|
|
+ String payload = JSON.toJSONString(deviceStatistics);
|
|
|
+ this.publisher.publishMsg(topic, payload);
|
|
|
+ logger.info("推送大华单次运行主题-->{},推送消息-->{}", topic, payload);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设备心跳信息 - 大华
|
|
|
+ *
|
|
|
+ * @param heartbeat
|
|
|
+ * @param deviceSn
|
|
|
+ */
|
|
|
+ @Async
|
|
|
+ public void handleDhHeartbeatMsg(DhHeartbeat heartbeat, String deviceSn) {
|
|
|
+ // 收到心跳消息后 下发上报实时运行状态指令
|
|
|
+ logger.info("收到大华设备{}心跳消息,发送实时上状态指令", deviceSn);
|
|
|
+ JSONObject command = new JSONObject();
|
|
|
+ command.put("type", "Sendstate");
|
|
|
+ String topic = "/API/V1/Down/" + deviceSn + "/Command";
|
|
|
+ String payload = JSON.toJSONString(command);
|
|
|
+ this.publisherDahua.publishMsg(topic, payload);
|
|
|
+ logger.info("MQTT下发指令消息已成功发布至主题 {}", topic);
|
|
|
+ }
|
|
|
+}
|