Commit 6c8216c0 authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.修改代码扫描测试账号遗留问题,修改环境配置表增加字段,同时修改对应代码增加字段,修改获取当前配置接口逻辑,完成接口冒烟测试;
2.修改天气数据抽取定时任务,修改定时任务配置,将两小时抽取数据改完半小时抽取数据;
3.修改代码扫描硬编码问题,修改第三方环境配置表,增加字段保存第三方接口认证配置信息,修改代码添加对应字段同时修改代码逻辑,完成接口冒烟测试;
4.统计分析模块风能发电监控页面风机运行情况接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
5.统计分析模块风能发电监控页面场站发电量统计接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
6.统计分析模块风能发电监控页面风电站运行状态接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
7.统计分析模块风能发电监控页面发电功率预测接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
8.统计分析模块风能发电监控页面发电功率列表接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
9.统计分析模块风能发电监控页面发电趋势列表接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
10.统计分析模块风能发电监控页面历史风向接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
11.统计分析模块风能发电监控页面历史风速接口开发,完成接口冒烟测试并编写线上接口文档同时生成接口用例;
12.风资源历史数据表增加实际风速字段,同时修改对应代码增加填充实际风速逻辑,修改定时任务;
13.第三方风力发电数据定时任务;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 7673f65b
package pps.cloud.base.service;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
/**
* 第三方风力发电数据
*
* @author ZWT
* @date 2024/09/03 16:30
*/
@XService
@XText("第三方风力发电数据Cloud模块")
public interface IThirdWindPowerGenerationCloudService {
/**
* 第三方风力发电数据Cloud模块--第三方风力发电数据定时任务
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@XText("第三方风力发电数据Cloud模块--第三方风力发电数据定时任务")
XServiceResult thirdWindPowerGenerationJob(XContext context);
}
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/09/03
*/
@Data
@TableName("third_wind_power_generation")
public class ThirdWindPowerGenerationEnt implements Serializable {
@XText("ID")
@TableId(type = IdType.AUTO)
private Long id;
@XText("风电站名称")
@TableField
private String stationName;
@XText("风电站ID")
@TableField
private String stationId;
@XText("采集时间")
@TableField
private Date collectTime;
@XText("实际风速(m/s)")
@TableField
private BigDecimal actualWindSpeed;
@XText("实际功率(kw)")
@TableField
private BigDecimal actualPower;
@XText("实际风向")
@TableField
private Integer actualWindDirection;
@XText("录入时间")
@TableField
private Date inputTime;
@XText("来源系统")
@TableField
private String systemSource;
}
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/09/03
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ThirdWindPowerGenerationView implements Serializable {
@XText("ID")
@TableField
private Long id;
@XText("风电站名称")
@TableField
private String stationName;
@XText("风电站ID")
@TableField
private String stationId;
@XText("采集时间")
@TableField
private Date collectTime;
@XText("实际风速(m/s)")
@TableField
private BigDecimal actualWindSpeed;
@XText("实际功率(kw)")
@TableField
private BigDecimal actualPower;
@XText("实际风向")
@TableField
private Integer actualWindDirection;
@XText("录入时间")
@TableField
private Date inputTime;
@XText("来源系统")
@TableField
private String systemSource;
/*----------------- exist = false -----------------*/
@XText("开始时间")
@TableField(exist = false)
private Date startTime;
@XText("结束时间")
@TableField(exist = false)
private Date endTime;
}
......@@ -66,6 +66,8 @@ public class WindPredictionFutureView implements Serializable {
@TableField
private BigDecimal predictedPower;
/*----------------- exist = false -----------------*/
@XText("创建时间")
@TableField(exist = false)
private Date createTime;
......
package pps.core.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.ThirdWindPowerGenerationEnt;
/**
* 第三方风力发电数据
*
* @author ZWT
* @date 2024/09/03
*/
@Repository(value = "pps.core.base.mapper.ThirdWindPowerGenerationMapper")
public interface ThirdWindPowerGenerationMapper extends BaseMapper<ThirdWindPowerGenerationEnt> {
}
package pps.core.base.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.ThirdWindPowerGenerationView;
import java.util.List;
/**
* 第三方风力发电数据
*
* @author ZWT
* @date 2024/09/03
*/
@Repository(value = "pps.core.base.mapper.ThirdWindPowerGenerationViewMapper")
public interface ThirdWindPowerGenerationViewMapper {
ThirdWindPowerGenerationView selectOne(ThirdWindPowerGenerationView record);
List<ThirdWindPowerGenerationView> selectList(ThirdWindPowerGenerationView record);
/**
* 生成模拟数据
*
* @param record 记录
* @return {@link List }<{@link ThirdWindPowerGenerationView }>
*/
List<ThirdWindPowerGenerationView> generateSimulatedData(ThirdWindPowerGenerationView record);
/**
* 批量插入
*
* @param list 列表
* @return int
*/
int batchInsert(@Param(value = "list") List<ThirdWindPowerGenerationView> list);
}
......@@ -26,12 +26,14 @@ import java.util.*;
@XService
public class BaseLineService {
@XText("天气")
@XApiGet
@XApiGet(anonymous = true)
public XServiceResult test(XContext context) {
// BaseWeatherCloudServiceImpl bean = context.getBean(BaseWeatherCloudServiceImpl.class);
// bean.weatherDataProcess(context, "CQ");
WindPredictionHistoryCloudServiceImpl bean = context.getBean(WindPredictionHistoryCloudServiceImpl.class);
bean.windPredictionHistoryJob(context);
// WindPredictionHistoryCloudServiceImpl bean = context.getBean(WindPredictionHistoryCloudServiceImpl.class);
// bean.windPredictionHistoryJob(context);
ThirdWindPowerGenerationCloudServiceImpl bean = context.getBean(ThirdWindPowerGenerationCloudServiceImpl.class);
bean.thirdWindPowerGenerationJob(context);
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 pps.cloud.base.service.IThirdWindPowerGenerationCloudService;
import pps.core.base.entity.ThirdWindPowerGenerationView;
import pps.core.base.mapper.ThirdWindPowerGenerationViewMapper;
import pps.core.base.service.data.config_oil_field.GetConfigOilFieldOutput;
import pps.core.common.utils.BaseUtils;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
import xstartup.data.XSingleResult;
import java.util.List;
/**
* 第三方风力发电数据
*
* @author ZWT
* @date 2024/09/03 16:34
*/
@XService
public class ThirdWindPowerGenerationCloudServiceImpl implements IThirdWindPowerGenerationCloudService {
/**
* 第三方风力发电数据定时任务
* todo 模拟数据生成
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@Override
public XServiceResult thirdWindPowerGenerationJob(XContext context) {
DateTime endTime = DateUtil.date();
DateTime startTime = DateUtil.offsetMinute(endTime, -30);
ThirdWindPowerGenerationViewMapper viewMapper = context.getBean(ThirdWindPowerGenerationViewMapper.class);
List<ThirdWindPowerGenerationView> list = viewMapper.generateSimulatedData(ThirdWindPowerGenerationView.builder()
.startTime(startTime)
.endTime(endTime)
.build());
if (CollUtil.isNotEmpty(list)) {
//查当前环境
XSingleResult<GetConfigOilFieldOutput> result = context.getBean(ConfigOilFieldService.class).getCurrentConfig(context);
result.throwIfFail();
String systemSource = result.getResult().getOilFieldCode();
for (ThirdWindPowerGenerationView thirdWindPowerGenerationView : list) {
thirdWindPowerGenerationView.setSystemSource(systemSource);
thirdWindPowerGenerationView.setInputTime(endTime);
}
//批量新增
if (list.size() > BaseUtils.BATCH_SIZE) {
List<List<ThirdWindPowerGenerationView>> subList = BaseUtils.getSubList(list);
subList.forEach(viewMapper::batchInsert);
} else {
viewMapper.batchInsert(list);
}
}
return XServiceResult.OK;
}
}
<?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.ThirdWindPowerGenerationViewMapper">
<resultMap id="BaseResultMap" type="pps.core.base.entity.ThirdWindPowerGenerationView">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="station_name" property="stationName" jdbcType="VARCHAR"/>
<result column="station_id" property="stationId" jdbcType="VARCHAR"/>
<result column="collect_time" property="collectTime" jdbcType="DATE"/>
<result column="actual_wind_speed" property="actualWindSpeed" jdbcType="DECIMAL"/>
<result column="actual_power" property="actualPower" jdbcType="DECIMAL"/>
<result column="actual_wind_direction" property="actualWindDirection" jdbcType="INTEGER"/>
<result column="input_time" property="inputTime" jdbcType="DATE"/>
<result column="system_source" property="systemSource" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id
,
station_name,
station_id,
collect_time,
actual_wind_speed,
actual_power,
actual_wind_direction,
input_time,
system_source
</sql>
<select id="selectOne" parameterType="pps.core.base.entity.ThirdWindPowerGenerationView" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from third_wind_power_generation
where
id=#{id}
</select>
<select id="selectList" parameterType="pps.core.base.entity.ThirdWindPowerGenerationView" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from third_wind_power_generation
where
id=#{id}
</select>
<select id="generateSimulatedData" parameterType="pps.core.base.entity.ThirdWindPowerGenerationView"
resultMap="BaseResultMap">
WITH wind_prediction AS (SELECT t.station_name AS station_name,
f.station_id AS station_id,
f.data_time AS collect_time,
f.wind_speed AS actual_wind_speed,
f.predicted_power AS actual_power,
f.wind_direction AS actual_wind_direction,
ROW_NUMBER() OVER ( PARTITION BY f.station_id ORDER BY f.data_time DESC ) AS rn
FROM base_wind_turbine t
LEFT JOIN wind_prediction_future f ON t.id = f.station_id
WHERE t.is_deleted = 1
AND f.data_time BETWEEN #{startTime}
AND #{endTime})
SELECT station_name,
station_id,
collect_time,
actual_wind_speed,
ROUND(actual_wind_speed * RAND() * 1000, 2) AS actual_power,
actual_wind_direction
FROM wind_prediction
WHERE rn = 1
</select>
<insert id="batchInsert" parameterType="list">
INSERT INTO third_wind_power_generation (station_name, station_id, collect_time, actual_wind_speed,
actual_power, actual_wind_direction, input_time, system_source) VALUES
<foreach collection="list" separator="," item="item">
(
#{item.stationName},
#{item.stationId},
#{item.collectTime},
#{item.actualWindSpeed},
#{item.actualPower},
#{item.actualWindDirection},
#{item.inputTime},
#{item.systemSource}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
......@@ -53,6 +53,11 @@ public class TaskConstant {
*/
public static final String EVERY_DAY_0 = "0 0 0 * * ?";
/**
* 每一天 00:03:00
*/
public static final String EVERY_DAY_3 = "0 3 0 * * ?";
/**
* 每一天 00:05:00
*/
......@@ -98,6 +103,11 @@ public class TaskConstant {
*/
public static final String HALF_HOUR_30 = "0 0/30 * * * ?";
/**
* 半小时执行一次 12:01:00 12:31:00...
*/
public static final String HALF_HOUR_31 = "0 1/30 * * * ?";
/**
* 半小时执行一次 12:05:00 12:35:00...
*/
......
package pps.core.task.job;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import pps.cloud.base.service.IThirdWindPowerGenerationCloudService;
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;
/**
* 第三方风力发电数据定时任务
* todo 测试用
*
* @author ZWT
* @date 2024/09/03 16:22
*/
@XText("第三方风力发电数据定时任务")
@XService
public class ThirdWindPowerGenerationJob implements XJob {
/**
* 每半小时执行
*
* @param xContext x上下文
* @return {@link XServiceResult }
*/
@XCronTrigger(value = TaskConstant.HALF_HOUR_31)
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdWindPowerGenerationJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdWindPowerGenerationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
try {
IThirdWindPowerGenerationCloudService service = xContext.getBean(IThirdWindPowerGenerationCloudService.class);
XServiceResult result = service.thirdWindPowerGenerationJob(xContext);
result.throwIfFail();
} catch (Exception e) {
xContext.getLogger().error("------ ThirdWindPowerGenerationJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdWindPowerGenerationJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
}
}
return XServiceResult.OK;
}
}
\ No newline at end of file
......@@ -33,6 +33,7 @@ public class DeployPpsAllApplication {
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(WindPredictionHistoryJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(ThirdWindPowerGenerationJob.class));
startup.run(args);
}
}
......@@ -18,6 +18,7 @@ x.job.service=pps.core.task.job.SpaceOptimizeLongJob,\
pps.core.task.job.SpaceOptimizeShortJob,\
pps.core.task.job.SpaceOptimizeUltraJob,\
pps.core.task.job.WindPredictionHistoryJob,\
pps.core.task.job.ThirdWindPowerGenerationJob,\
pps.core.task.job.PlantPredictedPowerLongTermDataJob
# redis
x.cache.type=@x.cache.type@
......
......@@ -29,6 +29,7 @@ public class DeployPpsTaskApplication {
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(WindPredictionHistoryJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(ThirdWindPowerGenerationJob.class));
startup.enable(XRpcFeature.class);
startup.run(args);
}
......
......@@ -6,6 +6,7 @@ x.job.service=pps.core.task.job.SpaceOptimizeLongJob,\
pps.core.task.job.SpaceCalibrationJob,\
pps.core.task.job.SpaceOptimizeShortJob,\
pps.core.task.job.WindPredictionHistoryJob,\
pps.core.task.job.ThirdWindPowerGenerationJob,\
pps.core.task.job.PlantPredictedPowerLongTermDataJob
x.log.level=@x.log.level@
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