天气预报-玩具demo

162 阅读1分钟

/**
 * @description: 天气预报监听
 * @author: nice
 * @created: 2024/01/04 14:56
 */
@Component
@EventBusListener
@Slf4j
public class WeatherInfoListener {

    // 天气预报api
    private static String requestUrl = "https://restapi.amap.com/v3/weather/weatherInfo";

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private RecruitEventBusImpl recruitEventBus;

    @Subscribe
    private void send(WeatherInfoEvent weatherInfoEvent) {
        log.error("send->1WeatherInfoListenerWeatherInfoListenerWeatherInfoListenerWeatherInfoListenerWeatherInfoListenerWeatherInfoListenerWeatherInfoListenerWeatherInfoListener");
        String param = "key=" + weatherInfoEvent.getKey() + "&city=" + weatherInfoEvent.getCity();
        String response = HttpUtils.sendGet(requestUrl,param);
        // 转换
        Gson gson = new Gson();
        WeatherInfoBo weatherInfoBo = gson.fromJson(response,
                new TypeToken<WeatherInfoBo>(){}.getType());

        if (weatherInfoBo != null) {
            WeatherInfoLiveBo weatherInfoLiveBo = Optional.ofNullable(weatherInfoBo.getLives())
                    .orElse(Lists.newArrayList())
                    .stream()
                    .findFirst()
                    .orElse(WeatherInfoLiveBo.builder().build());

            StringBuffer mes = new StringBuffer();
            mes.append("天气预报: -> \n");
            mes.append(">地区 : <font color="warning">");
            mes.append(weatherInfoLiveBo.getProvince()+weatherInfoLiveBo.getCity() + "</font>\n ");
            mes.append(">天气现象 : <font color="warning">");
            mes.append(weatherInfoLiveBo.getWeather() + "</font>\n ");
            mes.append(">实时气温(单位:摄氏度) : <font color="warning">");
            mes.append(weatherInfoLiveBo.getTemperature() + "</font> \n");
            mes.append(">风向描述 : <font color="warning">");
            mes.append(weatherInfoLiveBo.getWinddirection() + "</font>\n ");
            mes.append(">风力级别(单位:级) : <font color="warning">");
            mes.append(weatherInfoLiveBo.getWindpower() + "</font>\n ");
            mes.append(">空气湿度 : <font color="warning">");
            mes.append(weatherInfoLiveBo.getHumidity() + "</font>\n ");
            mes.append(">数据发布的时间 : <font color="warning">");
            mes.append(weatherInfoLiveBo.getReporttime() + "</font> ");

            // 控制及发送消息就好了.
            String redisKey = "WeatherJobHandler" + LocalDate.now();
            if(StringUtilx.isBlank(getValue(redisKey))) {
                setValue(redisKey);
                recruitEventBus.postSync(EnterpriseWxSendEvent.builder()
                        .robotKey("机器人id") // 天气预报
                        .msgType(EnterpriseWxSendListener.MSG_TYPE_MARKDOWN)
                        .message(mes.toString())
                        .build());
            }
        }
    }

    public static void main(String[] args) {
        String param = "key=39f459229d56a82e8bef6ca677b7bb54&city=210200&extensions=all";
        String response = HttpUtils.sendGet(requestUrl,param);
        // 转换
        Gson gson = new Gson();
        WeatherInfoBo weatherInfoBo = gson.fromJson(response,
                new TypeToken<WeatherInfoBo>(){}.getType());
        System.out.println("@@@@@@@@@@@@");
    }
    private boolean hasKey(String redisKey) {
        return stringRedisTemplate.hasKey(redisKey);
    }
    private String getValue(String redisKey){
        return stringRedisTemplate.opsForValue().get(redisKey);
    }
    private void setValue(String redisKey) {
        // 清理多余字段,避免缓存
        LocalDateTime now = LocalDateTime.now();
        // 今天过期
        long time = LocalDateTimeUtils.between(now, LocalDateTimeUtils.endOfDay(now), ChronoUnit.SECONDS);
        stringRedisTemplate.opsForValue().set(redisKey,redisKey, time, TimeUnit.SECONDS);
    }
}