Commit d48500b6 authored by tianchao's avatar tianchao
parents 1705fea5 ecb09eed
package pps.core.common.constant;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
/**
* 业务操作常量
*
......@@ -28,6 +31,31 @@ public class BusinessConstant {
*/
public static final String PARENT_OU_ID = "00000000-0000-0000-0000-000000000000";
/**
* 时间格式
*/
public static final String TIME_FORMAT = "HH:mm:ss";
/**
* 分钟格式
*/
public static final String MINUTES_FORMAT = "HH:mm";
/**
* 初始化秒
*/
public static final String INITIALIZATION_SECOND = ":00";
/**
* 一天结束时间
*/
public static final String END_OF_DAY_TIME = "23:59";
/**
* 日期标志
*/
public static final DateTime DATE_FLAG = DateUtil.parse("1970-01-02 00:00:00", "yyyy-mm-dd HH:mm:ss");
/*------------------------------字典------------------------------*/
/**
......
package pps.core.common.utils;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import org.apache.commons.lang3.StringUtils;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
import pps.core.common.session.PpsUserSession;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 封装工具类
......@@ -14,6 +22,34 @@ import java.util.Date;
*/
public class BaseUtils {
/**
* 按每500个一组分割
*/
public static final Integer BATCH_SIZE = 500;
/**
* 计算批次数
*/
public static Integer countStep(Integer totalSize) {
return (totalSize + BATCH_SIZE - 1) / BATCH_SIZE;
}
/**
* 分批处理
*
* @param list 列表
* @return {@link List}<{@link List}<{@link E}>>
*/
public static <E> List<List<E>> getSubList(List<E> list) {
return Stream.iterate(0, n -> n + 1)
.limit(countStep(list.size()))
.parallel()
.map(a -> list.stream().skip(a * BaseUtils.BATCH_SIZE)
.limit(BATCH_SIZE).parallel()
.collect(Collectors.toList()))
.collect(Collectors.toList());
}
/**
* 设置实体默认值
*
......@@ -34,4 +70,74 @@ public class BaseUtils {
model.setModifyByName(userName);
model.setModifyTime(now);
}
/**
* 设置实体默认值(定时任务)
*
* @param model 模型
*/
public static void setBaseModelDefaultForJob(BaseModel model) {
Date now = new Date();
model.setId(BaseUtils.getUUID());
model.setCreateById("Task");
model.setCreateByName("Task");
model.setCreateTime(now);
model.setModifyById("Task");
model.setModifyByName("Task");
model.setModifyTime(now);
}
/**
* 获取uuid
*
* @return {@link String}
*/
public static String getUUID() {
return StringUtils.replace(UUID.randomUUID().toString(), "-", "");
}
/**
* 获取月份执行周期
*
* @param date 日期
* @return {@link String}
*/
public static String getExecutionCycleForMonth(Date date) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(DateUtil.format(DateUtil.beginOfMonth(date), "yyyy-MM-dd"))
.append('-')
.append(DateUtil.format(DateUtil.endOfMonth(date), "yyyy-MM-dd"));
return stringBuilder.toString();
}
/**
* 获取时差分钟
*
* @param optimizeTime 优化后时间
* @param originalTime 原始时间
* @return int
*/
public static int getTimeDifferenceMinute(DateTime optimizeTime, DateTime originalTime) {
int between = (int) optimizeTime.between(originalTime, DateUnit.MINUTE);
if (optimizeTime.compareTo(originalTime) < 0) {
between = ~between + 1;
}
return between;
}
/**
* 获取结束时间字符串
*
* @param endTimeOptimize 结束时间优化
* @return {@link String}
*/
public static String getEndTimeString(DateTime endTimeOptimize) {
String endTimeString;
if (endTimeOptimize.compareTo(BusinessConstant.DATE_FLAG) > 0) {
endTimeString = BusinessConstant.END_OF_DAY_TIME;
} else {
endTimeString = endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT);
}
return endTimeString;
}
}
\ No newline at end of file
......@@ -66,9 +66,7 @@ public class BasePowerLineService {
@XApiPost
@XText("输电线路配置--新增")
public XServiceResult createBasePowerLine(XContext context, CreateBasePowerLineInput input) {
PpsUserSession session = new PpsUserSession();
session.setId("123");
session.setUserName("ceshi");
PpsUserSession session = context.getSession(PpsUserSession.class);
return XTransactionHelper.begin(context, () -> {
BasePowerLineMapper mapper = context.getBean(BasePowerLineMapper.class);
BasePowerLineEnt entity = XCopyUtils.copyNewObject(input, BasePowerLineEnt.class);
......@@ -455,7 +453,7 @@ public class BasePowerLineService {
wellhead.setLineId(lineId);
wellhead.setOuId(ouId);
BaseUtils.setBaseModelDefault(wellhead, session);
wellhead.setId(UUID.randomUUID().toString());
wellhead.setId(BaseUtils.getUUID());
wellheads.add(wellhead);
}
wellheadMapper.batchInsertList(wellheads);
......
package pps.core.base.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import pps.cloud.base.service.IBasePriceStrategyCloudService;
import pps.cloud.base.service.data.base_price_strategy_detail.GetBasePriceStrategyDetailInput;
......@@ -13,6 +14,7 @@ import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XListResult;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -42,6 +44,12 @@ public class BasePriceStrategyCloudServiceImpl implements IBasePriceStrategyClou
.apply("strategy_id = ( SELECT strategy_id FROM base_power_line WHERE id = {0} ) ", input.getLineId())
.orderByAsc(BasePriceStrategyDetailEnt::getStartTime)
);
return XListResult.success(XCopyUtils.copyNewList(detailList, GetBasePriceStrategyDetailOutput.class));
List<GetBasePriceStrategyDetailOutput> outputs;
if (CollUtil.isEmpty(detailList)) {
outputs = new ArrayList<>(0);
} else {
outputs = XCopyUtils.copyNewList(detailList, GetBasePriceStrategyDetailOutput.class);
}
return XListResult.success(outputs);
}
}
}
\ No newline at end of file
......@@ -352,7 +352,7 @@ public class BasePriceStrategyService {
for (BasePriceStrategyMonthView monthView : monthList) {
monthView.setStrategyId(strategyId);
BaseUtils.setBaseModelDefault(monthView, session);
monthView.setId(UUID.randomUUID().toString());
monthView.setId(BaseUtils.getUUID());
monthViewList.add(monthView);
details = monthView.getDetails();
if (CollUtil.isNotEmpty(details)) {
......@@ -360,7 +360,7 @@ public class BasePriceStrategyService {
d.setStrategyId(strategyId);
d.setStrategyMonth(monthView.getStrategyMonth());
BaseUtils.setBaseModelDefault(d, session);
d.setId(UUID.randomUUID().toString());
d.setId(BaseUtils.getUUID());
detailViewList.add(d);
});
}
......
package pps.core.task.job;
import pps.cloud.space.service.ISpaceOptimizeLongCloudService;
import pps.core.task.constant.CronConstant;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
import xstartup.service.job.XJob;
import xstartup.service.job.annotation.XCronTrigger;
/**
* 长期间开优化定时任务
......@@ -23,8 +25,7 @@ public class SpaceOptimizeLongJob implements XJob {
* @param xContext x上下文
* @return {@link XServiceResult}
*/
// @XCronTrigger(value = XCronTrigger.PRE_10S)
// @XCronTrigger(value = CronConstant.FIRST_DAY_OF_THE_MONTH)
@XCronTrigger(value = CronConstant.FIRST_DAY_OF_THE_MONTH)
@Override
public XServiceResult execute(XContext xContext) {
ISpaceOptimizeLongCloudService service = xContext.getBean(ISpaceOptimizeLongCloudService.class);
......
package pps.core.task.job;
import pps.core.task.constant.CronConstant;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
import xstartup.service.job.XJob;
import xstartup.service.job.annotation.XCronTrigger;
/**
* 中短期间开优化定时任务
*
* @author ZWT
* @date 2023/09/18 13:58
*/
@XText("中短期间开优化定时任务")
@XService
public class SpaceOptimizeMidJob implements XJob {
/**
* 每周一执行
*
* @param xContext x上下文
* @return {@link XServiceResult}
*/
@XCronTrigger(value = CronConstant.EVERY_MONDAY)
@Override
public XServiceResult execute(XContext xContext) {
return XServiceResult.OK;
}
}
......@@ -2,7 +2,10 @@ package pps.core.space.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import pps.core.common.entity.BaseModel;
import xstartup.annotation.XText;
......@@ -15,6 +18,9 @@ import java.io.Serializable;
* @date 2023/09/05
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@TableName("space_optimize_long_duration")
public class SpaceOptimizeLongDurationEnt extends BaseModel implements Serializable {
......
package pps.core.space.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import pps.core.space.entity.SpaceOptimizeLongDurationView;
......@@ -16,4 +17,12 @@ public interface SpaceOptimizeLongDurationViewMapper {
SpaceOptimizeLongDurationView selectOne(SpaceOptimizeLongDurationView record);
List<SpaceOptimizeLongDurationView> selectList(SpaceOptimizeLongDurationView record);
/**
* 批量新增
*
* @param list 列表
* @return int
*/
int batchInsertList(@Param(value = "list") List<SpaceOptimizeLongDurationView> list);
}
package pps.core.space.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import pps.core.space.entity.SpaceOptimizeLongPeriodView;
......@@ -22,4 +23,12 @@ public interface SpaceOptimizeLongPeriodViewMapper {
* @return {@link List}<{@link SpaceOptimizeLongPeriodView}>
*/
List<SpaceOptimizeLongPeriodView> selectList(SpaceOptimizeLongPeriodView record);
/**
* 批量新增
*
* @param list 列表
* @return int
*/
int batchInsertList(@Param(value = "list") List<SpaceOptimizeLongPeriodView> list);
}
package pps.core.space.mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import pps.core.space.entity.SpaceOptimizeLongWellheadView;
......@@ -16,4 +17,12 @@ public interface SpaceOptimizeLongWellheadViewMapper {
SpaceOptimizeLongWellheadView selectOne(SpaceOptimizeLongWellheadView record);
List<SpaceOptimizeLongWellheadView> selectList(SpaceOptimizeLongWellheadView record);
/**
* 批量新增
*
* @param list 列表
* @return int
*/
int batchInsertList(@Param(value = "list") List<SpaceOptimizeLongWellheadView> list);
}
......@@ -402,7 +402,7 @@ public class SpaceInstitutionDetailService {
for (SpaceInstitutionWellheadView wellhead : (List<SpaceInstitutionWellheadView>) XCopyUtils.copyNewList(wellheadList, SpaceInstitutionWellheadView.class)) {
wellhead.setInstitutionId(institutionId);
BaseUtils.setBaseModelDefault(wellhead, session);
wellhead.setId(UUID.randomUUID().toString());
wellhead.setId(BaseUtils.getUUID());
wellheadViewList.add(wellhead);
durationList = wellhead.getDurationList();
if (CollUtil.isNotEmpty(durationList)) {
......@@ -411,7 +411,7 @@ public class SpaceInstitutionDetailService {
d.setConfigId(wellhead.getId());
d.setInstitutionId(institutionId);
BaseUtils.setBaseModelDefault(d, session);
d.setId(UUID.randomUUID().toString());
d.setId(BaseUtils.getUUID());
durationViewList.add(d);
});
}
......
package pps.core.space.service;
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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
......@@ -9,6 +11,8 @@ import pps.cloud.base.service.IBasePowerLineCloudService;
import pps.cloud.base.service.IBaseWellheadCloudService;
import pps.cloud.base.service.data.base_power_line_plant.DynamicQueryBasePowerLinePlantInput;
import pps.cloud.base.service.data.base_power_line_plant.DynamicQueryBasePowerLinePlantOutput;
import pps.cloud.base.service.data.base_price_strategy_detail.GetBasePriceStrategyDetailInput;
import pps.cloud.base.service.data.base_price_strategy_detail.GetBasePriceStrategyDetailOutput;
import pps.cloud.base.service.data.base_wellhead.DynamicQueryBaseWellheadInput;
import pps.cloud.base.service.data.base_wellhead.DynamicQueryBaseWellheadOutput;
import pps.cloud.prediction.service.IPlantPredictedPowerCloudService;
......@@ -17,21 +21,19 @@ import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQuery
import pps.cloud.space.service.ISpaceOptimizeLongCloudService;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
import pps.core.space.entity.SpaceInstitutionDetailEnt;
import pps.core.space.entity.SpaceInstitutionWellheadView;
import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*;
import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.SpaceInstitutionDetailMapper;
import pps.core.space.mapper.SpaceInstitutionWellheadViewMapper;
import pps.core.space.mapper.*;
import pps.core.space.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.data.XListResult;
import xstartup.data.XServiceResult;
import xstartup.helper.XTransactionHelper;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -85,15 +87,27 @@ public class SpaceOptimizeLongCloudServiceImpl implements ISpaceOptimizeLongClou
//取当前时间
DateTime date = DateUtil.date();
int year = date.year();
int monthNum = date.month();
//月份要加一
int monthNum = date.month() + 1;
String month;
if (monthNum < BusinessConstant.TEN) {
month = "0" + monthNum;
} else {
month = String.valueOf(monthNum);
}
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
List<SpaceOptimizeLongPeriodView> longPeriodList = new ArrayList<>(32);
List<SpaceOptimizeLongWellheadView> longWellheadList = new ArrayList<>(64);
List<SpaceOptimizeLongDurationView> longDurationList = new ArrayList<>(128);
List<SpaceOptimizeLongDurationView> unOptimizeDurationList = new ArrayList<>(128);
String executionCycleForMonth = BaseUtils.getExecutionCycleForMonth(date);
DateTime optimizeDeadline = DateUtil.endOfMonth(date);
//优化
for (SpaceInstitutionDetailEnt detail : detailEntList) {
String detailId = detail.getId();
String lineId = detail.getLineId();
//创建记录
String longPeriodId = this.createOptimizeLongPeriod(longPeriodList, detailId, lineId, executionCycleForMonth, optimizeDeadline);
switch (detail.getGridTypeKey()) {
//并网型优化
case "1":
......@@ -102,7 +116,7 @@ public class SpaceOptimizeLongCloudServiceImpl implements ISpaceOptimizeLongClou
DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(
plantList.stream()
.filter(p -> StringUtils.equals(detail.getLineId(), p.getLineId()))
.filter(p -> StringUtils.equals(lineId, p.getLineId()))
.map(DynamicQueryBasePowerLinePlantOutput::getPlantId)
.collect(Collectors.toList())
)
......@@ -117,18 +131,42 @@ public class SpaceOptimizeLongCloudServiceImpl implements ISpaceOptimizeLongClou
.orElse(BigDecimal.ZERO);
//取当前制度下井口的总功率
BigDecimal wellheadTotalPower = spaceWellheadList.stream()
.filter(w -> StringUtils.equals(detail.getId(), w.getInstitutionId()))
.filter(w -> StringUtils.equals(detailId, w.getInstitutionId()))
.map(SpaceInstitutionWellheadView::getServiceRating)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//根据类型过滤井口:大间开,连抽井不优化
List<SpaceInstitutionWellheadView> wellheadViewList = spaceWellheadList.stream()
.filter(w -> StringUtils.equals(detailId, w.getInstitutionId()) &&
StringUtils.equals("INTERVAL", w.getRunTypeKey()) &&
StringUtils.equals("0", w.getIntervalTypeKey()))
.sorted(Comparator.comparing(SpaceInstitutionWellheadView::getStartSeq))
.collect(Collectors.toList());
if (CollUtil.isEmpty(wellheadViewList)) {
continue;
}
//通过间开ID和井口ID查所有井口时段配置
List<SpaceInstitutionDurationEnt> durationList = durationMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionDurationEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionDurationEnt::getInstitutionId, detailId)
.orderByAsc(SpaceInstitutionDurationEnt::getOpenWellTime)
);
if (CollUtil.isEmpty(durationList)) {
//没有设置时间段,无法优化
continue;
}
Map<String, List<SpaceInstitutionDurationEnt>> durationMap = durationList.stream()
.collect(Collectors.groupingBy(SpaceInstitutionDurationEnt::getWellheadId));
int compare = powerMax.compareTo(wellheadTotalPower);
//光伏出力峰值大于等于井口总功率:绿电消纳优先策略
if (compare >= BusinessConstant.ZERO) {
//光伏出力峰值大于等于井口总功率:绿电消纳优先策略
//---------------------------------绿电消纳策略---------------------------------
this.greenElectricityConsumptionStrategy(longWellheadList, unOptimizeDurationList, longDurationList,
wellheadViewList, avgPowerList, durationMap, detail, longPeriodId);
} else {
//遍历井口,按发电功率大于等于光伏出力峰值条件分组
Map<Boolean, List<SpaceInstitutionWellheadView>> collect = spaceWellheadList.stream()
.filter(w ->
StringUtils.equals(detail.getId(), w.getInstitutionId())
StringUtils.equals(detailId, w.getInstitutionId())
)
.collect(Collectors.partitioningBy(w -> powerMax.compareTo(w.getServiceRating()) >= BusinessConstant.ZERO));
......@@ -137,13 +175,17 @@ public class SpaceOptimizeLongCloudServiceImpl implements ISpaceOptimizeLongClou
int lowWellheadListSize = lowWellheadList.size();
//光伏出力峰值<任何一口井的运行功率:消峰平谷策略
if (size == lowWellheadListSize) {
//---------------------------------消峰平谷策略---------------------------------
this.peakEliminationAndValleyLevelingStrategy(context, longWellheadList, unOptimizeDurationList, longDurationList, wellheadViewList,
durationMap, detail, lineId, monthNum, longPeriodId);
}
//光伏出力峰值>=线路哪部分井口运行功率:满足的部分井口采用绿电消纳优先,不满足的井采用消峰平谷
else {
List<SpaceInstitutionWellheadView> highWellheadList = collect.get(true);
this.greenElectricityConsumptionStrategy(longWellheadList, unOptimizeDurationList, longDurationList,
highWellheadList, avgPowerList, durationMap, detail, longPeriodId);
this.peakEliminationAndValleyLevelingStrategy(context, longWellheadList, unOptimizeDurationList, longDurationList, lowWellheadList,
durationMap, detail, lineId, monthNum, longPeriodId);
}
}
break;
......@@ -154,11 +196,390 @@ public class SpaceOptimizeLongCloudServiceImpl implements ISpaceOptimizeLongClou
//电网类型不存在
}
}
return XServiceResult.OK;
//开启事务
return XTransactionHelper.begin(context, () -> {
int size;
if (CollUtil.isNotEmpty(longPeriodList)) {
SpaceOptimizeLongPeriodViewMapper longPeriodViewMapper = context.getBean(SpaceOptimizeLongPeriodViewMapper.class);
size = longPeriodList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeLongPeriodView>> subList = BaseUtils.getSubList(longPeriodList);
subList.forEach(b -> longPeriodViewMapper.batchInsertList(b));
} else {
longPeriodViewMapper.batchInsertList(longPeriodList);
}
}
if (CollUtil.isNotEmpty(longWellheadList)) {
SpaceOptimizeLongWellheadViewMapper longWellheadViewMapper = context.getBean(SpaceOptimizeLongWellheadViewMapper.class);
size = longWellheadList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeLongWellheadView>> subList = BaseUtils.getSubList(longWellheadList);
subList.forEach(b -> longWellheadViewMapper.batchInsertList(b));
} else {
longWellheadViewMapper.batchInsertList(longWellheadList);
}
}
if (CollUtil.isNotEmpty(unOptimizeDurationList)) {
SpaceOptimizeLongDurationViewMapper longDurationViewMapper = context.getBean(SpaceOptimizeLongDurationViewMapper.class);
size = unOptimizeDurationList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeLongDurationView>> subList = BaseUtils.getSubList(unOptimizeDurationList);
subList.forEach(b -> longDurationViewMapper.batchInsertList(b));
} else {
longDurationViewMapper.batchInsertList(unOptimizeDurationList);
}
}
if (CollUtil.isNotEmpty(longDurationList)) {
SpaceOptimizeLongDurationViewMapper longDurationViewMapper = context.getBean(SpaceOptimizeLongDurationViewMapper.class);
size = longDurationList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeLongDurationView>> subList = BaseUtils.getSubList(longDurationList);
subList.forEach(b -> longDurationViewMapper.batchInsertList(b));
} else {
longDurationViewMapper.batchInsertList(longDurationList);
}
}
return XServiceResult.OK;
});
}
/*-----------------------------------private-----------------------------------*/
/**
* 消峰平谷策略
*
* @param context 上下文
* @param longWellheadList 长井口列表
* @param unOptimizeDurationList 取消优化工期列表
* @param longDurationList 长期清单
* @param wellheadViewList 井口视图列表
* @param durationMap 持续时间图
* @param detail 细节
* @param lineId 线路id
* @param monthNum 月份
* @param longPeriodId 长周期id
*/
private void peakEliminationAndValleyLevelingStrategy(XContext context, List<SpaceOptimizeLongWellheadView> longWellheadList, List<SpaceOptimizeLongDurationView> unOptimizeDurationList,
List<SpaceOptimizeLongDurationView> longDurationList, List<SpaceInstitutionWellheadView> wellheadViewList,
Map<String, List<SpaceInstitutionDurationEnt>> durationMap, SpaceInstitutionDetailEnt detail,
String lineId, int monthNum, String longPeriodId) {
//通过线路ID和月份获取市电峰谷策略明细配置
List<GetBasePriceStrategyDetailOutput> strategyDetailList = ServiceUtil.getStrategyDetailList(context,
GetBasePriceStrategyDetailInput.builder()
.lineId(lineId)
.strategyMonth(String.valueOf(monthNum))
.build()
);
if (CollUtil.isEmpty(strategyDetailList)) {
//没有配置,不优化
return;
}
//获取第一段谷电阶段的开始时间为第一口井的开井时间
Optional<GetBasePriceStrategyDetailOutput> low = strategyDetailList.stream()
.filter(s -> !StringUtils.isAnyBlank(s.getEndTime(), s.getStartTime()) && StringUtils.equals("LOW", s.getPeriodTypeKey()))
.findFirst();
if (!low.isPresent()) {
//没有谷电,不优化
return;
}
GetBasePriceStrategyDetailOutput strategyDetailOutput = low.get();
//第一口井启动时间
DateTime firstStartTime = DateUtil.parse(strategyDetailOutput.getStartTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
DateTime firstEndTime = DateUtil.parse(strategyDetailOutput.getEndTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
//判断是否第一口井
boolean isFirstWellhead;
//时间差
int between = 0;
//启动间隔累积
int startInterval = 0;
for (int w = 0, wellheadSize = wellheadViewList.size(); w < wellheadSize; w++) {
SpaceInstitutionWellheadView wellhead = wellheadViewList.get(w);
String wellheadId = wellhead.getWellheadId();
String recordId = this.createOptimizeLongWellhead(longWellheadList, longPeriodId, wellheadId, wellhead.getWellNumber());
List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellhead);
if (CollUtil.isEmpty(durationConfigList)) {
//没有设置时间段,无法优化
continue;
}
//保存原始记录
for (SpaceInstitutionDurationEnt durationEnt : durationConfigList) {
this.createUnOptimizeLongDuration(unOptimizeDurationList, durationEnt, longPeriodId, recordId, wellheadId);
}
if (w == 0) {
//第一个井口
isFirstWellhead = true;
} else {
//计算启动间隔
startInterval = startInterval + detail.getStartInterval();
isFirstWellhead = false;
}
for (int d = 0, durationSize = durationConfigList.size(); d < durationSize; d++) {
SpaceInstitutionDurationEnt duration = durationConfigList.get(d);
String openWellTime = duration.getOpenWellTime();
DateTime startTime = DateUtil.parse(openWellTime + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
DateTime endTime = DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
//第一次启动
if (d == 0) {
//第一口井的启动时间
if (isFirstWellhead) {
//计算优化后的时间差优化后的第一口井开井时间-优化前第一次开井时间
int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
//第一次关井时间按照启动时长顺延
DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration);
this.createOptimizeLongDuration(longDurationList, longPeriodId, recordId, wellheadId, null,
strategyDetailOutput.getStartTime(), endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT)
);
//取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(firstEndTime, endTime);
}//其它井口的第一次启动时间
else {
//其它井启动时间:第一口井启动时间+启动间隔
DateTime startTimeOffset = firstStartTime.offset(DateField.MINUTE, startInterval);
DateTime endTimeOffset = firstEndTime.offset(DateField.MINUTE, startInterval);
//取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(firstEndTime, endTime);
this.createOptimizeLongDuration(longDurationList, longPeriodId, recordId, wellheadId, null,
startTimeOffset.toString(BusinessConstant.MINUTES_FORMAT), endTimeOffset.toString(BusinessConstant.MINUTES_FORMAT)
);
}
} else {
//计算偏移
DateTime offset = startTime.offset(DateField.MINUTE, between);
if (offset.compareTo(BusinessConstant.DATE_FLAG) > 0) {
//如果时间超过当天,舍弃
continue;
}
this.createOptimizeLongDuration(longDurationList, longPeriodId, recordId, wellheadId, null,
offset.toString(BusinessConstant.MINUTES_FORMAT), BaseUtils.getEndTimeString(
DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT)
.offset(DateField.MINUTE, between)
)
);
}
}
}
}
/**
* 绿电消纳策略
*
* @param longWellheadList 长井口列表
* @param unOptimizeDurationList 取消优化工期列表
* @param longDurationList 长期清单
* @param wellheadViewList 井口视图列表
* @param avgPowerList 平均功率列表
* @param durationMap 持续时间图
* @param detail 细节
* @param longPeriodId 长周期id
*/
private void greenElectricityConsumptionStrategy(List<SpaceOptimizeLongWellheadView> longWellheadList, List<SpaceOptimizeLongDurationView> unOptimizeDurationList,
List<SpaceOptimizeLongDurationView> longDurationList, List<SpaceInstitutionWellheadView> wellheadViewList,
List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, Map<String, List<SpaceInstitutionDurationEnt>> durationMap,
SpaceInstitutionDetailEnt detail, String longPeriodId) {
//时间差
int between = 0;
//启动间隔累积
int startInterval = 0;
//判断是否第一口井
boolean isFirstWellhead;
//第一口井启动时间
DateTime firstStartTime = null;
//井口累积运行总功率
BigDecimal totalOperatingPower = BigDecimal.ZERO;
for (int w = 0, wellheadSize = wellheadViewList.size(); w < wellheadSize; w++) {
SpaceInstitutionWellheadView wellhead = wellheadViewList.get(w);
String wellheadId = wellhead.getWellheadId();
String recordId = this.createOptimizeLongWellhead(longWellheadList, longPeriodId, wellheadId, wellhead.getWellNumber());
//取当前井口最大发电量
BigDecimal serviceRating = wellhead.getServiceRating();
List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellhead);
if (CollUtil.isEmpty(durationConfigList)) {
//没有设置时间段,无法优化
continue;
}
//保存原始记录
for (SpaceInstitutionDurationEnt durationEnt : durationConfigList) {
this.createUnOptimizeLongDuration(unOptimizeDurationList, durationEnt, longPeriodId, recordId, wellheadId);
}
if (w == 0) {
//第一个井口
isFirstWellhead = true;
totalOperatingPower.add(serviceRating);
} else {
//累加
totalOperatingPower = totalOperatingPower.add(serviceRating);
startInterval = startInterval + detail.getStartInterval();
isFirstWellhead = false;
}
for (int d = 0, durationSize = durationConfigList.size(); d < durationSize; d++) {
SpaceInstitutionDurationEnt duration = durationConfigList.get(d);
String openWellTime = duration.getOpenWellTime();
DateTime startTime = DateUtil.parse(openWellTime + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
DateTime endTime = DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
//第一次启动
if (d == 0) {
//第一口井的启动时间
if (isFirstWellhead) {
firstStartTime = startTime;
//计算开井时间
int startIndex = 0;
for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) {
DynamicQueryPlantPredictedPowerOutput predictedPower = avgPowerList.get(a);
//当日时间段平均光伏出力>=第一口井运行负荷时,该时间为第一口井运行时间
if (predictedPower.getPower().compareTo(serviceRating) >= BusinessConstant.ZERO) {
startIndex = a;
break;
}
}
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex);
String startTimeString = start.getHourTime() + start.getMinTime();
//计算第一次关井时间,按照间开时间段顺延
int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration);
this.createOptimizeLongDuration(longDurationList, longPeriodId, recordId, wellheadId, null,
startTimeString, endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT)
);
//计算时间偏移
DateTime startTimeOptimize = DateUtil.parse(startTimeString, BusinessConstant.TIME_FORMAT);
//取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(startTimeOptimize, startTime);
}
//其它井口的第一次启动时间
else {
DateTime startTimeOffset = firstStartTime.offset(DateField.MINUTE, startInterval);
int startIndex = -1;
BigDecimal add = serviceRating.add(totalOperatingPower);
for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) {
DynamicQueryPlantPredictedPowerOutput predictedPower = avgPowerList.get(a);
if (DateUtil.parse(predictedPower.getHourTime() + predictedPower.getMinTime(), BusinessConstant.TIME_FORMAT)
.compareTo(startTimeOffset) >= 0) {
//判断第一口井启动时间+启动间隔时日平均光伏出力-前两口井的运行功率是否为正数
if (predictedPower.getPower().compareTo(add) >= 0) {
//确定第二口井第一次开井时间为第一口井启动时间+启动间隔
startIndex = a;
break;
}
}
}
if (startIndex > -1) {
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex);
DateTime startTimeOptimize = DateUtil.parse(start.getHourTime() + start.getMinTime(), BusinessConstant.TIME_FORMAT);
//计算未优化启动间隔
int openDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTimeOptimize.offset(DateField.MINUTE, openDuration);
this.createOptimizeLongDuration(longDurationList, longPeriodId, recordId, wellheadId, null,
openWellTime, BaseUtils.getEndTimeString(endTimeOptimize)
);
//取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(endTimeOptimize, endTime);
} else {
//无法优化
}
}
} else {
DateTime offset = startTime.offset(DateField.MINUTE, between);
if (offset.compareTo(BusinessConstant.DATE_FLAG) > 0) {
//如果时间超过当天,舍弃
continue;
}
//计算偏移
this.createOptimizeLongDuration(longDurationList, longPeriodId, recordId, wellheadId, null,
offset.toString(BusinessConstant.MINUTES_FORMAT),
BaseUtils.getEndTimeString(DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT)
.offset(DateField.MINUTE, between))
);
}
}
}
}
/**
* 创建长期优化信息
*
* @param longPeriodList 长期清单
* @param detailId 详细信息id
* @param lineId 线路id
* @param executionCycleForMonth 月执行周期
* @param optimizeDeadline 优化截止日期
* @return {@link String}
*/
private String createOptimizeLongPeriod(List<SpaceOptimizeLongPeriodView> longPeriodList, String detailId, String lineId, String executionCycleForMonth, Date optimizeDeadline) {
SpaceOptimizeLongPeriodView longPeriod = new SpaceOptimizeLongPeriodView();
BaseUtils.setBaseModelDefaultForJob(longPeriod);
longPeriod.setInstitutionId(detailId);
longPeriod.setLineId(lineId);
longPeriod.setExecutionCycle(executionCycleForMonth);
longPeriod.setOptimizeDeadline(optimizeDeadline);
longPeriodList.add(longPeriod);
return longPeriod.getId();
}
/**
* 创建长期优化井口信息
*
* @param longWellheadList 长井口列表
* @param longPeriodId 长周期id
* @param wellheadId 井口id
* @param wellNumber 井号
* @return {@link String}
*/
private String createOptimizeLongWellhead(List<SpaceOptimizeLongWellheadView> longWellheadList, String longPeriodId, String wellheadId, String wellNumber) {
SpaceOptimizeLongWellheadView wellheadView = new SpaceOptimizeLongWellheadView();
BaseUtils.setBaseModelDefaultForJob(wellheadView);
wellheadView.setLongPeriodId(longPeriodId);
wellheadView.setWellheadId(wellheadId);
wellheadView.setWellNumber(wellNumber);
longWellheadList.add(wellheadView);
return wellheadView.getId();
}
/**
* 创建长期优化井口区间配置信息
*
* @param longDurationList 长期清单
* @param longPeriodId 长周期id
* @param recordId 记录id
* @param wellheadId 井口id
* @param generationTypeKey 生成类型密钥
* @param openWellTime 开井时间
* @param endTimeString 结束时间字符串
*/
private void createOptimizeLongDuration(List<SpaceOptimizeLongDurationView> longDurationList, String longPeriodId,
String recordId, String wellheadId, String generationTypeKey, String openWellTime, String endTimeString) {
SpaceOptimizeLongDurationView durationView = new SpaceOptimizeLongDurationView();
BaseUtils.setBaseModelDefaultForJob(durationView);
durationView.setRecordId(recordId);
durationView.setLongPeriodId(longPeriodId);
durationView.setWellheadId(wellheadId);
durationView.setGenerationTypeKey(generationTypeKey);
durationView.setIsOptimize(BusinessConstant.ZERO);
durationView.setOpenWellTime(openWellTime);
durationView.setCloseWellTime(endTimeString);
longDurationList.add(durationView);
}
/**
* 创建原始间开区间
*
* @param unOptimizeDurationList 取消优化工期列表
* @param durationEnt 持续时间ent
* @param longPeriodId 长周期id
* @param recordId 记录id
* @param wellheadId 井口id
*/
private void createUnOptimizeLongDuration(List<SpaceOptimizeLongDurationView> unOptimizeDurationList, SpaceInstitutionDurationEnt durationEnt,
String longPeriodId, String recordId, String wellheadId) {
SpaceOptimizeLongDurationView durationViewUnOptimize = new SpaceOptimizeLongDurationView();
BaseUtils.setBaseModelDefaultForJob(durationViewUnOptimize);
durationViewUnOptimize.setRecordId(recordId);
durationViewUnOptimize.setLongPeriodId(longPeriodId);
durationViewUnOptimize.setWellheadId(wellheadId);
durationViewUnOptimize.setIsOptimize(BusinessConstant.ONE);
durationViewUnOptimize.setOpenWellTime(durationEnt.getOpenWellTime());
durationViewUnOptimize.setCloseWellTime(durationEnt.getCloseWellTime());
unOptimizeDurationList.add(durationViewUnOptimize);
}
/**
* 条件获取获取光伏预测各时段平均值列表
*
......@@ -221,4 +642,4 @@ public class SpaceOptimizeLongCloudServiceImpl implements ISpaceOptimizeLongClou
);
});
}
}
}
\ No newline at end of file
......@@ -52,4 +52,49 @@
where
id=#{id}
</select>
<insert id="batchInsertList" parameterType="list">
INSERT INTO space_optimize_long_duration (
id,
create_by_id,
create_by_name,
create_time,
modify_by_id,
modify_by_name,
modify_time,
record_id,
long_period_id,
wellhead_id,
is_optimize,
generation_type_key,
open_well_time,
close_well_time
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id},
#{item.createById},
#{item.createByName},
#{item.createTime},
#{item.modifyById},
#{item.modifyByName},
#{item.modifyTime},
#{item.recordId},
#{item.longPeriodId},
#{item.wellheadId},
#{item.isOptimize},
<choose>
<when test="item.generationTypeKey != null and item.generationTypeKey != ''">
#{item.generationTypeKey},
</when>
<otherwise>
NULL,
</otherwise>
</choose>
#{item.openWellTime},
#{item.closeWellTime}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
......@@ -65,4 +65,27 @@
AND p.line_id = #{lineId}
ORDER BY p.optimize_deadline DESC
</select>
<insert id="batchInsertList" parameterType="list">
INSERT INTO space_optimize_long_period ( id, create_by_id, create_by_name, create_time,
modify_by_id, modify_by_name, modify_time, line_id, institution_id, execution_cycle, optimize_state,
optimize_deadline )
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id},
#{item.createById},
#{item.createByName},
#{item.createTime},
#{item.modifyById},
#{item.modifyByName},
#{item.modifyTime},
#{item.lineId},
#{item.institutionId},
#{item.executionCycle},
#{item.optimizeState},
#{item.optimizeDeadline}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
......@@ -44,4 +44,24 @@
where
id=#{id}
</select>
<insert id="batchInsertList" parameterType="list">
INSERT INTO space_optimize_long_wellhead ( id, create_by_id, create_by_name, create_time,
modify_by_id, modify_by_name, modify_time, long_period_id, wellhead_id, well_number )
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id},
#{item.createById},
#{item.createByName},
#{item.createTime},
#{item.modifyById},
#{item.modifyByName},
#{item.modifyTime},
#{item.longPeriodId},
#{item.wellheadId},
#{item.wellNumber}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
......@@ -41,10 +41,8 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class);
List<PlantPredictedPowerDataEnt> list = mapper.selectList(
new QueryWrapper<PlantPredictedPowerDataEnt>()
.select("data_date",
"year_time",
.select("year_time",
"month_time",
"day_time",
"hour_time",
"min_time",
"AVG( power ) AS power")
......@@ -53,10 +51,8 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower
.in(CollUtil.isNotEmpty(plantIds), PlantPredictedPowerDataEnt::getPlantId, plantIds)
.eq(StringUtils.isNotBlank(yearTime), PlantPredictedPowerDataEnt::getYearTime, yearTime)
.eq(StringUtils.isNotBlank(monthTime), PlantPredictedPowerDataEnt::getMonthTime, monthTime)
.groupBy(PlantPredictedPowerDataEnt::getDataDate,
PlantPredictedPowerDataEnt::getYearTime,
.groupBy(PlantPredictedPowerDataEnt::getYearTime,
PlantPredictedPowerDataEnt::getMonthTime,
PlantPredictedPowerDataEnt::getDayTime,
PlantPredictedPowerDataEnt::getHourTime,
PlantPredictedPowerDataEnt::getMinTime)
);
......
package app;
import pps.core.task.job.SpaceOptimizeLongJob;
import pps.core.task.job.SpaceOptimizeMidJob;
import pps.core.task.job.TestJob;
import pps.core.task.job.WeatherJob;
import xstartup.base.XStartup;
......@@ -34,6 +35,7 @@ public class DeployPpsAllApplication {
startup.enable(XJobFeature.class).config(new XJobServiceConf(TestJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(WeatherJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeLongJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeMidJob.class));
//startup.enable(XCloudHuaweiCseFeature.class);
startup.run(args);
}
......
x.app.env=${env}
x.app.buildtime=${maven.build.timestamp}
#�Զ�������
#\uFFFD\u0536\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
pps.core.system.login-config.expiresIn=@pps.core.system.login-config.expiresIn@
pps.core.system.login-config.rsaPrivateKey=@pps.core.system.login-config.rsaPrivateKey@
pps.core.system.login-config.userRsaPrivateKey=@pps.core.system.login-config.userRsaPrivateKey@
......@@ -43,10 +43,10 @@ pps.core.common.base-config.predictedUrl=@pps.core.common.base-config.predictedU
#x.job.service=pps.core.task.job.TaskPlanTransferJob,pps.core.task.job.TaskPlanImsJob,pps.core.task.job.TaskPlanAckImsJob
#session����
#session\uFFFD\uFFFD\uFFFD\uFFFD
x.session.cache.key-prefix=pps
#��־��������
#\uFFFD\uFFFD\u05BE\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
x.log.level=@x.log.level@
x.log.directory=@x.log.directory@
......@@ -55,6 +55,7 @@ x.server.host=127.0.0.1
x.job.service=pps.core.task.job.TestJob,\
pps.core.task.job.SpaceOptimizeLongJob,\
pps.core.task.job.SpaceOptimizeMidJob,\
pps.core.task.job.WeatherJob
# redis
......
......@@ -32,6 +32,7 @@ public class DeployPpsTaskApplication {
startup.enable(XJobFeature.class).config(new XJobServiceConf(TestJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(WeatherJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeLongJob.class));
startup.enable(XJobFeature.class).config(new XJobServiceConf(SpaceOptimizeMidJob.class));
startup.enable(XRpcFeature.class);
startup.enable(XCloudHuaweiCseFeature.class)
......
......@@ -9,6 +9,7 @@ pps.core.common.mq-config.ackImsMq=@pps.core.common.mq-config.ackImsMq@
x.job.service=pps.core.task.job.TestJob,\
pps.core.task.job.SpaceOptimizeLongJob,\
pps.core.task.job.SpaceOptimizeMidJob,\
pps.core.task.job.WeatherJob
#\uFFFD\uFFFD\u05BE\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
......
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