Commit d15e6f0c authored by ZWT's avatar ZWT

feat(能源管理系统): 间开优化定时任务

1.开发间开优化定期校准定时任务,配置表达式修改定时任务配置文件,创建cloud模块方法;
2.开发间开优化定期校准定时任务,完成业务逻辑开发;
3.修改间开制度管理模块定期校准新增功能,增加初始化校准历史业务逻辑;
4.开发间开优化短期间开优化定时任务,配置表达式修改定时任务配置文件,创建cloud模块方法;
5.修改长期间开优化定时任务,添加离网型线路数据处理逻辑;
6.创建储能预测电量数据(模拟数据测试用)表,生成对应代码,添加条件查询各时段储能预测数据Cloud模块接口;
7.修改长期间开优化定时任务,增加离网型算法计算储能可用时长逻辑;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 7da51c66
......@@ -170,4 +170,20 @@ public class BaseUtils {
}
return endTimeString;
}
/**
* 获取月份字符串
*
* @param monthNum 月份
* @return {@link String}
*/
public static String getMonthString(int monthNum) {
String month;
if (monthNum < BusinessConstant.TEN) {
month = "0" + monthNum;
} else {
month = String.valueOf(monthNum);
}
return month;
}
}
\ No newline at end of file
......@@ -7,6 +7,8 @@ import pps.cloud.base.service.data.base_power_line.GetBasePowerLineInput;
import pps.cloud.base.service.data.base_power_line.GetBasePowerLineViewOutput;
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_power_line_storage.DynamicQueryBasePowerLineStorageInput;
import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePowerLineStorageViewOutput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadInput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput;
import xstartup.annotation.XService;
......@@ -70,4 +72,15 @@ public interface IBasePowerLineCloudService {
@XText("输电线路配置Cloud模块--条件查询线路关联电站信息")
@XApiPost
XListResult<DynamicQueryBasePowerLinePlantOutput> queryPowerLinePlantListByParam(XContext context, DynamicQueryBasePowerLinePlantInput input);
/**
* 输电线路配置Cloud模块--条件查询线路关联储能设备参数平均值
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult}<{@link DynamicQueryBasePowerLineStorageViewOutput}>
*/
@XText("输电线路配置Cloud模块--条件查询线路关联储能设备参数平均值")
@XApiPost
XListResult<DynamicQueryBasePowerLineStorageViewOutput> queryPowerLineStorageListByLineIds(XContext context, DynamicQueryBasePowerLineStorageInput input);
}
package pps.cloud.base.service.data.base_power_line_storage;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText;
import java.util.Collection;
/**
* 输电线路储能配置
*
* @author ZWT
* @date 2023/08/25
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DynamicQueryBasePowerLineStorageInput {
@XText("线路ID集合")
private Collection<String> lineIds;
}
package pps.cloud.base.service.data.base_power_line_storage;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
/**
* 输电线路储能配置
*
* @author ZWT
* @date 2023/08/25
*/
@Data
public class DynamicQueryBasePowerLineStorageViewOutput {
@XText("线路ID")
private String lineId;
@XText("额定放电功率(KW)")
@TableField
private BigDecimal ratedDischargePower;
@XText("额定放电深度")
@TableField
private BigDecimal ratedDischargeDepth;
@XText("额定放电效率")
@TableField
private BigDecimal ratedDischargeEfficiency;
}
......@@ -62,6 +62,4 @@ public class BaseEnergyStorageDeviceEnt extends BaseModel implements Serializabl
@XText("额定放电效率")
@TableField
private BigDecimal ratedDischargeEfficiency;
}
......@@ -48,4 +48,25 @@ public class BasePowerLineStorageView extends BaseModel implements Serializable
@XText("设备容量(KWh)")
@TableField
private BigDecimal apparatusCapacity;
/**
* 额定放电功率(KW)
*/
@XText("额定放电功率(KW)")
@TableField
private BigDecimal ratedDischargePower;
/**
* 额定放电深度
*/
@XText("额定放电深度")
@TableField
private BigDecimal ratedDischargeDepth;
/**
* 额定放电效率
*/
@XText("额定放电效率")
@TableField
private BigDecimal ratedDischargeEfficiency;
}
......@@ -4,6 +4,7 @@ import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.BasePowerLineStorageView;
import java.util.Collection;
import java.util.List;
/**
......@@ -31,4 +32,12 @@ public interface BasePowerLineStorageViewMapper {
* @return int
*/
int batchInsertList(@Param(value = "list") List<BasePowerLineStorageView> list);
/**
* 按行ID选择存储平均值
*
* @param lineIds 线路ID
* @return {@link List}<{@link BasePowerLineStorageView}>
*/
List<BasePowerLineStorageView> selectStorageAverageByLineIds(@Param(value = "list") Collection<String> lineIds);
}
......@@ -10,13 +10,17 @@ import pps.cloud.base.service.data.base_power_line.GetBasePowerLineInput;
import pps.cloud.base.service.data.base_power_line.GetBasePowerLineViewOutput;
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_power_line_storage.DynamicQueryBasePowerLineStorageInput;
import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePowerLineStorageViewOutput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadInput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput;
import pps.core.base.entity.BasePowerLineEnt;
import pps.core.base.entity.BasePowerLinePlantEnt;
import pps.core.base.entity.BasePowerLineStorageView;
import pps.core.base.entity.BasePowerLineWellheadView;
import pps.core.base.mapper.BasePowerLineMapper;
import pps.core.base.mapper.BasePowerLinePlantMapper;
import pps.core.base.mapper.BasePowerLineStorageViewMapper;
import pps.core.base.mapper.BasePowerLineWellheadViewMapper;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
......@@ -144,4 +148,27 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService
}
return XListResult.success(outputs);
}
/**
* 输电线路配置Cloud模块--条件查询线路关联储能设备参数平均值
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult}<{@link DynamicQueryBasePowerLineStorageViewOutput}>
*/
@Override
public XListResult<DynamicQueryBasePowerLineStorageViewOutput> queryPowerLineStorageListByLineIds(XContext context, DynamicQueryBasePowerLineStorageInput input) {
BasePowerLineStorageViewMapper mapper = context.getBean(BasePowerLineStorageViewMapper.class);
List<BasePowerLineStorageView> list = mapper.selectStorageAverageByLineIds(input.getLineIds());
List<DynamicQueryBasePowerLineStorageViewOutput> outputs;
if (CollUtil.isEmpty(list)) {
outputs = new ArrayList<>(0);
} else {
outputs = XCopyUtils.copyNewList(
list,
DynamicQueryBasePowerLineStorageViewOutput.class
);
}
return XListResult.success(outputs);
}
}
\ No newline at end of file
......@@ -32,6 +32,9 @@
<resultMap id="ExtendsResultMap" type="pps.core.base.entity.BasePowerLineStorageView" extends="BaseResultMap">
<result column="device_name" property="deviceName" jdbcType="VARCHAR"/>
<result column="apparatus_capacity" property="apparatusCapacity" jdbcType="DECIMAL"/>
<result column="rated_discharge_power" property="ratedDischargePower" jdbcType="DECIMAL"/>
<result column="rated_discharge_depth" property="ratedDischargeDepth" jdbcType="DECIMAL"/>
<result column="rated_discharge_efficiency" property="ratedDischargeEfficiency" jdbcType="DECIMAL"/>
</resultMap>
<select id="selectOne" parameterType="pps.core.base.entity.BasePowerLineStorageView" resultMap="BaseResultMap">
......@@ -53,6 +56,25 @@
WHERE l.line_id = #{lineId}
</select>
<select id="selectStorageAverageByLineIds" parameterType="pps.core.base.entity.BasePowerLineStorageView"
resultMap="ExtendsResultMap">
SELECT
s.line_id,
ROUND( AVG( d.rated_discharge_depth ) / 100, 2 ) AS rated_discharge_depth,
ROUND( AVG( d.rated_discharge_efficiency ) / 100, 2 ) AS rated_discharge_efficiency,
AVG( d.rated_discharge_power ) AS rated_discharge_power
FROM
base_power_line_storage s
JOIN base_energy_storage_device d ON s.storage_id = d.id
WHERE
s.line_id IN
<foreach collection="list" open="(" close=")" separator="," item="item">
#{item}
</foreach>
GROUP BY
s.line_id
</select>
<insert id="batchInsertList" parameterType="list">
INSERT INTO base_power_line_storage ( id, create_by_id, create_by_name, create_time, modify_by_id,
modify_by_name, modify_time, line_id, storage_id, ou_id )
......
......@@ -21,7 +21,7 @@ import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*;
import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.*;
import pps.core.space.service.data.SpaceOptimizeWellheadAndPlant;
import pps.core.space.service.data.SpaceOptimizeLineRelation;
import pps.core.space.service.data.space_institution_detail.*;
import pps.core.space.service.data.space_institution_duration.GetSpaceInstitutionDurationViewOutput;
import pps.core.space.service.data.space_institution_wellhead.CreateSpaceInstitutionWellheadInput;
......@@ -380,7 +380,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
} else {
month = String.valueOf(monthNum);
}
SpaceOptimizeWellheadAndPlant wellheadAndPlant = super.getWellheadAndPlant(context, ListUtil.toList(detail));
SpaceOptimizeLineRelation wellheadAndPlant = super.getWellheadAndPlant(context, ListUtil.toList(detail));
//长期间开优化
List<DynamicQueryPlantPredictedPowerOutput> longAvgPowerList = super.getAveragePowerGenerationListByPlantIds(context,
DynamicQueryPlantPredictedPowerInput.builder()
......@@ -682,7 +682,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
*/
private void institutionalOptimization(XContext context, List<SpaceOptimizePeriodDTO> periodDTOList, List<SpaceOptimizeWellheadDTO> wellheadDTOList,
List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
SpaceOptimizeWellheadAndPlant wellheadAndPlant, List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, SpaceInstitutionDetailEnt detail,
SpaceOptimizeLineRelation wellheadAndPlant, List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, SpaceInstitutionDetailEnt detail,
String executionCycle, Date optimizeDeadline, int monthNum) {
String detailId = detail.getId();
String lineId = detail.getLineId();
......
......@@ -11,13 +11,18 @@ 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_power_line_storage.DynamicQueryBasePowerLineStorageInput;
import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePowerLineStorageViewOutput;
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;
import pps.cloud.prediction.service.IStoragePredictedPowerCloudService;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerInput;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerOutput;
import pps.cloud.prediction.service.data.storage_predicted_power_data.DynamicQueryStoragePredictedPowerInput;
import pps.cloud.prediction.service.data.storage_predicted_power_data.DynamicQueryStoragePredictedPowerOutput;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
import pps.core.common.utils.BaseUtils;
......@@ -26,7 +31,7 @@ import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.SpaceInstitutionDetailMapper;
import pps.core.space.mapper.SpaceInstitutionDurationMapper;
import pps.core.space.mapper.SpaceInstitutionWellheadViewMapper;
import pps.core.space.service.data.SpaceOptimizeWellheadAndPlant;
import pps.core.space.service.data.SpaceOptimizeLineRelation;
import pps.core.space.utils.ServiceUtil;
import xstartup.base.XContext;
import xstartup.base.exception.XServiceException;
......@@ -72,9 +77,9 @@ public class SpaceOptimizeBaseService {
*
* @param context 上下文
* @param detailEntList 详细ent列表
* @return {@link SpaceOptimizeWellheadAndPlant}
* @return {@link SpaceOptimizeLineRelation}
*/
public SpaceOptimizeWellheadAndPlant getWellheadAndPlant(XContext context, List<SpaceInstitutionDetailEnt> detailEntList) {
public SpaceOptimizeLineRelation getWellheadAndPlant(XContext context, List<SpaceInstitutionDetailEnt> detailEntList) {
Set<String> lineIds = new HashSet<>(32);
Set<String> institutionIds = new HashSet<>(32);
for (SpaceInstitutionDetailEnt spaceInstitutionDetailEnt : detailEntList) {
......@@ -95,7 +100,7 @@ public class SpaceOptimizeBaseService {
//未发现可用光伏电站
throw new XServiceException(BusinessError.DidNotFindPlant);
}
return SpaceOptimizeWellheadAndPlant.builder()
return SpaceOptimizeLineRelation.builder()
.spaceWellheadList(spaceWellheadList)
.plantIdsByLineIdMap(
plantList.stream()
......@@ -104,6 +109,8 @@ public class SpaceOptimizeBaseService {
Collectors.mapping(DynamicQueryBasePowerLinePlantOutput::getPlantId, Collectors.toList()))
)
)
//取线路关联所有储能电站计算平均功率
.storageAvgMap(this.getPowerLineStorageListByLineIds(context, lineIds))
.build();
}
......@@ -121,6 +128,21 @@ public class SpaceOptimizeBaseService {
return result.getResult();
}
/**
* 条件查询时段储能电量平均值(模拟测试用)
* todo: 模拟测试用,后续替换
*
* @param context 上下文
* @param input 输入
* @return {@link List}<{@link DynamicQueryStoragePredictedPowerOutput}>
*/
public List<DynamicQueryStoragePredictedPowerOutput> getAverageEnergyStorageListByParam(XContext context, DynamicQueryStoragePredictedPowerInput input) {
IStoragePredictedPowerCloudService cloudService = context.getBean(IStoragePredictedPowerCloudService.class);
XListResult<DynamicQueryStoragePredictedPowerOutput> result = cloudService.queryAverageEnergyStorageListByParam(context, input);
result.throwIfFail();
return result.getResult();
}
/**
* 获得最大功率
*
......@@ -188,6 +210,8 @@ public class SpaceOptimizeBaseService {
);
}
/*-----------------------------------private-----------------------------------*/
/**
* 获取井口Map通过最大功率区分
*
......@@ -195,15 +219,13 @@ public class SpaceOptimizeBaseService {
* @param powerMax 最大功率
* @return {@link Map}<{@link Boolean}, {@link List}<{@link SpaceInstitutionWellheadView}>>
*/
public Map<Boolean, List<SpaceInstitutionWellheadView>> getWellheadViewMapByPower(List<SpaceInstitutionWellheadView> wellheadViewList, BigDecimal powerMax) {
private Map<Boolean, List<SpaceInstitutionWellheadView>> getWellheadViewMapByPower(List<SpaceInstitutionWellheadView> wellheadViewList, BigDecimal powerMax) {
return wellheadViewList.stream()
.collect(
Collectors.partitioningBy(w -> powerMax.compareTo(w.getServiceRating()) >= BusinessConstant.ZERO)
);
}
/*-----------------------------------private-----------------------------------*/
/**
* 按线路ID集合获取电站列表
*
......@@ -222,6 +244,32 @@ public class SpaceOptimizeBaseService {
return result.getResult();
}
/**
* 条件查询线路关联储能设备参数平均值
*
* @param context 上下文
* @param lineIds 线路ID
* @return {@link Map}<{@link String}, {@link List}<{@link DynamicQueryBasePowerLineStorageViewOutput}>>
*/
private Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> getPowerLineStorageListByLineIds(XContext context, Set<String> lineIds) {
IBasePowerLineCloudService cloudService = context.getBean(IBasePowerLineCloudService.class);
XListResult<DynamicQueryBasePowerLineStorageViewOutput> result = cloudService.queryPowerLineStorageListByLineIds(context,
DynamicQueryBasePowerLineStorageInput.builder()
.lineIds(lineIds)
.build()
);
result.throwIfFail();
List<DynamicQueryBasePowerLineStorageViewOutput> list = result.getResult();
Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> collect;
if (CollUtil.isEmpty(list)) {
collect = new HashMap<>(0);
} else {
collect = list.stream()
.collect(Collectors.groupingBy(DynamicQueryBasePowerLineStorageViewOutput::getLineId));
}
return collect;
}
/**
* 为间开井口列表设置发电功率
*
......
......@@ -11,7 +11,7 @@ import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*;
import pps.core.space.mapper.SpaceInstitutionDurationMapper;
import pps.core.space.mapper.SpaceOptimizeViewMapper;
import pps.core.space.service.data.SpaceOptimizeWellheadAndPlant;
import pps.core.space.service.data.SpaceOptimizeLineRelation;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
......@@ -43,7 +43,7 @@ public class SpaceOptimizeMidCloudServiceImpl extends SpaceOptimizeBaseService i
String startWeek = date.toString(BusinessConstant.DATE_FORMAT_DAY);
//取生效中的基础间开
List<SpaceInstitutionDetailEnt> detailEntList = super.getEffectiveSpaceInstitution(context, startWeek);
SpaceOptimizeWellheadAndPlant wellheadAndPlant = super.getWellheadAndPlant(context, detailEntList);
SpaceOptimizeLineRelation wellheadAndPlant = super.getWellheadAndPlant(context, detailEntList);
List<SpaceInstitutionWellheadView> spaceWellheadList = wellheadAndPlant.getSpaceWellheadList();
Map<String, List<String>> plantIdsByLineIdMap = wellheadAndPlant.getPlantIdsByLineIdMap();
//月份要加一
......
......@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePowerLineStorageViewOutput;
import pps.core.space.entity.SpaceInstitutionWellheadView;
import java.util.List;
......@@ -19,7 +20,7 @@ import java.util.Map;
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SpaceOptimizeWellheadAndPlant {
public class SpaceOptimizeLineRelation {
/**
* 井口列表
......@@ -30,4 +31,9 @@ public class SpaceOptimizeWellheadAndPlant {
* 电站Map
*/
Map<String, List<String>> plantIdsByLineIdMap;
/**
* 储能设备参数平均值Map
*/
Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> storageAvgMap;
}
......@@ -31,4 +31,7 @@ public class DynamicQueryPlantPredictedPowerOutput {
@XText("是否满足")
private boolean meetFlag;
@XText("可供电时长")
private int powerDuration;
}
package pps.cloud.prediction.service.data.storage_predicted_power_data;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText;
import java.util.List;
......@@ -12,6 +15,9 @@ import java.util.List;
* @date 2023/09/20
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DynamicQueryStoragePredictedPowerInput {
@XText("储能设备id")
......
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