screen-api/src/main/java/com/moral/api/controller/AqiController.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
screen-common/src/main/java/com/moral/util/AQIUtils.java | ●●●●● patch | view | raw | blame | history |
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)); } } screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java
New file @@ -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; } screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java
New file @@ -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() { } } 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); } 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; } } 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: