From 6450fec60b8dc7e6d31779bcfe3b23b3f665ebaf Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Tue, 28 Dec 2021 15:08:45 +0800
Subject: [PATCH] screen-api            更新单位转换代码

---
 /dev/null                                                                                   |   48 ---------
 screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartTableOfPollutionLevelVO.java |    2 
 screen-api/src/main/java/com/moral/api/controller/AqiController.java                        |   14 ++
 screen-api/src/main/java/com/moral/api/utils/UnitConvertUtils.java                          |  180 ++++++++++++++++++++++++++++++++++++
 screen-api/src/main/java/com/moral/api/kafka/consumer/CruiserDataConsumer.java              |    2 
 screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java                 |   19 +++
 screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java               |    5 
 7 files changed, 214 insertions(+), 56 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/controller/AqiController.java b/screen-api/src/main/java/com/moral/api/controller/AqiController.java
index c248635..e6302ef 100644
--- a/screen-api/src/main/java/com/moral/api/controller/AqiController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/AqiController.java
@@ -109,6 +109,13 @@
         return ResultMessage.ok(VO);
     }
 
+    /**
+    * @Description: ������������������������������������������������
+            * @Param: [form]
+            * @return: com.moral.constant.ResultMessage
+            * @Author: ���������
+            * @Date: 2021/11/22
+            */
     @GetMapping("queryBarChartOfPollutionLevel")
     public ResultMessage queryBarChartOfPollutionLevel(QueryChartOfPollutionLevelForm form){
         //������������������������
@@ -123,6 +130,13 @@
 
     }
 
+    /**
+    * @Description: ������������������������������������������������������������
+            * @Param: [form]
+            * @return: com.moral.constant.ResultMessage
+            * @Author: ���������
+            * @Date: 2021/11/22
+            */
     @GetMapping("queryBarChatTableOfPollutionLevel")
     public ResultMessage queryBarChatTableOfPollutionLevel(QueryChartOfPollutionLevelForm form){
         //������������������������
diff --git a/screen-api/src/main/java/com/moral/api/kafka/consumer/CruiserDataConsumer.java b/screen-api/src/main/java/com/moral/api/kafka/consumer/CruiserDataConsumer.java
index 609d2fb..c463e19 100644
--- a/screen-api/src/main/java/com/moral/api/kafka/consumer/CruiserDataConsumer.java
+++ b/screen-api/src/main/java/com/moral/api/kafka/consumer/CruiserDataConsumer.java
@@ -1,5 +1,6 @@
 package com.moral.api.kafka.consumer;
 
+import com.moral.api.utils.UnitConvertUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.apache.kafka.common.TopicPartition;
@@ -22,7 +23,6 @@
 import com.moral.api.entity.UnitConversion;
 import com.moral.api.websocket.CruiserWebSocketServer;
 import com.moral.constant.KafkaConstants;
-import com.moral.util.UnitConvertUtils;
 
 /*
  * ������������������������
diff --git a/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java b/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
index 68fcd33..729dcbf 100644
--- a/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
+++ b/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
@@ -4,15 +4,12 @@
 import com.moral.api.entity.Device;
 import com.moral.api.entity.Sensor;
 import com.moral.api.entity.UnitConversion;
+import com.moral.api.utils.UnitConvertUtils;
 import com.moral.api.websocket.SingleDeviceServer;
-import com.moral.util.UnitConvertUtils;
-import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.kafka.clients.consumer.Consumer;
 import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.apache.kafka.common.TopicPartition;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.kafka.annotation.KafkaListener;
 import org.springframework.kafka.listener.ConsumerSeekAware;
 import org.springframework.stereotype.Component;
diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartTableOfPollutionLevelVO.java b/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartTableOfPollutionLevelVO.java
index 0c9a4b5..a6b404a 100644
--- a/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartTableOfPollutionLevelVO.java
+++ b/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartTableOfPollutionLevelVO.java
@@ -89,7 +89,7 @@
         vo.setSerious(serious);
         vo.setServer(server);
 
-
         return vo;
     }
 }
+
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
index 9ab60a0..8bfb783 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -135,6 +135,21 @@
         Map<String, Object> value = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.CITY_AQI, String.valueOf(regionCode));
         if (value == null)
             value = queryCityAqiByRegionCodeFromDB(regionCode);
+        //������������������������������������������������������������
+        if (value == null) {
+            String regionCodeStr = String.valueOf(regionCode);
+            String end = regionCodeStr.substring(regionCodeStr.length() - 2, regionCodeStr.length());
+            if (!end.equals(00)) {
+                regionCodeStr = regionCodeStr.substring(0, regionCodeStr.length() - 2);
+                regionCodeStr += "00";
+                regionCode = Integer.parseInt(regionCodeStr);
+                value = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.CITY_AQI, String.valueOf(regionCode));
+                if (value == null)
+                    value = queryCityAqiByRegionCodeFromDB(regionCode);
+            }else{
+                return null;
+            }
+        }
         //������AQI������������������
         if (value == null || value.get("AQI") == null)
             return null;
@@ -754,7 +769,7 @@
     /**
      * @Description: ������6������������
      * @Param: [cityAqiList]
-     * @return: java.util.Map<java.lang.String, java.lang.Double>
+     * @return: java.util.Map<java.lang.String       ,               java.lang.Double>
      * ���������key���sensorCode,value������
      * @Author: ���������
      * @Date: 2021/11/2
@@ -808,7 +823,7 @@
     /**
      * @Description: ������������������������
      * @Param: [regionCode]
-     * @return: java.util.Map<java.lang.String, java.lang.Object>
+     * @return: java.util.Map<java.lang.String       ,               java.lang.Object>
      * @Author: ���������
      * @Date: 2021/10/28
      */
diff --git a/screen-api/src/main/java/com/moral/api/utils/UnitConvertUtils.java b/screen-api/src/main/java/com/moral/api/utils/UnitConvertUtils.java
new file mode 100644
index 0000000..5355a24
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/UnitConvertUtils.java
@@ -0,0 +1,180 @@
+package com.moral.api.utils;
+
+import com.moral.api.entity.Device;
+import com.moral.api.entity.Sensor;
+import com.moral.api.entity.UnitConversion;
+import com.moral.api.entity.Version;
+import com.moral.constant.RedisConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import javax.annotation.PostConstruct;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName UnitConvertUtils
+ * @Description TODO
+ * @Author ���������
+ * @Date 2021/12/27 16:17
+ * @Version TODO
+ **/
+@Component
+public class UnitConvertUtils {
+
+    /*
+     * ������������������������
+     * */
+    public static Integer num = 3;
+
+    private static RedisTemplate redisTemplate;
+
+    private static List<UnitConversion> unitConversions;
+
+    private static Map<String,Device> devices;
+
+    @PostConstruct
+    public void init() {
+        UnitConvertUtils.unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1);
+        devices = redisTemplate.opsForHash().entries(RedisConstants.DEVICE_INFO);
+    }
+
+    @Autowired
+    public void setRedisTemplate(RedisTemplate redisTemplate) {
+        this.redisTemplate = redisTemplate;
+    }
+
+    /**
+     * @Description: ������������������������������������������
+     * @Param: [mac, data]
+     * @return: java.util.Map<java.lang.String                                                               ,                                                               java.lang.Object>
+     * @Author: ���������
+     * @Date: 2021/12/27
+     */
+    public static Map<String, Object> convertUnitToShowUnit(String mac, Map<String, Object> data) {
+        if (mac == null || data == null)
+            return null;
+        Device device = devices.get(mac);
+        //������������������������������������������
+        if(device==null){
+            devices = redisTemplate.opsForHash().entries(RedisConstants.DEVICE_INFO);
+            device = devices.get(mac);
+            if(device==null)
+                return null;
+        }
+        Version version = device.getVersion();
+        //������������������������
+        List<Sensor> sensors = version.getSensors();
+        //���������������������������������������������������������
+        for (Sensor sensor : sensors) {
+            String unitKey = sensor.getUnitKey();//������������
+            String showUnitKey = sensor.getShowUnitKey();//������������
+            //���������������������������������������������������������������
+            if (!unitKey.equals(showUnitKey)) {
+                Object valueObject = data.get(sensor.getCode());
+                //������������������������������������������������������������������������
+                if (valueObject == null)
+                    continue;
+                //������������������
+                String formula = getFormula(sensor);
+                if (formula == null)
+                    continue;
+                //������������������������
+                Double value = Double.valueOf(String.valueOf(valueObject));
+                //���������������������
+                String valueStr = new BigDecimal(value).toString();
+                //������������������������������������
+                String calculateValue = calculate(valueStr, formula);
+                if(calculateValue==null)
+                    continue;
+                value = Double.parseDouble(calculateValue);
+                data.put(sensor.getCode(),value);
+            } else
+                continue;
+        }
+        return data;
+    }
+
+    /**
+     * @Description: ���������������������������
+     * @Param: [sensor]
+     * @return: java.lang.String
+     * @Author: ���������
+     * @Date: 2021/12/28
+     */
+    private static String getFormula(Sensor sensor) {
+        String formula = sensor.getFormula();
+        if (!ObjectUtils.isEmpty(formula))
+            return formula;
+
+        List<UnitConversion> tmpUnitConversions = new ArrayList<>();
+        for (UnitConversion unitConversion : unitConversions) {
+            if (unitConversion.getOriginalUnitKey().equals(sensor.getUnitKey()) && unitConversion.getTargetUnitKey().equals(sensor.getShowUnitKey()))
+                tmpUnitConversions.add(unitConversion);
+        }
+        //���������������������������������������������
+        if (tmpUnitConversions.size() == 0) {
+            refreshUnitConversionCache();
+        }
+        //������������������
+        for (UnitConversion unitConversion : unitConversions) {
+            if (unitConversion.getOriginalUnitKey().equals(sensor.getUnitKey()) && unitConversion.getTargetUnitKey().equals(sensor.getShowUnitKey()))
+                tmpUnitConversions.add(unitConversion);
+        }
+        //���������������������������null
+        if (tmpUnitConversions.size() == 0)
+            return null;
+        //������������������������������������������
+        if (unitConversions.size() == 1)
+            return unitConversions.get(0).getFormula();
+        //������������������������
+        for (UnitConversion unitConversion : unitConversions) {
+            if (unitConversion.getSensorCode().equals(sensor.getCode()))
+                return unitConversion.getFormula();
+        }
+        return null;
+    }
+
+    /**
+     * @Description: ������������������������
+     * @Param: []
+     * @return: void
+     * @Author: ���������
+     * @Date: 2021/12/28
+     */
+    private static void refreshUnitConversionCache() {
+        UnitConvertUtils.unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1);
+    }
+
+    /**
+     * @Description: value���������������������format���������
+     * @Param: [value, format]
+     * @return: java.lang.Double
+     * @Author: ���������
+     * @Date: 2021/7/5
+     */
+    public static String calculate(String value, String formula) {
+        if (ObjectUtils.isEmpty(formula))
+            return null;
+        ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
+        formula = formula.replaceAll("\\{0\\}", value);
+        Double result = null;
+        try {
+            result = (Double) jse.eval(formula);
+        } catch (ScriptException e) {
+            e.printStackTrace();
+        }
+        //������������������������
+        BigDecimal bg = new BigDecimal(result);
+        result = bg.setScale(num, BigDecimal.ROUND_HALF_UP).doubleValue();
+        return result.toString();
+    }
+
+
+}
diff --git a/screen-common/src/main/java/com/moral/util/UnitConvertUtils.java b/screen-common/src/main/java/com/moral/util/UnitConvertUtils.java
deleted file mode 100644
index 7d918da..0000000
--- a/screen-common/src/main/java/com/moral/util/UnitConvertUtils.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.moral.util;
-
-import org.springframework.util.ObjectUtils;
-
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
-import java.math.BigDecimal;
-
-/**
- * @ClassName UnitConvertUtils
- * @Description TODO
- * @Author ���������
- * @Date 2021/7/5 9:00
- * @Version TODO
- **/
-public class UnitConvertUtils {
-
-    /*
-    * ������������������������
-    * */
-    public  static Integer num = 3;
-
-
-    /**
-    * @Description: value���������������������format���������
-            * @Param: [value, format]
-            * @return: java.lang.Double
-            * @Author: ���������
-            * @Date: 2021/7/5
-            */
-    public static String calculate(String value, String formula) {
-        if(ObjectUtils.isEmpty(formula))
-            return null;
-        ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
-        formula = formula.replaceAll("\\{0\\}", value);
-        Double result = null;
-        try {
-            result = (Double) jse.eval(formula);
-        } catch (ScriptException e) {
-            e.printStackTrace();
-        }
-        //������������������������
-        BigDecimal bg = new BigDecimal(result);
-        result = bg.setScale(num, BigDecimal.ROUND_HALF_UP).doubleValue();
-        return result.toString();
-    }
-}

--
Gitblit v1.8.0