|  |  |  | 
|---|
|  |  |  | //获取所有城市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<>(); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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<>(); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //获取去年本月数据,用于计算同比 | 
|---|
|  |  |  | List<CityAqiMonthly> thisMonthOfLastYears = thisMonthOfLastYearData.get(Integer.parseInt(cityCode)); | 
|---|
|  |  |  | CityAqiMonthly thisMonthOfLastYears = thisMonthOfLastYearData.get(cityCode); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //各因子同比计算 | 
|---|
|  |  |  | Map<String, Object> yearOnYearValue = yearOnYearOfSensor(thisMonthOfLastYears, jsonMap); | 
|---|
|  |  |  | 
|---|
|  |  |  | * @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()); | 
|---|