kaiyu
2022-02-25 a0224894fcc89500a701f39ccaf4322a03231ff6
screen-api
增加达标天数分析接口
2 files added
4 files modified
532 ■■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/AqiController.java 27 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/ComplianceDaysDTO.java 55 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/ComplianceDaysVO.java 246 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiYearlyService.java 10 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java 157 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/AQIUtils.java 37 ●●●●● 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: