jinpengyong
2021-10-11 81d31a0f9449943dcd78c1d0358443366a998201
接入城市气象数据定时任务
3 files renamed
3 files deleted
14 files added
2 files modified
521 ■■■■ changed files
screen-job/src/main/java/com/moral/api/entity/CityAqi.java 45 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/CityConfig.java 19 ●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/CityWeather.java 45 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/CityAqiConfigMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/CityAqiMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/CityConfigMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/CityWeatherMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityAqiConfigService.java 21 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityAqiService.java 19 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityConfigService.java 16 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/CityWeatherService.java 19 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java 2 ●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java 31 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java 62 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityConfigServiceImpl.java 20 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java 67 ●●●●● 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/AqiInsertTask.java 44 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/task/WeatherTask.java 15 ●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/CityAqiMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/CityConfigMapper.xml 6 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/CityWeatherMapper.xml 12 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/entity/CityAqi.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>
 * 城市aqi实测小时数据表
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CityAqi extends Model<CityAqi> {
    private static final long serialVersionUID = 1L;
    /**
     * 城市id
     */
    private String cityCode;
    /**
     * 时间
     */
    private Date time;
    /**
     * 数据
     */
    private String value;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-job/src/main/java/com/moral/api/entity/CityConfig.java
File was renamed from screen-job/src/main/java/com/moral/api/entity/CityAqiConfig.java
@@ -9,15 +9,15 @@
/**
 * <p>
 * 墨迹天气aqi城市配置
 * 城市配置表,用于从第三方接口获取数据
 * </p>
 *
 * @author moral
 * @since 2021-06-15
 * @since 2021-10-11
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CityAqiConfig extends Model<CityAqiConfig> {
public class CityConfig extends Model<CityConfig> {
    private static final long serialVersionUID = 1L;
@@ -38,10 +38,21 @@
    private String cityName;
    /**
     * 墨迹天气接口中城市id
     * 从墨迹获取数据
     */
    private Integer cityId;
    /**
     * 从和风天气获取数据
     */
    private Integer locationId;
    /**
     * 逻辑删除,0:不删除;1:删除
     */
    private String isDelete;
    @Override
    protected Serializable pkVal() {
        return this.id;
screen-job/src/main/java/com/moral/api/entity/CityWeather.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-10-11
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class CityWeather extends Model<CityWeather> {
    private static final long serialVersionUID = 1L;
    /**
     * 城市code
     */
    private String cityCode;
    /**
     * 时间
     */
    private Date time;
    /**
     * 数据
     */
    private String value;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-job/src/main/java/com/moral/api/mapper/CityAqiConfigMapper.java
File was deleted
screen-job/src/main/java/com/moral/api/mapper/CityAqiMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.CityAqi;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 城市aqi实测小时数据表 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface CityAqiMapper extends BaseMapper<CityAqi> {
}
screen-job/src/main/java/com/moral/api/mapper/CityConfigMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.CityConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取数据 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface CityConfigMapper extends BaseMapper<CityConfig> {
}
screen-job/src/main/java/com/moral/api/mapper/CityWeatherMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.CityWeather;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 * 城市实测小时气象数据表 Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface CityWeatherMapper extends BaseMapper<CityWeather> {
}
screen-job/src/main/java/com/moral/api/service/CityAqiConfigService.java
File was deleted
screen-job/src/main/java/com/moral/api/service/CityAqiService.java
New file
@@ -0,0 +1,19 @@
package com.moral.api.service;
import com.moral.api.entity.CityAqi;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 城市aqi实测小时数据表 服务类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface CityAqiService extends IService<CityAqi> {
    //aqi数据按城市insert
    void insertCityAqi();
}
screen-job/src/main/java/com/moral/api/service/CityConfigService.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.service;
import com.moral.api.entity.CityConfig;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取数据 服务类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface CityConfigService extends IService<CityConfig> {
}
screen-job/src/main/java/com/moral/api/service/CityWeatherService.java
New file
@@ -0,0 +1,19 @@
package com.moral.api.service;
import com.moral.api.entity.CityWeather;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * 城市实测小时气象数据表 服务类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
public interface CityWeatherService extends IService<CityWeather> {
    //实时城市气象数据insert
    void insertCityWeather();
}
screen-job/src/main/java/com/moral/api/service/HistoryAqiService.java
@@ -5,7 +5,7 @@
public interface HistoryAqiService extends IService<HistoryAqi> {
    //墨迹aqi数据insert
    //aqi数据按国控站接入
    void insertHistoryAqi();
}
screen-job/src/main/java/com/moral/api/service/impl/CityAqiConfigServiceImpl.java
File was deleted
screen-job/src/main/java/com/moral/api/service/impl/CityAqiServiceImpl.java
New file
@@ -0,0 +1,62 @@
package com.moral.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.CityAqi;
import com.moral.api.entity.CityConfig;
import com.moral.api.entity.CityWeather;
import com.moral.api.mapper.CityAqiMapper;
import com.moral.api.service.CityAqiService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.service.CityConfigService;
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>
 * 城市aqi实测小时数据表 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
@Service
public class CityAqiServiceImpl extends ServiceImpl<CityAqiMapper, CityAqi> implements CityAqiService {
    @Autowired
    private CityAqiMapper cityAqiMapper;
    @Autowired
    private CityConfigService cityConfigService;
    @Autowired
    private RestTemplate restTemplate;
    @Override
    public void insertCityAqi() {
        //获取城市配置
        QueryWrapper<CityConfig> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "location_id").eq("is_delete", Constants.NOT_DELETE);
        List<CityConfig> list = cityConfigService.list(wrapper);
        for (CityConfig cityConfig : list) {
            String cityCode = cityConfig.getCityCode();
            Integer locationId = cityConfig.getLocationId();
            Map<String, Object> data = restTemplate.getForObject("https://api.qweather.com/v7/air/now?key=da05c6c4852d4f7aa3364a9236ee9e26&gzip=n&location={1}", Map.class, locationId);
            Map<String, Object> now = (Map<String, Object>) data.get("now");
            CityAqi cityAqi = new CityAqi();
            cityAqi.setCityCode(cityCode);
            cityAqi.setValue(JSONObject.toJSONString(now));
            Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN);
            cityAqi.setTime(time);
            cityAqiMapper.insert(cityAqi);
        }
    }
}
screen-job/src/main/java/com/moral/api/service/impl/CityConfigServiceImpl.java
New file
@@ -0,0 +1,20 @@
package com.moral.api.service.impl;
import com.moral.api.entity.CityConfig;
import com.moral.api.mapper.CityConfigMapper;
import com.moral.api.service.CityConfigService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 城市配置表,用于从第三方接口获取数据 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
@Service
public class CityConfigServiceImpl extends ServiceImpl<CityConfigMapper, CityConfig> implements CityConfigService {
}
screen-job/src/main/java/com/moral/api/service/impl/CityWeatherServiceImpl.java
New file
@@ -0,0 +1,67 @@
package com.moral.api.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.CityConfig;
import com.moral.api.entity.CityWeather;
import com.moral.api.mapper.CityWeatherMapper;
import com.moral.api.service.CityConfigService;
import com.moral.api.service.CityWeatherService;
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.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * <p>
 * 城市实测小时气象数据表 服务实现类
 * </p>
 *
 * @author moral
 * @since 2021-10-11
 */
@Service
public class CityWeatherServiceImpl extends ServiceImpl<CityWeatherMapper, CityWeather> implements CityWeatherService {
    @Autowired
    private CityWeatherMapper cityWeatherMapper;
    @Autowired
    private CityConfigService cityConfigService;
    @Autowired
    private RestTemplate restTemplate;
    @Override
    public void insertCityWeather() {
        //获取城市配置
        QueryWrapper<CityConfig> wrapper = new QueryWrapper<>();
        wrapper.select("city_code", "location_id").eq("is_delete", Constants.NOT_DELETE);
        List<CityConfig> list = cityConfigService.list(wrapper);
        for (CityConfig cityConfig : list) {
            String cityCode = cityConfig.getCityCode();
            Integer locationId = cityConfig.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());
            windSpeed = windSpeed * 1000 / 3600;
            String format = String.format("%.1f", windSpeed);
            now.put("windSpeed", format);
            cityWeather.setValue(JSONObject.toJSONString(now));
            Date time = DateUtils.dataToTimeStampTime(new Date(), DateUtils.yyyy_MM_dd_HH_EN);
            cityWeather.setTime(time);
            cityWeatherMapper.insert(cityWeather);
        }
    }
}
screen-job/src/main/java/com/moral/api/service/impl/HistoryAqiServiceImpl.java
@@ -2,11 +2,9 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.moral.api.entity.CityAqiConfig;
import com.moral.api.entity.GovMonitorPoint;
import com.moral.api.entity.HistoryAqi;
import com.moral.api.mapper.HistoryAqiMapper;
import com.moral.api.service.CityAqiConfigService;
import com.moral.api.service.GovMonitorPointService;
import com.moral.api.service.HistoryAqiService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
screen-job/src/main/java/com/moral/api/task/AqiInsertTask.java
New file
@@ -0,0 +1,44 @@
package com.moral.api.task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.moral.api.service.CityAqiService;
import com.moral.api.service.HistoryAqiService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
@Component
public class AqiInsertTask {
    @Autowired
    private HistoryAqiService historyAqiService;
    @Autowired
    private CityAqiService cityAqiService;
    //aqi数据按国控站接入
    @XxlJob("insertHistoryAqi")
    public ReturnT insertHistoryAqi() {
        try {
            historyAqiService.insertHistoryAqi();
        } catch (Exception e) {
            XxlJobHelper.log(e.getMessage());
            return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
        }
        return ReturnT.SUCCESS;
    }
    //aqi数据按城市接入
    @XxlJob("insertCityAqi")
    public ReturnT insertCityAqi() {
        try {
            cityAqiService.insertCityAqi();
        } catch (Exception e) {
            XxlJobHelper.log(e.getMessage());
            return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
        }
        return ReturnT.SUCCESS;
    }
}
screen-job/src/main/java/com/moral/api/task/WeatherTask.java
File was renamed from screen-job/src/main/java/com/moral/api/task/HistoryAqiInsertTask.java
@@ -3,22 +3,23 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.moral.api.service.HistoryAqiService;
import com.moral.api.service.CityConfigService;
import com.moral.api.service.CityWeatherService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
@Component
public class HistoryAqiInsertTask {
public class WeatherTask {
    @Autowired
    private HistoryAqiService historyAqiService;
    private CityWeatherService cityWeatherService;
    //墨迹小时aqi数据接入
    @XxlJob("insertHistoryAqi")
    public ReturnT insertHistoryAqi() {
    //城市气象实测数据insert
    @XxlJob("insertCityWeather")
    public ReturnT insertCityWeather(){
        try {
            historyAqiService.insertHistoryAqi();
            cityWeatherService.insertCityWeather();
        } catch (Exception e) {
            XxlJobHelper.log(e.getMessage());
            return new ReturnT(ReturnT.FAIL_CODE, e.getMessage());
screen-job/src/main/resources/mapper/CityAqiMapper.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.CityAqiMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqi">
                    <result column="city_code" property="cityCode" />
                    <result column="time" property="time" />
                    <result column="value" property="value" />
        </resultMap>
</mapper>
screen-job/src/main/resources/mapper/CityConfigMapper.xml
File was renamed from screen-job/src/main/resources/mapper/CityAqiConfigMapper.xml
@@ -1,13 +1,15 @@
<?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.CityAqiConfigMapper">
<mapper namespace="com.moral.api.mapper.CityConfigMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.moral.api.entity.CityAqiConfig">
    <resultMap id="BaseResultMap" type="com.moral.api.entity.CityConfig">
        <id column="id" property="id"/>
        <result column="city_code" property="cityCode"/>
        <result column="city_name" property="cityName"/>
        <result column="city_id" property="cityId"/>
        <result column="location_id" property="locationId"/>
        <result column="is_delete" property="isDelete"/>
    </resultMap>
</mapper>
screen-job/src/main/resources/mapper/CityWeatherMapper.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.CityWeatherMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.moral.api.entity.CityWeather">
        <result column="city_code" property="cityCode"/>
        <result column="time" property="time"/>
        <result column="value" property="value"/>
    </resultMap>
</mapper>