Commit 90a4e848 authored by ZWT's avatar ZWT

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

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

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent efc07572
package pps.core.prediction.service;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.core.common.constant.BusinessConstant;
import pps.core.prediction.entity.PlantPredictedPowerMidTermEnt;
import pps.core.prediction.mapper.PlantPredictedPowerMidTermMapper;
import pps.core.prediction.service.data.plant_predicted_power_data.GetPredictedPowerOutput;
import pps.core.prediction.service.data.plant_predicted_power_mid_term.GetPlantPredictedPowerMidTermInput;
import pps.core.prediction.service.data.plant_predicted_power_mid_term.GetPlantPredictedPowerMidTermOutput;
import pps.core.prediction.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils;
import xstartup.base.util.XStringUtils;
import xstartup.data.XListResult;
import xstartup.feature.api.annotation.XApiGet;
import java.util.List;
@XService
@XText("电站预测功率中期240小时数据")
public class PlantPredictedPowerMidTermService {
/**
* 十五天功率预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetPredictedPowerOutput }>
*/
@XApiGet
@XText("根据电站预测15天的预测数据")
public XListResult<GetPlantPredictedPowerMidTermOutput> getFifteenPlantPredictedPowerMidTermList(XContext context, GetPlantPredictedPowerMidTermInput input) {
PlantPredictedPowerMidTermMapper mapper = context.getBean(PlantPredictedPowerMidTermMapper.class);
QueryWrapper<PlantPredictedPowerMidTermEnt> queryWrapper = setQueryWrapper(input.getPlantId(), input.getStartTime(), 16);
List<PlantPredictedPowerMidTermEnt> list = mapper.selectList(queryWrapper);
List<GetPlantPredictedPowerMidTermOutput> outputs = XCopyUtils.copyNewList(list, GetPlantPredictedPowerMidTermOutput.class);
ThirdActivePowerServiceHelper.getActivePower(context, outputs, input.getPlantId(), null);
return XListResult.success(outputs);
public XListResult<GetPredictedPowerOutput> getFifteenPlantPredictedPowerMidTermList(XContext context, GetPlantPredictedPowerMidTermInput input) {
return XListResult.success(ServiceUtil.getPredictedPowerOutput(context, input.getStartTime(), input.getPlantId(), 15, 2));
}
/**
* 十天功率预测
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult }<{@link GetPredictedPowerOutput }>
*/
@XApiGet
@XText("根据电站预测10天的预测数据")
public XListResult<GetPlantPredictedPowerMidTermOutput> getTenPlantPredictedPowerMidTermList(XContext context, GetPlantPredictedPowerMidTermInput input) {
PlantPredictedPowerMidTermMapper mapper = context.getBean(PlantPredictedPowerMidTermMapper.class);
QueryWrapper<PlantPredictedPowerMidTermEnt> queryWrapper = setQueryWrapper(input.getPlantId(), input.getStartTime(), 10);
List<PlantPredictedPowerMidTermEnt> list = mapper.selectList(queryWrapper);
List<GetPlantPredictedPowerMidTermOutput> outputs = XCopyUtils.copyNewList(list, GetPlantPredictedPowerMidTermOutput.class);
ThirdActivePowerServiceHelper.getActivePower(context, outputs, input.getPlantId(), null);
return XListResult.success(outputs);
public XListResult<GetPredictedPowerOutput> getTenPlantPredictedPowerMidTermList(XContext context, GetPlantPredictedPowerMidTermInput input) {
return XListResult.success(ServiceUtil.getPredictedPowerOutput(context, input.getStartTime(), input.getPlantId(), 10, 2));
}
private QueryWrapper<PlantPredictedPowerMidTermEnt> setQueryWrapper(String plantId, String startTime, Integer days) {
QueryWrapper<PlantPredictedPowerMidTermEnt> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(PlantPredictedPowerMidTermEnt::getPlantId, plantId);
DateTime date;
if (XStringUtils.isEmpty(startTime)) {
date = DateUtil.beginOfDay(DateUtil.date());
} else {
date = DateUtil.parse(startTime, BusinessConstant.DATE_FORMAT_DAY);
}
queryWrapper.lambda().between(PlantPredictedPowerMidTermEnt::getDataDate, date, DateUtil.offsetDay(date, days));
queryWrapper.lambda().orderByAsc(PlantPredictedPowerMidTermEnt::getDataDate);
return queryWrapper;
}
}
\ No newline at end of file
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 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_short_term.GetPlantPredictedPowerShortTermInput;
import pps.core.prediction.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XListResult;
import xstartup.feature.api.annotation.XApiGet;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 短期功率预测
......@@ -46,7 +30,7 @@ public class PlantPredictedPowerShortTermService {
@XApiGet
@XText("根据电站预测3天的预测数据")
public XListResult<GetPredictedPowerOutput> getThreePlantPredictedPowerShortTermList(XContext context, GetPlantPredictedPowerShortTermInput input) {
return XListResult.success(this.getPredictedPowerOutput(context, input.getStartTime(), input.getPlantId(), 3));
return XListResult.success(ServiceUtil.getPredictedPowerOutput(context, input.getStartTime(), input.getPlantId(), 3, 1));
}
/**
......@@ -59,89 +43,8 @@ public class PlantPredictedPowerShortTermService {
@XApiGet
@XText("根据电站预测1天的预测数据")
public XListResult<GetPredictedPowerOutput> getOnePlantPredictedPowerShortTermList(XContext context, GetPlantPredictedPowerShortTermInput input) {
return XListResult.success(this.getPredictedPowerOutput(context, input.getStartTime(), input.getPlantId(), 1));
return XListResult.success(ServiceUtil.getPredictedPowerOutput(context, input.getStartTime(), input.getPlantId(), 1, 1));
}
/**
* 获得预测功率输出
*
* @param context 上下文
* @param inputTimeStr 输入时间str
* @param stationId 工作站id
* @param offsetDay 抵消日
* @return {@link List }<{@link GetPredictedPowerOutput }>
*/
private List<GetPredictedPowerOutput> getPredictedPowerOutput(XContext context, String inputTimeStr, String stationId, int offsetDay) {
//判断是否需要启用演示配置
DateTime date = DateUtil.date();
DateTime inputTime = DateUtil.parse(inputTimeStr, 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.getIsEnable(), configShowEnt.getChoiceDate())) {
day = configShowEnt.getIsEnable().equals(0) ? DateUtil.date(configShowEnt.getChoiceDate()) : 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, offsetDay);
//查短期预测
PlantPredictedPowerShortTermMapper mapper = context.getBean(PlantPredictedPowerShortTermMapper.class);
List<PlantPredictedPowerShortTermEnt> predictedList = mapper.selectList(new LambdaQueryWrapper<PlantPredictedPowerShortTermEnt>()
.eq(PlantPredictedPowerShortTermEnt::getPlantId, stationId)
.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(stationId)
.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 outputs;
}
}
\ No newline at end of file
package pps.core.prediction.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import pps.core.auth.HttpRequestClient;
import pps.core.common.cache.ThirdPartyConfigCache;
import pps.core.common.constant.BusinessConstant;
import pps.core.prediction.constant.ThirdPartyApiConstant;
import pps.core.prediction.entity.ConfigShowEnt;
import pps.core.prediction.entity.PlantPredictedPowerMidTermEnt;
import pps.core.prediction.entity.PlantPredictedPowerShortTermEnt;
import pps.core.prediction.entity.ThirdActivePowerView;
import pps.core.prediction.mapper.ConfigShowMapper;
import pps.core.prediction.mapper.PlantPredictedPowerMidTermMapper;
import pps.core.prediction.mapper.PlantPredictedPowerShortTermMapper;
import pps.core.prediction.mapper.ThirdActivePowerViewMapper;
import pps.core.prediction.service.data.plant_predicted_power_data.GetPredictedPowerOutput;
import xstartup.base.XContext;
import xstartup.base.XStartup;
import xstartup.base.exception.XServiceException;
import xstartup.base.util.XHttpUtils;
import java.util.HashMap;
import java.util.Map;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 常用服务调用工具类
......@@ -66,6 +81,112 @@ public class ServiceUtil {
return token;
}
/**
* 获得预测功率输出
*
* @param context 上下文
* @param inputTimeStr 输入时间str
* @param stationId 工作站id
* @param offsetDay 偏移日
* @param cycle 周期
* @return {@link List }<{@link GetPredictedPowerOutput }>
*/
public static List<GetPredictedPowerOutput> getPredictedPowerOutput(XContext context, String inputTimeStr, String stationId, int offsetDay, int cycle) {
//判断是否需要启用演示配置
DateTime date = DateUtil.date();
DateTime inputTime = DateUtil.parse(inputTimeStr, 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.getIsEnable(), configShowEnt.getChoiceDate())) {
day = configShowEnt.getIsEnable().equals(0) ? DateUtil.date(configShowEnt.getChoiceDate()) : 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, offsetDay);
//查预测功率
Map<DateTime, BigDecimal> predictedMap;
switch (cycle) {
case 1:
//查短期预测
PlantPredictedPowerShortTermMapper shortMapper = context.getBean(PlantPredictedPowerShortTermMapper.class);
List<PlantPredictedPowerShortTermEnt> predictedList = shortMapper.selectList(new LambdaQueryWrapper<PlantPredictedPowerShortTermEnt>()
.eq(PlantPredictedPowerShortTermEnt::getPlantId, stationId)
.between(PlantPredictedPowerShortTermEnt::getDataDate, beginTime, endTime)
.orderByAsc(PlantPredictedPowerShortTermEnt::getDataDate)
);
if (CollUtil.isNotEmpty(predictedList)) {
predictedMap = predictedList.stream()
.collect(Collectors.toMap(x -> DateUtil.parse(x.getDataDate()), PlantPredictedPowerShortTermEnt::getPredictPower));
} else {
predictedMap = Collections.emptyMap();
}
break;
case 2:
//查中期预测
PlantPredictedPowerMidTermMapper midMapper = context.getBean(PlantPredictedPowerMidTermMapper.class);
List<PlantPredictedPowerMidTermEnt> midList = midMapper.selectList(new LambdaQueryWrapper<PlantPredictedPowerMidTermEnt>()
.eq(PlantPredictedPowerMidTermEnt::getPlantId, stationId)
.between(PlantPredictedPowerMidTermEnt::getDataDate, beginTime, endTime)
.orderByAsc(PlantPredictedPowerMidTermEnt::getDataDate)
);
if (CollUtil.isNotEmpty(midList)) {
predictedMap = midList.stream()
.collect(Collectors.toMap(x -> DateUtil.parse(x.getDataDate()), PlantPredictedPowerMidTermEnt::getPredictPower));
} else {
predictedMap = Collections.emptyMap();
}
break;
default:
predictedMap = Collections.emptyMap();
}
//查实际功率
ThirdActivePowerViewMapper powerMapper = context.getBean(ThirdActivePowerViewMapper.class);
List<ThirdActivePowerView> powerList = powerMapper.selectAvgPower15(ThirdActivePowerView.builder()
.stationId(stationId)
.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 outputs;
}
/*----------------------------------- 私有方法 -----------------------------------*/
/**
......
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