Commit b1a9a8ca authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.开发间开优化结果统计功能,创建间开优化效果统计表,生成对应代码;
2.修改15天,10天,3天,1天间开优化功能,修改代码结构;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 2bae2117
...@@ -8,6 +8,7 @@ import cn.hutool.core.date.DateUtil; ...@@ -8,6 +8,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.cloud.base.service.IBasePowerLineCloudService; import pps.cloud.base.service.IBasePowerLineCloudService;
...@@ -67,9 +68,11 @@ public class SpaceOptimizeBaseService { ...@@ -67,9 +68,11 @@ public class SpaceOptimizeBaseService {
* @param durationDTOList 优化结果 * @param durationDTOList 优化结果
* @param unOptimizeDurationList 未优化持续时间列表 * @param unOptimizeDurationList 未优化持续时间列表
* @param offset 偏移 * @param offset 偏移
* @param dateType 数据范围
*/ */
public void calculateOptimizeEffect(XContext context, List<SpaceOptimizePeriodDTO> periodDTOList, List<SpaceOptimizeWellheadDTO> wellheadDTOList, public void calculateOptimizeEffect(XContext context, List<SpaceOptimizePeriodDTO> periodDTOList, List<SpaceOptimizeWellheadDTO> wellheadDTOList,
List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList, Integer offset) { List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
Integer offset, Integer dateType) {
if (CollUtil.isNotEmpty(periodDTOList)) { if (CollUtil.isNotEmpty(periodDTOList)) {
//按周期ID分组 //按周期ID分组
Map<String, Map<Date, List<SpaceOptimizeWellheadDTO>>> wellMap; Map<String, Map<Date, List<SpaceOptimizeWellheadDTO>>> wellMap;
...@@ -112,6 +115,16 @@ public class SpaceOptimizeBaseService { ...@@ -112,6 +115,16 @@ public class SpaceOptimizeBaseService {
} else { } else {
strategyMap = Collections.emptyMap(); strategyMap = Collections.emptyMap();
} }
//线路ID/峰谷策略ID Map
Map<String, String> lineStrategyMap;
//取线路列表
List<DynamicQueryBasePowerLineOutput> powerLineList = ServiceUtil.getPowerLineList(context, new DynamicQueryBasePowerLineInput());
if (CollUtil.isNotEmpty(powerLineList)) {
lineStrategyMap = powerLineList.stream()
.collect(Collectors.toMap(DynamicQueryBasePowerLineOutput::getId, DynamicQueryBasePowerLineOutput::getStrategyId));
} else {
lineStrategyMap = Collections.emptyMap();
}
//线路ID/电站ID LIST Map //线路ID/电站ID LIST Map
Map<String, List<String>> plantIdsMap; Map<String, List<String>> plantIdsMap;
//查关联线路的所有电站 //查关联线路的所有电站
...@@ -141,10 +154,15 @@ public class SpaceOptimizeBaseService { ...@@ -141,10 +154,15 @@ public class SpaceOptimizeBaseService {
List<SpaceOptimizeWellheadDTO> optimizeWellList; List<SpaceOptimizeWellheadDTO> optimizeWellList;
List<String> plantIds; List<String> plantIds;
List<DynamicQueryPlantPredictedPowerOutput> powerList; List<DynamicQueryPlantPredictedPowerOutput> powerList;
String monthBaseOne;
Map<String, List<GetBasePriceStrategyDetailOutput>> monthStrategyMap;
List<GetBasePriceStrategyDetailOutput> monthStrategyList = null;
BigDecimal serviceRating;
List<SpaceOptimizeWeight> weightList;
for (SpaceOptimizePeriodDTO period : periodDTOList) { for (SpaceOptimizePeriodDTO period : periodDTOList) {
//取电站ID列表 //取电站ID列表
plantIds = plantIdsMap.get(period.getLineId()); plantIds = plantIdsMap.get(period.getLineId());
for (int d = 0; d < offset; d++) { for (int d = 0; d <= offset; d++) {
begin = DateUtil.offsetDay(now, d); begin = DateUtil.offsetDay(now, d);
//取优化井 //取优化井
if (!wellMap.containsKey(period.getId())) { if (!wellMap.containsKey(period.getId())) {
...@@ -154,7 +172,35 @@ public class SpaceOptimizeBaseService { ...@@ -154,7 +172,35 @@ public class SpaceOptimizeBaseService {
if (!wellDateMap.containsKey(begin)) { if (!wellDateMap.containsKey(begin)) {
continue; continue;
} }
optimizeWellList = wellDateMap.get(begin); //取市电峰谷
if (lineStrategyMap.containsKey(period.getLineId())) {
monthBaseOne = String.valueOf(begin.monthBaseOne());
if (strategyMap.containsKey(monthBaseOne)) {
monthStrategyMap = strategyMap.get(monthBaseOne);
if (monthStrategyMap.containsKey(lineStrategyMap.get(period.getLineId()))) {
monthStrategyList = monthStrategyMap.get(lineStrategyMap.get(period.getLineId()));
}
}
}
//查光伏预测
powerList = this.getAveragePowerHalfHour(context, DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(plantIds)
.startTime(begin.toString(BusinessConstant.DATE_FORMAT_DAY))
.endTime(DateUtil.offsetDay(begin, 1).toString(BusinessConstant.DATE_FORMAT_DAY))
.dateType(dateType)
.build());
//遍历井
for (SpaceOptimizeWellheadDTO spaceWell : wellDateMap.get(begin)) {
//取井运行功率
if (baseWellMap.containsKey(spaceWell.getWellheadId())) {
serviceRating = baseWellMap.get(spaceWell.getWellheadId()).getServiceRating();
} else {
serviceRating = BigDecimal.ZERO;
}
//计算权重
weightList = this.zoningList(serviceRating, rangeToList, powerList, monthStrategyList);
System.out.println(JSONUtil.toJsonStr(weightList));
}
} }
} }
System.out.println(); System.out.println();
...@@ -2167,6 +2213,104 @@ public class SpaceOptimizeBaseService { ...@@ -2167,6 +2213,104 @@ public class SpaceOptimizeBaseService {
} }
} }
/**
* 划分区域列表
*
* @param serviceRating 服务等级
* @param rangeToList 要列出范围
* @param powerList 电源列表
* @param strategyList 策略列表
* @return {@link List}<{@link SpaceOptimizeWeight}>
*/
private List<SpaceOptimizeWeight> zoningList(BigDecimal serviceRating, List<DateTime> rangeToList, List<DynamicQueryPlantPredictedPowerOutput> powerList, List<GetBasePriceStrategyDetailOutput> strategyList) {
int rangeListSize = rangeToList.size();
int strategyListSize = strategyList.size();
int rangeIndex = 0;
int strategyIndex = 0;
Map<Date, DynamicQueryPlantPredictedPowerOutput> powerMap;
if (CollUtil.isNotEmpty(powerList)) {
powerMap = powerList.stream()
.collect(Collectors.toMap(DynamicQueryPlantPredictedPowerOutput::getCreateTime, Function.identity()));
} else {
powerMap = Collections.emptyMap();
}
List<SpaceOptimizeWeight> weightList = new ArrayList<>(rangeListSize);
DynamicQueryPlantPredictedPowerOutput firstPower;
DynamicQueryPlantPredictedPowerOutput lastPower;
GetBasePriceStrategyDetailOutput firstStrategy;
GetBasePriceStrategyDetailOutput lastStrategy;
while (rangeListSize > 0 && rangeListSize > rangeIndex) {
boolean powerFlag = false;
SpaceOptimizeWeight firstWeight = new SpaceOptimizeWeight();
DateTime firstTime = rangeToList.get(rangeIndex);
firstWeight.setTimestamp(firstTime);
firstWeight.setSort(rangeIndex);
if (powerMap.containsKey(firstTime)) {
firstPower = powerMap.get(firstTime);
firstWeight.setPower(firstPower.getPower());
//判断发电量是否满足运行功率
powerFlag = firstPower.getPower().compareTo(serviceRating) >= 0;
if (powerFlag) {
firstWeight.setWeight(10);
firstWeight.setGenerationTypeKey(BusinessConstant.PHOTOVOLTAIC);
}
}
firstStrategy = strategyList.get(strategyIndex);
//在市电峰谷时段内,且未满足运行功率,设置权重
if (DateUtil.isIn(firstTime, firstStrategy.getOpenTime(), ObjectUtil.isEmpty(firstStrategy.getCloseTime()) && CharSequenceUtil.equals(BusinessConstant.END_OF_DAY_TIME, firstStrategy.getStartTime()) ? BusinessConstant.DATE_FLAG : firstStrategy.getCloseTime())) {
if (CharSequenceUtil.equals(firstStrategy.getPeriodTypeKey(), "RUSH")) {
//尖峰时段要停井
firstWeight.setWeight(0);
} else if (!powerFlag) {
firstWeight.setWeight(this.getWeightByPeriodTypeKey(firstStrategy.getPeriodTypeKey()));
}
}
if (firstTime.compareTo(firstStrategy.getCloseTime()) >= 0) {
strategyIndex++;
}
weightList.add(firstWeight);
rangeIndex++;
rangeListSize--;
//防止重复插入
if (rangeIndex >= rangeListSize) {
continue;
}
/*----------------------------------------------------*/
powerFlag = false;
SpaceOptimizeWeight lastWeight = new SpaceOptimizeWeight();
DateTime lastTime = rangeToList.get(rangeListSize);
lastWeight.setTimestamp(lastTime);
lastWeight.setSort(rangeListSize);
if (powerMap.containsKey(lastTime)) {
lastPower = powerMap.get(lastTime);
lastWeight.setPower(lastPower.getPower());
//判断发电量是否满足运行功率
powerFlag = lastPower.getPower().compareTo(serviceRating) >= 0;
if (powerFlag) {
lastWeight.setWeight(10);
lastWeight.setGenerationTypeKey(BusinessConstant.PHOTOVOLTAIC);
}
}
lastStrategy = strategyList.get(strategyListSize - 1);
//在市电峰谷时段内,且未满足运行功率,设置权重
if (DateUtil.isIn(lastTime, lastStrategy.getOpenTime(), ObjectUtil.isEmpty(lastStrategy.getCloseTime()) && CharSequenceUtil.equals(BusinessConstant.END_OF_DAY_TIME, lastStrategy.getEndTime()) ? BusinessConstant.DATE_FLAG : lastStrategy.getCloseTime())) {
if (CharSequenceUtil.equals(lastStrategy.getPeriodTypeKey(), "RUSH")) {
//尖峰时段要停井
lastWeight.setWeight(0);
} else if (!powerFlag) {
lastWeight.setWeight(this.getWeightByPeriodTypeKey(lastStrategy.getPeriodTypeKey()));
}
}
if (lastTime.compareTo(lastStrategy.getOpenTime()) <= 0) {
strategyListSize--;
}
weightList.add(lastWeight);
}
//排序
weightList.sort(Comparator.comparing(SpaceOptimizeWeight::getSort));
return weightList;
}
/** /**
* 计算权重列表 * 计算权重列表
* *
......
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