From 9485a0cb33bb4535bb553a5bf49debeadbe0c89d Mon Sep 17 00:00:00 2001
From: jinpengyong <jpy123456>
Date: Wed, 03 Nov 2021 11:48:55 +0800
Subject: [PATCH] city_aqi o3_8h,综指,首要污染物计算

---
 screen-common/src/main/java/com/moral/util/AQIUtils.java                         |  152 ++++++++++++++++++++++-------
 screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java          |   29 ++++-
 screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java      |   46 ++++++---
 screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java |   14 ++
 4 files changed, 176 insertions(+), 65 deletions(-)

diff --git a/screen-common/src/main/java/com/moral/util/AQIUtils.java b/screen-common/src/main/java/com/moral/util/AQIUtils.java
index a55c8f5..d283d23 100644
--- a/screen-common/src/main/java/com/moral/util/AQIUtils.java
+++ b/screen-common/src/main/java/com/moral/util/AQIUtils.java
@@ -59,15 +59,15 @@
     }
 
     /**
-    * @Description: ������AQI������������������map���key���sensorCode���value���������
-            * @Param: [map]
-            * @return: java.util.Map<java.lang.String,java.lang.Object>
-            * @Author: ���������
-            * @Date: 2021/10/29
-            */
-    public static Map<String,Object> hourlyAqi_pollutant(Map<String, Object> map) {
+     * @Description: ������AQI������������������map���key���sensorCode���value���������
+     * @Param: [map]
+     * @return: java.util.Map<java.lang.String, java.lang.Object>
+     * @Author: ���������
+     * @Date: 2021/10/29
+     */
+    public static Map<String, Object> hourlyAqi_pollutant(Map<String, Object> map) {
         List<Integer> AQIList = new ArrayList<>();
-        Map<String,Integer> AQIMap = new HashMap<>();
+        Map<String, Integer> AQIMap = new HashMap<>();
         for (Map.Entry<String, Object> entry : map.entrySet()) {
             String key = entry.getKey();
             if (entry.getValue().toString().equals("")) {
@@ -83,32 +83,32 @@
                 case Constants.SENSOR_CODE_PM25:
                     PM2_5AQI = PM2_5AQI(Double.valueOf(entry.getValue().toString()));
                     AQIList.add(PM2_5AQI);
-                    AQIMap.put("PM2.5",PM2_5AQI);
+                    AQIMap.put("PM2.5", PM2_5AQI);
                     break;
                 case Constants.SENSOR_CODE_PM10:
                     PM10AQI = PM10AQI(Double.valueOf(entry.getValue().toString()));
                     AQIList.add(PM10AQI);
-                    AQIMap.put("PM10",PM10AQI);
+                    AQIMap.put("PM10", PM10AQI);
                     break;
                 case Constants.SENSOR_CODE_SO2:
                     SO2AQI = SO2AQI(Double.valueOf(entry.getValue().toString()));
                     AQIList.add(SO2AQI);
-                    AQIMap.put("SO2",SO2AQI);
+                    AQIMap.put("SO2", SO2AQI);
                     break;
                 case Constants.SENSOR_CODE_NO2:
                     NO2AQI = NO2AQI(Double.valueOf(entry.getValue().toString()));
                     AQIList.add(NO2AQI);
-                    AQIMap.put("NO2",NO2AQI);
+                    AQIMap.put("NO2", NO2AQI);
                     break;
                 case Constants.SENSOR_CODE_CO:
                     COAQI = COAQI(Double.valueOf(entry.getValue().toString()));
                     AQIList.add(COAQI);
-                    AQIMap.put("CO",COAQI);
+                    AQIMap.put("CO", COAQI);
                     break;
                 case Constants.SENSOR_CODE_O3:
                     O3AQI = O3AQI(Double.valueOf(entry.getValue().toString()));
                     AQIList.add(O3AQI);
-                    AQIMap.put("O3",O3AQI);
+                    AQIMap.put("O3", O3AQI);
                     break;
                 default:
                     break;
@@ -119,49 +119,50 @@
             AQIMAX = Collections.max(AQIList);
         }
         List<String> nameList = new ArrayList<>();
-        for (String key:AQIMap.keySet()){
-            if (AQIMap.get(key).equals(AQIMAX)){
+        for (String key : AQIMap.keySet()) {
+            if (AQIMap.get(key).equals(AQIMAX)) {
                 nameList.add(key);
             }
         }
-        Map<String,Object> resultMap = new HashMap<>();
-        resultMap.put("aqi",AQIMAX);
-        if(AQIMAX>50)
-            resultMap.put("pollutant",nameList);
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("aqi", AQIMAX);
+        if (AQIMAX > 50)
+            resultMap.put("pollutant", nameList);
         return resultMap;
     }
 
     public static void main(String[] args) {
-        Map<String,Object> map = new HashMap<>();
-        map.put("a34004",11.25);
-        map.put("a34002",18.25);
-        map.put("a21026",55);
-        map.put("a21004",200.01);
-        map.put("a21005",18.94);
-        map.put("a05024",55);
+        Map<String, Object> map = new HashMap<>();
+        map.put("a34004", 11.25);
+        map.put("a34002", 18.25);
+        map.put("a21026", 55);
+        map.put("a21004", 200.01);
+        map.put("a21005", 18.94);
+        map.put("a05024", 55);
         System.out.println(hourlyAqi_pollutant(map));
     }
 
     /**
-    * @Description: ������AQI������������
-            * @Param:
-            * @return:
-            * @Author: ���������
-            * @Date: 2021/10/29
-            */
-    public static String classOfPollutionByAqi(Integer aqi){
-        if(aqi>300)
+     * @Description: ������AQI������������
+     * @Param:
+     * @return:
+     * @Author: ���������
+     * @Date: 2021/10/29
+     */
+    public static String classOfPollutionByAqi(Integer aqi) {
+        if (aqi > 300)
             return Constants.SERVER;
-        if(aqi>200)
+        if (aqi > 200)
             return Constants.SERIOUS;
-        if(aqi>150)
+        if (aqi > 150)
             return Constants.MIDDLE;
-        if(aqi>100)
+        if (aqi > 100)
             return Constants.MILD;
-        if(aqi>50)
+        if (aqi > 50)
             return Constants.GOOD;
         return Constants.EXCELLENT;
     }
+
     //PM2.5 IAQI
     private static int PM2_5AQI(Double value) {
         double result;
@@ -293,4 +294,77 @@
         }
         return (int) Math.ceil(result);
     }
+
+    /**
+     * @Description: ������AQI������������������map���key���sensorCode���value���������
+     * @Param: [map]
+     * @return: java.util.Map<java.lang.String, java.lang.Object>
+     * @Author: ���������
+     * @Date: 2021/10/29
+     */
+    public static Map<String, Object> cityAqiPollutant(Map<String, Object> map) {
+        List<Integer> AQIList = new ArrayList<>();
+        Map<String, Integer> AQIMap = new HashMap<>();
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
+            String key = entry.getKey();
+            if (entry.getValue().toString().equals("")) {
+                continue;
+            }
+            int PM2_5AQI;
+            int PM10AQI;
+            int SO2AQI;
+            int NO2AQI;
+            int COAQI;
+            int O3AQI;
+            switch (key) {
+                case "pm2_5":
+                    PM2_5AQI = PM2_5AQI(Double.valueOf(entry.getValue().toString()));
+                    AQIList.add(PM2_5AQI);
+                    AQIMap.put("pm2_5", PM2_5AQI);
+                    break;
+                case "pm10":
+                    PM10AQI = PM10AQI(Double.valueOf(entry.getValue().toString()));
+                    AQIList.add(PM10AQI);
+                    AQIMap.put("pm10", PM10AQI);
+                    break;
+                case Constants.SENSOR_CODE_SO2:
+                    SO2AQI = SO2AQI(Double.valueOf(entry.getValue().toString()));
+                    AQIList.add(SO2AQI);
+                    AQIMap.put("so2", SO2AQI);
+                    break;
+                case Constants.SENSOR_CODE_NO2:
+                    NO2AQI = NO2AQI(Double.valueOf(entry.getValue().toString()));
+                    AQIList.add(NO2AQI);
+                    AQIMap.put("no2", NO2AQI);
+                    break;
+                case Constants.SENSOR_CODE_CO:
+                    COAQI = COAQI(Double.valueOf(entry.getValue().toString()));
+                    AQIList.add(COAQI);
+                    AQIMap.put("co", COAQI);
+                    break;
+                case Constants.SENSOR_CODE_O3:
+                    O3AQI = O3AQI(Double.valueOf(entry.getValue().toString()));
+                    AQIList.add(O3AQI);
+                    AQIMap.put("o3", O3AQI);
+                    break;
+                default:
+                    break;
+            }
+        }
+        int AQIMAX = 0;
+        if (!ObjectUtils.isEmpty(AQIList)) {
+            AQIMAX = Collections.max(AQIList);
+        }
+        List<String> nameList = new ArrayList<>();
+        for (String key : AQIMap.keySet()) {
+            if (AQIMap.get(key).equals(AQIMAX)) {
+                nameList.add(key);
+            }
+        }
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("aqi", AQIMAX);
+        if (AQIMAX > 50)
+            resultMap.put("pollutant", nameList);
+        return resultMap;
+    }
 }
diff --git a/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java b/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
index 7aae70f..ae30e5c 100644
--- a/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
+++ b/screen-common/src/main/java/com/moral/util/ComprehensiveIndexUtils.java
@@ -1,5 +1,7 @@
 package com.moral.util;
 
+import org.springframework.util.ObjectUtils;
+
 import java.util.*;
 
 /**
@@ -170,12 +172,17 @@
     public static Double dailyData(Map<String, Object> data) {
         if (data == null)
             return null;
-        Double CPM25 = (Double) data.get("pm2_5");
-        Double CPM10 = (Double) data.get("pm10");
-        Double CSO2 = (Double) data.get("so2");
-        Double CNO2 = (Double) data.get("no2");
-        Double CCO = (Double) data.get("co");
-        Double CO3 = (Double) data.get("o3");
+        Double CPM25 = Double.parseDouble(data.get("pm2_5").toString());
+        Double CPM10 = Double.parseDouble(data.get("pm10").toString());
+        Double CSO2 = Double.parseDouble(data.get("so2").toString());
+        Double CNO2 = Double.parseDouble(data.get("no2").toString());
+        Double CCO = Double.parseDouble(data.get("co").toString());
+        Object o3 = data.get("o3");
+        Double CO3 = null;
+        if (!ObjectUtils.isEmpty(o3)) {
+            CO3 = Double.parseDouble(o3.toString());
+        }
+
         //S���������������������������������������(���������������CO������������������������������������������������O3���������������������������������������)
         //������������GB 3095-2012
         Double SSO2 = 60d;
@@ -190,13 +197,19 @@
         Double IPM25 = CPM25 / SPM25;
         Double IPM10 = CPM10 / SPM10;
         Double ICO = CCO / SCO;
-        Double IO3 = CO3 / SO3;
+        Double IO3 = null;
+        if (!ObjectUtils.isEmpty(CO3)) {
+            IO3 = CO3 / SO3;
+        }
+
         //������������������
         Double comprehensiveIndex = MathUtils.add(ISO2, INO2);
         comprehensiveIndex = MathUtils.add(comprehensiveIndex, IPM25);
         comprehensiveIndex = MathUtils.add(comprehensiveIndex, IPM10);
         comprehensiveIndex = MathUtils.add(comprehensiveIndex, ICO);
-        comprehensiveIndex = MathUtils.add(comprehensiveIndex, IO3);
+        if (!ObjectUtils.isEmpty(IO3)) {
+            comprehensiveIndex = MathUtils.add(comprehensiveIndex, IO3);
+        }
         comprehensiveIndex = AmendUtils.sciCal(comprehensiveIndex, 2);
         return comprehensiveIndex;
     }
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
index 5c4d849..92b325d 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
+++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -16,6 +16,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
@@ -55,7 +56,7 @@
         QueryWrapper<CityAqi> wrapper = new QueryWrapper<>();
         wrapper.select("city_code", "time", "value")
                 .ge("time", DateUtils.dateToDateString(start))
-                .lt("time", DateUtils.dateToDateString(end));
+                .le("time", DateUtils.dateToDateString(end));
         List<Map<String, Object>> dailyData = cityAqiService.listMaps(wrapper);
 
         if (dailyData.size() == 0) {
@@ -70,14 +71,21 @@
             cityAqiDaily.setCityCode(Integer.parseInt(cityCode));
             cityAqiDaily.setTime(start);
 
-            //���������������������������
+            //���������������������������������������������������
+            List<Map<String, Object>> tempValue = new ArrayList<>(value);
+
+            //������������������������0������������O3������������������������������1���-8���
+            value.removeIf(map -> ((Date) map.get("time")).getTime() == start.getTime());
+
             Double o3OfDay = AmendUtils.o3OfDay(value);
             if (o3OfDay != null) {
                 jsonMap.put("o3", o3OfDay);
             }
+            //������������������������������������
+            tempValue.removeIf(o -> ((Date) o.get("time")).getTime() == end.getTime());
 
             sensors.forEach(sensor -> {
-                OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> {
+                OptionalDouble optionalDouble = tempValue.parallelStream().flatMapToDouble(v -> {
                     Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
                     //������������������
                     if ("o3".equals(sensor)) {
diff --git a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
index 1f91041..9b31a27 100644
--- a/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
+++ b/screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -26,6 +26,8 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.OptionalDouble;
+import java.util.stream.DoubleStream;
 
 /**
  * <p>
@@ -55,11 +57,20 @@
 
     @Override
     public void insertCityAqi() {
+        Date now = new Date();
+        Date time = DateUtils.dataToTimeStampTime(now, DateUtils.yyyy_MM_dd_HH_EN);
+        String format = DateUtils.yyyy_MM_dd_EN;
+
+        Date start = null;
+        if (DateUtils.getHour(time) == 0 || DateUtils.getHour(time) >= 8) {
+            start = DateUtils.addHours(time, -7);
+        }
+
         //������������������
         QueryWrapper<CityConfig> wrapper = new QueryWrapper<>();
         wrapper.select("city_code", "city_id").eq("is_delete", Constants.NOT_DELETE);
         List<CityConfig> list = cityConfigService.list(wrapper);
-        Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN);
+
         for (CityConfig cityConfig : list) {
             Integer cityCode = cityConfig.getCityCode();
             Map<String, Object> data;
@@ -85,18 +96,25 @@
             aqi.put("aqi", aqi.remove("value"));
 
             //o3���������������
-            //���������������������������o3������
-            QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>();
-            queryWrapper.select("time", "value").eq("city_code", cityCode);
-            List<Map<String, Object>> cityAqis = cityAqiMapper.selectMaps(queryWrapper);
-            List<Map<String, Object>> o3_8H = AmendUtils.getO3_8H(cityAqis);
-            if (!ObjectUtils.isEmpty(o3_8H)) {
-                for (Map<String, Object> o3Map : o3_8H) {
-                    String hourTime = o3Map.get("time").toString();
-                    if (DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_HH_mm_ss_EN).equals(hourTime)) {
-                        o3Map.get("o3");
-                        aqi.put("o3_8h", o3Map.get("o3"));
-                        break;
+            if (start != null) {
+                QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>();
+                queryWrapper.select("time", "value")
+                        .eq("city_code", cityCode)
+                        .ge("time", DateUtils.dateToDateString(start));
+                List<Map<String, Object>> cityAqis = cityAqiMapper.selectMaps(queryWrapper);
+                Map<String, Object> params = new HashMap<>();
+                params.put("time", DateUtils.dateToDateString(time,DateUtils.yyyy_MM_dd_HH_mm_ss_S_EN));
+                params.put("value", JSONObject.toJSONString(aqi));
+                cityAqis.add(params);
+                if (cityAqis.size() >= 6) {
+                    OptionalDouble average = cityAqis.parallelStream().flatMapToDouble(v -> {
+                        Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class);
+                        double o3 = Double.parseDouble(dataValue.get("o3").toString());
+                        return DoubleStream.of(o3);
+                    }).average();
+                    if (average.isPresent()) {
+                        double o3_8h = AmendUtils.sciCal(average.getAsDouble(), 0);
+                        aqi.put("o3_8h", o3_8h);
                     }
                 }
             }
@@ -107,13 +125,11 @@
             Double compositeIndex = ComprehensiveIndexUtils.dailyData(temp);
             aqi.put("compositeIndex", compositeIndex);
 
-
             //���������������������
             Map<String, Object> pollutant = AQIUtils.cityAqiPollutant(aqi);
             if (!ObjectUtils.isEmpty(pollutant)) {
                 aqi.putAll(pollutant);
             }
-
 
             CityAqi cityAqi = new CityAqi();
             cityAqi.setCityCode(cityCode);

--
Gitblit v1.8.0