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