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 { ...@@ -170,4 +170,20 @@ public class BaseUtils {
} }
return endTimeString; 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; ...@@ -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.GetBasePowerLineViewOutput;
import pps.cloud.base.service.data.base_power_line_plant.DynamicQueryBasePowerLinePlantInput; 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_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.DynamicQueryBasePowerLineWellheadInput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput; import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput;
import xstartup.annotation.XService; import xstartup.annotation.XService;
...@@ -70,4 +72,15 @@ public interface IBasePowerLineCloudService { ...@@ -70,4 +72,15 @@ public interface IBasePowerLineCloudService {
@XText("输电线路配置Cloud模块--条件查询线路关联电站信息") @XText("输电线路配置Cloud模块--条件查询线路关联电站信息")
@XApiPost @XApiPost
XListResult<DynamicQueryBasePowerLinePlantOutput> queryPowerLinePlantListByParam(XContext context, DynamicQueryBasePowerLinePlantInput input); 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 ...@@ -62,6 +62,4 @@ public class BaseEnergyStorageDeviceEnt extends BaseModel implements Serializabl
@XText("额定放电效率") @XText("额定放电效率")
@TableField @TableField
private BigDecimal ratedDischargeEfficiency; private BigDecimal ratedDischargeEfficiency;
} }
...@@ -48,4 +48,25 @@ public class BasePowerLineStorageView extends BaseModel implements Serializable ...@@ -48,4 +48,25 @@ public class BasePowerLineStorageView extends BaseModel implements Serializable
@XText("设备容量(KWh)") @XText("设备容量(KWh)")
@TableField @TableField
private BigDecimal apparatusCapacity; 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; ...@@ -4,6 +4,7 @@ import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import pps.core.base.entity.BasePowerLineStorageView; import pps.core.base.entity.BasePowerLineStorageView;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
...@@ -31,4 +32,12 @@ public interface BasePowerLineStorageViewMapper { ...@@ -31,4 +32,12 @@ public interface BasePowerLineStorageViewMapper {
* @return int * @return int
*/ */
int batchInsertList(@Param(value = "list") List<BasePowerLineStorageView> list); 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; ...@@ -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.GetBasePowerLineViewOutput;
import pps.cloud.base.service.data.base_power_line_plant.DynamicQueryBasePowerLinePlantInput; 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_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.DynamicQueryBasePowerLineWellheadInput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput; import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput;
import pps.core.base.entity.BasePowerLineEnt; import pps.core.base.entity.BasePowerLineEnt;
import pps.core.base.entity.BasePowerLinePlantEnt; import pps.core.base.entity.BasePowerLinePlantEnt;
import pps.core.base.entity.BasePowerLineStorageView;
import pps.core.base.entity.BasePowerLineWellheadView; import pps.core.base.entity.BasePowerLineWellheadView;
import pps.core.base.mapper.BasePowerLineMapper; import pps.core.base.mapper.BasePowerLineMapper;
import pps.core.base.mapper.BasePowerLinePlantMapper; import pps.core.base.mapper.BasePowerLinePlantMapper;
import pps.core.base.mapper.BasePowerLineStorageViewMapper;
import pps.core.base.mapper.BasePowerLineWellheadViewMapper; import pps.core.base.mapper.BasePowerLineWellheadViewMapper;
import pps.core.common.constant.BusinessConstant; import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel; import pps.core.common.entity.BaseModel;
...@@ -144,4 +148,27 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService ...@@ -144,4 +148,27 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService
} }
return XListResult.success(outputs); 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 @@ ...@@ -32,6 +32,9 @@
<resultMap id="ExtendsResultMap" type="pps.core.base.entity.BasePowerLineStorageView" extends="BaseResultMap"> <resultMap id="ExtendsResultMap" type="pps.core.base.entity.BasePowerLineStorageView" extends="BaseResultMap">
<result column="device_name" property="deviceName" jdbcType="VARCHAR"/> <result column="device_name" property="deviceName" jdbcType="VARCHAR"/>
<result column="apparatus_capacity" property="apparatusCapacity" jdbcType="DECIMAL"/> <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> </resultMap>
<select id="selectOne" parameterType="pps.core.base.entity.BasePowerLineStorageView" resultMap="BaseResultMap"> <select id="selectOne" parameterType="pps.core.base.entity.BasePowerLineStorageView" resultMap="BaseResultMap">
...@@ -53,6 +56,25 @@ ...@@ -53,6 +56,25 @@
WHERE l.line_id = #{lineId} WHERE l.line_id = #{lineId}
</select> </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 id="batchInsertList" parameterType="list">
INSERT INTO base_power_line_storage ( id, create_by_id, create_by_name, create_time, modify_by_id, 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 ) modify_by_name, modify_time, line_id, storage_id, ou_id )
......
...@@ -21,7 +21,7 @@ import pps.core.common.utils.BaseUtils; ...@@ -21,7 +21,7 @@ import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*; import pps.core.space.entity.*;
import pps.core.space.enums.BusinessError; import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.*; 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_detail.*;
import pps.core.space.service.data.space_institution_duration.GetSpaceInstitutionDurationViewOutput; import pps.core.space.service.data.space_institution_duration.GetSpaceInstitutionDurationViewOutput;
import pps.core.space.service.data.space_institution_wellhead.CreateSpaceInstitutionWellheadInput; import pps.core.space.service.data.space_institution_wellhead.CreateSpaceInstitutionWellheadInput;
...@@ -380,7 +380,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -380,7 +380,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
} else { } else {
month = String.valueOf(monthNum); 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, List<DynamicQueryPlantPredictedPowerOutput> longAvgPowerList = super.getAveragePowerGenerationListByPlantIds(context,
DynamicQueryPlantPredictedPowerInput.builder() DynamicQueryPlantPredictedPowerInput.builder()
...@@ -682,7 +682,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -682,7 +682,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
*/ */
private void institutionalOptimization(XContext context, List<SpaceOptimizePeriodDTO> periodDTOList, List<SpaceOptimizeWellheadDTO> wellheadDTOList, private void institutionalOptimization(XContext context, List<SpaceOptimizePeriodDTO> periodDTOList, List<SpaceOptimizeWellheadDTO> wellheadDTOList,
List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList, 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 executionCycle, Date optimizeDeadline, int monthNum) {
String detailId = detail.getId(); String detailId = detail.getId();
String lineId = detail.getLineId(); String lineId = detail.getLineId();
......
...@@ -11,13 +11,18 @@ import pps.cloud.base.service.IBasePowerLineCloudService; ...@@ -11,13 +11,18 @@ import pps.cloud.base.service.IBasePowerLineCloudService;
import pps.cloud.base.service.IBaseWellheadCloudService; 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.DynamicQueryBasePowerLinePlantInput;
import pps.cloud.base.service.data.base_power_line_plant.DynamicQueryBasePowerLinePlantOutput; 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.GetBasePriceStrategyDetailInput;
import pps.cloud.base.service.data.base_price_strategy_detail.GetBasePriceStrategyDetailOutput; 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.DynamicQueryBaseWellheadInput;
import pps.cloud.base.service.data.base_wellhead.DynamicQueryBaseWellheadOutput; import pps.cloud.base.service.data.base_wellhead.DynamicQueryBaseWellheadOutput;
import pps.cloud.prediction.service.IPlantPredictedPowerCloudService; 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.DynamicQueryPlantPredictedPowerInput;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerOutput; 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.constant.BusinessConstant;
import pps.core.common.entity.BaseModel; import pps.core.common.entity.BaseModel;
import pps.core.common.utils.BaseUtils; import pps.core.common.utils.BaseUtils;
...@@ -26,7 +31,7 @@ import pps.core.space.enums.BusinessError; ...@@ -26,7 +31,7 @@ import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.SpaceInstitutionDetailMapper; import pps.core.space.mapper.SpaceInstitutionDetailMapper;
import pps.core.space.mapper.SpaceInstitutionDurationMapper; import pps.core.space.mapper.SpaceInstitutionDurationMapper;
import pps.core.space.mapper.SpaceInstitutionWellheadViewMapper; 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 pps.core.space.utils.ServiceUtil;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.base.exception.XServiceException; import xstartup.base.exception.XServiceException;
...@@ -72,9 +77,9 @@ public class SpaceOptimizeBaseService { ...@@ -72,9 +77,9 @@ public class SpaceOptimizeBaseService {
* *
* @param context 上下文 * @param context 上下文
* @param detailEntList 详细ent列表 * @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> lineIds = new HashSet<>(32);
Set<String> institutionIds = new HashSet<>(32); Set<String> institutionIds = new HashSet<>(32);
for (SpaceInstitutionDetailEnt spaceInstitutionDetailEnt : detailEntList) { for (SpaceInstitutionDetailEnt spaceInstitutionDetailEnt : detailEntList) {
...@@ -95,7 +100,7 @@ public class SpaceOptimizeBaseService { ...@@ -95,7 +100,7 @@ public class SpaceOptimizeBaseService {
//未发现可用光伏电站 //未发现可用光伏电站
throw new XServiceException(BusinessError.DidNotFindPlant); throw new XServiceException(BusinessError.DidNotFindPlant);
} }
return SpaceOptimizeWellheadAndPlant.builder() return SpaceOptimizeLineRelation.builder()
.spaceWellheadList(spaceWellheadList) .spaceWellheadList(spaceWellheadList)
.plantIdsByLineIdMap( .plantIdsByLineIdMap(
plantList.stream() plantList.stream()
...@@ -104,6 +109,8 @@ public class SpaceOptimizeBaseService { ...@@ -104,6 +109,8 @@ public class SpaceOptimizeBaseService {
Collectors.mapping(DynamicQueryBasePowerLinePlantOutput::getPlantId, Collectors.toList())) Collectors.mapping(DynamicQueryBasePowerLinePlantOutput::getPlantId, Collectors.toList()))
) )
) )
//取线路关联所有储能电站计算平均功率
.storageAvgMap(this.getPowerLineStorageListByLineIds(context, lineIds))
.build(); .build();
} }
...@@ -121,6 +128,21 @@ public class SpaceOptimizeBaseService { ...@@ -121,6 +128,21 @@ public class SpaceOptimizeBaseService {
return result.getResult(); 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 { ...@@ -188,6 +210,8 @@ public class SpaceOptimizeBaseService {
); );
} }
/*-----------------------------------private-----------------------------------*/
/** /**
* 获取井口Map通过最大功率区分 * 获取井口Map通过最大功率区分
* *
...@@ -195,15 +219,13 @@ public class SpaceOptimizeBaseService { ...@@ -195,15 +219,13 @@ public class SpaceOptimizeBaseService {
* @param powerMax 最大功率 * @param powerMax 最大功率
* @return {@link Map}<{@link Boolean}, {@link List}<{@link SpaceInstitutionWellheadView}>> * @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() return wellheadViewList.stream()
.collect( .collect(
Collectors.partitioningBy(w -> powerMax.compareTo(w.getServiceRating()) >= BusinessConstant.ZERO) Collectors.partitioningBy(w -> powerMax.compareTo(w.getServiceRating()) >= BusinessConstant.ZERO)
); );
} }
/*-----------------------------------private-----------------------------------*/
/** /**
* 按线路ID集合获取电站列表 * 按线路ID集合获取电站列表
* *
...@@ -222,6 +244,32 @@ public class SpaceOptimizeBaseService { ...@@ -222,6 +244,32 @@ public class SpaceOptimizeBaseService {
return result.getResult(); 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;
}
/** /**
* 为间开井口列表设置发电功率 * 为间开井口列表设置发电功率
* *
......
...@@ -5,23 +5,28 @@ import cn.hutool.core.date.DateField; ...@@ -5,23 +5,28 @@ import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import org.apache.commons.lang3.StringUtils;
import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePowerLineStorageViewOutput;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerInput; 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.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.cloud.space.service.ISpaceOptimizeLongCloudService; import pps.cloud.space.service.ISpaceOptimizeLongCloudService;
import pps.core.common.constant.BusinessConstant; import pps.core.common.constant.BusinessConstant;
import pps.core.common.utils.BaseUtils; import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*; import pps.core.space.entity.*;
import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.SpaceInstitutionDurationMapper; import pps.core.space.mapper.SpaceInstitutionDurationMapper;
import pps.core.space.mapper.SpaceOptimizeViewMapper; 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.annotation.XService;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.data.XServiceResult; import xstartup.data.XServiceResult;
import xstartup.helper.XTransactionHelper; import xstartup.helper.XTransactionHelper;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -46,19 +51,23 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService ...@@ -46,19 +51,23 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService
DateTime date = DateUtil.date(); DateTime date = DateUtil.date();
//取生效中的基础间开 //取生效中的基础间开
List<SpaceInstitutionDetailEnt> detailEntList = super.getEffectiveSpaceInstitution(context, date.toString(BusinessConstant.DATE_FORMAT_DAY)); List<SpaceInstitutionDetailEnt> detailEntList = super.getEffectiveSpaceInstitution(context, date.toString(BusinessConstant.DATE_FORMAT_DAY));
SpaceOptimizeWellheadAndPlant wellheadAndPlant = super.getWellheadAndPlant(context, detailEntList); SpaceOptimizeLineRelation relation = super.getWellheadAndPlant(context, detailEntList);
List<SpaceInstitutionWellheadView> spaceWellheadList = wellheadAndPlant.getSpaceWellheadList(); List<SpaceInstitutionWellheadView> spaceWellheadList = relation.getSpaceWellheadList();
Map<String, List<String>> plantIdsByLineIdMap = wellheadAndPlant.getPlantIdsByLineIdMap(); Map<String, List<String>> plantIdsByLineIdMap = relation.getPlantIdsByLineIdMap();
Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> storageAvgMap = relation.getStorageAvgMap();
//取年份 //取年份
int year = date.year(); int year = date.year();
//月份要加一 //月份要加一
int monthNum = date.month() + 1; int monthIndex = date.month();
String month; int monthNum = monthIndex + 1;
if (monthNum < BusinessConstant.TEN) { int lastMonthNum = monthIndex;
month = "0" + monthNum; int lastYear = year;
} else { if (monthIndex == 0) {
month = String.valueOf(monthNum); lastMonthNum = 12;
lastYear = year - 1;
} }
String month = BaseUtils.getMonthString(lastMonthNum);
String lastMonth = BaseUtils.getMonthString(date.month());
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class); SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
List<SpaceOptimizePeriodDTO> periodDTOList = new ArrayList<>(32); List<SpaceOptimizePeriodDTO> periodDTOList = new ArrayList<>(32);
List<SpaceOptimizeWellheadDTO> wellheadDTOList = new ArrayList<>(64); List<SpaceOptimizeWellheadDTO> wellheadDTOList = new ArrayList<>(64);
...@@ -66,37 +75,29 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService ...@@ -66,37 +75,29 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService
List<SpaceOptimizeDurationDTO> unOptimizeDurationList = new ArrayList<>(128); List<SpaceOptimizeDurationDTO> unOptimizeDurationList = new ArrayList<>(128);
String executionCycleForMonth = BaseUtils.getExecutionCycleForMonth(date); String executionCycleForMonth = BaseUtils.getExecutionCycleForMonth(date);
DateTime optimizeDeadline = DateUtil.endOfMonth(date); DateTime optimizeDeadline = DateUtil.endOfMonth(date);
List<DynamicQueryPlantPredictedPowerOutput> avgPowerList;
//优化 //优化
for (SpaceInstitutionDetailEnt detail : detailEntList) { for (SpaceInstitutionDetailEnt detail : detailEntList) {
String detailId = detail.getId(); String detailId = detail.getId();
String lineId = detail.getLineId(); String lineId = detail.getLineId();
//创建记录 //创建记录
String periodId = super.createOptimizePeriod(periodDTOList, detailId, lineId, executionCycleForMonth, optimizeDeadline); String periodId = super.createOptimizePeriod(periodDTOList, detailId, lineId, executionCycleForMonth, optimizeDeadline);
List<DynamicQueryPlantPredictedPowerOutput> avgPowerList; //获取当前制度对应的光伏预测数据列表
avgPowerList = super.getAveragePowerGenerationListByPlantIds(context,
DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(plantIdsByLineIdMap.get(lineId))
.yearTime(String.valueOf(year))
.monthTime(month)
.build()
);
switch (detail.getGridTypeKey()) { switch (detail.getGridTypeKey()) {
//并网型优化 //并网型优化
case "1": case "1":
//获取当前制度对应的光伏预测数据列表
avgPowerList = super.getAveragePowerGenerationListByPlantIds(context,
DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(plantIdsByLineIdMap.get(lineId))
.yearTime(String.valueOf(year))
.monthTime(month)
.build()
);
super.gridConnectedOptimization(context, durationMapper, wellheadDTOList, durationDTOList, unOptimizeDurationList, super.gridConnectedOptimization(context, durationMapper, wellheadDTOList, durationDTOList, unOptimizeDurationList,
spaceWellheadList, avgPowerList, detail, monthNum, detailId, periodId, lineId); spaceWellheadList, avgPowerList, detail, monthNum, detailId, periodId, lineId);
break; break;
//离网型优化 //离网型优化
case "0": case "0":
//获取当前制度对应的光伏预测数据列表
avgPowerList = super.getAveragePowerGenerationListByPlantIds(context,
DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(plantIdsByLineIdMap.get(lineId))
.yearTime(String.valueOf(year))
.monthTime(month)
.build()
);
//根据类型过滤井口:大间开,连抽井不优化 //根据类型过滤井口:大间开,连抽井不优化
List<SpaceInstitutionWellheadView> wellheadViewList = this.getWellheadViewList(spaceWellheadList, detailId); List<SpaceInstitutionWellheadView> wellheadViewList = this.getWellheadViewList(spaceWellheadList, detailId);
if (CollUtil.isEmpty(wellheadViewList)) { if (CollUtil.isEmpty(wellheadViewList)) {
...@@ -222,14 +223,65 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService ...@@ -222,14 +223,65 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService
} }
//离网优化 //离网优化
if (CollUtil.isNotEmpty(offGridPeriodList)) { if (CollUtil.isNotEmpty(offGridPeriodList)) {
if (!storageAvgMap.containsKey(lineId)) {
//没有储能设备,无法计算
continue;
}
//截取从第一次开井时间往后的时间段 //截取从第一次开井时间往后的时间段
List<DynamicQueryPlantPredictedPowerOutput> subAvgPowerList = CollUtil.sub(avgPowerList, firstIndex + 1, avgPowerList.size()); List<DynamicQueryPlantPredictedPowerOutput> subAvgPowerList = CollUtil.sub(avgPowerList, firstIndex + 1, avgPowerList.size());
if (CollUtil.isEmpty(subAvgPowerList)) { if (CollUtil.isEmpty(subAvgPowerList)) {
return XServiceResult.error(context, BusinessError.UnableToOptimize); //没有时间段,无法计算
continue;
}
//查获取前一个月该时间点储能剩余电量,求平均数
List<DynamicQueryStoragePredictedPowerOutput> averageEnergyStorageList = super.getAverageEnergyStorageListByParam(context,
DynamicQueryStoragePredictedPowerInput.builder()
.storageIds(plantIdsByLineIdMap.get(lineId))
.yearTime(String.valueOf(lastYear))
.monthTime(lastMonth)
.build()
);
if (CollUtil.isEmpty(averageEnergyStorageList)) {
//没有储能发电量,无法计算
continue;
} }
//逐15分钟计算光伏出力-井场运行功率之和,获得光伏出力不足时间段 //取储能计算参数
List<DynamicQueryBasePowerLineStorageViewOutput> avgStorageViewList = storageAvgMap.get(lineId);
DynamicQueryBasePowerLineStorageViewOutput avgStorageView = avgStorageViewList.get(0);
//平均额定放电效率(%)
BigDecimal avgRatedDischargeEfficiency = avgStorageView.getRatedDischargeEfficiency();
//平均额定放电深度(%)
BigDecimal avgRatedDischargeDepth = avgStorageView.getRatedDischargeDepth();
//平均额定放电功率(KW)
BigDecimal avgRatedDischargePower = avgStorageView.getRatedDischargePower();
//逐15分钟计算光伏出力-井场运行功率之和,获得光伏出力不足时间段,并计算储能可用时长
Iterator<DynamicQueryStoragePredictedPowerOutput> iterator = averageEnergyStorageList.iterator();
for (DynamicQueryPlantPredictedPowerOutput avg : subAvgPowerList) { for (DynamicQueryPlantPredictedPowerOutput avg : subAvgPowerList) {
avg.setMeetFlag(avg.getPower().compareTo(totalOperatingPower) >= 0); if (avg.getPower().compareTo(totalOperatingPower) >= 0) {
String hourTime = avg.getHourTime();
String minTime = avg.getMinTime();
while (iterator.hasNext()) {
DynamicQueryStoragePredictedPowerOutput storagePredicted = iterator.next();
if (StringUtils.equals(hourTime, storagePredicted.getHourTime()) && StringUtils.equals(minTime, storagePredicted.getMinTime())) {
//计算储能可供电时长:(储能剩余容量*放电深度*放电效率)/额定放电功率
avg.setPowerDuration(
storagePredicted.getPower()
.multiply(avgRatedDischargeDepth)
.multiply(avgRatedDischargeEfficiency)
.divide(avgRatedDischargePower)
.setScale(BusinessConstant.ZERO, RoundingMode.DOWN)
.intValueExact()
);
break;
}
//删除计算过的时间段
iterator.remove();
}
}
}
//拆分时间段
for (SpaceOptimizeDurationDTO durationDTO : offGridPeriodList) {
} }
} }
break; break;
......
...@@ -11,7 +11,7 @@ import pps.core.common.utils.BaseUtils; ...@@ -11,7 +11,7 @@ import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*; import pps.core.space.entity.*;
import pps.core.space.mapper.SpaceInstitutionDurationMapper; import pps.core.space.mapper.SpaceInstitutionDurationMapper;
import pps.core.space.mapper.SpaceOptimizeViewMapper; 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.annotation.XService;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.data.XServiceResult; import xstartup.data.XServiceResult;
...@@ -43,7 +43,7 @@ public class SpaceOptimizeMidCloudServiceImpl extends SpaceOptimizeBaseService i ...@@ -43,7 +43,7 @@ public class SpaceOptimizeMidCloudServiceImpl extends SpaceOptimizeBaseService i
String startWeek = date.toString(BusinessConstant.DATE_FORMAT_DAY); String startWeek = date.toString(BusinessConstant.DATE_FORMAT_DAY);
//取生效中的基础间开 //取生效中的基础间开
List<SpaceInstitutionDetailEnt> detailEntList = super.getEffectiveSpaceInstitution(context, startWeek); List<SpaceInstitutionDetailEnt> detailEntList = super.getEffectiveSpaceInstitution(context, startWeek);
SpaceOptimizeWellheadAndPlant wellheadAndPlant = super.getWellheadAndPlant(context, detailEntList); SpaceOptimizeLineRelation wellheadAndPlant = super.getWellheadAndPlant(context, detailEntList);
List<SpaceInstitutionWellheadView> spaceWellheadList = wellheadAndPlant.getSpaceWellheadList(); List<SpaceInstitutionWellheadView> spaceWellheadList = wellheadAndPlant.getSpaceWellheadList();
Map<String, List<String>> plantIdsByLineIdMap = wellheadAndPlant.getPlantIdsByLineIdMap(); Map<String, List<String>> plantIdsByLineIdMap = wellheadAndPlant.getPlantIdsByLineIdMap();
//月份要加一 //月份要加一
......
...@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; ...@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePowerLineStorageViewOutput;
import pps.core.space.entity.SpaceInstitutionWellheadView; import pps.core.space.entity.SpaceInstitutionWellheadView;
import java.util.List; import java.util.List;
...@@ -19,7 +20,7 @@ import java.util.Map; ...@@ -19,7 +20,7 @@ import java.util.Map;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
public class SpaceOptimizeWellheadAndPlant { public class SpaceOptimizeLineRelation {
/** /**
* 井口列表 * 井口列表
...@@ -30,4 +31,9 @@ public class SpaceOptimizeWellheadAndPlant { ...@@ -30,4 +31,9 @@ public class SpaceOptimizeWellheadAndPlant {
* 电站Map * 电站Map
*/ */
Map<String, List<String>> plantIdsByLineIdMap; Map<String, List<String>> plantIdsByLineIdMap;
/**
* 储能设备参数平均值Map
*/
Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> storageAvgMap;
} }
...@@ -31,4 +31,7 @@ public class DynamicQueryPlantPredictedPowerOutput { ...@@ -31,4 +31,7 @@ public class DynamicQueryPlantPredictedPowerOutput {
@XText("是否满足") @XText("是否满足")
private boolean meetFlag; private boolean meetFlag;
@XText("可供电时长")
private int powerDuration;
} }
package pps.cloud.prediction.service.data.storage_predicted_power_data; package pps.cloud.prediction.service.data.storage_predicted_power_data;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.util.List; import java.util.List;
...@@ -12,6 +15,9 @@ import java.util.List; ...@@ -12,6 +15,9 @@ import java.util.List;
* @date 2023/09/20 * @date 2023/09/20
*/ */
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class DynamicQueryStoragePredictedPowerInput { public class DynamicQueryStoragePredictedPowerInput {
@XText("储能设备id") @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