From a0224894fcc89500a701f39ccaf4322a03231ff6 Mon Sep 17 00:00:00 2001 From: kaiyu <404897439@qq.com> Date: Fri, 25 Feb 2022 16:48:28 +0800 Subject: [PATCH] screen-api 增加达标天数分析接口 --- screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java | 246 +++++++++++++++++++++++++++ screen-common/src/main/java/com/moral/util/AQIUtils.java | 37 ++++ screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java | 10 + screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java | 55 ++++++ screen-api/src/main/java/com/moral/api/controller/AqiController.java | 27 +- screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java | 157 +++++++++++++++++ 6 files changed, 520 insertions(+), 12 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 f89d725..087cc14 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 @@ -2,15 +2,9 @@ import com.moral.api.config.properties.SpecialCitiesProperties; import com.moral.api.entity.SysArea; -import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; -import com.moral.api.pojo.dto.cityAQI.ConcentrationAndPercent; -import com.moral.api.pojo.dto.cityAQI.DataPercentRange; -import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; +import com.moral.api.pojo.dto.cityAQI.*; import com.moral.api.pojo.form.aqi.*; -import com.moral.api.pojo.vo.cityAQI.AirQualityComparisonVO; -import com.moral.api.pojo.vo.cityAQI.BarChartOfPollutionLevelVO; -import com.moral.api.pojo.vo.cityAQI.BarChartTableOfPollutionLevelVO; -import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; +import com.moral.api.pojo.vo.cityAQI.*; import com.moral.api.service.CityAqiDailyService; import com.moral.api.service.CityAqiYearlyService; @@ -47,6 +41,10 @@ private CityAqiService cityAqiService; @Autowired private CityAqiDailyService cityAqiDailyService; + @Autowired + SpecialCitiesProperties specialCitiesProperties; + @Autowired + CityAqiYearlyService cityAqiYearlyService; @GetMapping("compareO3") @ApiOperation(value = "���������������������������", notes = "���������������������������") @@ -282,10 +280,6 @@ return ResultMessage.ok(datas); } - @Autowired - SpecialCitiesProperties specialCitiesProperties; - @Autowired - CityAqiYearlyService cityAqiYearlyService; /** * @Description: ������������������������ * @Param: [year, cityCode] @@ -302,4 +296,13 @@ return ResultMessage.ok(result); } + @GetMapping("queryComplianceDaysAnalysis") + public ResultMessage queryComplianceDaysAnalysis( String year, Integer cityCode){ + if(year==null||cityCode==null) + return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), + ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); + List<ComplianceDaysDTO> dtos = cityAqiYearlyService.analysisComplianceDays(year, cityCode); + return ResultMessage.ok(ComplianceDaysVO.convert(dtos)); + } + } diff --git a/screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java b/screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java new file mode 100644 index 0000000..cada042 --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java @@ -0,0 +1,55 @@ +package com.moral.api.pojo.dto.cityAQI; + +import lombok.Data; + +/** + * @ClassName + * @Description TODO + * @Author ��������� + * @Date 2022/2/25 15:14 + * @Version TODO + **/ +@Data +public class ComplianceDaysDTO { + + //������ + int month; + + //aqi������������ + int aqiComplianceDays; + + //������aqi������������ + int comAqiComplianceDays; + + //aqi��������� + double aqiCompliancePer; + + //������aqi��������� + double comAqiCompliancePer; + + //PM2.5������������������ + int PM2_5Days; + + int PM10Days; + + int SO2Days; + + int NO2Days; + + int CODays; + + int O3Days; + + //PM2.5������������������ + int PM2_5FirstDays; + + int PM10FirstDays; + + int SO2FirstDays; + + int NO2FirstDays; + + int COFirstDays; + + int O3FirstDays; +} diff --git a/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java b/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java new file mode 100644 index 0000000..fa4d80f --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java @@ -0,0 +1,246 @@ +package com.moral.api.pojo.vo.cityAQI; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.moral.api.pojo.dto.cityAQI.ComplianceDaysDTO; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName + * @Description TODO + * @Author ��������� + * @Date 2022/2/25 15:14 + * @Version TODO + **/ +@JsonPropertyOrder(value={"month","aqiComplianceDays","comAqiComplianceDays","aqiCompliancePer","comAqiCompliancePer", "PM2_5Days","PM10Days","SO2Days","NO2Days","CODays","O3Days", "PM2_5FirstDays","PM10FirstDays","SO2FirstDays","NO2FirstDays","COFirstDays","O3FirstDays"}) +public class ComplianceDaysVO { + + //������ + String month; + + //aqi������������ + String aqiComplianceDays; + + //������aqi������������ + String comAqiComplianceDays; + + //aqi��������� + String aqiCompliancePer; + + //������aqi��������� + String comAqiCompliancePer; + + //PM2.5������������������ + String PM2_5Days; + + String PM10Days; + + String SO2Days; + + String NO2Days; + + String CODays; + + String O3Days; + + //PM2.5������������������ + String PM2_5FirstDays; + + String PM10FirstDays; + + String SO2FirstDays; + + String NO2FirstDays; + + String COFirstDays; + + String O3FirstDays; + + public static List<ComplianceDaysVO> convert(List<ComplianceDaysDTO> dtos){ + List<ComplianceDaysVO> vos = new ArrayList<>(); + for (ComplianceDaysDTO dto : dtos) { + ComplianceDaysVO vo = new ComplianceDaysVO(); + + int month = dto.getMonth(); + if(month<10) + vo.setMonth("0"+month+"���"); + else + vo.setMonth(month+"���"); + + vo.setAqiComplianceDays(dto.getAqiComplianceDays()+" ���"); + vo.setComAqiComplianceDays(dto.getComAqiComplianceDays()+" ���"); + vo.setAqiCompliancePer(dto.getAqiCompliancePer()+"%"); + vo.setComAqiCompliancePer(dto.getComAqiCompliancePer()+"%"); + vo.setPM2_5Days(dto.getPM2_5Days()+" ���"); + vo.setPM10Days(dto.getPM10Days()+" ���"); + vo.setNO2Days(dto.getNO2Days()+" ���"); + vo.setSO2Days(dto.getSO2Days()+" ���"); + vo.setCODays(dto.getCODays()+" ���"); + vo.setO3Days(dto.getO3Days()+" ���"); + + vo.setPM2_5FirstDays(dto.getPM2_5FirstDays()+" ���"); + vo.setPM10FirstDays(dto.getPM10FirstDays()+" ���"); + vo.setNO2FirstDays(dto.getNO2FirstDays()+" ���"); + vo.setSO2FirstDays(dto.getSO2FirstDays()+" ���"); + vo.setCOFirstDays(dto.getCOFirstDays()+" ���"); + vo.setO3FirstDays(dto.getO3FirstDays()+" ���"); + vos.add(vo); + } + return vos; + } + + public String getMonth() { + return month; + } + + public void setMonth(String month) { + this.month = month; + } + + public String getAqiComplianceDays() { + return aqiComplianceDays; + } + + public void setAqiComplianceDays(String aqiComplianceDays) { + this.aqiComplianceDays = aqiComplianceDays; + } + + public String getComAqiComplianceDays() { + return comAqiComplianceDays; + } + + public void setComAqiComplianceDays(String comAqiComplianceDays) { + this.comAqiComplianceDays = comAqiComplianceDays; + } + + public String getAqiCompliancePer() { + return aqiCompliancePer; + } + + public void setAqiCompliancePer(String aqiCompliancePer) { + this.aqiCompliancePer = aqiCompliancePer; + } + + public String getComAqiCompliancePer() { + return comAqiCompliancePer; + } + + public void setComAqiCompliancePer(String comAqiCompliancePer) { + this.comAqiCompliancePer = comAqiCompliancePer; + } + + @JsonProperty("PM2_5Days") + public String getPM2_5Days() { + return PM2_5Days; + } + + public void setPM2_5Days(String PM2_5Days) { + this.PM2_5Days = PM2_5Days; + } + + @JsonProperty("PM10Days") + public String getPM10Days() { + return PM10Days; + } + + public void setPM10Days(String PM10Days) { + this.PM10Days = PM10Days; + } + + @JsonProperty("SO2Days") + public String getSO2Days() { + return SO2Days; + } + + public void setSO2Days(String SO2Days) { + this.SO2Days = SO2Days; + } + + @JsonProperty("NO2Days") + public String getNO2Days() { + return NO2Days; + } + + public void setNO2Days(String NO2Days) { + this.NO2Days = NO2Days; + } + + @JsonProperty("CODays") + public String getCODays() { + return CODays; + } + + public void setCODays(String CODays) { + this.CODays = CODays; + } + + @JsonProperty("O3Days") + public String getO3Days() { + return O3Days; + } + + public void setO3Days(String o3Days) { + O3Days = o3Days; + } + + @JsonProperty("PM2_5FirstDays") + public String getPM2_5FirstDays() { + return PM2_5FirstDays; + } + + public void setPM2_5FirstDays(String PM2_5FirstDays) { + this.PM2_5FirstDays = PM2_5FirstDays; + } + + @JsonProperty("PM10FirstDays") + public String getPM10FirstDays() { + return PM10FirstDays; + } + + public void setPM10FirstDays(String PM10FirstDays) { + this.PM10FirstDays = PM10FirstDays; + } + + @JsonProperty("SO2FirstDays") + public String getSO2FirstDays() { + return SO2FirstDays; + } + + public void setSO2FirstDays(String SO2FirstDays) { + this.SO2FirstDays = SO2FirstDays; + } + + @JsonProperty("NO2FirstDays") + public String getNO2FirstDays() { + return NO2FirstDays; + } + + public void setNO2FirstDays(String NO2FirstDays) { + this.NO2FirstDays = NO2FirstDays; + } + + @JsonProperty("COFirstDays") + public String getCOFirstDays() { + return COFirstDays; + } + + public void setCOFirstDays(String COFirstDays) { + this.COFirstDays = COFirstDays; + } + + @JsonProperty("O3FirstDays") + public String getO3FirstDays() { + return O3FirstDays; + } + + public void setO3FirstDays(String o3FirstDays) { + O3FirstDays = o3FirstDays; + } + + public ComplianceDaysVO() { + } +} diff --git a/screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java b/screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java index 6475990..2711271 100644 --- a/screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java +++ b/screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java @@ -2,6 +2,7 @@ import com.moral.api.entity.CityAqiYearly; import com.baomidou.mybatisplus.extension.service.IService; +import com.moral.api.pojo.dto.cityAQI.ComplianceDaysDTO; import com.moral.api.pojo.dto.cityAQI.DataPercentRange; import java.util.Date; @@ -34,4 +35,13 @@ * @Date: 2022/2/11 */ Map<String, DataPercentRange> analysisPollutionLevel(String year, Integer cityCode); + + /** + * @Description: ������������������������ + * @Param: [year, cityCode] + * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.ComplianceDaysDTO> + * @Author: ��������� + * @Date: 2022/2/25 + */ + List<ComplianceDaysDTO> analysisComplianceDays(String year, Integer cityCode); } 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 1fec4d8..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.*; /** @@ -95,6 +100,144 @@ 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��������������������������������� @@ -449,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; + } + + + } 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 4bad0e2..982af88 100644 --- a/screen-common/src/main/java/com/moral/util/AQIUtils.java +++ b/screen-common/src/main/java/com/moral/util/AQIUtils.java @@ -24,6 +24,43 @@ /*���������������������*/ private static Double[] IAQI_Array = new Double[]{0d,50d,100d,150d,200d,300d,400d,500d}; + //������aqi������������ + public static boolean aqiIsStandard(int aqi){ + if(aqi<=100) + return true; + return false; + } + public static boolean PM2_5IsStandard(Double pm2_5){ + if(pm2_5<=75) + return true; + return false; + } + public static boolean PM10IsStandard(Double pm10){ + if(pm10<=150) + return true; + return false; + } + public static boolean SO2IsStandard(Double so2){ + if(so2<=500) + return true; + return false; + } + public static boolean NO2IsStandard(Double no2){ + if(no2<=80) + return true; + return false; + } + public static boolean COIsStandard(Double co){ + if(co<=4) + return true; + return false; + } + public static boolean O3IsStandard(Double o3){ + if(o3<=200) + return true; + return false; + } + /** * @Description: ������AQI��������������������������������������� * @Param: -- Gitblit v1.8.0