screen-api/src/main/java/com/moral/api/controller/AqiController.java
@@ -1,9 +1,10 @@ package com.moral.api.controller; import com.moral.api.pojo.dto.cityAQI.BarChartOfPollutionLevelVO; import com.moral.api.pojo.dto.cityAQI.BarChartTableOfPollutionLevelVO; import com.moral.api.pojo.dto.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.QueryPieChartOfPollutionLevelForm; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.vo.cityAQI.BarChartOfPollutionLevelVO; import com.moral.api.pojo.vo.cityAQI.BarChartTableOfPollutionLevelVO; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.QueryChartOfPollutionLevelForm; import com.moral.api.service.CityAqiDailyService; import io.swagger.annotations.Api; @@ -98,7 +99,7 @@ * @Date: 2021/11/11 */ @GetMapping("queryPieChartOfPollutionLevel") public ResultMessage queryPieChartOfPollutionLevel(QueryPieChartOfPollutionLevelForm form) { public ResultMessage queryPieChartOfPollutionLevel(QueryChartOfPollutionLevelForm form) { //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), @@ -108,213 +109,33 @@ return ResultMessage.ok(VO); } @GetMapping("test1") public ResultMessage test1(){ List<PieChartOfPollutionLevelVO> dtos = new ArrayList<>(); PieChartOfPollutionLevelVO dto = new PieChartOfPollutionLevelVO(); dto.setTime("2021-11"); dto.setTotalDays(10); List<Map<String,Object>> list = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); map.put("proportion","40%"); map.put("days",4); map.put("pollution",0); list.add(map); Map<String,Object> map1 = new HashMap<>(); map1.put("proportion","30%"); map1.put("days",3); map1.put("pollution",1); list.add(map1); Map<String,Object> map2 = new HashMap<>(); map2.put("proportion","30%"); map2.put("days",3); map2.put("pollution",2); list.add(map2); Map<String,Object> map3 = new HashMap<>(); map3.put("proportion","0%"); map3.put("days",0); map3.put("pollution",3); list.add(map3); Map<String,Object> map4 = new HashMap<>(); map4.put("proportion","0%"); map4.put("days",0); map4.put("pollution",4); list.add(map4); Map<String,Object> map5 = new HashMap<>(); map5.put("proportion","0%"); map5.put("days",0); map5.put("pollution",5); list.add(map5); dto.setValues(list); PieChartOfPollutionLevelVO dto1 = new PieChartOfPollutionLevelVO(); dto1.setTime("2021-11"); List<Map<String,Object>> list1 = new ArrayList<>(); Map<String,Object> map11 = new HashMap<>(); map11.put("proportion","40%"); map11.put("days",4); map11.put("pollution",0); list1.add(map11); Map<String,Object> map12 = new HashMap<>(); map12.put("proportion","30%"); map12.put("days",3); map12.put("pollution",1); list1.add(map12); Map<String,Object> map13 = new HashMap<>(); map13.put("proportion","30%"); map13.put("days",3); map13.put("pollution",2); list1.add(map13); Map<String,Object> map14 = new HashMap<>(); map14.put("proportion","0%"); map14.put("days",0); map14.put("pollution",3); list1.add(map14); Map<String,Object> map15 = new HashMap<>(); map15.put("proportion","0%"); map15.put("days",0); map15.put("pollution",4); list1.add(map15); Map<String,Object> map16 = new HashMap<>(); map16.put("proportion","0%"); map16.put("days",0); map16.put("pollution",5); list1.add(map16); dto1.setValues(list1); dto1.setTotalDays(10); dtos.add(dto); dtos.add(dto1); return ResultMessage.ok(dtos); } @GetMapping("queryBarChartOfPollutionLevel") public ResultMessage queryBarChartOfPollutionLevel(){ BarChartOfPollutionLevelVO dto = new BarChartOfPollutionLevelVO(); List<String> time = new ArrayList<>(); time.add("2021-10"); time.add("2021-11"); List<Map<String,Object>> values = new ArrayList<>(); Map<String,Object> map1 = new HashMap<>(); map1.put("pollution",0); List<Integer> days1 = new ArrayList<>(); days1.add(4); days1.add(6); List<String> proportion1 = new ArrayList<>(); proportion1.add("40%"); proportion1.add("60%"); map1.put("days",days1); map1.put("proportion",proportion1); Map<String,Object> map2 = new HashMap<>(); map2.put("pollution",1); List<Integer> days2 = new ArrayList<>(); days2.add(1); days2.add(0); List<String> proportion2 = new ArrayList<>(); proportion2.add("10%"); proportion2.add("0%"); map2.put("days",days2); map2.put("proportion",proportion2); Map<String,Object> map3 = new HashMap<>(); map3.put("pollution",2); List<Integer> days3 = new ArrayList<>(); days3.add(1); days3.add(0); List<String> proportion3 = new ArrayList<>(); proportion3.add("10%"); proportion3.add("0%"); map3.put("days",days3); map3.put("proportion",proportion3); Map<String,Object> map4 = new HashMap<>(); map4.put("pollution",3); List<Integer> days4 = new ArrayList<>(); days4.add(2); days4.add(2); List<String> proportion4 = new ArrayList<>(); proportion4.add("20%"); proportion4.add("20%"); map4.put("days",days4); map4.put("proportion",proportion4); Map<String,Object> map5 = new HashMap<>(); map5.put("pollution",4); List<Integer> days5 = new ArrayList<>(); days5.add(2); days5.add(2); List<String> proportion5 = new ArrayList<>(); proportion5.add("20%"); proportion5.add("20%"); map5.put("days",days5); map5.put("proportion",proportion5); Map<String,Object> map6 = new HashMap<>(); map6.put("pollution",5); List<Integer> days6 = new ArrayList<>(); days6.add(0); days6.add(0); List<String> proportion6 = new ArrayList<>(); proportion6.add("0%"); proportion6.add("0%"); map6.put("days",days6); map6.put("proportion",proportion6); values.add(map1); values.add(map2); values.add(map3); values.add(map4); values.add(map5); values.add(map6); dto.setTime(time); dto.setValues(values); return ResultMessage.ok(dto); public ResultMessage queryBarChartOfPollutionLevel(QueryChartOfPollutionLevelForm form){ //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //查询数据 List<MonthlyPollutionLevel> datas = cityAqiDailyService.queryBarChartOfPollutionLevels(form); //数据格式转换 BarChartOfPollutionLevelVO vo = BarChartOfPollutionLevelVO.convert(datas); return ResultMessage.ok(vo); } @GetMapping("queryBarChatTableOfPollutionLevel") public ResultMessage queryBarChatTableOfPollutionLevel(){ public ResultMessage queryBarChatTableOfPollutionLevel(QueryChartOfPollutionLevelForm form){ //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //查询数据 List<MonthlyPollutionLevel> datas = cityAqiDailyService.queryBarChartOfPollutionLevels(form); List<BarChartTableOfPollutionLevelVO> vos = new ArrayList<>(); BarChartTableOfPollutionLevelVO vo1 = new BarChartTableOfPollutionLevelVO(); BarChartTableOfPollutionLevelVO vo2 = new BarChartTableOfPollutionLevelVO(); vo1.setExcellent("4(40%)"); vo1.setGood("1(10%)"); vo1.setMild("1(10%)"); vo1.setMiddle("2(20%)"); vo1.setSerious("2(20%)"); vo1.setServer("0(0%)"); vo1.setTotal("10(100%)"); vo1.setTime("2021年10月"); vo2.setExcellent("6(60%)"); vo2.setGood("0(0%)"); vo2.setMild("0(0%)"); vo2.setMiddle("2(20%)"); vo2.setSerious("2(20%)"); vo2.setServer("0(0%)"); vo2.setTotal("10(100%)"); vo2.setTime("2021年11月"); vos.add(vo1); vos.add(vo2); for (MonthlyPollutionLevel data : datas) { BarChartTableOfPollutionLevelVO vo = BarChartTableOfPollutionLevelVO.convert(data); vos.add(vo); } return ResultMessage.ok(vos); } screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/BarChartOfPollutionLevelVO.java
File was deleted screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/BarChartTableOfPollutionLevelVO.java
File was deleted screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/MonthlyPollutionLevel.java
New file @@ -0,0 +1,26 @@ package com.moral.api.pojo.dto.cityAQI; import lombok.Data; import java.util.List; /** * @ClassName MonthlyPollutionLevel * @Description 每个月的污染信息 * @Author 陈凯裕 * @Date 2021/11/22 9:52 * @Version TODO **/ @Data public class MonthlyPollutionLevel { /* * 格式yyyy年MM月 * */ private String time; /* * 每个污染等级的天数和占比 * */ private List<PollutionDaysAndProportion> pollutionDaysAndProportions; } screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/PollutionDaysAndProportion.java
New file @@ -0,0 +1,29 @@ package com.moral.api.pojo.dto.cityAQI; import lombok.Data; /** * @ClassName PollutionDaysAndProportion * @Description 污染天气以及占比 * @Author 陈凯裕 * @Date 2021/11/22 9:50 * @Version TODO **/ @Data public class PollutionDaysAndProportion { /* * 污染等级 * */ private String pollutionLevel; /* * 污染天数 * */ private Integer days; /* * 占比 * */ private String proportion; } screen-api/src/main/java/com/moral/api/pojo/form/aqi/QueryChartOfPollutionLevelForm.java
File was renamed from screen-api/src/main/java/com/moral/api/pojo/form/aqi/QueryPieChartOfPollutionLevelForm.java @@ -15,7 +15,7 @@ * @Version TODO **/ @Data public class QueryPieChartOfPollutionLevelForm { public class QueryChartOfPollutionLevelForm { /* * 地区码 必传 screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartOfPollutionLevelVO.java
New file @@ -0,0 +1,61 @@ package com.moral.api.pojo.vo.cityAQI; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.dto.cityAQI.PollutionDaysAndProportion; import lombok.Data; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @ClassName BarChartOfPollutionLevelDTO * @Description 柱状图数据DTO * @Author 陈凯裕 * @Date 2021/11/19 8:31 * @Version TODO **/ @Data public class BarChartOfPollutionLevelVO { /*时间集合*/ List<String> time; /*污染信息,一共有5个Map,分别对应五个污染等级 * Map中有三个字段 * pollution表示污染等级 * days存放天数集合 * proportion存放天数占比的集合*/ List<Map<String, Object>> values; public static BarChartOfPollutionLevelVO convert(List<MonthlyPollutionLevel> datas) { BarChartOfPollutionLevelVO vo = new BarChartOfPollutionLevelVO(); List<String> time = new ArrayList<>(); List<Map<String, Object>> values= new ArrayList<>(); //6个污染等级循环获取数据 for (int i = 0; i <= 5; i++) { Map<String,Object> map = new HashMap<>(); List<String> proportion = new ArrayList<>(); List<Integer> days = new ArrayList<>(); String pollution = String.valueOf(i); for (MonthlyPollutionLevel data : datas) { if(!time.contains(data.getTime())) time.add(data.getTime()); List<PollutionDaysAndProportion> pollutionDaysAndProportions = data.getPollutionDaysAndProportions(); for (PollutionDaysAndProportion pollutionDaysAndProportion : pollutionDaysAndProportions) { if(pollutionDaysAndProportion.getPollutionLevel().equals(pollution)){ proportion.add(pollutionDaysAndProportion.getProportion()); days.add(pollutionDaysAndProportion.getDays()); } } } map.put("proportion",proportion); map.put("days",days); map.put("pollution",pollution); values.add(map); } vo.setTime(time); vo.setValues(values); return vo; } } screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/BarChartTableOfPollutionLevelVO.java
New file @@ -0,0 +1,95 @@ package com.moral.api.pojo.vo.cityAQI; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.dto.cityAQI.PollutionDaysAndProportion; import lombok.Data; import java.util.List; /** * @ClassName BarChartTableOfPollutionLevelVO * @Description 柱状图数据表格的VO * @Author 陈凯裕 * @Date 2021/11/22 9:05 * @Version TODO **/ @Data public class BarChartTableOfPollutionLevelVO { /* * 时间 * */ private String time; /* * 优 * */ private String excellent; /* * 良 * */ private String good; /* * 轻度污染 * */ private String mild; /* * 中度污染 * */ private String middle; /* * 重度污染 * */ private String serious; /* * 严重污染 * */ private String server; /* * 合计 * */ private String total; public static BarChartTableOfPollutionLevelVO convert(MonthlyPollutionLevel data){ BarChartTableOfPollutionLevelVO vo = new BarChartTableOfPollutionLevelVO(); vo.setTime(data.getTime().replaceAll("-","年")+"月"); List<PollutionDaysAndProportion> pollutionDaysAndProportions = data.getPollutionDaysAndProportions(); if(pollutionDaysAndProportions.size()!=6) return null; //拼接每个污染等级天数和百分比 PollutionDaysAndProportion excellentProportion = pollutionDaysAndProportions.get(0); PollutionDaysAndProportion goodProportion = pollutionDaysAndProportions.get(1); PollutionDaysAndProportion mildProportion = pollutionDaysAndProportions.get(2); PollutionDaysAndProportion middleProportion = pollutionDaysAndProportions.get(3); PollutionDaysAndProportion seriousProportion = pollutionDaysAndProportions.get(4); PollutionDaysAndProportion serverProportion = pollutionDaysAndProportions.get(5); String excellent = excellentProportion.getDays()+"("+excellentProportion.getProportion()+")"; String good = goodProportion.getDays()+"("+goodProportion.getProportion()+")"; String mild = mildProportion.getDays()+"("+mildProportion.getProportion()+")"; String middle = middleProportion.getDays()+"("+middleProportion.getProportion()+")"; String serious = seriousProportion.getDays()+"("+seriousProportion.getProportion()+")"; String server = serverProportion.getDays()+"("+serverProportion.getProportion()+")"; //拼接共计天数 Integer totalDays = excellentProportion.getDays()+ goodProportion.getDays()+ mildProportion.getDays()+ middleProportion.getDays()+ seriousProportion.getDays()+ serverProportion.getDays(); vo.setTotal(totalDays+"(100%)"); vo.setExcellent(excellent); vo.setGood(good); vo.setMild(mild); vo.setMiddle(middle); vo.setSerious(serious); vo.setServer(server); return vo; } } screen-api/src/main/java/com/moral/api/pojo/vo/cityAQI/PieChartOfPollutionLevelVO.java
File was renamed from screen-api/src/main/java/com/moral/api/pojo/dto/cityAQI/PieChartOfPollutionLevelVO.java @@ -1,4 +1,4 @@ package com.moral.api.pojo.dto.cityAQI; package com.moral.api.pojo.vo.cityAQI; import lombok.Data; screen-api/src/main/java/com/moral/api/service/CityAqiDailyService.java
@@ -2,8 +2,11 @@ import com.moral.api.entity.CityAqiDaily; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.QueryPieChartOfPollutionLevelForm; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.QueryChartOfPollutionLevelForm; import java.util.List; /** * <p> @@ -22,6 +25,14 @@ * @Author: 陈凯裕 * @Date: 2021/11/9 */ PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(QueryPieChartOfPollutionLevelForm form); PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(QueryChartOfPollutionLevelForm form); /** * @Description: 查询污染等级的柱状图数据,包括天数和占比 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/11/22 */ List<MonthlyPollutionLevel> queryBarChartOfPollutionLevels(QueryChartOfPollutionLevelForm form); } screen-api/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -4,8 +4,10 @@ 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.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.QueryPieChartOfPollutionLevelForm; 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; @@ -14,7 +16,9 @@ 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.*; /** @@ -32,65 +36,65 @@ CityAqiDailyMapper cityAqiDailyMapper; @Override public PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(QueryPieChartOfPollutionLevelForm form) { 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); wrapper.eq("city_code", regionCode); wrapper.between("time", startDate, endDate); List<CityAqiDaily> cityAqiDailies = cityAqiDailyMapper.selectList(wrapper); //取开始结束时间,拼装返回time if(cityAqiDailies.size()==0) 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; 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<>(); Map<String, CityAqiDaily> tmpMap = new HashMap<>(); for (CityAqiDaily cityAqiDaily : cityAqiDailies) { String tmpTime = DateUtils.dateToDateString(cityAqiDaily.getTime(),"yyyy-MM-dd"); tmpMap.put(tmpTime,cityAqiDaily); 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); 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) 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); pollutionDaysMap.put(pollutionClass, days + 1); } //计算比例 List<Map<String,Object>> valueMap = new ArrayList<>(); 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()){ while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); Map<String,Object> pollutionMap = new HashMap<>(); 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); 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; totalDays += days; } //封装返回对象 PieChartOfPollutionLevelVO VO = new PieChartOfPollutionLevelVO(); @@ -99,4 +103,87 @@ 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; } }