package com.moral.api.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.moral.api.entity.CityAqiDaily;
|
import com.moral.api.mapper.CityAqiDailyMapper;
|
import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel;
|
import com.moral.api.pojo.dto.cityAQI.PollutionDaysAndProportion;
|
import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO;
|
import com.moral.api.pojo.form.aqi.QueryChartOfPollutionLevelForm;
|
import com.moral.api.service.CityAqiDailyService;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.moral.constant.Constants;
|
import com.moral.util.AQIUtils;
|
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.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* <p>
|
* 城市aqi日数据表 服务实现类
|
* </p>
|
*
|
* @author moral
|
* @since 2021-11-01
|
*/
|
@Service
|
public class CityAqiDailyServiceImpl extends ServiceImpl<CityAqiDailyMapper, CityAqiDaily> implements CityAqiDailyService {
|
|
@Autowired
|
CityAqiDailyMapper cityAqiDailyMapper;
|
|
@Override
|
public PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(QueryChartOfPollutionLevelForm form) {
|
//取参
|
Integer regionCode = form.getRegionCode();
|
Date startDate = form.getStartDate();
|
Date endDate = form.getEndDate();
|
//查询数据
|
QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>();
|
wrapper.eq("city_code", regionCode);
|
wrapper.between("time", startDate, endDate);
|
List<CityAqiDaily> cityAqiDailies = cityAqiDailyMapper.selectList(wrapper);
|
//取开始结束时间,拼装返回time
|
if (cityAqiDailies.size() == 0)
|
return null;
|
String startTime = DateUtils.dateToDateString(cityAqiDailies.get(0).getTime(), "yyyy-MM-dd");
|
String endTime = DateUtils.dateToDateString(cityAqiDailies.get(cityAqiDailies.size() - 1).getTime(), "yyyy-MM-dd");
|
String time = startTime + " 至 " + endTime;
|
//如果数据的时间有重复则去重
|
Map<String, CityAqiDaily> tmpMap = new HashMap<>();
|
for (CityAqiDaily cityAqiDaily : cityAqiDailies) {
|
String tmpTime = DateUtils.dateToDateString(cityAqiDaily.getTime(), "yyyy-MM-dd");
|
tmpMap.put(tmpTime, cityAqiDaily);
|
}
|
cityAqiDailies = new ArrayList<CityAqiDaily>(tmpMap.values());
|
//统计各污染等级的天数
|
Map<String, Integer> pollutionDaysMap = new LinkedHashMap<>();
|
pollutionDaysMap.put(Constants.EXCELLENT_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.GOOD_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.MILD_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.MIDDLE_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.SERIOUS_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.SERVER_WEATHER_CODE, 0);
|
for (CityAqiDaily cityAqiDaily : cityAqiDailies) {
|
Map<String, Object> valueMap = JSON.parseObject(cityAqiDaily.getValue(), Map.class);
|
if (valueMap.get("AQI") == null)
|
continue;
|
Integer aqi = Integer.valueOf(valueMap.get("AQI").toString());
|
//计算AQI污染等级
|
String pollutionClass = AQIUtils.classCodeOfPollutionByAqi(aqi);
|
Integer days = pollutionDaysMap.get(pollutionClass);
|
pollutionDaysMap.put(pollutionClass, days + 1);
|
}
|
//计算比例
|
List<Map<String, Object>> valueMap = new ArrayList<>();
|
Set<Map.Entry<String, Integer>> entries = pollutionDaysMap.entrySet();
|
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
|
Integer totalDays = 0;
|
while (iterator.hasNext()) {
|
Map.Entry<String, Integer> entry = iterator.next();
|
Map<String, Object> pollutionMap = new HashMap<>();
|
String pollution = entry.getKey();
|
Integer days = entry.getValue();
|
Double proportionTmp = MathUtils.division(Double.valueOf(days), Double.valueOf(cityAqiDailies.size()), 3);
|
Double proportionD = MathUtils.mul(proportionTmp, 100);
|
String proportion = proportionD.toString() + "%";
|
pollutionMap.put("proportion", proportion);
|
pollutionMap.put("pollution", pollution);
|
pollutionMap.put("days", days);
|
valueMap.add(pollutionMap);
|
totalDays += days;
|
}
|
//封装返回对象
|
PieChartOfPollutionLevelVO VO = new PieChartOfPollutionLevelVO();
|
VO.setTime(time);
|
VO.setValues(valueMap);
|
VO.setTotalDays(totalDays);
|
return VO;
|
}
|
|
@Override
|
public List<MonthlyPollutionLevel> queryBarChartOfPollutionLevels(QueryChartOfPollutionLevelForm form) {
|
//取参
|
Integer regionCode = form.getRegionCode();
|
Date startDate = form.getStartDate();
|
Date endDate = form.getEndDate();
|
//查询数据
|
QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>();
|
wrapper.eq("city_code", regionCode);
|
wrapper.between("time", startDate, endDate);
|
wrapper.orderByAsc("time");
|
List<CityAqiDaily> cityAqiDailies = cityAqiDailyMapper.selectList(wrapper);
|
//如果数据的时间有重复则去重
|
Map<String, CityAqiDaily> tmpMap = new LinkedHashMap<>();
|
for (CityAqiDaily cityAqiDaily : cityAqiDailies) {
|
String tmpTime = DateUtils.dateToDateString(cityAqiDaily.getTime(), "yyyy-MM-dd");
|
tmpMap.put(tmpTime, cityAqiDaily);
|
}
|
cityAqiDailies = new ArrayList<CityAqiDaily>(tmpMap.values());
|
//按照月份对数据进行分类
|
Map<String, List<CityAqiDaily>> monthlyDataMap = new LinkedHashMap<>();
|
cityAqiDailies.forEach(value -> {
|
String month = DateUtils.dateToDateString(value.getTime(), "yyyy-MM");
|
List<CityAqiDaily> dataList = monthlyDataMap.get(month);
|
if (ObjectUtils.isEmpty(dataList))
|
dataList = new ArrayList<>();
|
dataList.add(value);
|
monthlyDataMap.put(month, dataList);
|
});
|
//计算污染天数和比例
|
List<MonthlyPollutionLevel> monthlyPollutionLevels = new ArrayList<>();
|
Set<Map.Entry<String, List<CityAqiDaily>>> monthlyEntries = monthlyDataMap.entrySet();
|
Iterator<Map.Entry<String, List<CityAqiDaily>>> monthlyIterator = monthlyEntries.iterator();
|
while(monthlyIterator.hasNext()){
|
Map.Entry<String, List<CityAqiDaily>> monthlyEntry = monthlyIterator.next();
|
List<CityAqiDaily> monthlyValues = monthlyEntry.getValue();
|
//用于统计各个污染等级的天数
|
Map<String, Integer> pollutionDaysMap = new LinkedHashMap<>();
|
pollutionDaysMap.put(Constants.EXCELLENT_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.GOOD_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.MILD_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.MIDDLE_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.SERIOUS_WEATHER_CODE, 0);
|
pollutionDaysMap.put(Constants.SERVER_WEATHER_CODE, 0);
|
for (CityAqiDaily cityAqiDaily : monthlyValues) {
|
Map<String, Object> valueMap = JSON.parseObject(cityAqiDaily.getValue(), Map.class);
|
if (valueMap.get("AQI") == null)
|
continue;
|
Integer aqi = Integer.valueOf(valueMap.get("AQI").toString());
|
//计算AQI污染等级
|
String pollutionClass = AQIUtils.classCodeOfPollutionByAqi(aqi);
|
Integer days = pollutionDaysMap.get(pollutionClass);
|
pollutionDaysMap.put(pollutionClass, days + 1);
|
}
|
|
//计算比例
|
List<PollutionDaysAndProportion> pollutionDaysAndProportions = new ArrayList<>();
|
Set<Map.Entry<String, Integer>> entries = pollutionDaysMap.entrySet();
|
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
|
while (iterator.hasNext()) {
|
Map.Entry<String, Integer> entry = iterator.next();
|
String pollution = entry.getKey();
|
Integer days = entry.getValue();
|
Double proportionTmp = MathUtils.division(Double.valueOf(days), Double.valueOf(monthlyValues.size()), 3);
|
Double proportionD = MathUtils.mul(proportionTmp, 100);
|
String proportion = proportionD.toString() + "%";
|
PollutionDaysAndProportion pollutionDaysAndProportion = new PollutionDaysAndProportion();
|
pollutionDaysAndProportion.setDays(days);
|
pollutionDaysAndProportion.setPollutionLevel(pollution);
|
pollutionDaysAndProportion.setProportion(proportion);
|
pollutionDaysAndProportions.add(pollutionDaysAndProportion);
|
}
|
//封装返回对象
|
MonthlyPollutionLevel monthlyPollutionLevel = new MonthlyPollutionLevel();
|
monthlyPollutionLevel.setPollutionDaysAndProportions(pollutionDaysAndProportions);
|
monthlyPollutionLevel.setTime(monthlyEntry.getKey());
|
monthlyPollutionLevels.add(monthlyPollutionLevel);
|
}
|
return monthlyPollutionLevels;
|
}
|
|
|
}
|