kaiyu
2021-11-02 52fc99187771247b58ecf52e1fcd390bfe7ed3d9
screen-api
增加获取累计AQI和首要污染物接口
6 files modified
135 ■■■■■ changed files
screen-api/src/main/java/com/moral/api/controller/AqiController.java 17 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/CityAqiService.java 10 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java 78 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/AQIUtils.java 13 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/DateUtils.java 1 ●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/util/MathUtils.java 16 ●●●●● patch | view | raw | blame | history
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,6 +180,82 @@
        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]
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: 陈凯裕
@@ -130,6 +130,17 @@
        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();
    }
}