package com.moral.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.config.properties.BulletinProperties;
import com.moral.api.config.properties.SpecialCitiesProperties;
import com.moral.api.entity.CityAqiDaily;
import com.moral.api.entity.CityAqiMonthly;
import com.moral.api.entity.CityAqiYearly;
import com.moral.api.entity.SysArea;
import com.moral.api.mapper.CityAqiDailyMapper;
import com.moral.api.mapper.CityAqiMonthlyMapper;
import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel;
import com.moral.api.pojo.dto.cityAQI.ConcentrationAndPercent;
import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel;
import com.moral.api.pojo.dto.cityAQI.PollutionDaysAndProportion;
import com.moral.api.pojo.form.aqi.*;
import com.moral.api.pojo.vo.cityAQI.CityAreaRangeVO;
import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO;
import com.moral.api.service.CityAqiDailyService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.service.CityAqiMonthlyService;
import com.moral.api.service.CityAqiYearlyService;
import com.moral.api.service.SysAreaService;
import com.moral.constant.Constants;
import com.moral.util.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* 城市aqi日数据表 服务实现类
*
*
* @author moral
* @since 2021-11-01
*/
@Service
public class CityAqiDailyServiceImpl extends ServiceImpl implements CityAqiDailyService {
@Autowired
CityAqiDailyMapper cityAqiDailyMapper;
@Autowired
SysAreaService sysAreaService;
@Autowired
SpecialCitiesProperties specialCitiesProperties;
@Autowired
BulletinProperties bulletinProperties;
@Autowired
CityAqiMonthlyService cityAqiMonthlyService;
@Autowired
CityAqiYearlyService cityAqiYearlyService;
@Override
public List getCityAqiDailyByRegionCodeAndTime(Integer regionCode, Date startDate, Date endDate) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("city_code", regionCode);
queryWrapper.between("time", startDate, endDate);
return cityAqiDailyMapper.selectList(queryWrapper);
}
@Override
public PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(ChartOfPollutionLevelForm form) {
//取参
Integer regionCode = form.getRegionCode();
Date startDate = form.getStartDate();
Date endDate = form.getEndDate();
//查询数据
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("city_code", regionCode);
wrapper.between("time", startDate, endDate);
List 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 tmpMap = new HashMap<>();
for (CityAqiDaily cityAqiDaily : cityAqiDailies) {
String tmpTime = DateUtils.dateToDateString(cityAqiDaily.getTime(), "yyyy-MM-dd");
tmpMap.put(tmpTime, cityAqiDaily);
}
cityAqiDailies = new ArrayList(tmpMap.values());
//统计各污染等级的天数
Map 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 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