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