From 239927b057f65a040594f7a4cb08c8881b303797 Mon Sep 17 00:00:00 2001
From: cjl <276999030@qq.com>
Date: Fri, 18 Aug 2023 14:52:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/cjl-230812' into cjl-230812
---
screen-api/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java | 223 ++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 193 insertions(+), 30 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 3917c5d..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;
@@ -178,20 +327,20 @@
//������������������
DataPercentRange pm2_5 = new DataPercentRange();
pm2_5.setConcentration(concentration.get("PM2_5").intValue() + " ��g/m��");
- DataPercentRange PM2_5 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "PM2_5", 0, "��g/m");
- DataPercentRange PM10 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "PM10", 0, "��g/m");
- DataPercentRange SO2 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "SO2", 0, "��g/m");
- DataPercentRange NO2 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "NO2", 0, "��g/m");
- 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 PM2_5 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "PM2_5", 0, "��g/m��");
+ DataPercentRange PM10 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "PM10", 0, "��g/m��");
+ DataPercentRange SO2 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "SO2", 0, "��g/m��");
+ DataPercentRange NO2 = packageSixParam(concentration, compareResult, provinceRangeResult, twentyEightRangeResult, provinceChannelRangeResult, "NO2", 0, "��g/m��");
+ 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