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/service/impl/CityAqiYearlyServiceImpl.java | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 157 insertions(+), 0 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 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; + } + + + } -- Gitblit v1.8.0