jinpengyong
2022-04-08 fdbef2a3293e536be6b119e4e1e67cc8cc9842f0
screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java
@@ -76,35 +76,39 @@
        //获取所有城市aqi小时数据
        QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "time", "value")
                .ge("time", DateUtils.dateToDateString(start))
                .lt("time", DateUtils.dateToDateString(end));
                .ge("time", start)
                .lt("time", end);
        List<Map<String, Object>> monthlyData = cityAqiDailyService.listMaps(wrapper);
        if (monthlyData.size() == 0) {
            return;
        }
        //按city_code分组
        Map<String, List<Map<String, Object>>> data = monthlyData.stream()
                .collect(Collectors.groupingBy(o -> o.get("city_code").toString()));
        Map<Integer, List<Map<String, Object>>> data = monthlyData.stream()
                .collect(Collectors.groupingBy(o ->Integer.parseInt(o.get("city_code").toString()) ));
        //获取上月数据,本月综指同上月对比
        QueryWrapper<CityAqiMonthly> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("city_code", "value")
                .eq("time", DateUtils.dateToDateString(lastLastMonth));
                .eq("time", lastLastMonth);
        //获取上月数据
        List<CityAqiMonthly> lastCityAqiMonthly = cityAqiMonthlyMapper.selectList(queryWrapper);
        Map<Integer, List<CityAqiMonthly>> lastMonthData = lastCityAqiMonthly.stream()
                .collect(Collectors.groupingBy(CityAqiMonthly::getCityCode));
        List<CityAqiMonthly> lastCityAqiMonthlyList = cityAqiMonthlyMapper.selectList(queryWrapper);
        Map<Integer, CityAqiMonthly> lastMonthData = new HashMap<>();
        for (CityAqiMonthly cityAqiMonthly : lastCityAqiMonthlyList) {
            lastMonthData.put(cityAqiMonthly.getCityCode(), cityAqiMonthly);
        }
        //获取去年本月数据
        Date thisMonthOfLastYear = DateUtils.addYears(start, -1);
        queryWrapper.clear();
        queryWrapper.select("city_code", "value")
                .eq("time", DateUtils.dateToDateString(thisMonthOfLastYear));
                .eq("time", thisMonthOfLastYear);
        List<CityAqiMonthly> thisMonthOfLastYearList = cityAqiMonthlyMapper.selectList(queryWrapper);
        Map<Integer, List<CityAqiMonthly>> thisMonthOfLastYearData = thisMonthOfLastYearList.stream()
                .collect(Collectors.groupingBy(CityAqiMonthly::getCityCode));
        Map<Integer, CityAqiMonthly> thisMonthOfLastYearData = new HashMap<>();
        for (CityAqiMonthly cityAqiMonthly : thisMonthOfLastYearList) {
            thisMonthOfLastYearData.put(cityAqiMonthly.getCityCode(), cityAqiMonthly);
        }
        List<CityAqiMonthly> cityAqiMonthlyList = new ArrayList<>();
@@ -113,7 +117,7 @@
        data.forEach((cityCode, value) -> {
            CityAqiMonthly cityAqiMonthly = new CityAqiMonthly();
            Map<String, Object> jsonMap = new HashMap<>();
            cityAqiMonthly.setCityCode(Integer.parseInt(cityCode));
            cityAqiMonthly.setCityCode(cityCode);
            cityAqiMonthly.setTime(finalStart);
            Map<String, Object> params = new HashMap<>();
@@ -157,10 +161,9 @@
            jsonMap.put("compositeIndex", compositeIndex);
            //本月综指同上月对比(综合指数环比)
            List<CityAqiMonthly> cityAqiMonthlies = lastMonthData.get(Integer.parseInt(cityCode));
            if (!ObjectUtils.isEmpty(cityAqiMonthlies)) {
                CityAqiMonthly monthly = cityAqiMonthlies.get(0);
                Map<String, Object> map = JSONObject.parseObject(monthly.getValue(), Map.class);
            CityAqiMonthly lastCityAqiMonthly = lastMonthData.get(cityCode);
            if (lastCityAqiMonthly != null) {
                Map<String, Object> map = JSONObject.parseObject(lastCityAqiMonthly.getValue(), Map.class);
                double lastCompositeIndex = Double.parseDouble(map.get("compositeIndex").toString());
                DecimalFormat decimalFormat = new DecimalFormat("0.00%");
                String format = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex);
@@ -168,7 +171,7 @@
            }
            //获取去年本月数据,用于计算同比
            List<CityAqiMonthly> thisMonthOfLastYears = thisMonthOfLastYearData.get(Integer.parseInt(cityCode));
            CityAqiMonthly thisMonthOfLastYears = thisMonthOfLastYearData.get(cityCode);
            //各因子同比计算
            Map<String, Object> yearOnYearValue = yearOnYearOfSensor(thisMonthOfLastYears, jsonMap);
@@ -187,14 +190,13 @@
     * @param thisMonthOfLastYearData 去年本月数据
     * @param currentData             当前月该数据
     */
    private Map<String, Object> yearOnYearOfSensor(List<CityAqiMonthly> thisMonthOfLastYearData, Map<String, Object> currentData) {
    private Map<String, Object> yearOnYearOfSensor(CityAqiMonthly thisMonthOfLastYearData, Map<String, Object> currentData) {
        Map<String, Object> result = null;
        //需要计算同比的因子
        List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2", "CO", "O3", "compositeIndex");
        if (!ObjectUtils.isEmpty(thisMonthOfLastYearData)) {
        if (thisMonthOfLastYearData != null) {
            result = new HashMap<>();
            CityAqiMonthly monthly = thisMonthOfLastYearData.get(0);
            Map<String, Object> map = JSONObject.parseObject(monthly.getValue(), Map.class);
            Map<String, Object> map = JSONObject.parseObject(thisMonthOfLastYearData.getValue(), Map.class);
            for (String sensor : sensors) {
                //去年本月该因子值
                double thisMonthOfLeastYearValue = Double.parseDouble(map.get(sensor).toString());