Commit 1b7fe308 authored by ZWT's avatar ZWT

feat(吉林演示): 松原

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

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent dadf49c4
......@@ -17,10 +17,7 @@ import pps.core.base.enums.WindDirection;
import pps.core.base.mapper.BaseWindTurbineMapper;
import pps.core.base.mapper.BaseWindTurbineViewMapper;
import pps.core.base.mapper.WindPredictionFutureMapper;
import pps.core.base.service.data.base_wind_turbine.GetBaseWindTurbineViewInput;
import pps.core.base.service.data.base_wind_turbine.GetBaseWindTurbineViewOutput;
import pps.core.base.service.data.base_wind_turbine.GetStationPowerGenerationOutput;
import pps.core.base.service.data.base_wind_turbine.GetWindTurbineRunStatusOutput;
import pps.core.base.service.data.base_wind_turbine.*;
import pps.core.base.service.data.weather_bureau_data.GetWeatherBureauDataOutput;
import pps.core.base.service.data.wind_prediction_future.GetWindPredictionFutureInput;
import pps.core.base.service.data.wind_prediction_future.GetWindPredictionFutureOutput;
......@@ -132,6 +129,73 @@ public class WindPredictionFutureService {
.build());
}
/**
* 发电功率预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetPowerGenerationTrendOutput }>
*/
@XApiPost
@XText("发电功率预测")
public XListResult<GetPowerGenerationTrendOutput> powerGenerationTrend(XContext context, GetBaseWindTurbineViewInput input) {
DateTime now = DateUtil.date();
//处理时间范围
Date startTime = input.getStartTime();
Date endTime = input.getEndTime();
if (ObjectUtil.isNull(startTime)) {
startTime = DateUtil.beginOfDay(now);
} else {
startTime = DateUtil.beginOfHour(startTime);
}
if (ObjectUtil.isNull(endTime)) {
endTime = DateUtil.offsetDay(startTime, BusinessConstant.TEN);
} else {
endTime = DateUtil.beginOfHour(endTime);
}
//查电站列表
List<BaseWindTurbineEnt> turbineList = this.getWindTurbineList(context, input.getOuId());
if (CollUtil.isEmpty(turbineList)) {
return XListResult.success(Collections.emptyList());
}
List<String> stationIds = turbineList.stream().map(BaseModel::getId).collect(Collectors.toList());
//计算中期截至时间
Date midEnd = DateUtil.offsetDay(now, BusinessConstant.TEN);
if (DateUtil.compare(midEnd, endTime) > 0) {
midEnd = endTime;
}
Map<Date, BigDecimal> midMap = this.getPredictedMap(context, stationIds, startTime, midEnd);
//计算短期截至时间
Date shortEnd = DateUtil.offsetDay(now, BusinessConstant.THREE);
if (DateUtil.compare(shortEnd, endTime) > 0) {
shortEnd = endTime;
}
Map<Date, BigDecimal> shortMap = this.getPredictedMap(context, stationIds, startTime, shortEnd);
//计算超短期截至时间
Date ultraShortEnd = DateUtil.offsetHour(now, BusinessConstant.FOUR);
if (DateUtil.compare(ultraShortEnd, endTime) > 0) {
ultraShortEnd = endTime;
}
Map<Date, BigDecimal> ultraShortMap = this.getPredictedMap(context, stationIds, startTime, ultraShortEnd);
//时间区间
List<DateTime> rangeToList = DateUtil.rangeToList(startTime, endTime, DateField.MINUTE, 15);
//封装数据
List<GetPowerGenerationTrendOutput> outputs = new ArrayList<>(rangeToList.size());
for (DateTime dateTime : rangeToList) {
outputs.add(
GetPowerGenerationTrendOutput.builder()
.dataTime(dateTime)
.midPredictedPower(midMap.getOrDefault(dateTime, BigDecimal.ZERO))
.shortPredictedPower(shortMap.getOrDefault(dateTime, BigDecimal.ZERO))
.ultraShortPredictedPower(ultraShortMap.getOrDefault(dateTime, BigDecimal.ZERO))
//todo 暂时没接数据
.actualPower(BigDecimal.ZERO)
.build()
);
}
return XListResult.success(outputs);
}
/**
* 风电站运行状态
*
......@@ -325,6 +389,35 @@ public class WindPredictionFutureService {
return predictedMap;
}
/**
* 获取预测数据
*
* @param context 上下文
* @param stationIds 站点ID
* @param beginTime 开始时间
* @param endTime 结束时间
* @return {@link Map }<{@link Date }, {@link BigDecimal }>
*/
private Map<Date, BigDecimal> getPredictedMap(XContext context, List<String> stationIds, Date beginTime, Date endTime) {
WindPredictionFutureMapper mapper = context.getBean(WindPredictionFutureMapper.class);
List<WindPredictionFutureEnt> predictedList = mapper.selectList(new QueryWrapper<WindPredictionFutureEnt>()
.select("data_time", "IFNULL( SUM( predicted_power ), 0 ) AS predicted_power")
.lambda()
.in(WindPredictionFutureEnt::getStationId, stationIds)
.between(WindPredictionFutureEnt::getDataTime, beginTime, endTime)
.groupBy(WindPredictionFutureEnt::getDataTime)
.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();
}
return predictedMap;
}
/**
* 获取风力电站列表
*
......@@ -338,17 +431,14 @@ public class WindPredictionFutureService {
queryWrapper.eq(BaseModel::getIsDeleted, BusinessConstant.ONE);
if (CharSequenceUtil.isBlank(ouId)) {
ouId = context.getSession(PpsUserSession.class).getOuId();
List<GetSysOrganizationViewOutput> ouList = ServiceUtil.getOrgIdsByPath(context, GetAllOuListByOuIdInput.builder()
.ouId(ouId)
.ouLevel(BusinessConstant.PLANT_FLAG)
.build());
queryWrapper.in(BaseWindTurbineEnt::getOuId, ouList.stream()
.map(GetSysOrganizationViewOutput::getId)
.collect(Collectors.toList())
);
} else {
queryWrapper.eq(BaseWindTurbineEnt::getOuId, ouId);
}
List<GetSysOrganizationViewOutput> ouList = ServiceUtil.getOrgIdsByPath(context, GetAllOuListByOuIdInput.builder()
.ouId(ouId)
.build());
queryWrapper.in(BaseWindTurbineEnt::getOuId, ouList.stream()
.map(GetSysOrganizationViewOutput::getId)
.collect(Collectors.toList())
);
//查电站
BaseWindTurbineMapper mapper = context.getBean(BaseWindTurbineMapper.class);
return mapper.selectList(queryWrapper);
......
......@@ -3,6 +3,8 @@ package pps.core.base.service.data.base_wind_turbine;
import lombok.Data;
import xstartup.annotation.XText;
import java.util.Date;
/**
* 基础风机电站
*
......@@ -17,4 +19,10 @@ public class GetBaseWindTurbineViewInput {
@XText("运行状态(启动/停用/故障)")
private String runState;
@XText("开始时间(yyyy-MM-dd HH:00:00)")
private Date startTime;
@XText("结束时间(yyyy-MM-dd HH:00:00)")
private Date endTime;
}
package pps.core.base.service.data.base_wind_turbine;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 发电功率预测
*
* @author ZWT
* @date 2024/09/03
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GetPowerGenerationTrendOutput {
@XText("时间")
private Date dataTime;
@XText("中期预测功率(kW)")
private BigDecimal midPredictedPower;
@XText("短期预测功率(kW)")
private BigDecimal shortPredictedPower;
@XText("超短期预测功率(kW)")
private BigDecimal ultraShortPredictedPower;
@XText("实际功率(kw)")
private BigDecimal actualPower;
}
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