Browse Source

阀门状态记录 PengDi@2021/3/20

pengdi@zoniot.com 4 years ago
parent
commit
c5dcf4db62

+ 6 - 0
meter-reading-common/src/main/java/com/huaxu/zoniot/entity/MeterReadRecord.java

@@ -125,6 +125,12 @@ public class MeterReadRecord implements Serializable {
     */
     private String readData;
 
+    /**
+     * 阀门状态
+     * 0:关 1:开 2:无阀 3:异常
+     */
+    private Integer valveState ;
+
     /**
     * 最近有效数据
     */

+ 4 - 0
meter-reading-common/src/main/java/com/huaxu/zoniot/entity/WaterMeter.java

@@ -84,6 +84,10 @@ public class WaterMeter {
      */
     private Integer deviceTypeId;
 
+    /**
+     * 是否支持阀控,0:不支持,1:支持
+     */
+    private Integer isValve;
 
     /**
      * 阀门测点

+ 99 - 1
meter-reading-common/src/main/java/com/huaxu/zoniot/service/impl/MeterReadRecordServiceImpl.java

@@ -216,11 +216,71 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
         meterReadRecord.setCommunityName(waterMeter.getCommunityName());
         meterReadRecord.setChannelNumberId(waterMeter.getChannelNumberId());
         meterReadRecord.setChannelName(waterMeter.getChannelName());
-
+        /***************************增加阀门状态**********************************/
+        meterReadRecord.setValveState(getValveState(waterMeter));
         return meterReadRecord ;
     }
 
 
+    /**
+     * 获取上一次阀门状态
+     * 平台: 0:关 1:开 2:无阀 3:异常 4:未知
+     * NB:0开,1关,2故障
+     * Lora:00开,01关,11异常
+     * @param waterMeter
+     * @return
+     */
+    protected  Integer getValveState(WaterMeter waterMeter){
+        Integer valveState = null ;
+        // 表是否支持阀控
+        Integer isValve = waterMeter.getIsValve();
+        if(isValve == 0){
+            // 不支持阀控,则状态为无阀
+            valveState = 2 ;
+        }
+        else{
+            // 支持阀控,则从最后一次上报数据中获取阀门状态
+            String lastValveState = getValveStateFromCache(waterMeter);
+            if(StringUtils.isNotBlank(lastValveState)){
+                if("00".equals(lastValveState) || "0".equals(lastValveState)){
+                    valveState = 1 ;
+                }
+                else if("01".equals(lastValveState) || "1".equals(lastValveState)){
+                    valveState = 0 ;
+                }
+                else if("11".equals(lastValveState) || "2".equals(lastValveState)){
+                    valveState = 3 ;
+                }
+                else{ // 未明确的阀门状态
+                    valveState = 4 ;
+                }
+            }
+            else{
+                valveState = 4 ;
+            }
+        }
+        return valveState ;
+    }
+
+    protected String getValveStateFromCache(WaterMeter waterMeter){
+        // 默认水表止度
+        String lastValveState = "" ;
+        Map<String, MeasuringData> meterLastData = getMeterLastDataFromCache(waterMeter.getDeviceId());
+        if(meterLastData != null){
+            MeasuringData measuringData = meterLastData.get(waterMeter.getValveMeasuringCode());
+            if(measuringData == null){
+                log.error("Device measuring code get null value ? " +
+                                "device Id ={},measuring code ={} ,meterLastData = {}",waterMeter.getDeviceId(),
+                        waterMeter.getReadingMeasuringCode(),JSON.toJSONString(meterLastData));
+            }
+            else{
+                if(StringUtils.isNotBlank(measuringData.getMeasuringVaule())){
+                    lastValveState = measuringData.getMeasuringVaule();
+                }
+            }
+        }
+        return lastValveState ;
+    }
     /**
      * 获取水表最后止度,先从缓存中获取止度,缓存无数据则从数据库中获取
      * @param waterMeter
@@ -384,6 +444,7 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
                 }
             }
             String currentReading = getReadingFromMeterData(waterMeter, measuringData);
+            Integer valveState = getValveStateFromMeterData(waterMeter, measuringData);
             if(StringUtils.isBlank(currentReading)){
                 log.error("表{}数据异常,数据无最新止度,MeasuringData = {}",
                         waterMeter.getDeviceId(),JSON.toJSONString(measuringData));
@@ -398,6 +459,7 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
             update.setLastCost(todayCost);
             update.setReadData(currentReading);
             update.setLastValid(currentReading);
+            update.setValveState(valveState);
             update.setReadStatus(Constants.READ);
             update.setDateUpdate(new Date());
             update.setReadTime(sendTime);
@@ -425,6 +487,7 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
                 param.set("lastCost",todayCost);
                 param.set("readData",currentReading);
                 param.set("lastValid",currentReading);
+                param.set("valveState",valveState);
                 param.set("readStatus",Constants.READ);
                 param.set("readTime",sendTime);
                 param.set("dateUpdate",new Date());
@@ -479,6 +542,41 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
         meterReading(meter,measuringData,readDay);
     }
 
+    protected  Integer getValveStateFromMeterData(WaterMeter waterMeter,Map<String, MeasuringData> measuringData){
+        Integer valveState = null ;
+        // 表是否支持阀控
+        Integer isValve = waterMeter.getIsValve();
+        if(isValve == 0){
+            // 不支持阀控,则状态为无阀
+            valveState = 2 ;
+        }
+        else{
+            MeasuringData data = measuringData.get(waterMeter.getValveMeasuringCode());
+            if(data == null || StringUtils.isBlank(data.getMeasuringVaule())){
+                log.warn("Upload Data Not Contain Valve Data , MeasuringCode = {},MeasuringData = {}",
+                        waterMeter.getValveMeasuringCode(),
+                        JSON.toJSONString(measuringData)
+                        );
+                valveState = 4 ;
+            }
+            else{
+               String  valveStateData = data.getMeasuringVaule();
+                if("00".equals(valveStateData) || "0".equals(valveStateData)){
+                    valveState = 1 ;
+                }
+                else if("01".equals(valveStateData) || "1".equals(valveStateData)){
+                    valveState = 0 ;
+                }
+                else if("11".equals(valveStateData) || "2".equals(valveStateData)){
+                    valveState = 3 ;
+                }
+                else{ // 未明确的阀门状态
+                    valveState = 4 ;
+                }
+            }
+        }
+        return valveState ;
+    }
 
     /**
      * 从上报数据中获取当前读表数

+ 3 - 2
meter-reading-common/src/main/resources/mapper/WaterMeterMapper.xml

@@ -38,7 +38,7 @@
       <result column="device_type_name" jdbcType="VARCHAR" property="deviceTypeName"/>
       <result column="manufacturer_id" jdbcType="INTEGER" property="manufacturerId" />
       <result column="manufacturer_name" jdbcType="VARCHAR" property="manufacturerName" />
-
+    <result column="is_valve" jdbcType="INTEGER" property="isValve" />
 
   </resultMap>
     <insert id="insert" keyProperty="waterMeter.id">
@@ -122,7 +122,8 @@
 	  m.`name` as manufacturer_name,
       cu.customer_name as customer_name,
       cn.channel_name as channel_name ,
-      wrd.channel_number_id as channel_number_id
+      wrd.channel_number_id as channel_number_id,
+      dt.is_valve as is_valve
   </sql>
   <sql id="Base_Meter_Query_Where">
       d.`status` = 1