jinpengyong
2021-12-31 a470e75012381d51b14065c34424e619c86b16e5
气象预测数据定时任务
10 files added
7 files modified
315 ■■■■■ changed files
screen-job/src/main/java/com/moral/api/entity/CityConfigWeatherForecast.java 56 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/CityWeatherForecast.java 45 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/CityConfigWeatherForecastMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/CityWeatherForecastMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityConfigWeatherForecastService.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityWeatherForecastService.java 19 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityConfigWeatherForecastServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherForecastServiceImpl.java 69 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/task/WeatherTask.java 20 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/CityConfigWeatherForecastMapper.xml 14 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/CityWeatherForecastMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/CityConfigWeatherForecast.java
New file
@@ -0,0 +1,56 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取气象预测数据
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CityConfigWeatherForecast extends Model<CityConfigWeatherForecast> {
    private static final long serialVersionUID = 1L;
    /**
     * 主键id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 城市code
     */
    private Integer cityCode;
    /**
     * 城市名字
     */
    private String cityName;
    /**
     * 从和风天气获取气象预测数据
     */
    private Integer locationId;
    /**
     * 逻辑删除,0:不删除;1:删除
     */
    private String isDelete;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
screen-job/src/main/java/com/moral/api/entity/CityWeatherForecast.java
New file
@@ -0,0 +1,45 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 * 城市预测气象数据表
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CityWeatherForecast extends Model<CityWeatherForecast> {
    private static final long serialVersionUID = 1L;
    /**
     * 城市code
     */
    private Integer cityCode;
    /**
     * 时间
     */
    private Date time;
    /**
     * 数据
     */
    private String value;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-job/src/main/java/com/moral/api/mapper/CityConfigWeatherForecastMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.CityConfigWeatherForecast;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取气象预测数据 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
public interface CityConfigWeatherForecastMapper extends BaseMapper<CityConfigWeatherForecast> {
}
screen-job/src/main/java/com/moral/api/mapper/CityWeatherForecastMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.CityWeatherForecast;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 城市预测气象数据表 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
public interface CityWeatherForecastMapper extends BaseMapper<CityWeatherForecast> {
}
screen-job/src/main/java/com/moral/api/service/CityConfigWeatherForecastService.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.service;
import com.moral.api.entity.CityConfigWeatherForecast;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取气象预测数据 服务类
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
public interface CityConfigWeatherForecastService extends IService<CityConfigWeatherForecast> {
}
screen-job/src/main/java/com/moral/api/service/CityWeatherForecastService.java
New file
@@ -0,0 +1,19 @@
package com.moral.api.service;
import com.moral.api.entity.CityWeatherForecast;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 城市预测气象数据表 服务类
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
public interface CityWeatherForecastService extends IService<CityWeatherForecast> {
    //城市明日逐小时预测气象数据insert
    void insertCityWeatherForecast();
}
screen-job/src/main/java/com/moral/api/service/impl/CityAqiDailyServiceImpl.java
@@ -69,9 +69,9 @@
        //按city_code分组
        Map<String, List<Map<String, Object>>> data = dailyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString()));
        CityAqiDaily cityAqiDaily = new CityAqiDaily();
        data.forEach((cityCode, value) -> {
            Map<String, Object> jsonMap = new HashMap<>();
            CityAqiDaily cityAqiDaily = new CityAqiDaily();
            cityAqiDaily.setCityCode(Integer.parseInt(cityCode));
            cityAqiDaily.setTime(start);
            //O3日均值单独计算,滑动值算法
screen-job/src/main/java/com/moral/api/service/impl/CityAqiMonthlyServiceImpl.java
@@ -71,9 +71,9 @@
        //按city_code分组
        Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString()));
        CityAqiMonthly cityAqiMonthly = new CityAqiMonthly();
        data.forEach((cityCode, value) -> {
            Map<String, Object> jsonMap = new HashMap<>();
            CityAqiMonthly cityAqiMonthly = new CityAqiMonthly();
            cityAqiMonthly.setCityCode(Integer.parseInt(cityCode));
            cityAqiMonthly.setTime(start);
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
@@ -70,6 +70,7 @@
        wrapper.select("city_code", "city_id").eq("is_delete", Constants.NOT_DELETE);
        List<CityConfigAqi> list = cityConfigAqiService.list(wrapper);
        CityAqi cityAqi = new CityAqi();
        for (CityConfigAqi cityConfigAqi : list) {
            Integer cityCode = cityConfigAqi.getCityCode();
            Map<String, Object> data;
@@ -142,7 +143,6 @@
            aqi.put("primaryPollutant", aqiAndPollutant.getPrimaryPollutantNames());
            CityAqi cityAqi = new CityAqi();
            cityAqi.setCityCode(cityCode);
            cityAqi.setTime(dataTime);
            cityAqi.setValue(JSONObject.toJSONString(aqi));
screen-job/src/main/java/com/moral/api/service/impl/CityAqiYearlyServiceImpl.java
@@ -72,9 +72,9 @@
        //按city_code分组
        Map<String, List<Map<String, Object>>> data = monthlyData.parallelStream().collect(Collectors.groupingBy(o -> o.get("city_code").toString()));
        CityAqiYearly cityAqiYearly = new CityAqiYearly();
        data.forEach((cityCode, value) -> {
            Map<String, Object> jsonMap = new HashMap<>();
            CityAqiYearly cityAqiYearly = new CityAqiYearly();
            cityAqiYearly.setCityCode(Integer.parseInt(cityCode));
            cityAqiYearly.setTime(start);
screen-job/src/main/java/com/moral/api/service/impl/CityConfigWeatherForecastServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.moral.api.service.impl;
import com.moral.api.entity.CityConfigWeatherForecast;
import com.moral.api.mapper.CityConfigWeatherForecastMapper;
import com.moral.api.service.CityConfigWeatherForecastService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取气象预测数据 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
@Service
public class CityConfigWeatherForecastServiceImpl extends ServiceImpl<CityConfigWeatherForecastMapper, CityConfigWeatherForecast> implements CityConfigWeatherForecastService {
}
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherForecastServiceImpl.java
New file
@@ -0,0 +1,69 @@
package com.moral.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.CityConfigWeatherForecast;
import com.moral.api.entity.CityWeatherForecast;
import com.moral.api.mapper.CityWeatherForecastMapper;
import com.moral.api.service.CityConfigWeatherForecastService;
import com.moral.api.service.CityWeatherForecastService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.constant.Constants;
import com.moral.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * 城市预测气象数据表 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-12-30
 */
@Service
public class CityWeatherForecastServiceImpl extends ServiceImpl<CityWeatherForecastMapper, CityWeatherForecast> implements CityWeatherForecastService {
    @Autowired
    private CityConfigWeatherForecastService cityConfigWeatherForecastService;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private CityWeatherForecastMapper cityWeatherForecastMapper;
    @Override
    public void insertCityWeatherForecast() {
        Date nextDay = DateUtils.addDays(new Date(), 1);
        String nextTime = DateUtils.dateToDateString(nextDay, DateUtils.yyyy_MM_dd_EN);
        //获取城市配置
        QueryWrapper<CityConfigWeatherForecast> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "location_id").eq("is_delete", Constants.NOT_DELETE);
        List<CityConfigWeatherForecast> list = cityConfigWeatherForecastService.list(wrapper);
        CityWeatherForecast cityWeatherForecast = new CityWeatherForecast();
        for (CityConfigWeatherForecast cityConfigWeatherForecast : list) {
            Integer cityCode = cityConfigWeatherForecast.getCityCode();
            Integer locationId = cityConfigWeatherForecast.getLocationId();
            Map<String, Object> data = restTemplate.getForObject("https://api.qweather.com/v7/weather/72h?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, locationId);
            List<Map<String, Object>> hourly = (List<Map<String, Object>>) data.get("hourly");
            for (Map<String, Object> hourlyMap : hourly) {
                String fxTime = hourlyMap.get("fxTime").toString();
                String dayTime = fxTime.split("T")[0];
                if (dayTime.equals(nextTime)) {
                    String hourTime = fxTime.substring(0, 17).replaceAll("T", " ");
                    cityWeatherForecast.setCityCode(cityCode);
                    cityWeatherForecast.setTime(DateUtils.getDate(hourTime, DateUtils.yyyy_MM_dd_HH_EN));
                    cityWeatherForecast.setValue(JSONObject.toJSONString(hourlyMap));
                    cityWeatherForecastMapper.insert(cityWeatherForecast);
                }
            }
        }
    }
}
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java
@@ -50,12 +50,12 @@
        QueryWrapper<CityConfigWeather> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "location_id").eq("is_delete", Constants.NOT_DELETE);
        List<CityConfigWeather> list = cityConfigWeatherService.list(wrapper);
        CityWeather cityWeather = new CityWeather();
        for (CityConfigWeather cityConfigWeather : list) {
            Integer cityCode = cityConfigWeather.getCityCode();
            Integer locationId = cityConfigWeather.getLocationId();
            Map<String, Object> data = restTemplate.getForObject("https://api.qweather.com/v7/weather/now?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, locationId);
            Map<String, Object> now = (Map<String, Object>) data.get("now");
            CityWeather cityWeather = new CityWeather();
            cityWeather.setCityCode(cityCode);
            //风速km/h->m/s
            double windSpeed = Double.parseDouble(now.get("windSpeed").toString());
screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java
@@ -69,6 +69,7 @@
        List<GovMonitorPoint> 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);
        HistoryAqi historyAqi = new HistoryAqi();
        for (GovMonitorPoint govMonitorPoint : govMonitorPoints) {
            String guid = govMonitorPoint.getGuid();
            ResponseEntity<String> response;
@@ -84,7 +85,6 @@
            if (ObjectUtils.isEmpty(map)) {
                continue;
            }
            HistoryAqi historyAqi = new HistoryAqi();
            historyAqi.setGuid(guid);
            historyAqi.setTime(DateUtils.addHours(time, -1));
            //存入数据库
screen-job/src/main/java/com/moral/api/task/WeatherTask.java
@@ -3,6 +3,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.moral.api.service.CityWeatherForecastService;
import com.moral.api.service.CityWeatherService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
@@ -14,9 +15,12 @@
    @Autowired
    private CityWeatherService cityWeatherService;
    //城市气象实测数据insert
    @Autowired
    private CityWeatherForecastService cityWeatherForecastService;
    //城市逐小时气象实测数据insert
    @XxlJob("insertCityWeather")
    public ReturnT insertCityWeather(){
    public ReturnT insertCityWeather() {
        try {
            cityWeatherService.insertCityWeather();
        } catch (Exception e) {
@@ -25,4 +29,16 @@
        }
        return ReturnT.SUCCESS;
    }
    //城市明日逐小时预测气象预测数据insert
    @XxlJob("insertCityWeatherForecast")
    public ReturnT insertCityWeatherForecast() {
        try {
            cityWeatherForecastService.insertCityWeatherForecast();
        } catch (Exception e) {
            XxlJobHelper.log(e.getMessage());
            return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
        }
        return ReturnT.SUCCESS;
    }
}
screen-job/src/main/resources/mapper/CityConfigWeatherForecastMapper.xml
New file
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.moral.api.mapper.CityConfigWeatherForecastMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.moral.api.entity.CityConfigWeatherForecast">
        <id column="id" property="id"/>
        <result column="city_code" property="cityCode"/>
        <result column="city_name" property="cityName"/>
        <result column="location_id" property="locationId"/>
        <result column="is_delete" property="isDelete"/>
    </resultMap>
</mapper>
screen-job/src/main/resources/mapper/CityWeatherForecastMapper.xml
New file
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.moral.api.mapper.CityWeatherForecastMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.moral.api.entity.CityWeatherForecast">
        <result column="city_code" property="cityCode"/>
        <result column="time" property="time"/>
        <result column="value" property="value"/>
    </resultMap>
</mapper>