Commit cb7fc5cd authored by ZWT's avatar ZWT

feat(零碳): 长庆演示系统新增功能

1.修改第三方日累计数据推送表表结构,增加日累计储能放电量字段,同时修改代码对应实体及mapper文件,修改相关接口增加储能日累计放电量接收逻辑;
2.修改首页井场收益分析模块接口,修改获取储能累计放电量逻辑;
3.设计并创建井口日用电趋势表,生成对应实体类及mapper文件;
4.统计分析模块,新增本月累计节电经济效益查询接口,添加线上接口文档并完成接口冒烟测试;
5.统计分析模块,新增本月累计减碳量查询接口,添加线上接口文档并完成接口冒烟测试;
6.统计分析模块,新增光伏发电趋势查询接口,添加线上接口文档并完成接口冒烟测试;
7.统计分析模块,新增月度总览查询接口,添加线上接口文档并完成接口冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent adf4001f
......@@ -49,4 +49,12 @@ public interface ThirdActivePowerViewMapper {
* @return {@link List }<{@link ThirdActivePowerView }>
*/
List<ThirdActivePowerView> selectAvgPhotovoltaicPower(ThirdActivePowerView record);
/**
* 获得15分钟平均功率
*
* @param record 记录
* @return {@link List }<{@link ThirdActivePowerView }>
*/
List<ThirdActivePowerView> selectAvgPower15(ThirdActivePowerView record);
}
package pps.core.prediction.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.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.core.common.constant.BusinessConstant;
import pps.core.prediction.entity.ConfigShowEnt;
import pps.core.prediction.entity.PlantPredictedPowerShortTermEnt;
import pps.core.prediction.entity.ThirdActivePowerView;
import pps.core.prediction.mapper.ConfigShowMapper;
import pps.core.prediction.mapper.PlantPredictedPowerShortTermMapper;
import pps.core.prediction.mapper.ThirdActivePowerViewMapper;
import pps.core.prediction.service.data.plant_predicted_power_data.GetPredictedPowerOutput;
import pps.core.prediction.service.data.plant_predicted_power_mid_term.GetPlantPredictedPowerMidTermOutput;
import pps.core.prediction.service.data.plant_predicted_power_short_term.GetPlantPredictedPowerShortTermInput;
import xstartup.annotation.XService;
......@@ -14,10 +26,17 @@ import xstartup.base.util.XStringUtils;
import xstartup.data.XListResult;
import xstartup.feature.api.annotation.XApiGet;
import java.util.Date;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 短期功率预测
*
* @author ZWT
* @date 2024/06/06
*/
@XService
@XText("电站预测功率短期72小时数据")
public class PlantPredictedPowerShortTermService {
......@@ -33,14 +52,87 @@ public class PlantPredictedPowerShortTermService {
return XListResult.success(outputs);
}
/**
* 一天功率预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetPredictedPowerOutput }>
*/
@XApiGet
@XText("根据电站预测1天的预测数据")
public XListResult<GetPlantPredictedPowerMidTermOutput> getOnePlantPredictedPowerShortTermList(XContext context, GetPlantPredictedPowerShortTermInput input) {
public XListResult<GetPredictedPowerOutput> getOnePlantPredictedPowerShortTermList(XContext context, GetPlantPredictedPowerShortTermInput input) {
//判断是否需要启用演示配置
DateTime date = DateUtil.date();
DateTime inputTime = DateUtil.parse(input.getStartTime(), BusinessConstant.DATE_FORMAT_DAY);
ConfigShowMapper configMapper = context.getBean(ConfigShowMapper.class);
ConfigShowEnt configShowEnt = configMapper.selectOne(new LambdaQueryWrapper<ConfigShowEnt>()
.last("LIMIT 1"));
Date showTime;
DateTime day;
int betweenDay;
if (ObjectUtil.isAllNotEmpty(configShowEnt, configShowEnt.getChoiceDate(), configShowEnt.getChoiceDate())) {
DateTime choiceDate = DateUtil.date(configShowEnt.getChoiceDate());
day = configShowEnt.getIsEnable().equals(0) ? choiceDate : inputTime;
showTime = DateUtil.parse(day.toString(BusinessConstant.DATE_FORMAT_DAY) + " " + date.toString(BusinessConstant.TIME_FORMAT));
//计算偏移
betweenDay = (int) DateUtil.betweenDay(inputTime, day, false);
if (DateUtil.compare(day, inputTime) > 0) {
betweenDay = -betweenDay;
}
} else {
day = inputTime;
showTime = date;
betweenDay = 0;
}
DateTime beginTime = DateUtil.offsetMinute(day, -1);
DateTime endTime = DateUtil.offsetDay(day, 1);
//查一天预测
PlantPredictedPowerShortTermMapper mapper = context.getBean(PlantPredictedPowerShortTermMapper.class);
QueryWrapper<PlantPredictedPowerShortTermEnt> queryWrapper = setQueryWrapper(input.getPlantId(), input.getStartTime(), 1);
List<PlantPredictedPowerShortTermEnt> list = mapper.selectList(queryWrapper);
List<GetPlantPredictedPowerMidTermOutput> outputs = XCopyUtils.copyNewList(list, GetPlantPredictedPowerMidTermOutput.class);
ThirdActivePowerServiceHelper.getActivePower(context, outputs, input.getPlantId(), null);
List<PlantPredictedPowerShortTermEnt> predictedList = mapper.selectList(new LambdaQueryWrapper<PlantPredictedPowerShortTermEnt>()
.eq(PlantPredictedPowerShortTermEnt::getPlantId, input.getPlantId())
.between(PlantPredictedPowerShortTermEnt::getDataDate, beginTime, endTime)
.orderByAsc(PlantPredictedPowerShortTermEnt::getDataDate)
);
Map<DateTime, BigDecimal> predictedMap;
if (CollUtil.isNotEmpty(predictedList)) {
predictedMap = predictedList.stream()
.collect(Collectors.toMap(x -> DateUtil.parse(x.getDataDate()), PlantPredictedPowerShortTermEnt::getPredictPower));
} else {
predictedMap = Collections.emptyMap();
}
//查实际功率
ThirdActivePowerViewMapper powerMapper = context.getBean(ThirdActivePowerViewMapper.class);
List<ThirdActivePowerView> powerList = powerMapper.selectAvgPower15(ThirdActivePowerView.builder()
.stationId(input.getPlantId())
.startTime(beginTime)
.endTime(showTime)
.build());
Map<Date, BigDecimal> powerMap;
if (CollUtil.isNotEmpty(powerList)) {
powerMap = powerList.stream()
.collect(Collectors.toMap(ThirdActivePowerView::getInputTime, ThirdActivePowerView::getPhotovoltaicPower));
} else {
powerMap = Collections.emptyMap();
}
//取时间范围
List<DateTime> rangeToList = DateUtil.rangeToList(day, endTime, DateField.MINUTE, 15);
GetPredictedPowerOutput output;
List<GetPredictedPowerOutput> outputs = new ArrayList<>(rangeToList.size());
for (DateTime dateTime : rangeToList) {
output = new GetPredictedPowerOutput();
//匹配预测发电量
output.setPredictPower(predictedMap.getOrDefault(dateTime, BigDecimal.ZERO));
//匹配实际发电量
output.setPower(powerMap.getOrDefault(dateTime, BigDecimal.ZERO));
//时间偏移
if (betweenDay != 0) {
output.setDataDate(DateUtil.offsetDay(dateTime, betweenDay));
} else {
output.setDataDate(dateTime);
}
outputs.add(output);
}
return XListResult.success(outputs);
}
......
package pps.core.prediction.service.data.plant_predicted_power_data;
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/06/06 15:42
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GetPredictedPowerOutput {
@XText("日期")
private Date dataDate;
@XText("实际功率")
private BigDecimal power;
@XText("预测功率")
private BigDecimal predictPower;
}
......@@ -2,14 +2,26 @@ package pps.core.prediction.service.data.plant_predicted_power_mid_term;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
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/06/06
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GetPlantPredictedPowerMidTermOutput implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
......@@ -28,5 +40,4 @@ public class GetPlantPredictedPowerMidTermOutput implements Serializable {
@XText("创建时间")
private Date createTime;
}
......@@ -9,7 +9,7 @@
<result column="photovoltaic_power" property="photovoltaicPower" jdbcType="DECIMAL"/>
<result column="meter_power" property="meterPower" jdbcType="DECIMAL"/>
<result column="system_source" property="systemSource" jdbcType="VARCHAR"/>
<result column="input_time" property="inputTime" jdbcType="DATE"/>
<result column="input_time" property="inputTime" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id
......@@ -132,4 +132,33 @@
ORDER BY g.station_name,
g.create_time
</select>
<select id="selectAvgPower15" parameterType="pps.core.prediction.entity.ThirdActivePowerView"
resultMap="BaseResultMap">
SELECT IFNULL(AVG(z.photovoltaic_power), 0) AS photovoltaic_power,
z.input_time
FROM (SELECT photovoltaic_power,
CASE
WHEN MINUTE ( input_time) IN ( 10, 40 ) THEN
DATE_SUB( input_time, INTERVAL + 10 MINUTE )
WHEN MINUTE ( input_time ) IN ( 20, 50 ) THEN
DATE_SUB( input_time, INTERVAL + 5 MINUTE ) ELSE input_time
END input_time
FROM
third_active_power
WHERE
station_id = #{stationId}
AND input_time &gt;= #{startTime}
<if test="endTime != null">
AND input_time &lt;= #{endTime}
</if>
ORDER BY
input_time ASC
) z
GROUP BY
z.input_time
ORDER BY
z.input_time
</select>
</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