Commit 0a4ba39e authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.新建气象局数据收集表,同时生成相关代码;
2.修改天气数据处理转换定时任务,增加处理保存气象局天气数据逻辑,同时解决接收数据入库重复问题;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 4752bda0
package pps.core.base.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import xstartup.annotation.XText;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 气象局数据
*
* @author ZWT
* @date 2024/08/30
*/
@Data
@TableName("weather_bureau_data")
public class WeatherBureauDataEnt implements Serializable {
@XText("ID")
@TableId(type = IdType.AUTO)
private Long id;
@XText("记录时间")
@TableField
private Date dataTime;
@XText("天气图标")
@TableField
private String weatherIcon;
@XText("气温(℃)")
@TableField
private BigDecimal airTemperature;
@XText("降水")
@TableField
private String precipitation;
@XText("风速(m/s)")
@TableField
private BigDecimal windSpeed;
@XText("风向")
@TableField
private Integer windDirection;
@XText("气压(hPa)")
@TableField
private BigDecimal pressure;
@XText("湿度(%)")
@TableField
private BigDecimal humidity;
@XText("云量(%)")
@TableField
private BigDecimal cloudCover;
@XText("地区编码")
@TableField
private String areaCode;
}
package pps.core.base.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 气象局数据
*
* @author ZWT
* @date 2024/08/30
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WeatherBureauDataView implements Serializable {
@XText("ID")
@TableField
private Long id;
@XText("记录时间")
@TableField
private Date dataTime;
@XText("天气图标")
@TableField
private String weatherIcon;
@XText("气温(℃)")
@TableField
private BigDecimal airTemperature;
@XText("降水")
@TableField
private String precipitation;
@XText("风速(m/s)")
@TableField
private BigDecimal windSpeed;
@XText("风向")
@TableField
private Integer windDirection;
@XText("气压(hPa)")
@TableField
private BigDecimal pressure;
@XText("湿度(%)")
@TableField
private BigDecimal humidity;
@XText("云量(%)")
@TableField
private BigDecimal cloudCover;
@XText("地区编码")
@TableField
private String areaCode;
}
package pps.core.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.WeatherBureauDataEnt;
/**
* 气象局数据
*
* @author ZWT
* @date 2024/08/30
*/
@Repository(value = "pps.core.base.mapper.WeatherBureauDataMapper")
public interface WeatherBureauDataMapper extends BaseMapper<WeatherBureauDataEnt> {
}
package pps.core.base.mapper;
import cn.hutool.core.date.DateTime;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.WeatherBureauDataView;
import java.util.List;
/**
* 气象局数据
*
* @author ZWT
* @date 2024/08/30
*/
@Repository(value = "pps.core.base.mapper.WeatherBureauDataViewMapper")
public interface WeatherBureauDataViewMapper {
WeatherBureauDataView selectOne(WeatherBureauDataView record);
List<WeatherBureauDataView> selectList(WeatherBureauDataView record);
/**
* 批量删除
*
* @param deleteList 删除列表
* @param create 创造
* @param end 结束
* @return int
*/
int deleteBatch(@Param(value = "list") List<String> deleteList, @Param(value = "create") DateTime create, @Param(value = "end") DateTime end);
/**
* 批量新增
*
* @param list 列表
* @return int
*/
int insertBatch(List<WeatherBureauDataView> list);
}
...@@ -32,7 +32,7 @@ public class BaseLineService { ...@@ -32,7 +32,7 @@ public class BaseLineService {
@XApiGet(anonymous = true) @XApiGet(anonymous = true)
public XServiceResult test(XContext context) { public XServiceResult test(XContext context) {
BaseWeatherCloudServiceImpl bean = context.getBean(BaseWeatherCloudServiceImpl.class); BaseWeatherCloudServiceImpl bean = context.getBean(BaseWeatherCloudServiceImpl.class);
bean.weatherDataProcess(context, "SY"); bean.weatherDataProcess(context, "CQ");
return XServiceResult.OK; return XServiceResult.OK;
} }
......
...@@ -112,6 +112,10 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -112,6 +112,10 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
} }
logger.info("------ weatherDataProcess jsonObjectList size: {}", jsonObjectList.size()); logger.info("------ weatherDataProcess jsonObjectList size: {}", jsonObjectList.size());
if (CollUtil.isNotEmpty(jsonObjectList)) { if (CollUtil.isNotEmpty(jsonObjectList)) {
//气象局数据处理
XThreadHelper.async(() -> {
this.weatherBureauDataProcess(context, jsonObjectList);
});
//风机预测数据处理 //风机预测数据处理
XThreadHelper.async(() -> { XThreadHelper.async(() -> {
this.windTurbineDataProcess(context, jsonObjectList); this.windTurbineDataProcess(context, jsonObjectList);
...@@ -413,6 +417,149 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -413,6 +417,149 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
return String.valueOf(number); return String.valueOf(number);
} }
/**
* 气象局数据处理
*
* @param context 上下文
* @param jsonObjectList json对象列表
*/
private void weatherBureauDataProcess(XContext context, List<JSONObject> jsonObjectList) {
context.getLogger().info("------ weatherDataProcess weatherBureauDataProcess begin ------");
List<String> deleteList = new ArrayList<>(32);
List<WeatherBureauDataView> batchList = new ArrayList<>(13312);
DateTime create = DateUtil.offsetMinute(DateTime.of(DateUtil.now(), "yyyy-MM-dd HH"), -5);
DateTime end = DateUtil.offsetDay(create, 16);
int count = 0;
for (JSONObject jsonObject : jsonObjectList) {
this.dataFractionation(jsonObject, deleteList, batchList);
count++;
if (BusinessConstant.TEN.equals(count)) {
this.deleteWeatherBureauList(context, deleteList, create, end);
this.insertWeatherBureauList(context, batchList);
context.getLogger().info("------ weatherDataProcess clear size d {} b {}", deleteList.size(), batchList.size());
CollUtil.clear(deleteList, batchList);
count = 0;
}
}
context.getLogger().info("------ weatherDataProcess delete and insertBatch");
if (CollUtil.isNotEmpty(deleteList)) {
this.deleteWeatherBureauList(context, deleteList, create, end);
}
if (CollUtil.isNotEmpty(batchList)) {
this.insertWeatherBureauList(context, batchList);
}
CollUtil.clear(deleteList, batchList);
context.getLogger().info("------ weatherDataProcess weatherBureauDataProcess end ------");
}
/**
* 数据处理
*
* @param jsonObject json对象
* @param deleteList 删除列表
* @param batchList 批次列表
*/
private void dataFractionation(JSONObject jsonObject, List<String> deleteList, List<WeatherBureauDataView> batchList) {
Map<String, List<DailyData>> cityDataMap = new HashMap<>(16);
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof JSONArray) {
cityDataMap.put(key, ((JSONArray) value).toJavaList(DailyData.class));
}
}
for (String cityCode : cityDataMap.keySet()) {
List<DailyData> dailyDataList = cityDataMap.get(cityCode);
//删除数据
deleteList.add(cityCode);
//遍历预测数据列表
int hours = 0;
DateTime dateTime;
for (DailyData dailyData : dailyDataList) {
dateTime = DateUtil.date(dailyData.getDateTime());
for (int i = 0; i < 8; i++) {
//判断小时数与查到的小时数,如果查到的小时数小,判断为第二天
int hour = DateUtil.parse(dailyData.getHourTimeArray().get(i), BusinessConstant.MINUTES_FORMAT).hour(true);
if (hours >= hour) {
dateTime = DateUtil.offsetDay(dateTime, 1);
}
hours = hour;
//风向
int wind = 0;
if (CollUtil.isNotEmpty(dailyData.getWindDirectionArray())) {
if (i < dailyData.getWindDirectionArray().size()) {
WindDirection windDirection = WindDirection.findByValue(dailyData.getWindDirectionArray().get(i));
if (Objects.nonNull(windDirection)) {
wind = windDirection.getValue();
}
}
}
WeatherBureauDataView view = WeatherBureauDataView.builder()
.dataTime(DateUtil.parse(dateTime.toString(BusinessConstant.DATE_FORMAT_DAY) + ' ' + this.int2Str(hours) + ':' + BusinessConstant.START_OF_DAY_TIME))
.weatherIcon(dailyData.getWeatherArray().get(i))
.airTemperature(new BigDecimal(CharSequenceUtil.replace(dailyData.getTemperatureArray().get(i), "℃", "")))
.precipitation(dailyData.getPrecipitationArray().get(i))
.windSpeed(new BigDecimal(CharSequenceUtil.replace(dailyData.getWindSpeedArray().get(i), "m/s", "")))
.windDirection(wind)
.pressure(new BigDecimal(CharSequenceUtil.replace(dailyData.getPressureArray().get(i), "hPa", "")))
.humidity(new BigDecimal(CharSequenceUtil.replace(dailyData.getHumidityArray().get(i), "%", "")))
.cloudCover(new BigDecimal(CharSequenceUtil.replace(dailyData.getCloudCoverArray().get(i), "%", "")))
.areaCode(cityCode)
.build();
//去重
if (batchList.stream()
.noneMatch(item -> DateUtil.compare(item.getDataTime(), view.getDataTime()) == 0 && CharSequenceUtil.equals(item.getAreaCode(), view.getAreaCode()))) {
batchList.add(view);
}
}
}
}
}
/**
* 条件删除预测数据
*
* @param context 上下文
* @param deleteList 删除列表
* @param create 创造
* @param end 结束
*/
private void deleteWeatherBureauList(XContext context, List<String> deleteList, DateTime create, DateTime end) {
if (CollUtil.isNotEmpty(deleteList)) {
WeatherBureauDataViewMapper mapper = context.getBean(WeatherBureauDataViewMapper.class);
int size = deleteList.size();
context.getLogger().info("------ deleteWeatherBureauList batchDelete delete size: {}", size);
if (size > BaseUtils.BATCH_SIZE) {
List<List<String>> subList = BaseUtils.getSubList(deleteList);
for (List<String> list : subList) {
mapper.deleteBatch(list, create, end);
}
} else {
mapper.deleteBatch(deleteList, create, end);
}
}
}
/**
* 插入间歇装置预测功率列表
*
* @param context 上下文
* @param batchList 批处理列表
*/
private void insertWeatherBureauList(XContext context, List<WeatherBureauDataView> batchList) {
if (CollUtil.isNotEmpty(batchList)) {
WeatherBureauDataViewMapper dataViewMapper = context.getBean(WeatherBureauDataViewMapper.class);
int size = batchList.size();
context.getLogger().info("------ insertWindTurbineList batchList insert size: {}", size);
if (size > BaseUtils.BATCH_SIZE) {
List<List<WeatherBureauDataView>> subList = BaseUtils.getSubList(batchList);
subList.forEach(dataViewMapper::insertBatch);
} else {
dataViewMapper.insertBatch(batchList);
}
}
}
/** /**
* 风机预测数据处理 * 风机预测数据处理
* *
......
<?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="pps.core.base.mapper.WeatherBureauDataViewMapper">
<resultMap id="BaseResultMap" type="pps.core.base.entity.WeatherBureauDataView">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="data_time" property="dataTime" jdbcType="DATE"/>
<result column="weather_icon" property="weatherIcon" jdbcType="VARCHAR"/>
<result column="air_temperature" property="airTemperature" jdbcType="DECIMAL"/>
<result column="precipitation" property="precipitation" jdbcType="VARCHAR"/>
<result column="wind_speed" property="windSpeed" jdbcType="DECIMAL"/>
<result column="wind_direction" property="windDirection" jdbcType="INTEGER"/>
<result column="pressure" property="pressure" jdbcType="DECIMAL"/>
<result column="humidity" property="humidity" jdbcType="DECIMAL"/>
<result column="cloud_cover" property="cloudCover" jdbcType="DECIMAL"/>
<result column="area_code" property="areaCode" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id
,
data_time,
weather_icon,
air_temperature,
precipitation,
wind_speed,
wind_direction,
pressure,
humidity,
cloud_cover,
area_code
</sql>
<select id="selectOne" parameterType="pps.core.base.entity.WeatherBureauDataView" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from weather_bureau_data
where
id=#{id}
</select>
<select id="selectList" parameterType="pps.core.base.entity.WeatherBureauDataView" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from weather_bureau_data
where
id=#{id}
</select>
<delete id="deleteBatch" parameterType="list">
DELETE FROM weather_bureau_data
WHERE
area_code IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
AND data_time BETWEEN #{create}
AND #{end}
</delete>
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO weather_bureau_data (
data_time,
weather_icon,
air_temperature,
precipitation,
wind_speed,
wind_direction,
pressure,
humidity,
cloud_cover,
area_code
) VALUES
<foreach collection="list" separator="," item="item">
(
#{item.dataTime},
#{item.weatherIcon},
#{item.airTemperature},
#{item.precipitation},
#{item.windSpeed},
#{item.windDirection},
#{item.pressure},
#{item.humidity},
#{item.cloudCover},
#{item.areaCode}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment