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>