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;
import com.moral.api.entity.CityAqiDaily;
import com.moral.api.entity.CityAqiYearly;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* 城市aqi年数据表 服务实现类
*
*
* @author moral
* @since 2021-11-05
*/
@Service
public class CityAqiYearlyServiceImpl extends ServiceImpl implements CityAqiYearlyService {
@Autowired
CityAqiYearlyMapper cityAqiYearlyMapper;
@Autowired
SpecialCitiesProperties specialCitiesProperties;
@Autowired
SysAreaService sysAreaService;
@Autowired
CityAqiDailyService cityAqiDailyService;
@Override
public List getCityAqiYearlyByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("city_code", regionCode);
queryWrapper.between("time", startDate, endDate);
return cityAqiYearlyMapper.selectList(queryWrapper);
}
@Override
public Map analysisPollutionLevel(String year, Integer cityCode) {
//判断是否为今年,如果是今年则使用日数据进行查询,否则使用年数据
boolean thisYear = isThisYear(year);
//获取开始结束时间
Date yearDate = DateUtils.getDate(year, "yyyy");
Date startDate = DateUtils.getFirstDayOfYear(yearDate);
Date endDate;
if (thisYear)
endDate = DateUtils.addDays(new Date(), -1);
else
endDate = DateUtils.getLastDayOfYear(yearDate);
//判断是否属于2+26城市
List twentyEightCities = null;
if (specialCitiesProperties.isTwentyEightCities(cityCode))
twentyEightCities = specialCitiesProperties.getTwentyEightCities();
//判断是否属于河北通道城市
List heBeiEightCities = null;
if (specialCitiesProperties.isHeBeiEightCities(cityCode))
heBeiEightCities = specialCitiesProperties.getHeBeiEightCities();
//获取市所在省的所有城市
//如果是直辖市则不需要排名
List cities = null;
if (!cityCode.toString().substring(2).equals("0000")) {
String provinceCode = cityCode.toString().substring(0, 2) + "0000";
cities = sysAreaService.getChildren(Integer.parseInt(provinceCode));
}
//获取城市
SysArea city = sysAreaService.getAreaByCode(cityCode);
//计算优良天数
DataPercentRange fineDays = calculateFineDays(cities, twentyEightCities, heBeiEightCities, startDate, endDate, city);
//计算6参以及综合指数排名
Map sixParamMap = calculateSixParam(thisYear, startDate, endDate, city, cities, twentyEightCities, heBeiEightCities);
Map result = new HashMap<>();
if (fineDays != null)
result.put("fineDays", fineDays);
if (sixParamMap != null)
result.putAll(sixParamMap);
if (result.size() == 0)
return null;
return result;
}
@Override
public List analysisComplianceDays(String year, Integer cityCode) {
List 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 posYearDatas = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(cityCode, posYearStartDate, posYearEndDate);
List 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 posYearDatas,
List comYearDatas,
int month){
ComplianceDaysDTO dto = new ComplianceDaysDTO();
//取出指定月份数据
List posMonthDatas = new ArrayList<>();
List 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 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 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 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城市,省内通道的排名。
private DataPercentRange calculateFineDays(List provinceCities,
List twentyEightCities,
List heBeiEightCities,
Date startDate,
Date endDate,
SysArea city) {
DataPercentRange dataPercentRange = new DataPercentRange();
//查询优良天气数
CityPollutionLevel cityPollutionLevel = cityAqiDailyService.calculateDaysByTimeAndSysArea(city, startDate, endDate);
if (cityPollutionLevel == null)
return null;
Integer fineDays = cityPollutionLevel.getExcellentWeatherDays() + cityPollutionLevel.getGoodWeatherDays();
//计算同比数据
Date compareStartDate = DateUtils.addMonths(startDate, -12);
Date compareEndDate = DateUtils.addMonths(endDate, -12);
CityPollutionLevel cityPollutionLevelCompare = cityAqiDailyService.calculateDaysByTimeAndSysArea(city, compareStartDate, compareEndDate);
String percent = null;
if (cityPollutionLevelCompare != null) {
Integer compareFineDays = cityPollutionLevelCompare.getExcellentWeatherDays() + cityPollutionLevelCompare.getGoodWeatherDays();
Integer percentInt = fineDays - compareFineDays;
if (percentInt > 0) {
percent = "+" + percentInt + " 天";
} else {
percent = percentInt + " 天";
}
}
//计算省内排名
Integer provinceRange = null;
if (provinceCities != null)
provinceRange = calculateFineDaysRange(provinceCities, city, startDate, endDate);
//计算2+26城市排名
Integer twentyEightRange = null;
if (twentyEightCities != null)
twentyEightRange = calculateFineDaysRange(twentyEightCities, city, startDate, endDate);
//计算河北省内通道排名
Integer provinceChannelRange = null;
if (heBeiEightCities != null)
provinceChannelRange = calculateFineDaysRange(heBeiEightCities, city, startDate, endDate);
dataPercentRange.setConcentration(fineDays + " 天");
dataPercentRange.setProvinceChannelRange(provinceChannelRange);
dataPercentRange.setTwentyEightCitiesRange(twentyEightRange);
dataPercentRange.setProvinceRange(provinceRange);
dataPercentRange.setPercent(percent);
return dataPercentRange;
}
//计算六参以及综指平均浓度以及同比数据和排名情况
private Map calculateSixParam(boolean thisYear,
Date startDate,
Date endDate,
SysArea city,
List provinceCities,
List twentyEightCities,
List heBeiEightCities) {
Integer cityCode = city.getAreaCode();
Map result = new HashMap<>();
//查询平均浓度,判断是否为今年,如果不是今年则用年数据进行计算,是今年则用天数据进行计算
Map concentration = getConcentration(thisYear, startDate, endDate, cityCode);
if (concentration == null)
return null;
//查询同比数据
Date compareStartDate = DateUtils.addMonths(startDate, -12);
Date compareEndDate = DateUtils.addMonths(endDate, -12);
Map compareCentration = getConcentration(thisYear, compareStartDate, compareEndDate, cityCode);
//计算6参以及综指同比结果
Map compareResult = null;
if (compareCentration != null)
compareResult = calculateSixParamYOY(concentration, compareCentration);
//计算省内排名
Map provinceRangeResult = null;
if (provinceCities != null)
provinceRangeResult = sixParamRange(provinceCities, city, startDate, endDate, thisYear);
//计算2+26排名
Map twentyEightRangeResult = null;
if (twentyEightCities != null)
twentyEightRangeResult = sixParamRange(twentyEightCities, city, startDate, endDate, thisYear);
//计算省内通道排名
Map provinceChannelRangeResult = null;
if (heBeiEightCities != null)
provinceChannelRangeResult = sixParamRange(heBeiEightCities, city, startDate, endDate, thisYear);
//封装返回数据
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 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);
return result;
}
//打包六参以及综合指数数据对象
private DataPercentRange packageSixParam(Map concentration,//对应浓度/天数
Map compareResult,//同比结果
Map provinceRange,//省内排名
Map twentyEightRange,//2+26排名
Map heBeiEightCitiesRange,//省内通道排名
String sensor,//因子
int decimal,//保留小数位
String unit)//单位
{
DataPercentRange data = new DataPercentRange();
if (decimal == 0)
data.setConcentration(concentration.get(sensor).intValue() + " " + unit);
else
data.setConcentration(AmendUtils.sciCal(concentration.get(sensor), decimal) + " " + unit);
if (compareResult != null)
data.setPercent(compareResult.get(sensor));
if (provinceRange != null)
data.setProvinceRange(provinceRange.get(sensor));
if (twentyEightRange != null)
data.setTwentyEightCitiesRange(twentyEightRange.get(sensor));
if (heBeiEightCitiesRange != null)
data.setProvinceChannelRange(heBeiEightCitiesRange.get(sensor));
return data;
}
//计算六参和综合指数排名
private Map sixParamRange(List cities, SysArea posCity, Date startDate, Date endDate, boolean thisYear) {
Map pm2_5Map = new HashMap<>();
Map pm10Map = new HashMap<>();
Map so2Map = new HashMap<>();
Map no2Map = new HashMap<>();
Map o3Map = new HashMap<>();
Map coMap = new HashMap<>();
Map compositeIndexMap = new HashMap<>();
for (SysArea city : cities) {
Map concentration = getConcentration(thisYear, startDate, endDate, city.getAreaCode());
if (concentration == null)
continue;
Object pm2_5o = concentration.get("PM2_5");
pm2_5Map.put(city.getAreaCode().toString(), Double.valueOf(pm2_5o.toString()));
Object pm10o = concentration.get("PM10");
pm10Map.put(city.getAreaCode().toString(), Double.valueOf(pm10o.toString()));
Object so2o = concentration.get("SO2");
so2Map.put(city.getAreaCode().toString(), Double.valueOf(so2o.toString()));
Object no2o = concentration.get("NO2");
no2Map.put(city.getAreaCode().toString(), Double.valueOf(no2o.toString()));
Object o3o = concentration.get("O3");
o3Map.put(city.getAreaCode().toString(), Double.valueOf(o3o.toString()));
Object coo = concentration.get("CO");
coMap.put(city.getAreaCode().toString(), Double.valueOf(coo.toString()));
Object concentrationo = concentration.get("compositeIndex");
compositeIndexMap.put(city.getAreaCode().toString(), Double.valueOf(concentrationo.toString()));
}
Map result = new HashMap<>();
result.put("PM2_5", rangeMap(pm2_5Map, posCity.getAreaCode().toString()));
result.put("SO2", rangeMap(so2Map, posCity.getAreaCode().toString()));
result.put("NO2", rangeMap(no2Map, posCity.getAreaCode().toString()));
result.put("CO", rangeMap(coMap, posCity.getAreaCode().toString()));
result.put("O3", rangeMap(o3Map, posCity.getAreaCode().toString()));
result.put("PM10", rangeMap(pm10Map, posCity.getAreaCode().toString()));
result.put("compositeIndex", rangeMap(compositeIndexMap, posCity.getAreaCode().toString()));
return result;
}
//根域map的value进行升序排序,获取排名
private Integer rangeMap(Map map, String cityCode) {
Set> entries = map.entrySet();
List> list = new ArrayList<>(entries);
list.sort(Comparator.comparing(value -> value.getValue()));
for (Map.Entry entry : list) {
if (cityCode.equals(entry.getKey()))
return list.indexOf(entry) + 1;
}
return null;
}
//计算六参和综合指数同期对比结果
private Map calculateSixParamYOY(Map dataMap, Map compareDataMap) {
Map result = new HashMap<>();
Double pm2_5 = calculateSensorYOY(dataMap, compareDataMap, "PM2_5");
if (pm2_5 != null)
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() > 0 ? "+" + pm10.intValue() + " μg/m³" : pm10.intValue() + " μg/m³");
Double so2 = calculateSensorYOY(dataMap, compareDataMap, "SO2");
if (so2 != null)
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() > 0 ? "+" + no2.intValue() + " μg/m³" : no2.intValue() + " μg/m³");
Double o3 = calculateSensorYOY(dataMap, compareDataMap, "O3");
if (o3 != null)
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.intValue() > 0 ? "+" + co.intValue() + " mg/m³" : co.intValue() + " mg/m³");
}
//计算综合指数同比数据
Object compositeIndexO = dataMap.get("compositeIndex");
Object compareCompositeIndexO = compareDataMap.get("compositeIndex");
Double compositeIndex = Double.valueOf(compositeIndexO.toString());
Double compareCompositeIndex = Double.valueOf(compareCompositeIndexO.toString());
if (compositeIndex != null && compareCompositeIndex != null) {
Double compareResult = MathUtils.division(compositeIndex - compareCompositeIndex, compareCompositeIndex, 3);
compareResult = MathUtils.mul(compareResult, 100);
result.put("compositeIndex", compareResult > 0 ? "+" + compareResult + " %" : compareResult + " %");
}
if (result.size() != 7)
return null;
return result;
}
//计算单因子同比结果
private Double calculateSensorYOY(Map dataMap, Map compareDataMap, String sensor) {
Object dataO = dataMap.get(sensor);
Double data = Double.valueOf(dataO.toString());
Object cdataO = compareDataMap.get(sensor);
Double compareData = Double.valueOf(cdataO.toString());
if (data != null && compareData != null)
return data - compareData;
return null;
}
//获取城市对应时间的6参以及综合指数均值
private Map getConcentration(boolean thisYear, Date startDate, Date endDate, Integer cityCode) {
if (thisYear) {
List cityAqiDailies = cityAqiDailyService.getCityAqiDailyByRegionCodeAndTime(cityCode, startDate, endDate);
if (ObjectUtils.isEmpty(cityAqiDailies))
return null;
return calculate6ParamAvg(cityAqiDailies);
} else {
List cityAqiYearlies = getCityAqiYearlyByRegionCodeAndTime(cityCode, startDate, endDate);
if (ObjectUtils.isEmpty(cityAqiYearlies))
return null;
CityAqiYearly cityAqiYearly = cityAqiYearlies.get(0);
return JSON.parseObject(cityAqiYearly.getValue(), Map.class);
}
}
//计算6参以及综合指数平均值
private Map calculate6ParamAvg(List cityAqiList) {
Double co = calculatePercent(cityAqiList, "CO", 95);
Double pm2_5 = calculateSensorAvg(cityAqiList, "PM2_5");
Double pm10 = calculateSensorAvg(cityAqiList, "PM10");
Double so2 = calculateSensorAvg(cityAqiList, "SO2");
Double no2 = calculateSensorAvg(cityAqiList, "NO2");
Double o3 = calculatePercent(cityAqiList, "O3", 90);
Double compositeIndex = calculateSensorAvg(cityAqiList, "compositeIndex");
Map result = new HashMap<>();
result.put("CO", co);
result.put("NO2", no2);
result.put("SO2", so2);
result.put("O3", o3);
result.put("PM2_5", pm2_5);
result.put("PM10", pm10);
result.put("compositeIndex", compositeIndex);
return result;
}
//计算因子的平均值
private Double calculateSensorAvg(List cityAqiList, String sensor) {
Double sum = 0d;
int num = 0;
for (CityAqiDaily cityAqi : cityAqiList) {
String value = cityAqi.getValue();
if (value == null)
continue;
Map valueMap = JSON.parseObject(value, Map.class);
Object sensorValueObject = valueMap.get(sensor);
if (sensorValueObject == null)
continue;
Double sensorValue = Double.valueOf(sensorValueObject.toString());
sum = MathUtils.add(sum, sensorValue);
num++;
}
if (num == 0)
return null;
Double avg = MathUtils.division(sum, num, 2);
return avg;
}
//计算百分位
private Double calculatePercent(List cityAqiList, String sensor, int percent) {
List datas = new ArrayList<>();
for (CityAqiDaily cityAqi : cityAqiList) {
String value = cityAqi.getValue();
if (value == null)
continue;
Map valueMap = JSON.parseObject(value, Map.class);
Object sensorValueObject = valueMap.get(sensor);
if (sensorValueObject == null)
continue;
Double sensorValue = Double.valueOf(sensorValueObject.toString());
datas.add(sensorValue);
}
if (datas.size() == 0)
return null;
datas.sort(Comparator.comparing(value -> value));
Double avg = AmendUtils.percentile(datas, percent);
return avg;
}
//计算优良天数排名
private Integer calculateFineDaysRange(List cities, SysArea posCity, Date startDate, Date endDate) {
List result = new ArrayList<>();
for (SysArea city : cities) {
CityPollutionLevel cityPollutionLevel = cityAqiDailyService.calculateDaysByTimeAndSysArea(city, startDate, endDate);
result.add(cityPollutionLevel);
}
//排序
result.sort(Comparator.comparing(value -> value.getGoodWeatherDays() + value.getExcellentWeatherDays()));
//倒序排名
Collections.reverse(result);
for (CityPollutionLevel value : result) {
if (value.getRegionName().equals(posCity.getAreaName()))
return result.indexOf(value);
}
return null;
}
//判断是否为今年
private boolean isThisYear(String year) {
return DateUtils.dateToDateString(new Date(), "yyyy").equals(year);
}
//查询数据集合最大月份
private int maxMonth( List datas){
int i = 0;
for (CityAqiDaily data : datas) {
Date time = data.getTime();
int month = DateUtils.getMonth(time);
if(month>i)
i = month;
}
return i;
}
}