From ba55d44ea9f61a007f5c63fb8689488cc35d48ee Mon Sep 17 00:00:00 2001 From: chen_xi <276999030@qq.com> Date: Mon, 26 Sep 2022 15:05:56 +0800 Subject: [PATCH] 多站单参接口修改 --- screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java | 211 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 187 insertions(+), 24 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java index a8afe09..1eca5b8 100644 --- a/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java +++ b/screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java @@ -1,6 +1,7 @@ package com.moral.api.service.impl; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.config.properties.SpecialCitiesProperties; import com.moral.api.entity.CityAqi; @@ -9,12 +10,15 @@ import com.moral.api.entity.SysArea; import com.moral.api.mapper.CityAqiYearlyMapper; import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; +import com.moral.api.pojo.dto.cityAQI.ComplianceDaysDTO; import com.moral.api.pojo.dto.cityAQI.DataPercentRange; +import com.moral.api.pojo.vo.cityAQI.ComplianceDaysVO; import com.moral.api.service.CityAqiDailyService; import com.moral.api.service.CityAqiYearlyService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.SysAreaService; import com.moral.constant.Constants; +import com.moral.util.AQIUtils; import com.moral.util.AmendUtils; import com.moral.util.DateUtils; import com.moral.util.MathUtils; @@ -23,6 +27,7 @@ import org.springframework.util.ObjectUtils; import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.*; /** @@ -86,15 +91,153 @@ DataPercentRange fineDays = calculateFineDays(cities, twentyEightCities, heBeiEightCities, startDate, endDate, city); //������6��������������������������� Map<String, DataPercentRange> sixParamMap = calculateSixParam(thisYear, startDate, endDate, city, cities, twentyEightCities, heBeiEightCities); - Map<String,DataPercentRange> result = new HashMap<>(); - if(fineDays!=null) - result.put("fineDays",fineDays); - if(sixParamMap!=null) + Map<String, DataPercentRange> result = new HashMap<>(); + if (fineDays != null) + result.put("fineDays", fineDays); + if (sixParamMap != null) result.putAll(sixParamMap); - if(result.size()==0) + if (result.size() == 0) return null; return result; } + + @Override + public List<ComplianceDaysDTO> analysisComplianceDays(String year, Integer cityCode) { + List<ComplianceDaysDTO> dtos = new ArrayList<>(); + //������������������������������������ + Date posYear = DateUtils.getDate(year, "yyyy"); + Date posYearStartDate = DateUtils.getFirstDayOfYear(posYear); + Date posYearEndDate = DateUtils.getLastDayOfYear(posYear); + //������������������������������������ + String comYearStr = (Integer.parseInt(year)-1)+""; + Date comYear = DateUtils.getDate(comYearStr,"yyyy"); + Date comYearStartDate = DateUtils.getFirstDayOfYear(comYear); + Date comYearEndDate = DateUtils.getLastDayOfYear(comYear); + //������������������������������������ + List<CityAqiDaily> posYearDatas = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(cityCode, posYearStartDate, posYearEndDate); + List<CityAqiDaily> comYearDatas = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(cityCode, comYearStartDate, comYearEndDate); + //������������������������������ + int month = maxMonth(posYearDatas); + if(month==0) + return dtos; + //������������������������������ + for (int i = 1; i <= month; i++) { + ComplianceDaysDTO dto = analysisComplianceDaysForMonth(posYearDatas, comYearDatas, i); + dtos.add(dto); + } + return dtos; + } + + //������������������������������������������������ + private ComplianceDaysDTO analysisComplianceDaysForMonth(List<CityAqiDaily> posYearDatas, + List<CityAqiDaily> comYearDatas, + int month){ + ComplianceDaysDTO dto = new ComplianceDaysDTO(); + //������������������������ + List<CityAqiDaily> posMonthDatas = new ArrayList<>(); + List<CityAqiDaily> comMonthDatas = new ArrayList<>(); + for (CityAqiDaily posYearData : posYearDatas) { + Date time = posYearData.getTime(); + if(DateUtils.getMonth(time)==month) + posMonthDatas.add(posYearData); + } + for (CityAqiDaily comYearData : comYearDatas) { + Date time = comYearData.getTime(); + if(DateUtils.getMonth(time)==month) + comMonthDatas.add(comYearData); + } + //��������������������������������������� + for (CityAqiDaily posMonthData : posMonthDatas) { + //������������ + Map<String,String> dataMap = JSON.parseObject(posMonthData.getValue(),Map.class); + String aqi = String.valueOf(dataMap.get("AQI")); + String PM2_5 = String.valueOf(dataMap.get("PM2_5")); + String PM10 = String.valueOf(dataMap.get("PM10")); + String SO2 = String.valueOf(dataMap.get("SO2")); + String NO2 = String.valueOf(dataMap.get("NO2")); + String O3 = String.valueOf(dataMap.get("O3")); + String CO = String.valueOf(dataMap.get("CO")); + //������aqi������6������������������ + if(aqi!=null){ + if(AQIUtils.aqiIsStandard(Integer.parseInt(aqi))) + dto.setAqiComplianceDays(dto.getAqiComplianceDays()+1); + } + if(PM2_5!=null){ + if(!AQIUtils.PM2_5IsStandard(Double.parseDouble(PM2_5))) + dto.setPM2_5Days(dto.getPM2_5Days()+1); + } + if(PM10!=null){ + if(!AQIUtils.PM10IsStandard(Double.parseDouble(PM10))) + dto.setPM10Days(dto.getPM10Days()+1); + } + if(SO2!=null){ + if(!AQIUtils.SO2IsStandard(Double.parseDouble(SO2))) + dto.setSO2Days(dto.getSO2Days()+1); + } + if(NO2!=null){ + if(!AQIUtils.NO2IsStandard(Double.parseDouble(NO2))) + dto.setNO2Days(dto.getNO2Days()+1); + } + if(O3!=null){ + if(!AQIUtils.O3IsStandard(Double.parseDouble(O3))) + dto.setO3Days(dto.getO3Days()+1); + } + if(CO!=null){ + if(!AQIUtils.COIsStandard(Double.parseDouble(CO))) + dto.setCODays(dto.getCODays()+1); + } + //��������������������� + Object primaryPollutantO = dataMap.get("primaryPollutant"); + if(primaryPollutantO!=null){ + JSONArray primaryPollutantArray = (JSONArray) primaryPollutantO; + List<String> primaryPollutant = JSON.parseObject(primaryPollutantArray.toJSONString(),List.class); + for (String s : primaryPollutant) { + if(s.equals("PM2.5")) + dto.setPM2_5FirstDays(dto.getPM2_5FirstDays()+1); + if(s.equals("PM10")) + dto.setPM10FirstDays(dto.getPM10FirstDays()+1); + if(s.equals("SO2")) + dto.setSO2FirstDays(dto.getSO2FirstDays()+1); + if(s.equals("NO2")) + dto.setNO2FirstDays(dto.getNO2FirstDays()+1); + if(s.equals("CO")) + dto.setCOFirstDays(dto.getCOFirstDays()+1); + if(s.equals("O3")) + dto.setO3FirstDays(dto.getO3FirstDays()+1); + } + } + } + //������������������������ + for (CityAqiDaily comMonthData : comMonthDatas) { + //������������ + Map<String,String> dataMap = JSON.parseObject(comMonthData.getValue(),Map.class); + String aqi = String.valueOf(dataMap.get("AQI")); + //������aqi������������ + if(aqi!=null){ + if(AQIUtils.aqiIsStandard(Integer.parseInt(aqi))) + dto.setComAqiComplianceDays(dto.getComAqiComplianceDays()+1); + } + } + //������������������������������������������ + Double posAqiComplianceDays = Double.parseDouble(dto.getAqiComplianceDays()+""); + Double posDays = Double.parseDouble(posMonthDatas.size()+""); + Double comAqiComplianceDays = Double.parseDouble(dto.getComAqiComplianceDays()+""); + Double comDays = Double.parseDouble(comMonthDatas.size()+""); + if(posDays==0d) + dto.setAqiCompliancePer(0d); + else + dto.setAqiCompliancePer(MathUtils.division(posAqiComplianceDays*100,posDays,2)); + + if(comDays==0d) + dto.setComAqiCompliancePer(0d); + else + dto.setComAqiCompliancePer(MathUtils.division(comAqiComplianceDays*100,comDays,2)); + + dto.setMonth(month); + return dto; + } + + //������������������������������������������28��������������������������������� @@ -108,7 +251,7 @@ //��������������������� CityPollutionLevel cityPollutionLevel = cityAqiDailyService.calculateDaysByTimeAndSysArea(city, startDate, endDate); - if(cityPollutionLevel==null) + if (cityPollutionLevel == null) return null; Integer fineDays = cityPollutionLevel.getExcellentWeatherDays() + cityPollutionLevel.getGoodWeatherDays(); //������������������ @@ -116,13 +259,19 @@ Date compareEndDate = DateUtils.addMonths(endDate, -12); CityPollutionLevel cityPollutionLevelCompare = cityAqiDailyService.calculateDaysByTimeAndSysArea(city, compareStartDate, compareEndDate); String percent = null; - if(cityPollutionLevelCompare!=null){ + if (cityPollutionLevelCompare != null) { Integer compareFineDays = cityPollutionLevelCompare.getExcellentWeatherDays() + cityPollutionLevelCompare.getGoodWeatherDays(); - percent = (fineDays - compareFineDays) + " ���"; + Integer percentInt = fineDays - compareFineDays; + if (percentInt > 0) { + percent = "+" + percentInt + " ���"; + } else { + percent = percentInt + " ���"; + } + } //������������������ Integer provinceRange = null; - if(provinceCities!=null) + if (provinceCities != null) provinceRange = calculateFineDaysRange(provinceCities, city, startDate, endDate); //������2+26������������ Integer twentyEightRange = null; @@ -161,7 +310,7 @@ Map<String, Double> compareCentration = getConcentration(thisYear, compareStartDate, compareEndDate, cityCode); //������6��������������������������� Map<String, String> compareResult = null; - if(compareCentration!=null) + if (compareCentration != null) compareResult = calculateSixParamYOY(concentration, compareCentration); //������������������ Map<String, Integer> provinceRangeResult = null; @@ -185,13 +334,13 @@ DataPercentRange O3 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "O3", 0, "��g/m��"); DataPercentRange CO = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "CO", 1, "mg/m��"); DataPercentRange compositeIndex = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "compositeIndex", 3, ""); - result.put("PM2_5",PM2_5); - result.put("PM10",PM10); - result.put("SO2",SO2); - result.put("NO2",NO2); - result.put("O3",O3); - result.put("CO",CO); - result.put("compositeIndex",compositeIndex); + result.put("PM2_5", PM2_5); + result.put("PM10", PM10); + result.put("SO2", SO2); + result.put("NO2", NO2); + result.put("O3", O3); + result.put("CO", CO); + result.put("compositeIndex", compositeIndex); return result; } @@ -286,31 +435,31 @@ Double pm2_5 = calculateSensorYOY(dataMap, compareDataMap, "PM2_5"); if (pm2_5 != null) - result.put("PM2_5", pm2_5.intValue() + " ��g/m��"); + result.put("PM2_5", pm2_5.intValue() > 0 ? "+" + pm2_5.intValue() + " ��g/m��" : pm2_5.intValue() + " ��g/m��"); Double pm10 = calculateSensorYOY(dataMap, compareDataMap, "PM10"); if (pm10 != null) - result.put("PM10", pm10.intValue() + " ��g/m��"); + result.put("PM10", pm10.intValue() > 0 ? "+" + pm10.intValue() + " ��g/m��" : pm10.intValue() + " ��g/m��"); Double so2 = calculateSensorYOY(dataMap, compareDataMap, "SO2"); if (so2 != null) - result.put("SO2", so2.intValue() + " ��g/m��"); + result.put("SO2", so2.intValue() > 0 ? "+" + so2.intValue() + " ��g/m��" : so2.intValue() + " ��g/m��"); Double no2 = calculateSensorYOY(dataMap, compareDataMap, "NO2"); if (no2 != null) - result.put("NO2", no2.intValue() + " ��g/m��"); + result.put("NO2", no2.intValue() > 0 ? "+" + no2.intValue() + " ��g/m��" : no2.intValue() + " ��g/m��"); Double o3 = calculateSensorYOY(dataMap, compareDataMap, "O3"); if (o3 != null) - result.put("O3", o3.intValue() + " ��g/m��"); + result.put("O3", o3.intValue() > 0 ? "+" + o3.intValue() + " ��g/m��" : o3.intValue() + " ��g/m��"); Double co = calculateSensorYOY(dataMap, compareDataMap, "CO"); if (co != null) { co = AmendUtils.sciCal(co, 1); - result.put("CO", co + " mg/m��"); + result.put("CO", co.intValue() > 0 ? "+" + co.intValue() + " mg/m��" : co.intValue() + " mg/m��"); } //������������������������������ @@ -321,7 +470,7 @@ if (compositeIndex != null && compareCompositeIndex != null) { Double compareResult = MathUtils.division(compositeIndex - compareCompositeIndex, compareCompositeIndex, 3); compareResult = MathUtils.mul(compareResult, 100); - result.put("compositeIndex", compareResult + "%"); + result.put("compositeIndex", compareResult > 0 ? "+" + compareResult + " %" : compareResult + " %"); } if (result.size() != 7) return null; @@ -443,5 +592,19 @@ return DateUtils.dateToDateString(new Date(), "yyyy").equals(year); } + //������������������������������ + private int maxMonth( List<CityAqiDaily> datas){ + int i = 0; + for (CityAqiDaily data : datas) { + Date time = data.getTime(); + int month = DateUtils.getMonth(time); + if(month>i) + i = month; + } + return i; + } + + + } -- Gitblit v1.8.0