package com.moral.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.CityAqi; import com.moral.api.entity.Forecast; import com.moral.api.mapper.CityAqiMapper; import com.moral.api.mapper.ForecastMapper; import com.moral.api.service.CityAqiService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.RedisConstants; import com.moral.util.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; 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-09-28 */ @Service public class CityAqiServiceImpl extends ServiceImpl implements CityAqiService { @Autowired private CityAqiMapper cityAqiMapper; @Autowired private ForecastMapper forecastMapper; @Autowired private RedisTemplate redisTemplate; @Override public List> measuredCompareForecastOfO3(Map params) { String regionCode = params.get("regionCode").toString(); String time = params.get("time").toString(); //预测数据 QueryWrapper forecastQueryWrapper = new QueryWrapper<>(); forecastQueryWrapper.select("time", "value") .eq("city_code", regionCode) .likeRight("time", time); List> forecastData = forecastMapper.selectMaps(forecastQueryWrapper); //实测数据 QueryWrapper cityAqiQueryWrapper = new QueryWrapper<>(); cityAqiQueryWrapper.select("time", "value") .eq("city_code", regionCode) .likeRight("time", time); List> measuredData = cityAqiMapper.selectMaps(cityAqiQueryWrapper); List> result = new ArrayList<>(); for (int i = 0; i < 48; i++) { Map map = new HashMap<>(); if (i % 2 == 0) { map.put("type", "预测"); Date d = DateUtils.addHours(DateUtils.getDate(time), i / 2); map.put("time", DateUtils.dateToDateString(d, DateUtils.yyyy_MM_dd_HH_EN)); for (Map forecastDatum : forecastData) { Date date = (Date) forecastDatum.get("time"); String value = forecastDatum.get("value").toString(); Map data = JSONObject.parseObject(value, Map.class); Object o3 = data.get("o3"); if (i == DateUtils.getHour(date) * 2) { if (!ObjectUtils.isEmpty(o3)) { map.put("O3", o3); } } } } else { map.put("type", "实测"); Date d = DateUtils.addHours(DateUtils.getDate(time), (i - 1) / 2); map.put("time", DateUtils.dateToDateString(d, DateUtils.yyyy_MM_dd_HH_EN)); for (Map measuredDatum : measuredData) { Date date = (Date) measuredDatum.get("time"); String value = measuredDatum.get("value").toString(); Map data = JSONObject.parseObject(value, Map.class); Object o3 = data.get("o3"); if (i == (DateUtils.getHour(date) * 2 + 1)) { if (!ObjectUtils.isEmpty(o3)) { map.put("O3", o3); } } } } result.add(map); } return result; } @Override public Map queryCityAqiByRegionCode(Integer regionCode) { Map value = (Map) redisTemplate.opsForHash().get(RedisConstants.CITY_AQI,String.valueOf(regionCode)); if(value==null) value = queryCityAqiByRegionCodeFromDB(regionCode); return value; } /** * @Description: 从数据库查询数据 * @Param: [regionCode] * @return: java.util.Map * @Author: 陈凯裕 * @Date: 2021/10/28 */ private Map queryCityAqiByRegionCodeFromDB(Integer regionCode) { QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("city_code",regionCode); wrapper.orderByDesc("time"); wrapper.last(true,"limit 1"); CityAqi cityAqi = cityAqiMapper.selectOne(wrapper); String value = cityAqi.getValue(); redisTemplate.opsForHash().put(RedisConstants.CITY_AQI,regionCode,value); return JSON.parseObject(value,Map.class); } }