screen-api/src/main/java/com/moral/api/controller/AqiController.java
@@ -66,8 +66,21 @@ */ @GetMapping("query24HoursAQI") public ResultMessage query24HoursAQIByRegionCode(Integer regionCode){ Map<String, Object> stringObjectMap = cityAqiService.query24HoursAqiByRegionCode(regionCode); return ResultMessage.ok(stringObjectMap); Map<String, Object> datas = cityAqiService.query24HoursAqiByRegionCode(regionCode); return ResultMessage.ok(datas); } /** * @Description: 查询当天的累计aqi以及主要污染物 * @Param: [RegionCode] * @return: com.moral.constant.ResultMessage * @Author: 陈凯裕 * @Date: 2021/11/2 */ @GetMapping("queryTodayAqiAndPollutant") public ResultMessage queryTodayAqiAndPollutant(Integer regionCode){ Map<String, Object> datas = cityAqiService.queryTodayAqiAndPollutant(regionCode); return ResultMessage.ok(datas); } @GetMapping("provincialRanking") screen-api/src/main/java/com/moral/api/service/CityAqiService.java
@@ -39,4 +39,14 @@ * @Date: 2021/11/1 */ Map<String,Object> query24HoursAqiByRegionCode(Integer regionCode); /** * @Description: 查询当天的累计AQI以及主要污染物 * @Param: [regionCode] * @return: java.util.Map<java.lang.String,java.lang.Object>, * MAP有三个KEY,分别是主要污染物(pollutant),时间(time),累计AQI(aqi) * @Author: 陈凯裕 * @Date: 2021/11/2 */ Map<String,Object> queryTodayAqiAndPollutant(Integer regionCode); } screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -15,11 +15,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.OrganizationService; import com.moral.api.service.SysAreaService; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.AQIUtils; import com.moral.util.AmendUtils; import com.moral.util.DateUtils; import com.moral.util.MathUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -178,10 +180,86 @@ return result; } @Override public Map<String, Object> queryTodayAqiAndPollutant(Integer regionCode) { //获取今天的9点时间 Date startDate = new Date(DateUtils.getTodayTime()); Date endDate = new Date(); //查询当天数据 QueryWrapper<CityAqi> wrapper = new QueryWrapper<>(); wrapper.between("time",startDate,endDate); wrapper.eq("city_code",regionCode); wrapper.select("DISTINCT city_code,time,value"); List<CityAqi> cityAqis = cityAqiMapper.selectList(wrapper); //计算平均数 Map<String, Object> sixParamAvg = calculate6ParamAvg(cityAqis); //计算累计aqi和首要污染物 Map<String, Object> result = AQIUtils.hourlyAqi_pollutant(sixParamAvg); //结果集添加时间 CityAqi lastCityAqi = cityAqis.get(cityAqis.size() - 1); String time = DateUtils.dateToDateString(lastCityAqi.getTime(),"HH:mm"); result.put("time",time); return result; } /** * @Description: 计算6参平均值 * @Param: [cityAqiList] * @return: java.util.Map<java.lang.String,java.lang.Double> * 返回值key为sensorCode,value为值 * @Author: 陈凯裕 * @Date: 2021/11/2 */ private Map<String,Object> calculate6ParamAvg(List<CityAqi> cityAqiList){ Double co = calculateSensorAvg(cityAqiList,"co"); Double pm2_5 = calculateSensorAvg(cityAqiList,"pm2_5"); Double pm10 = calculateSensorAvg(cityAqiList,"pm10"); Double so2 = calculateSensorAvg(cityAqiList,"so2"); Double no2 = calculateSensorAvg(cityAqiList,"no2"); Double o3 = calculateSensorAvg(cityAqiList,"o3"); Map<String,Object> result = new HashMap<>(); result.put(Constants.SENSOR_CODE_CO,co); result.put(Constants.SENSOR_CODE_NO2,no2); result.put(Constants.SENSOR_CODE_SO2,so2); result.put(Constants.SENSOR_CODE_O3,o3); result.put(Constants.SENSOR_CODE_PM25,pm2_5); result.put(Constants.SENSOR_CODE_PM10,pm10); return result; } /** * @Description: 计算因子的平均值 * @Param: [cityAqiList, sensor] * ,sensor是要计算的因子名称 * @return: java.lang.Double * @Author: 陈凯裕 * @Date: 2021/11/2 */ private Double calculateSensorAvg(List<CityAqi> cityAqiList,String sensor){ Double sum = 0d; int num = 0; for (CityAqi cityAqi : cityAqiList) { String value = cityAqi.getValue(); if(value==null) continue; Map<String,Object> valueMap = JSON.parseObject(value,Map.class); Object sensorValueObject = valueMap.get(sensor); if(sensorValueObject==null) continue; Double sensorValue = Double.valueOf(sensorValueObject.toString()); sum = MathUtils.add(sum,sensorValue); num++; } if(num==0) return null; Double avg = MathUtils.division(sum,num,2); return avg; } /** * @Description: 从数据库查询数据 * @Param: [regionCode] * @return: java.util.Map<java.lang.String , java.lang.Object> * @return: java.util.Map<java.lang.String ,java.lang.Object> * @Author: 陈凯裕 * @Date: 2021/10/28 */ screen-common/src/main/java/com/moral/util/AQIUtils.java
@@ -59,7 +59,7 @@ } /** * @Description: 小时AQI首要污染物 * @Description: 小时AQI首要污染物,map的key为sensorCode,value为数值 * @Param: [map] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 @@ -126,10 +126,22 @@ } Map<String,Object> resultMap = new HashMap<>(); resultMap.put("aqi",AQIMAX); resultMap.put("pollutant",nameList); if(AQIMAX>50) resultMap.put("pollutant",nameList); return resultMap; } public static void main(String[] args) { Map<String,Object> map = new HashMap<>(); map.put("a34004",11.25); map.put("a34002",18.25); map.put("a21026",55); map.put("a21004",200.01); map.put("a21005",18.94); map.put("a05024",55); System.out.println(hourlyAqi_pollutant(map)); } /** * @Description: 计算AQI污染等级 * @Param: screen-common/src/main/java/com/moral/util/DateUtils.java
@@ -1117,6 +1117,7 @@ return todayStart.getTime().getTime(); } public static Integer getTodayInt() { return (int) (getTodayTime() / 1000); } screen-common/src/main/java/com/moral/util/MathUtils.java
@@ -50,4 +50,20 @@ BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * @Description: 除法,accurate为保留小数位 * @Param: [a, b, accurate] * @return: double * @Author: 陈凯裕 * @Date: 2021/11/2 */ public static double division(double a, double b,int accurate) { if (accurate < 0) { throw new RuntimeException("精确度必须是正整数或零"); } BigDecimal b1 = new BigDecimal(a); BigDecimal b2 = new BigDecimal(b); return b1.divide(b2, accurate, BigDecimal.ROUND_HALF_UP).doubleValue(); } }