From b1c572949997a5d82d9b609163ff280a1c49627d Mon Sep 17 00:00:00 2001
From: vince <757871790@qq.com>
Date: 星期五, 26 四月 2024 14:09:45 +0800
Subject: [PATCH] 粮情协议优化

---
 src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java |  239 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 208 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
index 9f804ac..780ef00 100644
--- a/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
+++ b/src/main/java/com/fzzy/protocol/bhzn/analysis/AnalysisService.java
@@ -3,9 +3,13 @@
 import com.alibaba.fastjson.JSONObject;
 import com.fzzy.api.Constant;
 import com.fzzy.api.data.ApiCommonDevice;
+import com.fzzy.api.data.DepotType;
 import com.fzzy.api.data.GatewayDeviceType;
 import com.fzzy.api.utils.BytesUtil;
 import com.fzzy.api.utils.NumberUtil;
+import com.fzzy.api.utils.RedisConst;
+import com.fzzy.api.utils.RedisUtil;
+import com.fzzy.data.ConfigData;
 import com.fzzy.gateway.GatewayUtils;
 import com.fzzy.gateway.api.GatewayDeviceReportService;
 import com.fzzy.gateway.api.GatewayRemoteManager;
@@ -18,10 +22,12 @@
 import com.fzzy.protocol.bhzn.cmd.CommandBuild;
 import com.fzzy.protocol.bhzn.cmd.ReMessageBuilder;
 import com.fzzy.protocol.bhzn.data.IoMessage;
+import com.fzzy.gateway.data.GrainCableData;
 import com.fzzy.protocol.data.THDto;
 import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerEngine;
 import com.fzzy.protocol.bhzn.server.BhznGrainV2ServerUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -41,6 +47,10 @@
 
     @Resource
     private GatewayRemoteManager gatewayRemoteManager;
+    @Resource
+    private ConfigData configData;
+    @Resource
+    private RedisUtil redisUtil;
 
     /**
      * 閽堝鍒嗗寘绮儏鎶ユ枃杩涜灏佽
@@ -114,9 +124,8 @@
             }
 
 
-
             //鑾峰彇璇锋眰淇℃伅
-            BaseReqData reqData = ProtocolUtils.getSyncReq(gatewayDevice.getDepotIdSys());
+            BaseReqData reqData = ProtocolUtils.getSyncReq(gatewayDevice.getDeviceSn());
             if (null == reqData) {
                 replayGrain(message);
                 log.error("涓绘満-------->>骞冲彴锛岃В鏋愮伯鎯呭け璐ワ紝鏈幏鍙栧埌绮儏璇锋眰淇℃伅锛�" + message.getAddr());
@@ -124,11 +133,8 @@
             }
 
             // 鍒ゆ柇鏁版嵁鏈夋病鏈夋敹鍙栧畬鏁�
-            String[] attCable = gatewayDevice.getCableRule().split("-");
-            int cableZ = Integer.valueOf(attCable[0]);
-            int cableY = Integer.valueOf(attCable[1]);
-            int cableX = Integer.valueOf(attCable[2]);
-            int sumPoint = cableZ * cableY * cableX;
+            GrainCableData cableData = GatewayUtils.getCableData(gatewayDevice);
+            int sumPoint = cableData.getSumNum();
 
             //鑾峰彇褰撳墠绮儏娓╁害鎶ユ枃
             String grainHex = message.getContent().substring(16);
@@ -141,7 +147,7 @@
                 log.info("鍒嗘満------>>>骞冲彴锛氱伯鎯呮暟鎹崟鍖�=" + grainHex);
                 //杩斿洖绮儏鎺ユ敹淇℃伅
                 replayGrain(message);
-                analysisGrain2(message, reqData, grainHex);
+                analysisGrain2(message, reqData, grainHex, cableData);
                 return;
             }
 
@@ -162,7 +168,7 @@
                 //杩斿洖绮儏鎺ユ敹淇℃伅
                 replayGrain(message);
                 log.info("鍒嗘満------>>>骞冲彴锛氱伯鎯呮暟鎹鍖咃紝瀹屾暣鏁版嵁=" + grainHex);
-                analysisGrain2(message, reqData, grainHex);
+                analysisGrain2(message, reqData, grainHex, cableData);
                 return;
 
             } else {
@@ -189,23 +195,19 @@
         BhznGrainV2ServerEngine.push(message.getIp(), message.getPort(), BytesUtil.hexStrToBytes(hexStr));
     }
 
-    private void analysisGrain2(IoMessage message, BaseReqData reqData, String grainStr) {
-
+    private void analysisGrain2(IoMessage message, BaseReqData reqData, String grainStr, GrainCableData cableData) {
         GatewayDevice device = reqData.getDevice();
         // 鑾峰彇瀹屾暣鐨勭伯鎯呭寘淇℃伅
-        String[] attCable = device.getCableRule().split("-");
-        int cableZ = Integer.valueOf(attCable[0]);
-        int cableY = Integer.valueOf(attCable[1]);
-        int cableX = Integer.valueOf(attCable[2]);
+        int sumNum = cableData.getSumNum();
 
         // 鏍规嵁灞傝鍒楄幏鍙栨寚瀹氶暱搴�
-        int start = 0;
-        int len = 4 * cableZ * cableY * cableX;
+        int start = (Integer.valueOf(device.getCableStart()) - 1) *  cableData.getCableZ()  * 4;
+        int len = 4 * sumNum;
 
         log.info("鍒嗘満------>>>骞冲彴锛氳繑鍥炵伯鎯呭畬鏁翠俊鎭紝鍒嗘満={}", device.getDeviceName());
 
         String strPoints = grainStr.substring(start, start + len);
-
+        log.info("strPoints = "+ strPoints);
         // 灏嗙伯鎯呰В鏋愭垚鏁扮粍
         List<Double> temps = new ArrayList<>();
         double tempValue;
@@ -230,14 +232,188 @@
 
         THDto thDto = this.getTH(message);
         if (null != thDto) {
-            log.debug("-------THDto--={}", thDto);
+            log.info("-------THDto--={}", thDto);
         }
         //娓呯┖
         String key = "GRAIN_" + message.getAddr();
         contextMapGrain.put(key, null);
 
-        // 灏嗛泦鍚堣В鏋愭垚鍧愭爣鏁版嵁
-        addPoint1(temps, reqData, thDto);
+
+        if (DepotType.TYPE_02.getCode().equals(device.getDepotType()) || DepotType.TYPE_04.getCode().equals(device.getDepotType())) {
+            //绛掍粨
+            analysisAndPush2(temps, reqData, thDto, cableData);
+        } else if (DepotType.TYPE_03.getCode().equals(device.getDepotType())) {
+            //鍌ㄦ补缃�
+            analysisAndPush3(temps, reqData, thDto, cableData);
+        } else {
+            //骞虫埧浠�
+            analysisAndPush1(temps, reqData, thDto, cableData);
+        }
+    }
+
+    /**
+     * 绛掍粨鎺ㄩ��
+     *
+     * @param temps
+     * @param reqData
+     * @param thDto
+     * @param cableData
+     */
+    private void analysisAndPush2(List<Double> temps, BaseReqData reqData, THDto thDto, GrainCableData cableData) {
+        //TODO
+        log.info("---------------------------绛掍粨鏆傛棤瀹炵幇---------------------------");
+    }
+
+    /**
+     * 鍌ㄦ补缃�
+     *
+     * @param temps
+     * @throws Exception
+     */
+    private void analysisAndPush3(List<Double> temps, BaseReqData reqData, THDto thDto, GrainCableData cableData) {
+
+        GatewayDevice device = reqData.getDevice();
+
+        int cableZ = cableData.getCableZ();
+        int cableY = cableData.getCableY();
+
+        int sumNum = temps.size();
+            log.info("temps:" + temps.toString());
+        //鏁版嵁灏佽
+        GrainData grain = new GrainData();
+        grain.setMessageId(ScConstant.getMessageId());
+        grain.setDeviceId(device.getDeviceId());
+        grain.setTimestamp(System.currentTimeMillis() + "");
+
+        ClientHeaders headers = new ClientHeaders();
+        headers.setDeviceName(device.getDeviceName());
+        headers.setProductId(device.getProductId());
+        headers.setOrgId(device.getOrgId());
+        headers.setMsgId(reqData.getMessageId());
+        grain.setHeaders(headers);
+
+
+        GrainOutPut outPut = new GrainOutPut();
+
+
+        double max = com.fzzy.protocol.bhzn.v0.cmd.ReMessageBuilder.MAX_TEMP, min = com.fzzy.protocol.bhzn.v0.cmd.ReMessageBuilder.MIN_TEMP, sumT = 0.0;
+
+        List<GrainTemp> temperature = new ArrayList<>();
+        //鏍瑰彿
+        int cableNum = 1, position = 0;
+
+        double curTemp;
+        int x = 0, y = 0, z = 0;
+        for (int i = 0; i < sumNum; i++) {
+            curTemp = temps.get(i);
+            position = i;
+
+            z = i % cableZ + 1;
+            x = i / (cableZ * cableY);
+            y = x * (cableZ * cableY);
+            y = (i - y) / cableZ;
+            //鏍瑰彿
+            cableNum = (i / cableZ) + 1;
+
+            temperature.add(new GrainTemp(cableNum + "", z + "", curTemp + "", position + ""));
+
+            //姹傛渶澶ф渶灏忓��
+            if (curTemp < -900) {
+                sumNum--;
+            } else {
+                sumT += curTemp;
+                if (curTemp > max) {
+                    max = curTemp;
+                }
+                if (curTemp < min) {
+                    min = curTemp;
+                }
+            }
+        }
+
+        if (sumNum == 0) {
+            sumNum = 1;
+            log.warn("---褰撳墠绮儏閲囬泦寮傚父--");
+        }
+        //杩囨护姣旇緝鐢ㄧ殑鏈�澶ф渶灏忓��
+        if (max == com.fzzy.protocol.bhzn.v0.cmd.ReMessageBuilder.MAX_TEMP) {
+            max = 0.0;
+        }
+        if (min == com.fzzy.protocol.bhzn.v0.cmd.ReMessageBuilder.MIN_TEMP) {
+            min = 0.0;
+        }
+
+        outPut.setTemperature(temperature);
+        outPut.setAvgTemperature(NumberUtil.keepPrecision((sumT / sumNum), 1) + "");
+        outPut.setMinTemperature(min + "");
+        outPut.setMaxTemperature(min + "");
+
+
+        JSONObject properties = new JSONObject();
+
+        properties.put("timestamp", grain.getTimestamp());
+        outPut.setDetectTime( grain.getTimestamp());
+        String height = this.getCacheHeight(device);
+        if (StringUtils.isEmpty(height)) height = "0.0";
+        properties.put("liquidHeight", height);
+
+        outPut.setLiquidHeight(height);
+        grain.setOutput(JSONObject.toJSONString(outPut));
+        properties.put("output", outPut);
+        GatewayDevice gatewayDeviceWeather = GatewayUtils.getCacheByDeviceTypeOne(GatewayDeviceType.TYPE_09.getCode());
+
+        //绯荤粺姘旇薄绔欎俊鎭�
+        WeatherWebDto weather = WeatherWebDto.contextMap.get("default");
+
+        //姘旇薄淇℃伅
+        GrainWeather weatherStation = new GrainWeather();
+        weatherStation.setMessageId(ScConstant.getMessageId());
+        weatherStation.setMessgeId(weatherStation.getMessageId());
+
+        if (null != gatewayDeviceWeather) {
+            weatherStation.setId(gatewayDeviceWeather.getDeviceId());
+        } else {
+            weatherStation.setId(device.getDeviceId());
+        }
+        weatherStation.setAirPressure(weather.getPressure());
+        weatherStation.setHumidity(weather.getHumidity());
+        weatherStation.setPm(weather.getAir_pm25());
+        weatherStation.setRadiation("0");
+        weatherStation.setRainfallAmount(weather.getWea());
+        weatherStation.setTemperature(weather.getTem());
+        weatherStation.setWindDirection(weather.getWin());
+        weatherStation.setWindPower(weather.getWin_meter());
+        weatherStation.setWindSpeed(weather.getWin_speed());
+
+        grain.setWeatherStation(JSONObject.toJSONString(weatherStation));
+
+        //灏佽濂界殑鏁版嵁
+        log.info("---娌圭綈浠撲俊鎭皝瑁呭畬鎴�----寮�濮嬫墽琛屾帹閫�");
+        grain.setProperties(properties);
+        reqData.setData(JSONObject.toJSONString(grain));
+
+        doPushGrain(reqData,grain);
+    }
+
+    /**
+     * 浠嶳EDIS涓幏鍙栨恫浣嶉珮搴︿俊鎭�
+     *
+     * @param device
+     * @return
+     */
+    private String getCacheHeight(GatewayDevice device) {
+        //缁欏叾浠栬蒋浣跨敤
+        //igds:5012:DEPOT_HEIGHT:0134
+        String key = "igds:"+ device.getOrgId() + ":"  + RedisConst.KEY_DEPOT_HEIGHT+ ":" + device.getDepotIdSys();
+        com.ld.igds.grain.dto.GrainData ht = (com.ld.igds.grain.dto.GrainData) redisUtil.get(key);
+        log.info("KEY="+key);
+        if(ht!=null){
+            log.info("VALUE="+ht.getOilHeight());
+            return ht.getOilHeight() ;
+        }else {
+            return "0.0";
+        }
+
     }
 
 
@@ -247,14 +423,13 @@
      * @param temps
      * @throws Exception
      */
-    private void addPoint1(List<Double> temps, BaseReqData reqData, THDto thDto) {
+    private void analysisAndPush1(List<Double> temps, BaseReqData reqData, THDto thDto, GrainCableData cableData) {
 
         GatewayDevice device = reqData.getDevice();
 
-        String[] attCable = device.getCableRule().split("-");
-        int cableZ = Integer.valueOf(attCable[0]);
-        int cableY = Integer.valueOf(attCable[1]);
-        int cableX = Integer.valueOf(attCable[2]);
+        int cableZ = cableData.getCableZ();
+        int cableY = cableData.getCableY();
+        int cableX = cableData.getCableX();
 
         //鏁版嵁灏佽
         GrainData grain = new GrainData();
@@ -326,7 +501,7 @@
         outPut.setMaxTemperature(min + "");
         List<GrainTH> ths = new ArrayList<>();
 
-        ths.add(new GrainTH(thDto.getTempIn()!=null?thDto.getTempIn()+"":"",thDto.getHumidityIn()!=null?thDto.getHumidityIn()+"":"","1"));
+        ths.add(new GrainTH(thDto.getTempIn() != null ? thDto.getTempIn() + "" : "", thDto.getHumidityIn() != null ? thDto.getHumidityIn() + "" : "", "1"));
         outPut.setTemperatureAndhumidity(ths);
         grain.setOutput(JSONObject.toJSONString(outPut));
 
@@ -362,10 +537,10 @@
 
         reqData.setData(JSONObject.toJSONString(grain));
 
-        doPushGrain(reqData);
+        doPushGrain(reqData,grain);
     }
 
-    private void doPushGrain(BaseReqData reqData) {
+    private void doPushGrain(BaseReqData reqData,GrainData grainData) {
 
         GatewayDeviceReportService reportService = gatewayRemoteManager.getDeviceReportService(reqData.getDevice().getPushProtocol());
         if (null == reportService) {
@@ -373,6 +548,8 @@
             return;
         }
         reportService.reportGrainData(reqData);
+        reqData.setData(reportService.grainData2GatewayApiInfoKafka(grainData,reqData.getDevice()).getData());
+        reportService.reportGrainDataByKafka(reqData);
     }
 
 
@@ -380,8 +557,8 @@
         try {
             THDto th = new THDto();
             String data = message.getContent();
-            String houseNo = data.substring(0, 4);
-            int depotId = BytesUtil.hexToInt(BytesUtil.tran_LH(houseNo));
+            String houseNo = data.substring(0, 2);
+            int depotId = BytesUtil.hexToInt(houseNo);
             String t = data.substring(4, 8);
             String h = data.substring(8, 12);
             double humy;

--
Gitblit v1.9.3