screen-api/src/main/java/com/moral/api/config/properties/SpecialCitiesProperties.java
New file @@ -0,0 +1,23 @@ package com.moral.api.config.properties; import com.moral.api.entity.SysArea; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * @ClassName * @Description TODO * @Author 陈凯裕 * @Date 2021/12/31 8:56 * @Version TODO **/ @Data @ConfigurationProperties(prefix = "special-city") @Component public class SpecialCitiesProperties { private List<SysArea> twentyEightCities; } screen-api/src/main/java/com/moral/api/controller/AqiController.java
@@ -3,6 +3,7 @@ import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.form.aqi.AreaPollutionLevelForm; import com.moral.api.pojo.form.aqi.SpecialCitiesPollutionLevelForm; import com.moral.api.pojo.vo.cityAQI.BarChartOfPollutionLevelVO; import com.moral.api.pojo.vo.cityAQI.BarChartTableOfPollutionLevelVO; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; @@ -213,7 +214,26 @@ ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //查询业务数据 List<CityPollutionLevel> datas = cityAqiDailyService.queryAreaPollutionLevel(form); //返回数据 return ResultMessage.ok(datas); } /** * @Description: 查询26+2城市优良天气数据 * @Param: [form] * @return: com.moral.constant.ResultMessage * @Author: 陈凯裕 * @Date: 2021/12/31 */ @GetMapping("qeury28CitiesPollutionLevel") public ResultMessage qeury28CitiesPollutionLevel(SpecialCitiesPollutionLevelForm form){ //判断是否缺少参数 if (!form.valid()) return ResultMessage.fail(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg()); //查询业务数据 List<CityPollutionLevel> datas = cityAqiDailyService.querySpecialCitiesPollutionLevel(form); //返回数据 return ResultMessage.ok(datas); } screen-api/src/main/java/com/moral/api/pojo/form/aqi/AreaPollutionLevelForm.java
@@ -63,6 +63,4 @@ endDate = DateUtils.getLastDayOfMonth(month); return true; } } screen-api/src/main/java/com/moral/api/pojo/form/aqi/SpecialCitiesPollutionLevelForm.java
New file @@ -0,0 +1,56 @@ 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 SpecialCitiesPollutionLevel * @Description 查询28,74城市接收参数实体类 * @Author 陈凯裕 * @Date 2021/12/31 9:35 * @Version TODO **/ @Data public class SpecialCitiesPollutionLevelForm { /* * 如果是查年数据则该参数不能为空 * */ @DateTimeFormat(pattern = "yyyy") @JsonFormat(pattern = "yyyy", timezone = "GMT+8") private Date year; /* * 如果是查月数据则该参数不能为空 * */ @DateTimeFormat(pattern = "yyyy-MM") @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8") private Date month; /* * 用于查询数据的开始时间,由form自行转换 * */ private Date startDate; /* * 用于查询数据的结束时间,由form自行转换 * */ private Date endDate; public boolean valid() { if ( (year == null && month == null)||(year != null && month != null)) return false; //时间转换 if (year != null) { startDate = DateUtils.getFirstDayOfYear(year); endDate = DateUtils.getLastDayOfYear(year); return true; } startDate = DateUtils.getFirstDayOfMonth(month); endDate = DateUtils.getLastDayOfMonth(month); return true; } } screen-api/src/main/java/com/moral/api/service/CityAqiDailyService.java
@@ -5,6 +5,7 @@ import com.moral.api.pojo.dto.cityAQI.CityPollutionLevel; import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.form.aqi.AreaPollutionLevelForm; import com.moral.api.pojo.form.aqi.SpecialCitiesPollutionLevelForm; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.ChartOfPollutionLevelForm; @@ -49,11 +50,20 @@ Map<String,Map<String,Object>> oneYearsData(Map map); /** * @Description: 查询一个城市所有县的优良天气占比 * @Description: 查询一个城市所有县的优良天气数 * @Param: [AreaPollutionLevelForm] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/12/30 */ List<CityPollutionLevel> queryAreaPollutionLevel(AreaPollutionLevelForm form); /** * @Description: 查询28市优良天气数 * @Param: [form] * @return: java.util.List<com.moral.api.pojo.dto.cityAQI.CityPollutionLevel> * @Author: 陈凯裕 * @Date: 2021/12/31 */ List<CityPollutionLevel> querySpecialCitiesPollutionLevel(SpecialCitiesPollutionLevelForm form); } screen-api/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -3,6 +3,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.config.properties.SpecialCitiesProperties; import com.moral.api.entity.CityAqiDaily; import com.moral.api.entity.SysArea; import com.moral.api.mapper.CityAqiDailyMapper; @@ -10,6 +11,7 @@ import com.moral.api.pojo.dto.cityAQI.MonthlyPollutionLevel; import com.moral.api.pojo.dto.cityAQI.PollutionDaysAndProportion; import com.moral.api.pojo.form.aqi.AreaPollutionLevelForm; import com.moral.api.pojo.form.aqi.SpecialCitiesPollutionLevelForm; import com.moral.api.pojo.vo.cityAQI.PieChartOfPollutionLevelVO; import com.moral.api.pojo.form.aqi.ChartOfPollutionLevelForm; import com.moral.api.service.CityAqiDailyService; @@ -41,6 +43,8 @@ CityAqiDailyMapper cityAqiDailyMapper; @Autowired SysAreaService sysAreaService; @Autowired SpecialCitiesProperties specialCitiesProperties; @Override public PieChartOfPollutionLevelVO queryPieChartOfPollutionLevels(ChartOfPollutionLevelForm form) { @@ -283,6 +287,7 @@ return resultMap; } @Override public List<CityPollutionLevel> queryAreaPollutionLevel(AreaPollutionLevelForm form) { //取参 @@ -295,49 +300,77 @@ List<CityPollutionLevel> datas = new ArrayList<>(); //遍历每个县级市 查询数据 for (SysArea area : allAreas) { //查询数据 QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); wrapper.eq("city_code", area.getAreaCode()); 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, 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); } //封装对象 CityPollutionLevel cityPollutionLevel = new CityPollutionLevel(); cityPollutionLevel.setRegionName(area.getAreaName()); cityPollutionLevel.setExcellentWeatherDays(pollutionDaysMap.get(Constants.EXCELLENT_WEATHER_CODE)); cityPollutionLevel.setGoodWeatherDays(pollutionDaysMap.get(Constants.GOOD_WEATHER_CODE)); cityPollutionLevel.setMildWeatherDays(pollutionDaysMap.get(Constants.MILD_WEATHER_CODE)); cityPollutionLevel.setMiddleWeatherDays(pollutionDaysMap.get(Constants.MIDDLE_WEATHER_CODE)); cityPollutionLevel.setSeriousWeatherDays(pollutionDaysMap.get(Constants.SERIOUS_WEATHER_CODE)); cityPollutionLevel.setServerWeatherDays(pollutionDaysMap.get(Constants.SERVER_WEATHER_CODE)); CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndCityCode(area,startDate,endDate); datas.add(cityPollutionLevel); } return datas; } @Override public List<CityPollutionLevel> querySpecialCitiesPollutionLevel(SpecialCitiesPollutionLevelForm form) { //取参 Date startDate = form.getStartDate(); Date endDate = form.getEndDate(); List<SysArea> areas = specialCitiesProperties.getTwentyEightCities(); //创建返回数据对象 List<CityPollutionLevel> datas = new ArrayList<>(); //遍历每个县级市 查询数据 for (SysArea area : areas) { CityPollutionLevel cityPollutionLevel = calculateDaysByTimeAndCityCode(area,startDate,endDate); datas.add(cityPollutionLevel); } return datas; } /** * @Description: 根据地区对象和开始结束时间计算污染天气 * @Param: [area, startDate, endDate] * @return: com.moral.api.pojo.dto.cityAQI.CityPollutionLevel * @Author: 陈凯裕 * @Date: 2021/12/31 */ private CityPollutionLevel calculateDaysByTimeAndCityCode(SysArea area, Date startDate, Date endDate) { //查询数据 QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); wrapper.eq("city_code", area.getAreaCode()); 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, 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); } //封装对象 CityPollutionLevel cityPollutionLevel = new CityPollutionLevel(); cityPollutionLevel.setRegionName(area.getAreaName()); cityPollutionLevel.setExcellentWeatherDays(pollutionDaysMap.get(Constants.EXCELLENT_WEATHER_CODE)); cityPollutionLevel.setGoodWeatherDays(pollutionDaysMap.get(Constants.GOOD_WEATHER_CODE)); cityPollutionLevel.setMildWeatherDays(pollutionDaysMap.get(Constants.MILD_WEATHER_CODE)); cityPollutionLevel.setMiddleWeatherDays(pollutionDaysMap.get(Constants.MIDDLE_WEATHER_CODE)); cityPollutionLevel.setSeriousWeatherDays(pollutionDaysMap.get(Constants.SERIOUS_WEATHER_CODE)); cityPollutionLevel.setServerWeatherDays(pollutionDaysMap.get(Constants.SERVER_WEATHER_CODE)); return cityPollutionLevel; } } screen-api/src/main/resources/application-dev.yml
@@ -13,8 +13,7 @@ spring: profiles: active: dev include: moduleFormColumn include: specialCity application: name: screen-api redis: screen-api/src/main/resources/application-specialCity.yml
New file @@ -0,0 +1,77 @@ special-city: twentyEightCities: - areaCode: 140400 areaName: 长治市 - areaCode: 110000 areaName: 北京市 - areaCode: 130900 areaName: 沧州市 - areaCode: 131000 areaName: 廊坊市 - areaCode: 120000 areaName: 天津市 - areaCode: 140300 areaName: 阳泉市 - areaCode: 131100 areaName: 衡水市 - areaCode: 130200 areaName: 唐山市 - areaCode: 140500 areaName: 晋城市 - areaCode: 130600 areaName: 保定市 - areaCode: 370800 areaName: 济宁市 - areaCode: 130400 areaName: 邯郸市 - areaCode: 130500 areaName: 邢台市 - areaCode: 371600 areaName: 滨州市 - areaCode: 371500 areaName: 聊城市 - areaCode: 130100 areaName: 石家庄市 - areaCode: 410200 areaName: 开封市 - areaCode: 410900 areaName: 濮阳市 - areaCode: 410000 areaName: 郑州市 - areaCode: 371400 areaName: 德州市 - areaCode: 371700 areaName: 菏泽市 - areaCode: 370100 areaName: 济南市 - areaCode: 410600 areaName: 鹤壁市 - areaCode: 410800 areaName: 焦作市 - areaCode: 410700 areaName: 新乡市 - areaCode: 140100 areaName: 太原市 - areaCode: 370300 areaName: 淄博市 - areaCode: 410500 areaName: 安阳市 screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -997,7 +997,7 @@ final Calendar cal = Calendar.getInstance(); cal.setTime(date); final int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH); cal.set(Calendar.DAY_OF_YEAR, last); cal.set(Calendar.DAY_OF_MONTH, last); cal.set(Calendar.HOUR_OF_DAY, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59);