|
@@ -127,11 +127,15 @@ public class DeviceDataServiceImpl implements DeviceDataService {
|
|
|
} catch (Exception e) {
|
|
|
log.error("save device data to cache failed", e);
|
|
|
}
|
|
|
-
|
|
|
+ // 如果设备类型是LoRa水表则判断电子号是否相同
|
|
|
+ DeviceError dataError = judgeLoRaMeterCode(device, measuringDataMap, lastUpateTime);
|
|
|
// 保存设备测点数据
|
|
|
int j = saveDeviceMeasuringDatas(device, measuringDataMap, lastUpateTime);
|
|
|
// 从测点数据中解析设备产生的告警
|
|
|
List<DeviceError> errorList = saveDeviceAlarmDatas(device,measuringDataMap,lastUpateTime);
|
|
|
+ if(dataError != null){
|
|
|
+ errorList.add(dataError);
|
|
|
+ }
|
|
|
// 处理产生的告警信息
|
|
|
List<DeviceError> processAlarmList = processAlarmList(device, errorList);
|
|
|
// 更新设备状态
|
|
@@ -153,11 +157,74 @@ public class DeviceDataServiceImpl implements DeviceDataService {
|
|
|
log.info("end savaDeviceData,total measuring data size = {} ,device status = {} ",j,newStatus);
|
|
|
return j;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * <p>
|
|
|
+ * LoRa 水表需进行电子号是否匹配的判断
|
|
|
+ * </p>
|
|
|
+ */
|
|
|
+ protected DeviceError judgeLoRaMeterCode(Device device, Map<String, MeasuringData> dataMap, String receiveTime){
|
|
|
+ DeviceError error = null ;
|
|
|
+ // 1,判断设备是否为LoRa水表
|
|
|
+ if(device.getIsLoraMeter() == 1){
|
|
|
+ // 2,从测点数据中获取METER_NO测点数据与电子号进行判断,
|
|
|
+ MeasuringData meterNoData = dataMap.get("METER_NO");
|
|
|
+ String protocolMeterNo = meterNoData.getMeasuringVaule();
|
|
|
+ String systemMeterNo = device.getWaterMeterNo() ;
|
|
|
+ log.info("Protocol MeterNo = {} ,System MeterNo={}",protocolMeterNo,systemMeterNo);
|
|
|
+ // 3,判断逻辑:
|
|
|
+ // a:如果电子号不满足9位长度,则给出电子号长度不足9位的异常
|
|
|
+ // b:如果电子号长度>=9位,则截取9位与测点中电子号进行匹配,不满足则给出电子号不匹配的异常
|
|
|
+ if(StringUtils.isNotEmpty(systemMeterNo)){
|
|
|
+ String errorMessage = "";
|
|
|
+ if(systemMeterNo.length() < 9){
|
|
|
+ errorMessage = "水表电子号长度不足9位";
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ systemMeterNo = systemMeterNo.substring(systemMeterNo.length()- 9);
|
|
|
+ if(!protocolMeterNo.endsWith(systemMeterNo)){
|
|
|
+ errorMessage = "协议电子号"+protocolMeterNo+"与系统电子号"+systemMeterNo+"不一致";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 4,查询告警类型,并根据告警类型生成告警
|
|
|
+ if(StringUtils.isNotEmpty(errorMessage)){
|
|
|
+ log.info("Judge LoRa meter with message = {}",errorMessage);
|
|
|
+ AlarmType forQuery = new AlarmType();
|
|
|
+ forQuery.setCode("abnormal data");
|
|
|
+ Map<String, Object> alarmTypeQueryParam = (Map<String, Object>) MapTransformUtils.objectToMap(forQuery);
|
|
|
+ List<AlarmType> alarmTypeList = alarmTypeMapper.list(alarmTypeQueryParam, 0, 1);
|
|
|
+ if(alarmTypeList.size() > 1){
|
|
|
+ AlarmType alarmType = alarmTypeList.get(0);
|
|
|
+ error = new DeviceError();
|
|
|
+ long alarmId = idWorker.nextId();
|
|
|
+ error.setAlarmCategory(alarmType.getAlarmCategory());
|
|
|
+ error.setAlarmTypeId(alarmType.getId());
|
|
|
+ error.setDeviceId(device.getId());
|
|
|
+ error.setDeviceNo(device.getDeviceNo());
|
|
|
+ error.setBuildingId(device.getBuildingId());
|
|
|
+ error.setFloor(device.getFloorId());
|
|
|
+ error.setHandleStatus("2");
|
|
|
+ error.setId(alarmId);
|
|
|
+ error.setLocation(device.getLocDesc());
|
|
|
+ error.setSiteId(device.getSiteId());
|
|
|
+ error.setSysId(device.getSysId());
|
|
|
+ error.setStatus(1);
|
|
|
+ error.setAlarmTime(parserDate(receiveTime)); // 首次告警时间
|
|
|
+ error.setLastAlarmTime(parserDate(receiveTime)); // 最后告警时间
|
|
|
+ error.setAlarmCount(1); // 告警次数
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ log.warn("系统未配置电子号数据异常告警类型");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return error ;
|
|
|
+ }
|
|
|
/**
|
|
|
* 处理告警数据
|
|
|
* @param device
|
|
|
* @param errors
|
|
|
- * @param lastReceiveTime
|
|
|
*/
|
|
|
protected List<DeviceError> processAlarmList(Device device , List<DeviceError> errors) {
|
|
|
List<DeviceError> rtnList = new ArrayList<DeviceError>();
|