screen-api/src/main/java/com/moral/api/controller/AqiController.java
@@ -1,6 +1,7 @@ package com.moral.api.controller; import com.moral.api.pojo.dto.dataDisplay.PollutionLevelProportionDTO; import com.moral.api.pojo.dto.dataDisplay.PieChartOfPollutionLevelDTO; import com.moral.api.pojo.form.aqi.QueryPieChartOfPollutionLevelForm; import com.moral.api.service.CityAqiDailyService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -87,9 +88,21 @@ return ResultMessage.ok(datas); } @GetMapping("queryPollutionLevelsForThisYear") public ResultMessage queryPollutionLevelsForThisYear(Integer regionCode){ PollutionLevelProportionDTO dto = cityAqiDailyService.queryPollutionLevelsForThisYear(regionCode); /** * @Description: 首页右下角,污染天数占比的饼状图 * @Param: [regionCode] * @return: com.moral.constant.ResultMessage * @Author: 陈凯裕 * @Date: 2021/11/11 */ @GetMapping("queryPieChartOfPollutionLevel") public ResultMessage queryPieChartOfPollutionLevel(QueryPieChartOfPollutionLevelForm form){ //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); PieChartOfPollutionLevelDTO dto = cityAqiDailyService.queryPieChartOfPollutionLevels(form); return ResultMessage.ok(dto); } screen-api/src/main/java/com/moral/api/pojo/dto/dataDisplay/PieChartOfPollutionLevelDTO.java
File was renamed from screen-api/src/main/java/com/moral/api/pojo/dto/dataDisplay/PollutionLevelProportionDTO.java @@ -13,7 +13,7 @@ * @Version TODO **/ @Data public class PollutionLevelProportionDTO { public class PieChartOfPollutionLevelDTO { /*时间格式yyyy-MM-dd 至 yyyy-MM-dd*/ private String time; screen-api/src/main/java/com/moral/api/pojo/form/aqi/QueryPieChartOfPollutionLevelForm.java
New file @@ -0,0 +1,50 @@ package com.moral.api.pojo.form.aqi; import com.fasterxml.jackson.annotation.JsonFormat; import com.moral.util.DateUtils; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * @ClassName QueryPollutionLevelsForPieChartFrom * @Description TODO * @Author 陈凯裕 * @Date 2021/11/11 8:37 * @Version TODO **/ @Data public class QueryPieChartOfPollutionLevelForm { /* * 地区码 必传 * */ Integer regionCode; /* * 自定义开始时间 * 非必传,当不传的时候默认获取今年的数据 * */ @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") Date startDate; /* * 自定义结束时间 * */ @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") Date endDate; public boolean valid(){ if(regionCode==null) return false; //如果没有自定义时间,则开始时间设定为今年第一天,结束时间设定为昨天 if(startDate==null||endDate==null){ startDate = DateUtils.getFirstDayOfCurrYear(); endDate = DateUtils.getYesterdayDate(); } return true; } } screen-api/src/main/java/com/moral/api/service/CityAqiDailyService.java
@@ -2,7 +2,8 @@ import com.moral.api.entity.CityAqiDaily; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.dataDisplay.PollutionLevelProportionDTO; import com.moral.api.pojo.dto.dataDisplay.PieChartOfPollutionLevelDTO; import com.moral.api.pojo.form.aqi.QueryPieChartOfPollutionLevelForm; /** * <p> @@ -15,12 +16,12 @@ public interface CityAqiDailyService extends IService<CityAqiDaily> { /** * @Description: 查询今年各种污染等级的占比以及天数 * @Description: 查询污染等级的饼状图,包括天数,占比 * @Param: [regionCode] * @return: com.moral.api.pojo.dto.dataDisplay.PollutionLevelProportionDTO * @Author: 陈凯裕 * @Date: 2021/11/9 */ PollutionLevelProportionDTO queryPollutionLevelsForThisYear(Integer regionCode); PieChartOfPollutionLevelDTO queryPieChartOfPollutionLevels(QueryPieChartOfPollutionLevelForm form); } screen-api/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -4,9 +4,11 @@ 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.dataDisplay.PollutionLevelProportionDTO; import com.moral.api.pojo.dto.dataDisplay.PieChartOfPollutionLevelDTO; import com.moral.api.pojo.form.aqi.QueryPieChartOfPollutionLevelForm; 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; @@ -30,10 +32,11 @@ CityAqiDailyMapper cityAqiDailyMapper; @Override public PollutionLevelProportionDTO queryPollutionLevelsForThisYear(Integer regionCode) { //获取时间 今年第一天 至 Date startDate = DateUtils.getFirstDayOfCurrYear(); Date endDate = DateUtils.getYesterdayDate(); public PieChartOfPollutionLevelDTO queryPieChartOfPollutionLevels(QueryPieChartOfPollutionLevelForm form) { //取参 Integer regionCode = form.getRegionCode(); Date startDate = form.getStartDate(); Date endDate = form.getEndDate(); //查询数据 QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); wrapper.eq("city_code",regionCode); @@ -45,7 +48,7 @@ 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"); @@ -53,20 +56,22 @@ } cityAqiDailies = new ArrayList<CityAqiDaily>(tmpMap.values()); //统计各污染等级的天数 Map<String,Integer> pollutionDaysMap = new HashMap<>(); 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.classOfPollutionByAqi(aqi); String pollutionClass = AQIUtils.classCodeOfPollutionByAqi(aqi); Integer days = pollutionDaysMap.get(pollutionClass); if(days==null){ pollutionDaysMap.put(pollutionClass,1); }else{ pollutionDaysMap.put(pollutionClass,days+1); } } //计算比例 List<Map<String,Object>> valueMap = new ArrayList<>(); @@ -78,15 +83,15 @@ String pollution = entry.getKey(); Integer days = entry.getValue(); Double proportionTmp = MathUtils.division(Double.valueOf(days),Double.valueOf(cityAqiDailies.size()),3); Double proprtionD = MathUtils.mul(proportionTmp,100); String proportion = proprtionD.toString()+"%"; 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); } //封装返回对象 PollutionLevelProportionDTO dto = new PollutionLevelProportionDTO(); PieChartOfPollutionLevelDTO dto = new PieChartOfPollutionLevelDTO(); dto.setTime(time); dto.setValues(valueMap); return dto;