package com.moral.api.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.GovMonitorPoint; import com.moral.api.entity.HistoryAqi; import com.moral.api.mapper.HistoryAqiMapper; import com.moral.api.service.GovMonitorPointService; import com.moral.api.service.HistoryAqiService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.DateUtils; import com.xxl.job.core.context.XxlJobHelper; import lombok.extern.slf4j.Slf4j; 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.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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; /** *

* 国控aqi数据表 服务实现类 *

* * @author moral * @since 2021-06-15 */ @Service @Slf4j public class HistoryAqiServiceImpl extends ServiceImpl implements HistoryAqiService { @Autowired private HistoryAqiMapper historyAqiMapper; @Autowired private RestTemplate restTemplate; @Autowired private GovMonitorPointService govMonitorPointService; @Autowired private RedisTemplate redisTemplate; //国控站aqi数据来自阿里云市场,大中华地区空气质量API--单站点接口 @Override @Transactional public void insertHistoryAqi() { //设置请求头 HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "APPCODE 31b6ea8f804a4472be3b633cfee44849"); HttpEntity requestEntity = new HttpEntity<>(headers); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("guid").eq("is_delete", Constants.NOT_DELETE); //获取所有国控,省控,县控站点 List govMonitorPoints = govMonitorPointService.list(queryWrapper); Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN); String timeStr = DateUtils.dateToDateString(time, DateUtils.yyyy_MM_dd_HH_mm_ss_EN); // String timeStr = DateUtils.dateToDateString(DateUtils.addHours(time, -1), DateUtils.yyyy_MM_dd_HH_mm_ss_EN); List historyAqis = new ArrayList<>(); for (GovMonitorPoint govMonitorPoint : govMonitorPoints) { HistoryAqi historyAqi = new HistoryAqi(); String guid = govMonitorPoint.getGuid(); if (guid.equals("f42092ed-cdf3-4ddc-a56f-0ac80a560847") || guid.equals("cedf9934-f3b0-499d-81cd-a17a109aa100")) { ResponseEntity response; try { //从第三方接口获取数据 response = restTemplate.exchange("http://chinair.market.alicloudapi.com/api/v1/air_all/station_realtime?guid={1}&pubtime={2}", HttpMethod.GET, requestEntity, String.class, "525d6346-f6c9-40e2-b3b6-a86fb7c85855", timeStr); } catch (Exception e) { continue; } String body = response.getBody(); Map data = JSONObject.parseObject(body, Map.class); Map map = (Map) data.get("data"); if (ObjectUtils.isEmpty(map)) { continue; } historyAqi.setGuid(guid); historyAqi.setTime(DateUtils.addHours(time, -1)); //存入数据库 historyAqi.setValue(JSONObject.toJSONString(map)); historyAqis.add(historyAqi); Map value = new HashMap<>(); Object pm2_5 = map.get("pm2_5"); Object pm10 = map.get("pm10"); Object so2 = map.get("so2"); Object no2 = map.get("no2"); Object co = map.get("co"); Object o3 = map.get("o3"); if (!ObjectUtils.isEmpty(pm2_5)) { value.put(Constants.SENSOR_CODE_PM25, pm2_5); } if (!ObjectUtils.isEmpty(pm10)) { value.put(Constants.SENSOR_CODE_PM10, pm10); } if (!ObjectUtils.isEmpty(so2)) { value.put(Constants.SENSOR_CODE_SO2, so2); } if (!ObjectUtils.isEmpty(no2)) { value.put(Constants.SENSOR_CODE_NO2, no2); } if (!ObjectUtils.isEmpty(co)) { value.put(Constants.SENSOR_CODE_CO, Double.parseDouble(co.toString())); } if (!ObjectUtils.isEmpty(o3)) { value.put(Constants.SENSOR_CODE_O3, o3); } //aqi数据存入redis redisTemplate.opsForHash().put(RedisConstants.AQI_DATA, guid, value); // historyAqiMapper.insert(historyAqi); }else { ResponseEntity response; try { //从第三方接口获取数据 response = restTemplate.exchange("http://chinair.market.alicloudapi.com/api/v1/air_all/station_realtime?guid={1}&pubtime={2}", HttpMethod.GET, requestEntity, String.class, guid, timeStr); } catch (Exception e) { continue; } String body = response.getBody(); Map data = JSONObject.parseObject(body, Map.class); Map map = (Map) data.get("data"); if (ObjectUtils.isEmpty(map)) { continue; } historyAqi.setGuid(guid); historyAqi.setTime(DateUtils.addHours(time, -1)); //存入数据库 historyAqi.setValue(JSONObject.toJSONString(map)); historyAqis.add(historyAqi); Map value = new HashMap<>(); Object pm2_5 = map.get("pm2_5"); Object pm10 = map.get("pm10"); Object so2 = map.get("so2"); Object no2 = map.get("no2"); Object co = map.get("co"); Object o3 = map.get("o3"); if (!ObjectUtils.isEmpty(pm2_5)) { value.put(Constants.SENSOR_CODE_PM25, pm2_5); } if (!ObjectUtils.isEmpty(pm10)) { value.put(Constants.SENSOR_CODE_PM10, pm10); } if (!ObjectUtils.isEmpty(so2)) { value.put(Constants.SENSOR_CODE_SO2, so2); } if (!ObjectUtils.isEmpty(no2)) { value.put(Constants.SENSOR_CODE_NO2, no2); } if (!ObjectUtils.isEmpty(co)) { value.put(Constants.SENSOR_CODE_CO, Double.parseDouble(co.toString())); } if (!ObjectUtils.isEmpty(o3)) { value.put(Constants.SENSOR_CODE_O3, o3); } //aqi数据存入redis redisTemplate.opsForHash().put(RedisConstants.AQI_DATA, guid, value); // historyAqiMapper.insert(historyAqi); } } if (ObjectUtils.isEmpty(historyAqis)){ XxlJobHelper.log("数据不存在"); } //存入数据库 historyAqiMapper.insertHistoryAqi(historyAqis); } @Override public HistoryAqi getHistoryApiByTimeAndGuid(String guid, String time) { QueryWrapper wrapper_historyAqi = new QueryWrapper<>(); wrapper_historyAqi.eq("guid", guid).eq("time", time); HistoryAqi historyAqi = new HistoryAqi(); if (historyAqiMapper.selectCount(wrapper_historyAqi) == 1) { historyAqi = historyAqiMapper.selectOne(wrapper_historyAqi); } return historyAqi; } @Override public List getHistoryAqi() { String time = DateUtils.getDateStringOfHour(-1, DateUtils.yyyy_MM_dd_HH_EN) + ":00:00"; QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("time", time); return historyAqiMapper.selectList(queryWrapper); } }