|  |  |  | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import org.springframework.data.redis.core.RedisTemplate; | 
|---|
|  |  |  | import org.springframework.http.HttpEntity; | 
|---|
|  |  |  | import org.springframework.http.HttpHeaders; | 
|---|
|  |  |  | import org.springframework.http.ResponseEntity; | 
|---|
|  |  |  | import org.springframework.stereotype.Service; | 
|---|
|  |  |  | import org.springframework.util.LinkedMultiValueMap; | 
|---|
|  |  |  | import org.springframework.util.MultiValueMap; | 
|---|
|  |  |  | import org.springframework.util.ObjectUtils; | 
|---|
|  |  |  | import org.springframework.web.client.RestTemplate; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Date; | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RedisTemplate redisTemplate; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //城市aqi数据来源于,阿里云市场:墨迹天气(基础版CityID)全国历史天气预报接口 | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void insertCityAqi() { | 
|---|
|  |  |  | //pubtime=08的数据,是07-08之间的数据,存入数据库时的时间为07点 | 
|---|
|  |  |  | 
|---|
|  |  |  | //存入数据库是time字段实际时间 | 
|---|
|  |  |  | Date dataTime = DateUtils.addHours(time, -1); | 
|---|
|  |  |  | Date start = null; | 
|---|
|  |  |  | if (DateUtils.getHour(time) >= 8) { | 
|---|
|  |  |  | if (DateUtils.getHour(time) >= 8 || DateUtils.getHour(time) == 0) { | 
|---|
|  |  |  | start = DateUtils.addHours(time, -8); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | wrapper.select("city_code", "city_id").eq("is_delete", Constants.NOT_DELETE); | 
|---|
|  |  |  | List<CityConfigAqi> list = cityConfigAqiService.list(wrapper); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //获取历史数据,用于计算臭氧滑动值 | 
|---|
|  |  |  | Map<Integer, List<Map<String, Object>>> cityData = null; | 
|---|
|  |  |  | if (start != null) { | 
|---|
|  |  |  | QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>(); | 
|---|
|  |  |  | List<Integer> cityCodes = list.stream().map(CityConfigAqi::getCityCode) | 
|---|
|  |  |  | .collect(Collectors.toList()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | queryWrapper.select("city_code", "time", "value") | 
|---|
|  |  |  | .ge("time", start) | 
|---|
|  |  |  | .in("city_code", cityCodes); | 
|---|
|  |  |  | List<Map<String, Object>> selectMaps = cityAqiMapper.selectMaps(queryWrapper); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //按city_code分组 | 
|---|
|  |  |  | cityData = selectMaps.stream() | 
|---|
|  |  |  | .collect(Collectors.groupingBy(o -> Integer.parseInt(o.get("city_code").toString()))); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<CityAqi> cityAqiList = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String url = "http://aliv13.data.moji.com/whapi/json/alicityweather/aqi"; | 
|---|
|  |  |  | String appcode = "31b6ea8f804a4472be3b633cfee44849"; | 
|---|
|  |  |  | HttpHeaders httpHeaders = new HttpHeaders(); | 
|---|
|  |  |  | httpHeaders.add("Authorization", "APPCODE " + appcode); | 
|---|
|  |  |  | //请求参数 | 
|---|
|  |  |  | LinkedMultiValueMap<String, Object> requestParams = new LinkedMultiValueMap<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (CityConfigAqi cityConfigAqi : list) { | 
|---|
|  |  |  | CityAqi cityAqi = new CityAqi(); | 
|---|
|  |  |  | Integer cityCode = cityConfigAqi.getCityCode(); | 
|---|
|  |  |  | Map<String, Object> data; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | //从第三方接口获取数据 | 
|---|
|  |  |  | data = restTemplate.getForObject("http://sapi.7drlb.com/api/mj?cityID={1}&apiKey=aqi", Map.class, cityConfigAqi.getCityId()); | 
|---|
|  |  |  | requestParams.set("cityId", cityConfigAqi.getCityId()); | 
|---|
|  |  |  | HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(requestParams, httpHeaders); | 
|---|
|  |  |  | ResponseEntity<String> response = restTemplate.postForEntity(url, httpEntity, String.class); | 
|---|
|  |  |  | data = JSONObject.parseObject(response.getBody(), Map.class); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | aqi.put("AQI", aqi.remove("value")); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //o3滑动值计算 | 
|---|
|  |  |  | if (start != null) { | 
|---|
|  |  |  | QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>(); | 
|---|
|  |  |  | queryWrapper.select("time", "value") | 
|---|
|  |  |  | .eq("city_code", cityCode) | 
|---|
|  |  |  | .ge("time", DateUtils.dateToDateString(start)); | 
|---|
|  |  |  | List<Map<String, Object>> cityAqis = cityAqiMapper.selectMaps(queryWrapper); | 
|---|
|  |  |  | if (cityData != null) { | 
|---|
|  |  |  | List<Map<String, Object>> cityAqis = cityData.get(cityCode); | 
|---|
|  |  |  | if (cityAqis == null) { | 
|---|
|  |  |  | cityAqis = new ArrayList<>(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Map<String, Object> params = new HashMap<>(); | 
|---|
|  |  |  | params.put("time", DateUtils.dateToDateString(dataTime, DateUtils.yyyy_MM_dd_HH_mm_ss_S_EN)); | 
|---|
|  |  |  | params.put("value", JSONObject.toJSONString(aqi)); | 
|---|
|  |  |  | cityAqis.add(params); | 
|---|
|  |  |  | if (cityAqis.size() >= 6) { | 
|---|
|  |  |  | OptionalDouble average = cityAqis.parallelStream().flatMapToDouble(v -> { | 
|---|
|  |  |  | OptionalDouble average = cityAqis.stream().flatMapToDouble(v -> { | 
|---|
|  |  |  | Map<String, Object> dataValue = JSONObject.parseObject((String) v.get("value"), Map.class); | 
|---|
|  |  |  | double o3 = Double.parseDouble(dataValue.get("O3").toString()); | 
|---|
|  |  |  | return DoubleStream.of(o3); | 
|---|
|  |  |  | 
|---|
|  |  |  | aqi.put("primaryPollutant", aqiAndPollutant.getPrimaryPollutantNames()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | CityAqi cityAqi = new CityAqi(); | 
|---|
|  |  |  | cityAqi.setCityCode(cityCode); | 
|---|
|  |  |  | cityAqi.setTime(dataTime); | 
|---|
|  |  |  | cityAqi.setValue(JSONObject.toJSONString(aqi)); | 
|---|
|  |  |  | cityAqiMapper.insert(cityAqi); | 
|---|
|  |  |  | cityAqiList.add(cityAqi); | 
|---|
|  |  |  | //存入redis | 
|---|
|  |  |  | redisTemplate.opsForHash().put(RedisConstants.CITY_AQI, cityCode.toString(), aqi); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | cityAqiMapper.insertCityAqi(cityAqiList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<CityAqi> getCityAqi() { | 
|---|
|  |  |  | String time = DateUtils.getDateStringOfHour(-1, DateUtils.yyyy_MM_dd_HH_EN) + ":00:00"; | 
|---|
|  |  |  | QueryWrapper<CityAqi> queryWrapper = new QueryWrapper<>(); | 
|---|
|  |  |  | queryWrapper.eq("time", time); | 
|---|
|  |  |  | return cityAqiMapper.selectList(queryWrapper); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|