Commit c60d355c authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.基础信息配置模块创建风资源历史数据表和风资源预测数据表,同时生成对应代码;
2.修改天气数据获取处理定时任务,修改光伏预测数据插入逻辑,同时增加风资源数据插入逻辑,完成功能测试;
3.开发风资源预测中期10天预测接口,完成接口冒烟测试并添加线上接口文档同时生成接口用例;
4.开发风资源预测中期3天预测接口,完成接口冒烟测试并添加线上接口文档同时生成接口用例;
5.开发风资源预测超短期4小时预测接口,完成接口冒烟测试并添加线上接口文档同时生成接口用例;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 3971547b
...@@ -54,7 +54,7 @@ public class BaseWindTurbineService { ...@@ -54,7 +54,7 @@ public class BaseWindTurbineService {
* @return {@link XSingleResult }<{@link GetBaseWindTurbineOutput }> * @return {@link XSingleResult }<{@link GetBaseWindTurbineOutput }>
*/ */
@XText("详情") @XText("详情")
@XApiPost @XApiPost(anonymous = true)
public XSingleResult<GetBaseWindTurbineOutput> getBaseWindTurbine(XContext context, GetBaseWindTurbineInput input) { public XSingleResult<GetBaseWindTurbineOutput> getBaseWindTurbine(XContext context, GetBaseWindTurbineInput input) {
//查主表信息 //查主表信息
BaseWindTurbineMapper mapper = context.getBean(BaseWindTurbineMapper.class); BaseWindTurbineMapper mapper = context.getBean(BaseWindTurbineMapper.class);
......
package pps.core.base.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.core.base.entity.WindPredictionFutureEnt;
import pps.core.base.mapper.WindPredictionFutureMapper;
import pps.core.base.service.data.wind_prediction_future.GetWindPredictionFutureInput;
import pps.core.base.service.data.wind_prediction_future.GetWindPredictionFutureOutput;
import pps.core.common.constant.BusinessConstant;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XListResult;
import xstartup.feature.api.annotation.XApiPost;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 风预测
*
* @author ZWT
* @date 2024/08/29
*/
@XText("风预测")
@XService
public class WindPredictionFutureService {
/**
* 中期10天预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetWindPredictionFutureOutput }>
*/
@XApiPost(anonymous = true)
@XText("中期10天预测")
public XListResult<GetWindPredictionFutureOutput> getMidTerm10DayList(XContext context, GetWindPredictionFutureInput input) {
return XListResult.success(getPredictedPowerOutput(context, input.getDataTime(), input.getStationId(), 10));
}
/**
* 中期3天预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetWindPredictionFutureOutput }>
*/
@XApiPost(anonymous = true)
@XText("中期3天预测")
public XListResult<GetWindPredictionFutureOutput> getMidTerm3DayList(XContext context, GetWindPredictionFutureInput input) {
return XListResult.success(getPredictedPowerOutput(context, input.getDataTime(), input.getStationId(), 3));
}
/**
* 短期4小时预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetWindPredictionFutureOutput }>
*/
@XApiPost(anonymous = true)
@XText("短期4小时预测")
public XListResult<GetWindPredictionFutureOutput> getShortTerm4HourList(XContext context, GetWindPredictionFutureInput input) {
DateTime now = DateUtil.date();
DateTime inputTime;
String inputStartTime = input.getDataTime();
if (CharSequenceUtil.isBlank(inputStartTime)) {
inputTime = DateUtil.beginOfHour(now);
} else {
inputTime = DateUtil.parse(now.toString(BusinessConstant.DATE_FORMAT_DAY) + " " + inputStartTime + BusinessConstant.INITIALIZATION_SECOND);
}
//时间出力截至时间
int betweenDay = 0;
DateTime day = inputTime;
//计算时间范围,开始时间往前推1天,结束时间往后推4小时
DateTime beginTime = DateUtil.offsetMinute(day, -1441);
DateTime endTime = DateUtil.offsetHour(day, 4);
//查预测功率
WindPredictionFutureMapper mapper = context.getBean(WindPredictionFutureMapper.class);
List<WindPredictionFutureEnt> predictedList = mapper.selectList(new QueryWrapper<WindPredictionFutureEnt>()
.select("data_time", "IFNULL( predicted_power, 0 ) AS predicted_power")
.lambda()
.eq(WindPredictionFutureEnt::getStationId, input.getStationId())
.between(WindPredictionFutureEnt::getDataTime, beginTime, endTime)
.groupBy(WindPredictionFutureEnt::getDataTime, WindPredictionFutureEnt::getPredictedPower)
.orderByAsc(WindPredictionFutureEnt::getDataTime)
);
Map<Date, BigDecimal> predictedMap;
if (CollUtil.isNotEmpty(predictedList)) {
predictedMap = predictedList.stream()
.collect(Collectors.toMap(WindPredictionFutureEnt::getDataTime, WindPredictionFutureEnt::getPredictedPower));
} else {
predictedMap = Collections.emptyMap();
}
//查实际功率
Map<Date, BigDecimal> powerMap = Collections.emptyMap();
return XListResult.success(getPowerOutput(DateUtil.offsetDay(day, -1), endTime, betweenDay, now, predictedMap, powerMap));
}
/**
* 获得预测功率输出
*
* @param context 上下文
* @param inputTimeStr 输入时间str
* @param stationId 站点id
* @param offsetDay 补偿日
* @return {@link List }<{@link GetWindPredictionFutureOutput }>
*/
public List<GetWindPredictionFutureOutput> getPredictedPowerOutput(XContext context, String inputTimeStr, String stationId, int offsetDay) {
//判断是否需要启用演示配置
DateTime date = DateUtil.date();
DateTime inputTime;
if (CharSequenceUtil.isBlank(inputTimeStr)) {
inputTime = DateUtil.beginOfDay(date);
} else {
inputTime = DateUtil.parse(inputTimeStr, BusinessConstant.DATE_FORMAT_DAY);
}
//时间出力截至时间
DateTime day = inputTime;
int betweenDay = 0;
//输入时间等于当日时间时,进行演示开关校验
DateTime beginTime = DateUtil.offsetMinute(day, -1);
DateTime endTime = DateUtil.offsetDay(day, offsetDay);
//查预测功率
WindPredictionFutureMapper mapper = context.getBean(WindPredictionFutureMapper.class);
List<WindPredictionFutureEnt> predictedList = mapper.selectList(new QueryWrapper<WindPredictionFutureEnt>()
.select("data_time", "IFNULL( predicted_power, 0 ) AS predicted_power")
.lambda()
.eq(WindPredictionFutureEnt::getStationId, stationId)
.between(WindPredictionFutureEnt::getDataTime, beginTime, endTime)
.groupBy(WindPredictionFutureEnt::getDataTime, WindPredictionFutureEnt::getPredictedPower)
.orderByAsc(WindPredictionFutureEnt::getDataTime)
);
Map<Date, BigDecimal> predictedMap;
if (CollUtil.isNotEmpty(predictedList)) {
predictedMap = predictedList.stream()
.collect(Collectors.toMap(WindPredictionFutureEnt::getDataTime, WindPredictionFutureEnt::getPredictedPower));
} else {
predictedMap = Collections.emptyMap();
}
//查实际功率
// Map<Date, BigDecimal> powerMap = getActivePowerMap15(context, stationId, beginTime, showTime);
Map<Date, BigDecimal> powerMap = Collections.emptyMap();
return getPowerOutput(day, endTime, betweenDay, date, predictedMap, powerMap);
}
/**
* 获得预测功率输出
*
* @param beginTime 开始时间
* @param endTime 结束时间
* @param betweenDay 天之间
* @param now 现在
* @param predictedMap 预测地图
* @param powerMap 功率图
* @return {@link List }<{@link GetWindPredictionFutureOutput }>
*/
public List<GetWindPredictionFutureOutput> getPowerOutput(DateTime beginTime, DateTime endTime, int betweenDay, Date now,
Map<Date, BigDecimal> predictedMap, Map<Date, BigDecimal> powerMap) {
//取时间范围
List<DateTime> rangeToList = DateUtil.rangeToList(beginTime, endTime, DateField.MINUTE, 15);
GetWindPredictionFutureOutput output;
List<GetWindPredictionFutureOutput> outputs = new ArrayList<>(rangeToList.size());
Date dataDate;
for (DateTime dateTime : rangeToList) {
output = new GetWindPredictionFutureOutput();
//时间偏移
if (betweenDay != 0) {
dataDate = DateUtil.offsetDay(dateTime, betweenDay);
} else {
dataDate = dateTime;
}
output.setDataTime(dataDate);
//匹配预测发电量
output.setPredictedPower(predictedMap.getOrDefault(dateTime, BigDecimal.ZERO));
//匹配实际发电量
if (DateUtil.compare(dataDate, now) > 0) {
output.setActualPower(null);
} else {
output.setActualPower(powerMap.getOrDefault(dateTime, null));
}
outputs.add(output);
}
return outputs;
}
}
package pps.core.base.service.data.wind_prediction_future;
import lombok.Data;
import xstartup.annotation.XText;
/**
* 风预测
*
* @author ZWT
* @date 2024/08/29
*/
@Data
public class GetWindPredictionFutureInput {
@XText("风电站ID")
private String stationId;
@XText("记录时间")
private String dataTime;
}
package pps.core.base.service.data.wind_prediction_future;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 风预测
*
* @author ZWT
* @date 2024/08/29
*/
@Data
public class GetWindPredictionFutureOutput {
@XText("记录时间")
private Date dataTime;
@XText("实际功率(kw)")
private BigDecimal actualPower;
@XText("预测功率(kw)")
private BigDecimal predictedPower;
}
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