|  |  |  | 
|---|
|  |  |  | import com.moral.api.service.CityAqiDailyService; | 
|---|
|  |  |  | import com.moral.api.service.CityAqiYearlyService; | 
|---|
|  |  |  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
|---|
|  |  |  | import com.moral.constant.Constants; | 
|---|
|  |  |  | import com.moral.util.AmendUtils; | 
|---|
|  |  |  | import com.moral.util.ComprehensiveIndexUtils; | 
|---|
|  |  |  | import com.moral.util.DateUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  | import java.util.HashMap; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Map; | 
|---|
|  |  |  | import java.util.OptionalDouble; | 
|---|
|  |  |  | import java.util.stream.Collectors; | 
|---|
|  |  |  | import java.util.stream.DoubleStream; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * <p> | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void insertCityAqiYearly() { | 
|---|
|  |  |  | //需要均值计算的因子 | 
|---|
|  |  |  | List<String> sensors = Arrays.asList("PM2_5", "PM10", "SO2", "NO2"); | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | * 年均值算法 | 
|---|
|  |  |  | * PM2.5,PM10,CO,日均值95百分位 | 
|---|
|  |  |  | * SO2,NO2,日均值98百分位 | 
|---|
|  |  |  | * O3,日最大值90百分位 | 
|---|
|  |  |  | * */ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //开始时间,去年1号 | 
|---|
|  |  |  | Date start = DateUtils.getFirstDayOfLastYear(); | 
|---|
|  |  |  | 
|---|
|  |  |  | Date end = DateUtils.getDate(DateUtils.getDateAddYear(DateUtils.dateToDateString(start, DateUtils.yyyy), 1), DateUtils.yyyy); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //获取所有城市aqi小时数据 | 
|---|
|  |  |  | //获取所有城市aqi日数据 | 
|---|
|  |  |  | QueryWrapper<CityAqiDaily> wrapper = new QueryWrapper<>(); | 
|---|
|  |  |  | wrapper.select("city_code", "time", "value") | 
|---|
|  |  |  | .ge("time", DateUtils.dateToDateString(start)) | 
|---|
|  |  |  | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //按city_code分组 | 
|---|
|  |  |  | Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString())); | 
|---|
|  |  |  | Map<String, List<Map<String, Object>>> data = monthlyData.stream() | 
|---|
|  |  |  | .collect(Collectors.groupingBy(o -> o.get("city_code").toString())); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | CityAqiYearly cityAqiYearly = new CityAqiYearly(); | 
|---|
|  |  |  | //上年数据 | 
|---|
|  |  |  | QueryWrapper<CityAqiYearly> queryWrapper = new QueryWrapper<>(); | 
|---|
|  |  |  | queryWrapper.select("city_code", "value") | 
|---|
|  |  |  | .eq("time", DateUtils.dateToDateString(lastLastYear)); | 
|---|
|  |  |  | //获取上年数据 | 
|---|
|  |  |  | List<CityAqiYearly> lastCityAqiYearly = cityAqiYearlyMapper.selectList(queryWrapper); | 
|---|
|  |  |  | Map<Integer, List<CityAqiYearly>> lastYearData = lastCityAqiYearly.stream() | 
|---|
|  |  |  | .collect(Collectors.groupingBy(CityAqiYearly::getCityCode)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<CityAqiYearly> cityAqiYearlyList = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | data.forEach((cityCode, value) -> { | 
|---|
|  |  |  | CityAqiYearly cityAqiYearly = new CityAqiYearly(); | 
|---|
|  |  |  | Map<String, Object> jsonMap = new HashMap<>(); | 
|---|
|  |  |  | cityAqiYearly.setCityCode(Integer.parseInt(cityCode)); | 
|---|
|  |  |  | cityAqiYearly.setTime(start); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //PM2.5 | 
|---|
|  |  |  | Double pm25Avg = AmendUtils.getAvgOfYear(value, "PM2_5"); | 
|---|
|  |  |  | jsonMap.put("PM2_5", pm25Avg); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map<String, Object> params = new HashMap<>(); | 
|---|
|  |  |  | List<Map<String, Object>> temp = new ArrayList<>(); | 
|---|
|  |  |  | //PM10 | 
|---|
|  |  |  | Double pm10Avg = AmendUtils.getAvgOfYear(value, "PM10"); | 
|---|
|  |  |  | jsonMap.put("PM10", pm10Avg); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (Map<String, Object> map : value) { | 
|---|
|  |  |  | Map<String, Object> sensorsValue = JSONObject.parseObject(map.get("value").toString(), Map.class); | 
|---|
|  |  |  | Map<String, Object> tempMap = new HashMap<>(); | 
|---|
|  |  |  | tempMap.put(Constants.SENSOR_CODE_CO, sensorsValue.get("PM2_5")); | 
|---|
|  |  |  | tempMap.put(Constants.SENSOR_CODE_O3, sensorsValue.get("O3")); | 
|---|
|  |  |  | Map<String, Object> hashMap = new HashMap<>(); | 
|---|
|  |  |  | hashMap.put("value", JSONObject.toJSONString(tempMap)); | 
|---|
|  |  |  | temp.add(hashMap); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | params.put("data", temp); | 
|---|
|  |  |  | //1. CO 95百分位计算并修约 | 
|---|
|  |  |  | Map<String, Object> coAvgOfWeekOrMonth = AmendUtils.getCOAvgOfWeekOrMonth(params); | 
|---|
|  |  |  | if (!ObjectUtils.isEmpty(coAvgOfWeekOrMonth)) { | 
|---|
|  |  |  | jsonMap.put("CO", coAvgOfWeekOrMonth.get(Constants.SENSOR_CODE_CO)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //SO2 | 
|---|
|  |  |  | Double so2Avg = AmendUtils.getAvgOfYear(value, "SO2"); | 
|---|
|  |  |  | jsonMap.put("SO2", so2Avg); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //2. O3 90百分位计算并修约 | 
|---|
|  |  |  | Map<String, Object> o3AvgOfWeekOrMonth = AmendUtils.getO3AvgOfWeekOrMonth(params); | 
|---|
|  |  |  | if (!ObjectUtils.isEmpty(o3AvgOfWeekOrMonth)) { | 
|---|
|  |  |  | jsonMap.put("O3", o3AvgOfWeekOrMonth.get(Constants.SENSOR_CODE_O3)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //NO2 | 
|---|
|  |  |  | Double no2Avg = AmendUtils.getAvgOfYear(value, "NO2"); | 
|---|
|  |  |  | jsonMap.put("NO2", no2Avg); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | sensors.forEach(sensor -> { | 
|---|
|  |  |  | OptionalDouble optionalDouble = value.parallelStream().flatMapToDouble(v -> { | 
|---|
|  |  |  | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); | 
|---|
|  |  |  | double aDouble = Double.parseDouble(dataValue.get(sensor).toString()); | 
|---|
|  |  |  | return DoubleStream.of(aDouble); | 
|---|
|  |  |  | }).average(); | 
|---|
|  |  |  | if (optionalDouble.isPresent()) { | 
|---|
|  |  |  | //银行家算法修约 | 
|---|
|  |  |  | jsonMap.put(sensor, AmendUtils.sciCal(optionalDouble.getAsDouble(), 0)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }); | 
|---|
|  |  |  | //CO | 
|---|
|  |  |  | Double coAvg = AmendUtils.getAvgOfYear(value, "CO"); | 
|---|
|  |  |  | jsonMap.put("CO", coAvg); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //O3 | 
|---|
|  |  |  | Double o3Avg = AmendUtils.getAvgOfYear(value, "O3"); | 
|---|
|  |  |  | jsonMap.put("O3", o3Avg); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //本月月综指计算 | 
|---|
|  |  |  | Double compositeIndex = ComprehensiveIndexUtils.dailyData(jsonMap); | 
|---|
|  |  |  | jsonMap.put("compositeIndex", compositeIndex); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //本月综指同上月对比 | 
|---|
|  |  |  | QueryWrapper<CityAqiYearly> queryWrapper = new QueryWrapper<>(); | 
|---|
|  |  |  | queryWrapper.select("value") | 
|---|
|  |  |  | .eq("city_code", cityCode) | 
|---|
|  |  |  | .eq("time", DateUtils.dateToDateString(lastLastYear)); | 
|---|
|  |  |  | //获取上上月数据 | 
|---|
|  |  |  | CityAqiYearly lastCityAqiYearly = cityAqiYearlyMapper.selectOne(queryWrapper); | 
|---|
|  |  |  | if (lastCityAqiYearly != null) { | 
|---|
|  |  |  | Map<String, Object> map = JSONObject.parseObject(lastCityAqiYearly.getValue(), Map.class); | 
|---|
|  |  |  | //上年数据同本年对比 | 
|---|
|  |  |  | List<CityAqiYearly> cityAqiYearlies = lastYearData.get(Integer.parseInt(cityCode)); | 
|---|
|  |  |  | if (!ObjectUtils.isEmpty(cityAqiYearlies)) { | 
|---|
|  |  |  | CityAqiYearly yearly = cityAqiYearlies.get(0); | 
|---|
|  |  |  | Map<String, Object> map = JSONObject.parseObject(yearly.getValue(), Map.class); | 
|---|
|  |  |  | double lastCompositeIndex = Double.parseDouble(map.get("compositeIndex").toString()); | 
|---|
|  |  |  | DecimalFormat decimalFormat = new DecimalFormat("0.00%"); | 
|---|
|  |  |  | String format = decimalFormat.format((compositeIndex - lastCompositeIndex) / lastCompositeIndex); | 
|---|
|  |  |  | jsonMap.put("yearContrast", format); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | cityAqiYearly.setValue(JSONObject.toJSONString(jsonMap)); | 
|---|
|  |  |  | cityAqiYearlyMapper.insert(cityAqiYearly); | 
|---|
|  |  |  | cityAqiYearlyList.add(cityAqiYearly); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | cityAqiYearlyMapper.insertCityAqiYearly(cityAqiYearlyList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|