Commit 81840eb4 authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.新建气象局数据收集表,同时生成相关代码;
2.修改天气数据处理转换定时任务,增加处理保存气象局天气数据逻辑,同时解决接收数据入库重复问题;
3.修改风资源功率预测中期三天功率预测结果接口,增加风速等响应字段;
4.修改风资源功率预测中期十天功率预测结果接口,增加风速等响应字段;
5.修改风资源功率预测超短期4小时功率预测结果接口,增加风速等响应字段;
6.修复登录后没有清除验证码导致可以重复登录问题;
7.开发风预测训练集数据保存定时任务,完成定时任务冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 14efdacd
package pps.cloud.base.service;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
/**
* 风资源训练集数据Cloud模块
*
* @author ZWT
* @date 2024/08/30 14:03
*/
@XService
@XText("风资源训练集数据Cloud模块")
public interface IWindPredictionHistoryCloudService {
/**
* 风资源训练集数据Cloud模块--风资源训练集定时任务
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@XText("风资源训练集数据Cloud模块--风资源训练集定时任务")
XServiceResult windPredictionHistoryJob(XContext context);
}
package pps.core.base.entity; package pps.core.base.entity;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.io.Serializable; import java.io.Serializable;
...@@ -15,6 +18,9 @@ import java.util.Date; ...@@ -15,6 +18,9 @@ import java.util.Date;
* @date 2024/08/29 * @date 2024/08/29
*/ */
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WindPredictionHistoryView implements Serializable { public class WindPredictionHistoryView implements Serializable {
@XText("ID") @XText("ID")
@TableField @TableField
...@@ -59,5 +65,4 @@ public class WindPredictionHistoryView implements Serializable { ...@@ -59,5 +65,4 @@ public class WindPredictionHistoryView implements Serializable {
@XText("预测功率(kw)") @XText("预测功率(kw)")
@TableField @TableField
private BigDecimal predictedPower; private BigDecimal predictedPower;
} }
...@@ -12,4 +12,4 @@ import pps.core.base.entity.WindPredictionFutureEnt; ...@@ -12,4 +12,4 @@ import pps.core.base.entity.WindPredictionFutureEnt;
*/ */
@Repository(value = "pps.core.base.mapper.WindPredictionFutureMapper") @Repository(value = "pps.core.base.mapper.WindPredictionFutureMapper")
public interface WindPredictionFutureMapper extends BaseMapper<WindPredictionFutureEnt> { public interface WindPredictionFutureMapper extends BaseMapper<WindPredictionFutureEnt> {
} }
\ No newline at end of file
package pps.core.base.mapper; package pps.core.base.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import pps.core.base.entity.WindPredictionHistoryView; import pps.core.base.entity.WindPredictionHistoryView;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -16,4 +18,21 @@ public interface WindPredictionHistoryViewMapper { ...@@ -16,4 +18,21 @@ public interface WindPredictionHistoryViewMapper {
WindPredictionHistoryView selectOne(WindPredictionHistoryView record); WindPredictionHistoryView selectOne(WindPredictionHistoryView record);
List<WindPredictionHistoryView> selectList(WindPredictionHistoryView record); List<WindPredictionHistoryView> selectList(WindPredictionHistoryView record);
/**
* 按时间范围删除
*
* @param startTime 开始时间
* @param endTime 结束时间
* @return int
*/
int deleteByTimeRange(@Param(value = "startTime") Date startTime, @Param(value = "endTime") Date endTime);
/**
* 批量插入
*
* @param list 列表
* @return int
*/
int batchInsert(@Param(value = "list") List<WindPredictionHistoryView> list);
} }
...@@ -31,8 +31,10 @@ public class BaseLineService { ...@@ -31,8 +31,10 @@ public class BaseLineService {
@XText("天气") @XText("天气")
@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, "CQ"); // bean.weatherDataProcess(context, "CQ");
WindPredictionHistoryCloudServiceImpl bean = context.getBean(WindPredictionHistoryCloudServiceImpl.class);
bean.windPredictionHistoryJob(context);
return XServiceResult.OK; return XServiceResult.OK;
} }
......
package pps.core.base.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import pps.cloud.base.service.IWindPredictionHistoryCloudService;
import pps.core.base.entity.WindPredictionFutureEnt;
import pps.core.base.entity.WindPredictionHistoryView;
import pps.core.base.mapper.WindPredictionFutureMapper;
import pps.core.base.mapper.WindPredictionHistoryViewMapper;
import pps.core.common.utils.BaseUtils;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
import java.util.ArrayList;
import java.util.List;
/**
* 风资源训练集数据Cloud模块
*
* @author ZWT
* @date 2024/08/30 14:07
*/
@XService
public class WindPredictionHistoryCloudServiceImpl implements IWindPredictionHistoryCloudService {
/**
* 风资源训练集定时任务
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@Override
public XServiceResult windPredictionHistoryJob(XContext context) {
DateTime startTime = DateUtil.beginOfDay(DateUtil.yesterday());
DateTime endTime = DateUtil.endOfDay(startTime);
//取日期范围内已预测数据
WindPredictionFutureMapper mapper = context.getBean(WindPredictionFutureMapper.class);
List<WindPredictionFutureEnt> list = mapper.selectList(new LambdaQueryWrapper<WindPredictionFutureEnt>()
.between(WindPredictionFutureEnt::getDataTime, startTime, endTime)
);
if (CollUtil.isNotEmpty(list)) {
WindPredictionHistoryViewMapper viewMapper = context.getBean(WindPredictionHistoryViewMapper.class);
//按时间范围删除数据
viewMapper.deleteByTimeRange(startTime, endTime);
//todo 数据处理,匹配实际发电量和实际风速
List<WindPredictionHistoryView> historyList = this.dataProcess(list);
if (historyList.size() > BaseUtils.BATCH_SIZE) {
List<List<WindPredictionHistoryView>> subList = BaseUtils.getSubList(historyList);
subList.forEach(viewMapper::batchInsert);
} else {
viewMapper.batchInsert(historyList);
}
}
return XServiceResult.OK;
}
/*------------------------- private -------------------------*/
/**
* 数据处理
* todo 后续增加匹配实际发电量和实际风速逻辑
*
* @param list 列表
* @return {@link List }<{@link WindPredictionHistoryView }>
*/
private List<WindPredictionHistoryView> dataProcess(List<WindPredictionFutureEnt> list) {
List<WindPredictionHistoryView> historyList = new ArrayList<>(list.size());
for (WindPredictionFutureEnt future : list) {
historyList.add(WindPredictionHistoryView.builder()
.stationId(future.getStationId())
.dataTime(future.getDataTime())
.windDirection(future.getWindDirection())
.windSpeed(future.getWindSpeed())
.airTemperature(future.getAirTemperature())
.humidity(future.getHumidity())
.pressure(future.getPressure())
.actualWindSpeed(future.getActualWindSpeed())
.actualPower(future.getActualPower())
.predictedPower(future.getPredictedPower())
.build());
}
return historyList;
}
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="pps.core.base.mapper.WindPredictionHistoryViewMapper"> <mapper namespace="pps.core.base.mapper.WindPredictionHistoryViewMapper">
<resultMap id="BaseResultMap" type="pps.core.base.entity.WindPredictionHistoryView"> <resultMap id="BaseResultMap" type="pps.core.base.entity.WindPredictionHistoryView">
<id column="id" property="id" jdbcType="BIGINT" /> <id column="id" property="id" jdbcType="BIGINT"/>
<result column="station_id" property="stationId" jdbcType="VARCHAR" /> <result column="station_id" property="stationId" jdbcType="VARCHAR"/>
<result column="data_time" property="dataTime" jdbcType="DATE" /> <result column="data_time" property="dataTime" jdbcType="DATE"/>
<result column="wind_direction" property="windDirection" jdbcType="INTEGER" /> <result column="wind_direction" property="windDirection" jdbcType="INTEGER"/>
<result column="wind_speed" property="windSpeed" jdbcType="DECIMAL" /> <result column="wind_speed" property="windSpeed" jdbcType="DECIMAL"/>
<result column="air_temperature" property="airTemperature" jdbcType="DECIMAL" /> <result column="air_temperature" property="airTemperature" jdbcType="DECIMAL"/>
<result column="humidity" property="humidity" jdbcType="DECIMAL" /> <result column="humidity" property="humidity" jdbcType="DECIMAL"/>
<result column="pressure" property="pressure" jdbcType="DECIMAL" /> <result column="pressure" property="pressure" jdbcType="DECIMAL"/>
<result column="actual_wind_speed" property="actualWindSpeed" jdbcType="DECIMAL" /> <result column="actual_wind_speed" property="actualWindSpeed" jdbcType="DECIMAL"/>
<result column="actual_power" property="actualPower" jdbcType="DECIMAL" /> <result column="actual_power" property="actualPower" jdbcType="DECIMAL"/>
<result column="predicted_power" property="predictedPower" jdbcType="DECIMAL" /> <result column="predicted_power" property="predictedPower" jdbcType="DECIMAL"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
, ,
station_id, station_id,
data_time, data_time,
wind_direction, wind_direction,
...@@ -27,19 +27,45 @@ ...@@ -27,19 +27,45 @@
actual_wind_speed, actual_wind_speed,
actual_power, actual_power,
predicted_power predicted_power
</sql> </sql>
<select id="selectOne" parameterType="pps.core.base.entity.WindPredictionHistoryView" resultMap="BaseResultMap"> <select id="selectOne" parameterType="pps.core.base.entity.WindPredictionHistoryView" resultMap="BaseResultMap">
select select
<include refid="Base_Column_List" /> <include refid="Base_Column_List"/>
from wind_prediction_history from wind_prediction_history
where where
id=#{id} id=#{id}
</select> </select>
<select id="selectList" parameterType="pps.core.base.entity.WindPredictionHistoryView" resultMap="BaseResultMap"> <select id="selectList" parameterType="pps.core.base.entity.WindPredictionHistoryView" resultMap="BaseResultMap">
select select
<include refid="Base_Column_List" /> <include refid="Base_Column_List"/>
from wind_prediction_history from wind_prediction_history
where where
id=#{id} id=#{id}
</select> </select>
<delete id="deleteByTimeRange">
DELETE
FROM wind_prediction_history
WHERE data_time BETWEEN #{startTime}
AND #{endTime}
</delete>
<insert id="batchInsert" parameterType="list">
INSERT INTO wind_prediction_history (station_id, data_time, wind_direction, wind_speed, air_temperature,
humidity, pressure ,actual_wind_speed ,actual_power ,predicted_power) VALUES
<foreach collection="list" separator="," item="item">
(
#{item.stationId},
#{item.dataTime},
#{item.windDirection},
#{item.windSpeed},
#{item.airTemperature},
#{item.humidity},
#{item.pressure},
#{item.actualWindSpeed},
#{item.actualPower},
#{item.predictedPower}
)
</foreach>
</insert>
</mapper> </mapper>
\ No newline at end of file
package pps.core.task.job;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import pps.cloud.base.service.IWindPredictionHistoryCloudService;
import pps.core.common.cache.TaskLockCache;
import pps.core.task.constant.TaskConstant;
import pps.core.task.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
import xstartup.service.job.XJob;
import xstartup.service.job.annotation.XCronTrigger;
/**
* 风资源训练集数据定时任务
*
* @author ZWT
* @date 2024/08/30 13:50
*/
@XText("风资源训练集数据定时任务")
@XService
public class WindPredictionHistoryJob implements XJob {
/**
* 每天00:12执行
*
* @param xContext x上下文
* @return {@link XServiceResult }
*/
@XCronTrigger(value = TaskConstant.EVERY_DAY_12)
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ WindPredictionHistoryJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "WindPredictionHistoryJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
try {
IWindPredictionHistoryCloudService service = xContext.getBean(IWindPredictionHistoryCloudService.class);
XServiceResult result = service.windPredictionHistoryJob(xContext);
result.throwIfFail();
} catch (Exception e) {
xContext.getLogger().error("------ WindPredictionHistoryJob Exception: ", e);
} finally {
xContext.getLogger().info("------ WindPredictionHistoryJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
}
}
return XServiceResult.OK;
}
}
...@@ -32,6 +32,7 @@ public class DeployPpsAllApplication { ...@@ -32,6 +32,7 @@ public class DeployPpsAllApplication {
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeUltraJob.class)); startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeUltraJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeShortJob.class)); startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeShortJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(PlantPredictedPowerLongTermDataJob.class)); startup.enable(XJobFeature.class).config(new XJobServiceConf(PlantPredictedPowerLongTermDataJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(WindPredictionHistoryJob.class));
startup.run(args); startup.run(args);
} }
} }
...@@ -17,6 +17,7 @@ x.job.service=pps.core.task.job.SpaceOptimizeLongJob,\ ...@@ -17,6 +17,7 @@ x.job.service=pps.core.task.job.SpaceOptimizeLongJob,\
pps.core.task.job.SpaceCalibrationJob,\ pps.core.task.job.SpaceCalibrationJob,\
pps.core.task.job.SpaceOptimizeShortJob,\ pps.core.task.job.SpaceOptimizeShortJob,\
pps.core.task.job.SpaceOptimizeUltraJob,\ pps.core.task.job.SpaceOptimizeUltraJob,\
pps.core.task.job.WindPredictionHistoryJob,\
pps.core.task.job.PlantPredictedPowerLongTermDataJob pps.core.task.job.PlantPredictedPowerLongTermDataJob
# redis # redis
x.cache.type=@x.cache.type@ x.cache.type=@x.cache.type@
......
...@@ -28,6 +28,7 @@ public class DeployPpsTaskApplication { ...@@ -28,6 +28,7 @@ public class DeployPpsTaskApplication {
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceCalibrationJob.class)); startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceCalibrationJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeShortJob.class)); startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeShortJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(PlantPredictedPowerLongTermDataJob.class)); startup.enable(XJobFeature.class).config(new XJobServiceConf(PlantPredictedPowerLongTermDataJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(WindPredictionHistoryJob.class));
startup.enable(XRpcFeature.class); startup.enable(XRpcFeature.class);
startup.run(args); startup.run(args);
} }
......
...@@ -5,6 +5,7 @@ x.job.service=pps.core.task.job.SpaceOptimizeLongJob,\ ...@@ -5,6 +5,7 @@ x.job.service=pps.core.task.job.SpaceOptimizeLongJob,\
pps.core.task.job.SpaceOptimizeUltraJob,\ pps.core.task.job.SpaceOptimizeUltraJob,\
pps.core.task.job.SpaceCalibrationJob,\ pps.core.task.job.SpaceCalibrationJob,\
pps.core.task.job.SpaceOptimizeShortJob,\ pps.core.task.job.SpaceOptimizeShortJob,\
pps.core.task.job.WindPredictionHistoryJob,\
pps.core.task.job.PlantPredictedPowerLongTermDataJob pps.core.task.job.PlantPredictedPowerLongTermDataJob
x.log.level=@x.log.level@ x.log.level=@x.log.level@
x.log.directory=@x.log.directory@ x.log.directory=@x.log.directory@
......
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