Browse Source

Merge remote-tracking branch 'origin/20200908' into 20200908

# Conflicts:
#	smart-city-intf/src/main/resources/mapper/DeviceMapper.xml
lin 4 years ago
parent
commit
0e3142c50b

+ 4 - 1
smart-city-intf/src/main/java/com/zcxk/smartcity/data/access/entity/Device.java

@@ -60,7 +60,10 @@ public class Device {
     private Integer isWater ; 
     
     @ApiModelProperty(value = "是否工卡 1:是 0:否", position = 12, hidden = true)
-    private Integer isCard ; 
+    private Integer isCard ;
+
+    @ApiModelProperty(value = "是否LoRa表 1:是 0:否", position = 12, hidden = true)
+    private Integer isLoraMeter;
     
     @ApiModelProperty(value = "坐标x", position = 14)
     private BigDecimal xCoordinates;

+ 69 - 2
smart-city-intf/src/main/java/com/zcxk/smartcity/data/access/service/impl/DeviceDataServiceImpl.java

@@ -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>();

+ 43 - 35
smart-city-intf/src/main/resources/mapper/DeviceMapper.xml

@@ -20,6 +20,7 @@
         <result column="status" property="status" jdbcType="INTEGER"/>
         <result column="is_tag" property="isTag" jdbcType="INTEGER"/>
         <result column="is_card" property="isCard" jdbcType="INTEGER"/>
+        <result column="is_lora_meter" property="isLoraMeter" jdbcType="INTEGER"/>
         <result column="x_coordinates" property="xCoordinates" jdbcType="DECIMAL"/>
         <result column="y_coordinates" property="yCoordinates" jdbcType="DECIMAL"/>
         <result column="customer_id" property="customerId" jdbcType="INTEGER"/>
@@ -237,41 +238,48 @@
 
     <select id="findByDeviceNo" resultMap="BaseResultMap">
         SELECT
-			CASE
-				WHEN
-				ext.id IS NOT NULL THEN
-				1 ELSE 0 
-			END AS is_card,
-				d.id,
-				d.device_no,
-				d.device_no,
-				d.water_meter_no,
-				d.device_type,
-				d.sys_id,
-				d.site_id,
-				d.building_id,
-				d.floor,
-				d.loc_desc,
-				d.related_device_no,
-				d.manufacturer_id,
-				d.device_status,
-				d.STATUS,
-				d.is_tag,
-				d.x_coordinates,
-				d.y_coordinates,
-				d.customer_id,
-				b.community,
-				if(mt.id is not null,1,0) as is_water ,
-				dt.device_type as device_category,
-				dt.equipment_type as equipment_type
-			FROM
-				sc_device d
-				LEFT JOIN sc_device_extend_info ext ON ( d.id = ext.device_id AND ext.extend_type_name = 'category' AND ext.extend_value = 'jobCard' AND ext.`status` = '1' ) 
-        		left join sc_device_type dt on (d.device_type = dt.id)
-        		left join sc_building b on (d.building_id = b.id)
-        		left join sc_w_meter_type mt on (d.device_type = mt.device_type_id)
-        	WHERE
-        		d.status  = 1 and d.device_no = #{deviceNo} limit 1 
+        CASE WHEN
+        ext.id IS NOT NULL THEN
+        1 ELSE 0
+        END AS is_card,
+        CASE WHEN
+        c.id IS NOT NULL THEN
+        1 ELSE 0
+        END AS is_lora_meter,
+        d.id,
+        d.device_no,
+        d.device_no,
+        d.water_meter_no,
+        d.device_type,
+        d.sys_id,
+        d.site_id,
+        d.building_id,
+        d.floor,
+        d.loc_desc,
+        d.related_device_no,
+        d.manufacturer_id,
+        d.device_status,
+        d.STATUS,
+        d.is_tag,
+        d.x_coordinates,
+        d.y_coordinates,
+        d.customer_id,
+        b.community,
+        IF
+        ( mt.id IS NOT NULL, 1, 0 ) AS is_water,
+        dt.device_type AS device_category,
+        dt.equipment_type AS equipment_type
+        FROM
+        sc_device d
+        LEFT JOIN sc_device_extend_info ext ON ( d.id = ext.device_id AND ext.extend_type_name = 'category' AND ext.extend_value = 'jobCard' AND ext.`status` = '1' )
+        LEFT JOIN sc_device_type dt ON ( d.device_type = dt.id )
+        LEFT JOIN sc_building b ON ( d.building_id = b.id )
+        LEFT JOIN sc_w_meter_type mt ON ( d.device_type = mt.device_type_id)
+        LEFT JOIN sc_channel_device_type_use tu on ( d.device_type = tu.device_type_id and tu.`status` = 1 )
+        left join sc_channel c on (tu.channel_id = c.id and c.channel_code = 'lora_meter' and c.`status` = 1)
+        WHERE
+        d.STATUS = 1
+        AND d.device_no = #{deviceNo} limit 1
     </select>
     <update id="updateDeviceErrorDays">
 		update sc_water_meter_error_days set days = #{days} , last_error_type = null where device_id = #{deviceId}