Commit 57e89594 authored by tianchao's avatar tianchao
parents bbd490c4 9e0772a7
...@@ -26,6 +26,46 @@ public class BusinessConstant { ...@@ -26,6 +26,46 @@ public class BusinessConstant {
*/ */
public static final String WELLHEAD = "wellhead"; public static final String WELLHEAD = "wellhead";
/**
* 光伏发电
*/
public static final String PHOTOVOLTAIC = "gf";
/**
* 储能发电
*/
public static final String STORED_ENERGY = "cn";
/**
* 柴油发电
*/
public static final String DIESEL_POWER = "cf";
/**
* 间抽井
*/
public static final String INTERVAL_PUMPING_WELL = "INTERVAL";
/**
* 连抽井
*/
public static final String CONTINUOUS_PUMPING_WELL = "CONTINUOUS";
/**
* 字符串一
*/
public static final String STRING_ONE = "1";
/**
* 已优化
*/
public static final String OPTIMIZED_C = "已优化";
/**
* 未优化
*/
public static final String NO_OPTIMIZATION_C = "未优化";
/*------------------------------数字------------------------------*/ /*------------------------------数字------------------------------*/
/** /**
...@@ -75,6 +115,11 @@ public class BusinessConstant { ...@@ -75,6 +115,11 @@ public class BusinessConstant {
*/ */
public static final String END_OF_DAY_TIME = "23:59"; public static final String END_OF_DAY_TIME = "23:59";
/**
* 一天开始时间
*/
public static final String START_OF_DAY_TIME = "00:00";
/** /**
* 日期标志 * 日期标志
*/ */
......
...@@ -423,6 +423,9 @@ public class SysOrganizationService { ...@@ -423,6 +423,9 @@ public class SysOrganizationService {
/** /**
* 组织机构管理--动态查询列表 * 组织机构管理--动态查询列表
* GET /system/sys-organization/query-sys-organization-list
* 接口ID:106823391
* 接口地址:https://app.apifox.com/project/3196988/apis/api-106823391
* *
* @param context 上下文 * @param context 上下文
* @param input 输入 * @param input 输入
...@@ -452,6 +455,9 @@ public class SysOrganizationService { ...@@ -452,6 +455,9 @@ public class SysOrganizationService {
/** /**
* 组织机构管理--查询组织和线路列表 * 组织机构管理--查询组织和线路列表
* GET /system/sys-organization/query-org-and-line-list
* 接口ID:108626631
* 接口地址:https://app.apifox.com/project/3196988/apis/api-108626631
* *
* @param context 上下文 * @param context 上下文
* @param input 输入 * @param input 输入
...@@ -784,6 +790,16 @@ public class SysOrganizationService { ...@@ -784,6 +790,16 @@ public class SysOrganizationService {
return XPageResult.success(outputs, input, pageInfo.getTotal()); return XPageResult.success(outputs, input, pageInfo.getTotal());
} }
/**
* 组织机构管理--分页列表
* POST /system/sys-organization/querySysOrganizationViewIncluedOwnerPage
* 接口ID:106663218
* 接口地址:https://app.apifox.com/project/3196988/apis/api-106663218
*
* @param context 上下文
* @param input 输入
* @return {@link XPageResult}<{@link QuerySysOrganizationViewOutput}>
*/
@XText("查询组织机构列表") @XText("查询组织机构列表")
@XApiPost @XApiPost
public XPageResult<QuerySysOrganizationViewOutput> querySysOrganizationViewIncluedOwnerPage(XContext context, QuerySysOrganizationViewInput input) { public XPageResult<QuerySysOrganizationViewOutput> querySysOrganizationViewIncluedOwnerPage(XContext context, QuerySysOrganizationViewInput input) {
......
...@@ -107,7 +107,8 @@ ...@@ -107,7 +107,8 @@
sys_organization_rel sor sys_organization_rel sor
LEFT JOIN sys_organization ou ON ou.id = sor.ou_id LEFT JOIN sys_organization ou ON ou.id = sor.ou_id
<where> <where>
ou.is_deleted = #{isDeleted} sor.end_time >= NOW()
and ou.is_deleted = #{isDeleted}
<if test="id != null and id != ''"> <if test="id != null and id != ''">
and sor.parent_ou_id = #{id} and sor.parent_ou_id = #{id}
</if> </if>
...@@ -471,7 +472,8 @@ ...@@ -471,7 +472,8 @@
from sys_organization so from sys_organization so
left join sys_organization_rel sor on sor.parent_ou_id = so.id left join sys_organization_rel sor on sor.parent_ou_id = so.id
<where> <where>
sor.ou_id in sor.end_time >= NOW()
AND sor.ou_id in
<foreach collection="list" open="(" close=")" separator="," item="item"> <foreach collection="list" open="(" close=")" separator="," item="item">
#{item} #{item}
</foreach> </foreach>
...@@ -539,6 +541,7 @@ ...@@ -539,6 +541,7 @@
sys_organization o sys_organization o
WHERE WHERE
r.ou_id = o.id r.ou_id = o.id
AND r.end_time >= NOW()
AND o.is_deleted = 1 AND o.is_deleted = 1
<if test="parentOuId != null and parentOuId != ''"> <if test="parentOuId != null and parentOuId != ''">
AND r.parent_ou_id = #{parentOuId} AND r.parent_ou_id = #{parentOuId}
...@@ -575,9 +578,10 @@ ...@@ -575,9 +578,10 @@
o.ou_name AS ou_name, o.ou_name AS ou_name,
'' AS line_id, '' AS line_id,
'ORG' AS ou_level 'ORG' AS ou_level
FROM sys_organization_rel r FROM sys_organization o
LEFT JOIN sys_organization o ON o.id = r.ou_id LEFT JOIN sys_organization_rel r ON o.id = r.ou_id
WHERE r.parent_ou_id = #{id} WHERE r.parent_ou_id = #{id}
AND r.end_time >= NOW()
AND o.is_deleted = 1 AND o.is_deleted = 1
ORDER BY r.sort) ORDER BY r.sort)
UNION ALL UNION ALL
......
...@@ -28,11 +28,11 @@ public enum BusinessError implements XError { ...@@ -28,11 +28,11 @@ public enum BusinessError implements XError {
@Override @Override
public int getCode() { public int getCode() {
return 0; return code;
} }
@Override @Override
public String getText() { public String getText() {
return null; return text;
} }
} }
...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import pps.core.base.entity.BaseDieselGeneratorEnt; import pps.core.base.entity.BaseDieselGeneratorEnt;
import pps.core.base.entity.BasePowerLineDieselEnt; import pps.core.base.entity.BasePowerLineDieselEnt;
import pps.core.base.enums.BusinessError; import pps.core.base.enums.BusinessError;
...@@ -110,23 +111,37 @@ public class BaseDieselGeneratorService { ...@@ -110,23 +111,37 @@ public class BaseDieselGeneratorService {
return XSingleResult.success(output); return XSingleResult.success(output);
} }
/**
* 分页查询
* GET /base/base-diesel-generator/query-base-diesel-generator
* 接口ID:105601992
* 接口地址:https://app.apifox.com/project/3196988/apis/api-105601992
*
* @param context 上下文
* @param input 输入
* @return {@link XPageResult}<{@link QueryBaseDieselGeneratorOutput}>
*/
@XText("分页查询") @XText("分页查询")
@XApiAnonymous @XApiAnonymous
@XApiGet @XApiGet
public XPageResult<QueryBaseDieselGeneratorOutput> queryBaseDieselGenerator(XContext context, QueryBaseDieselGeneratorInput input) { public XPageResult<QueryBaseDieselGeneratorOutput> queryBaseDieselGenerator(XContext context, QueryBaseDieselGeneratorInput input) {
String ouId = input.getOuId();
String ouName = input.getOuName(); String ouName = input.getOuName();
String deviceName = input.getDeviceName(); String deviceName = input.getDeviceName();
String excludeIdFlag = input.getExcludeIdFlag();
BaseDieselGeneratorMapper mapper = context.getBean(BaseDieselGeneratorMapper.class); BaseDieselGeneratorMapper mapper = context.getBean(BaseDieselGeneratorMapper.class);
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, ouId);
QueryWrapper<BaseDieselGeneratorEnt> queryWrapper = new QueryWrapper<>(); QueryWrapper<BaseDieselGeneratorEnt> queryWrapper = new QueryWrapper<>();
if (StringUtils.equals(BusinessConstant.STRING_ONE, input.getExcludeIdFlag())) {
queryWrapper.lambda()
.notExists("SELECT 1 FROM base_power_line_diesel w WHERE base_diesel_generator.id = w.diesel_id AND w.is_deleted = 1")
.eq(BaseDieselGeneratorEnt::getOuId, input.getOuId());
} else {
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, input.getOuId());
queryWrapper.lambda()
.in(CollUtil.isNotEmpty(allListByOuId), BaseDieselGeneratorEnt::getOuId, allListByOuId);
}
queryWrapper.lambda() queryWrapper.lambda()
.notExists("1".equals(excludeIdFlag), "SELECT 1 FROM base_power_line_diesel w WHERE w.ou_id = {0} AND base_diesel_generator.id = w.diesel_id AND w.is_deleted = 1", input.getOuId())
.eq(BaseDieselGeneratorEnt::getIsDeleted, BusinessConstant.ONE)
.in(CollUtil.isNotEmpty(allListByOuId), BaseDieselGeneratorEnt::getOuId, allListByOuId)
.like(StrUtil.isNotEmpty(ouName), BaseDieselGeneratorEnt::getOuName, ouName) .like(StrUtil.isNotEmpty(ouName), BaseDieselGeneratorEnt::getOuName, ouName)
.like(StrUtil.isNotEmpty(deviceName), BaseDieselGeneratorEnt::getDeviceName, deviceName) .like(StrUtil.isNotEmpty(deviceName), BaseDieselGeneratorEnt::getDeviceName, deviceName)
.eq(BaseDieselGeneratorEnt::getIsDeleted, BusinessConstant.ONE)
.orderByDesc(BaseDieselGeneratorEnt::getModifyTime); .orderByDesc(BaseDieselGeneratorEnt::getModifyTime);
return XMapperHelper.query(mapper, input, queryWrapper, QueryBaseDieselGeneratorOutput.class); return XMapperHelper.query(mapper, input, queryWrapper, QueryBaseDieselGeneratorOutput.class);
} }
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import pps.core.base.entity.BaseEnergyStorageDeviceEnt; import pps.core.base.entity.BaseEnergyStorageDeviceEnt;
import pps.core.base.entity.BasePowerLineStorageEnt; import pps.core.base.entity.BasePowerLineStorageEnt;
import pps.core.base.enums.BusinessError; import pps.core.base.enums.BusinessError;
...@@ -110,23 +111,37 @@ public class BaseEnergyStorageDeviceService { ...@@ -110,23 +111,37 @@ public class BaseEnergyStorageDeviceService {
return XSingleResult.success(output); return XSingleResult.success(output);
} }
/**
* 分页查询
* GET /base/base-energy-storage-device/query-base-energy-storage-device
* 接口ID:105602201
* 接口地址:https://app.apifox.com/project/3196988/apis/api-105602201
*
* @param context 上下文
* @param input 输入
* @return {@link XPageResult}<{@link QueryBaseEnergyStorageDeviceOutput}>
*/
@XText("分页查询") @XText("分页查询")
@XApiAnonymous @XApiAnonymous
@XApiGet @XApiGet
public XPageResult<QueryBaseEnergyStorageDeviceOutput> queryBaseEnergyStorageDevice(XContext context, QueryBaseEnergyStorageDeviceInput input) { public XPageResult<QueryBaseEnergyStorageDeviceOutput> queryBaseEnergyStorageDevice(XContext context, QueryBaseEnergyStorageDeviceInput input) {
String ouId = input.getOuId();
String ouName = input.getOuName(); String ouName = input.getOuName();
String deviceName = input.getDeviceName(); String deviceName = input.getDeviceName();
String excludeIdFlag = input.getExcludeIdFlag();
BaseEnergyStorageDeviceMapper mapper = context.getBean(BaseEnergyStorageDeviceMapper.class); BaseEnergyStorageDeviceMapper mapper = context.getBean(BaseEnergyStorageDeviceMapper.class);
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, ouId);
QueryWrapper<BaseEnergyStorageDeviceEnt> queryWrapper = new QueryWrapper<>(); QueryWrapper<BaseEnergyStorageDeviceEnt> queryWrapper = new QueryWrapper<>();
if (StringUtils.equals(BusinessConstant.STRING_ONE, input.getExcludeIdFlag())) {
queryWrapper.lambda()
.notExists("SELECT 1 FROM base_power_line_storage w WHERE base_energy_storage_device.id = w.storage_id AND w.is_deleted = 1")
.eq(BaseEnergyStorageDeviceEnt::getOuId, input.getOuId());
} else {
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, input.getOuId());
queryWrapper.lambda()
.in(CollUtil.isNotEmpty(allListByOuId), BaseEnergyStorageDeviceEnt::getOuId, allListByOuId);
}
queryWrapper.lambda() queryWrapper.lambda()
.notExists("1".equals(excludeIdFlag), "SELECT 1 FROM base_power_line_storage w WHERE w.ou_id = {0} AND base_energy_storage_device.id = w.storage_id AND w.is_deleted = 1", input.getOuId())
.eq(BaseEnergyStorageDeviceEnt::getIsDeleted, BusinessConstant.ONE)
.in(CollUtil.isNotEmpty(allListByOuId), BaseEnergyStorageDeviceEnt::getOuId, allListByOuId)
.like(StrUtil.isNotEmpty(ouName), BaseEnergyStorageDeviceEnt::getOuName, ouName) .like(StrUtil.isNotEmpty(ouName), BaseEnergyStorageDeviceEnt::getOuName, ouName)
.like(StrUtil.isNotEmpty(deviceName), BaseEnergyStorageDeviceEnt::getDeviceName, deviceName) .like(StrUtil.isNotEmpty(deviceName), BaseEnergyStorageDeviceEnt::getDeviceName, deviceName)
.eq(BaseEnergyStorageDeviceEnt::getIsDeleted, BusinessConstant.ONE)
.orderByDesc(BaseEnergyStorageDeviceEnt::getModifyTime); .orderByDesc(BaseEnergyStorageDeviceEnt::getModifyTime);
return XMapperHelper.query(mapper, input, queryWrapper, QueryBaseEnergyStorageDeviceOutput.class); return XMapperHelper.query(mapper, input, queryWrapper, QueryBaseEnergyStorageDeviceOutput.class);
} }
......
...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import pps.core.base.entity.BasePhotovoltaicPlantEnt; import pps.core.base.entity.BasePhotovoltaicPlantEnt;
import pps.core.base.entity.BasePowerLineEnt; import pps.core.base.entity.BasePowerLineEnt;
import pps.core.base.entity.BasePowerLinePlantEnt; import pps.core.base.entity.BasePowerLinePlantEnt;
...@@ -126,21 +127,35 @@ public class BasePhotovoltaicPlantService { ...@@ -126,21 +127,35 @@ public class BasePhotovoltaicPlantService {
return XSingleResult.success(output); return XSingleResult.success(output);
} }
/**
* 分页查询
* GET /base/base-photovoltaic-plant/query-base-photovoltaic-plant
* 接口ID:105466277
* 接口地址:https://app.apifox.com/project/3196988/apis/api-105466277
*
* @param context 上下文
* @param input 输入
* @return {@link XPageResult}<{@link QueryBasePhotovoltaicPlantOutput}>
*/
@XText("分页查询") @XText("分页查询")
@XApiAnonymous @XApiAnonymous
@XApiGet @XApiGet
public XPageResult<QueryBasePhotovoltaicPlantOutput> queryBasePhotovoltaicPlant(XContext context, QueryBasePhotovoltaicPlantInput input) { public XPageResult<QueryBasePhotovoltaicPlantOutput> queryBasePhotovoltaicPlant(XContext context, QueryBasePhotovoltaicPlantInput input) {
BasePhotovoltaicPlantMapper mapper = context.getBean(BasePhotovoltaicPlantMapper.class); BasePhotovoltaicPlantMapper mapper = context.getBean(BasePhotovoltaicPlantMapper.class);
String stationName = input.getStationName(); String stationName = input.getStationName();
String ouId = input.getOuId();
String excludeIdFlag = input.getExcludeIdFlag();
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, ouId);
QueryWrapper<BasePhotovoltaicPlantEnt> queryWrapper = new QueryWrapper<>(); QueryWrapper<BasePhotovoltaicPlantEnt> queryWrapper = new QueryWrapper<>();
if (StringUtils.equals(BusinessConstant.STRING_ONE, input.getExcludeIdFlag())) {
queryWrapper.lambda()
.notExists("SELECT 1 FROM base_power_line_plant w WHERE base_photovoltaic_plant.id = w.plant_id AND w.is_deleted = 1")
.eq(BasePhotovoltaicPlantEnt::getOuId, input.getOuId());
} else {
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, input.getOuId());
queryWrapper.lambda()
.in(CollUtil.isNotEmpty(allListByOuId), BasePhotovoltaicPlantEnt::getOuId, allListByOuId);
}
queryWrapper.lambda() queryWrapper.lambda()
.notExists("1".equals(excludeIdFlag), "SELECT 1 FROM base_power_line_plant w WHERE w.ou_id = {0} AND base_photovoltaic_plant.id = w.plant_id AND w.is_deleted = 1", input.getOuId())
.eq(BasePhotovoltaicPlantEnt::getIsDeleted, BusinessConstant.ONE)
.in(CollUtil.isNotEmpty(allListByOuId), BasePhotovoltaicPlantEnt::getOuId, allListByOuId)
.like(StrUtil.isNotEmpty(stationName), BasePhotovoltaicPlantEnt::getStationName, stationName) .like(StrUtil.isNotEmpty(stationName), BasePhotovoltaicPlantEnt::getStationName, stationName)
.eq(BasePhotovoltaicPlantEnt::getIsDeleted, BusinessConstant.ONE)
.orderByDesc(BasePhotovoltaicPlantEnt::getModifyTime); .orderByDesc(BasePhotovoltaicPlantEnt::getModifyTime);
return XMapperHelper.query(mapper, input, queryWrapper, QueryBasePhotovoltaicPlantOutput.class); return XMapperHelper.query(mapper, input, queryWrapper, QueryBasePhotovoltaicPlantOutput.class);
} }
......
...@@ -116,18 +116,33 @@ public class BaseWellheadService { ...@@ -116,18 +116,33 @@ public class BaseWellheadService {
return XSingleResult.success(output); return XSingleResult.success(output);
} }
/**
* 分页查询
* GET /base/base-wellhead/query-base-wellhead
* 接口ID:105431641
* 接口地址:https://app.apifox.com/project/3196988/apis/api-105431641
*
* @param context 上下文
* @param input 输入
* @return {@link XPageResult}<{@link QueryBaseWellheadOutput}>
*/
@XText("分页查询") @XText("分页查询")
@XApiAnonymous @XApiAnonymous
@XApiGet @XApiGet
public XPageResult<QueryBaseWellheadOutput> queryBaseWellhead(XContext context, QueryBaseWellheadInput input) { public XPageResult<QueryBaseWellheadOutput> queryBaseWellhead(XContext context, QueryBaseWellheadInput input) {
String excludeIdFlag = input.getExcludeIdFlag();
BaseWellheadMapper mapper = context.getBean(BaseWellheadMapper.class); BaseWellheadMapper mapper = context.getBean(BaseWellheadMapper.class);
QueryWrapper<BaseWellheadEnt> queryWrapper = new QueryWrapper<>(); QueryWrapper<BaseWellheadEnt> queryWrapper = new QueryWrapper<>();
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, input.getOuId()); if (StringUtils.equals(BusinessConstant.STRING_ONE, input.getExcludeIdFlag())) {
queryWrapper.lambda()
.notExists("SELECT 1 FROM base_power_line_wellhead w WHERE base_wellhead.id = w.wellhead_id AND w.is_deleted = 1")
.eq(BaseWellheadEnt::getOuId, input.getOuId());
} else {
List<String> allListByOuId = ServiceUtil.getOrgIdsByPath(context, input.getOuId());
queryWrapper.lambda()
.in(CollUtil.isNotEmpty(allListByOuId), BaseWellheadEnt::getOuId, allListByOuId);
}
queryWrapper.lambda() queryWrapper.lambda()
.notExists(StringUtils.equals("1", excludeIdFlag), "SELECT 1 FROM base_power_line_wellhead w WHERE w.ou_id = {0} AND base_wellhead.id = w.wellhead_id AND w.is_deleted = 1", input.getOuId())
.eq(BaseWellheadEnt::getIsDeleted, BusinessConstant.ONE) .eq(BaseWellheadEnt::getIsDeleted, BusinessConstant.ONE)
.in(CollUtil.isNotEmpty(allListByOuId), BaseWellheadEnt::getOuId, allListByOuId)
.orderByDesc(BaseWellheadEnt::getModifyTime); .orderByDesc(BaseWellheadEnt::getModifyTime);
return XMapperHelper.query(mapper, input, queryWrapper, QueryBaseWellheadOutput.class); return XMapperHelper.query(mapper, input, queryWrapper, QueryBaseWellheadOutput.class);
} }
......
package pps.core.base.service.data.base_diesel_generator; package pps.core.base.service.data.base_diesel_generator;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput; import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
/**
* 柴发设备
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBaseDieselGeneratorInput extends XPageInput { public class QueryBaseDieselGeneratorInput extends XPageInput {
@XText("组织机构ID") @XText("组织机构ID")
@NotBlank(message = "缺少组织机构ID")
private String ouId; private String ouId;
@XText("组织机构name") @XText("组织机构name")
...@@ -35,5 +43,4 @@ public class QueryBaseDieselGeneratorInput extends XPageInput { ...@@ -35,5 +43,4 @@ public class QueryBaseDieselGeneratorInput extends XPageInput {
@XText("排除已绑定线路标识") @XText("排除已绑定线路标识")
private String excludeIdFlag; private String excludeIdFlag;
} }
...@@ -2,36 +2,21 @@ package pps.core.base.service.data.base_diesel_generator; ...@@ -2,36 +2,21 @@ package pps.core.base.service.data.base_diesel_generator;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/**
* 柴发设备
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBaseDieselGeneratorOutput extends XPageInput { public class QueryBaseDieselGeneratorOutput {
@XText("ID") @XText("ID")
private String id; private String id;
@XText("是否删除(1_是;0_否)")
private Integer isDeleted;
@XText("创建人ID")
private String createById;
@XText("创建人名称")
private String createByName;
@XText("创建时间")
private Date createTime;
@XText("修改人ID")
private String modifyById;
@XText("修改人名称")
private String modifyByName;
@XText("修改时间")
private Date modifyTime;
@XText("组织机构ID") @XText("组织机构ID")
private String ouId; private String ouId;
...@@ -55,5 +40,4 @@ public class QueryBaseDieselGeneratorOutput extends XPageInput { ...@@ -55,5 +40,4 @@ public class QueryBaseDieselGeneratorOutput extends XPageInput {
@XText("备用功率(KW)") @XText("备用功率(KW)")
private BigDecimal standbyPower; private BigDecimal standbyPower;
} }
package pps.core.base.service.data.base_energy_storage_device; package pps.core.base.service.data.base_energy_storage_device;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput; import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
/**
* 储能设备
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBaseEnergyStorageDeviceInput extends XPageInput { public class QueryBaseEnergyStorageDeviceInput extends XPageInput {
@XText("组织机构ID") @XText("组织机构ID")
@NotBlank(message = "缺少组织机构ID")
private String ouId; private String ouId;
@XText("组织机构name") @XText("组织机构name")
...@@ -35,8 +43,7 @@ public class QueryBaseEnergyStorageDeviceInput extends XPageInput { ...@@ -35,8 +43,7 @@ public class QueryBaseEnergyStorageDeviceInput extends XPageInput {
@XText("额定充电功率(KW)") @XText("额定充电功率(KW)")
private BigDecimal ratedChargingPower; private BigDecimal ratedChargingPower;
@XText("排除已绑定线路标识") @XText("排除已绑定线路标识")
private String excludeIdFlag; private String excludeIdFlag;
} }
...@@ -3,36 +3,21 @@ package pps.core.base.service.data.base_energy_storage_device; ...@@ -3,36 +3,21 @@ package pps.core.base.service.data.base_energy_storage_device;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/**
* 储能设备
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBaseEnergyStorageDeviceOutput extends XPageInput { public class QueryBaseEnergyStorageDeviceOutput {
@XText("ID") @XText("ID")
private String id; private String id;
@XText("是否删除(1_是;0_否)")
private Integer isDeleted;
@XText("创建人ID")
private String createById;
@XText("创建人名称")
private String createByName;
@XText("创建时间")
private Date createTime;
@XText("修改人ID")
private String modifyById;
@XText("修改人名称")
private String modifyByName;
@XText("修改时间")
private Date modifyTime;
@XText("组织机构ID") @XText("组织机构ID")
private String ouId; private String ouId;
...@@ -67,5 +52,4 @@ public class QueryBaseEnergyStorageDeviceOutput extends XPageInput { ...@@ -67,5 +52,4 @@ public class QueryBaseEnergyStorageDeviceOutput extends XPageInput {
@XText("额定放电效率") @XText("额定放电效率")
@TableField @TableField
private BigDecimal ratedDischargeEfficiency; private BigDecimal ratedDischargeEfficiency;
} }
package pps.core.base.service.data.base_photovoltaic_plant; package pps.core.base.service.data.base_photovoltaic_plant;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput; import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
/**
* 光伏电站
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBasePhotovoltaicPlantInput extends XPageInput { public class QueryBasePhotovoltaicPlantInput extends XPageInput {
@XText("组织机构ID") @XText("组织机构ID")
@NotBlank(message = "缺少组织机构ID")
private String ouId; private String ouId;
@XText("电站名称") @XText("电站名称")
...@@ -31,9 +40,10 @@ public class QueryBasePhotovoltaicPlantInput extends XPageInput { ...@@ -31,9 +40,10 @@ public class QueryBasePhotovoltaicPlantInput extends XPageInput {
@XText("组织机构name") @XText("组织机构name")
private String ouName; private String ouName;
@XText("光伏设备规格型号name(字典获取)") @XText("光伏设备规格型号name(字典获取)")
private String photovoltaicModelName; private String photovoltaicModelName;
@XText("排除已绑定线路标识") @XText("排除已绑定线路标识")
private String excludeIdFlag; private String excludeIdFlag;
} }
...@@ -2,36 +2,21 @@ package pps.core.base.service.data.base_photovoltaic_plant; ...@@ -2,36 +2,21 @@ package pps.core.base.service.data.base_photovoltaic_plant;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/**
* 光伏电站
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBasePhotovoltaicPlantOutput extends XPageInput { public class QueryBasePhotovoltaicPlantOutput {
@XText("ID") @XText("ID")
private String id; private String id;
@XText("是否删除(0_是;1_否)")
private Integer isDeleted;
@XText("创建人ID")
private String createById;
@XText("创建人名称")
private String createByName;
@XText("创建时间")
private Date createTime;
@XText("修改人ID")
private String modifyById;
@XText("修改人名称")
private String modifyByName;
@XText("修改时间")
private Date modifyTime;
@XText("组织机构ID") @XText("组织机构ID")
private String ouId; private String ouId;
...@@ -52,9 +37,10 @@ public class QueryBasePhotovoltaicPlantOutput extends XPageInput { ...@@ -52,9 +37,10 @@ public class QueryBasePhotovoltaicPlantOutput extends XPageInput {
@XText("阵列朝向") @XText("阵列朝向")
private BigDecimal arrayOrientation; private BigDecimal arrayOrientation;
@XText("组织机构name") @XText("组织机构name")
private String ouName; private String ouName;
@XText("光伏设备规格型号name(字典获取)") @XText("光伏设备规格型号name(字典获取)")
private String photovoltaicModelName; private String photovoltaicModelName;
} }
package pps.core.base.service.data.base_wellhead; package pps.core.base.service.data.base_wellhead;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput; import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
/**
* 井口
*
* @author ZWT
* @date 2023/09/25
*/
@Data @Data
public class QueryBaseWellheadInput extends XPageInput { public class QueryBaseWellheadInput extends XPageInput {
@XText("组织机构ID") @XText("组织机构ID")
@NotBlank(message = "缺少组织机构ID")
private String ouId; private String ouId;
@XText("组织机构ID") @XText("组织机构ID")
private String ouName; private String ouName;
...@@ -19,6 +28,7 @@ public class QueryBaseWellheadInput extends XPageInput { ...@@ -19,6 +28,7 @@ public class QueryBaseWellheadInput extends XPageInput {
@XText("运行类型key(字典获取)") @XText("运行类型key(字典获取)")
private String runTypeKey; private String runTypeKey;
@XText("运行类型name(字典获取)") @XText("运行类型name(字典获取)")
private String runTypeName; private String runTypeName;
...@@ -27,5 +37,4 @@ public class QueryBaseWellheadInput extends XPageInput { ...@@ -27,5 +37,4 @@ public class QueryBaseWellheadInput extends XPageInput {
@XText("排除已绑定线路标识") @XText("排除已绑定线路标识")
private String excludeIdFlag; private String excludeIdFlag;
}
} \ No newline at end of file
package pps.core.base.service.data.base_wellhead; package pps.core.base.service.data.base_wellhead;
import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
public class QueryBaseWellheadOutput extends XPageInput {
@XText("ID")
private String id;
@XText("是否删除(1_是;0_否)")
private Integer isDeleted;
@XText("创建人ID")
private String createById;
@XText("创建人名称")
private String createByName;
@XText("创建时间") /**
private Date createTime; * 井口设置
*
* @author ZWT
* @date 2023/09/25
*/
@Data
public class QueryBaseWellheadOutput {
@XText("修改人ID") @XText("ID")
private String modifyById; private String id;
@XText("修改人名称")
private String modifyByName;
@XText("修改时间")
private Date modifyTime;
@XText("组织机构ID") @XText("组织机构ID")
private String ouId; private String ouId;
@XText("组织机构名称") @XText("组织机构名称")
private String ouName; private String ouName;
...@@ -40,121 +28,10 @@ public class QueryBaseWellheadOutput extends XPageInput { ...@@ -40,121 +28,10 @@ public class QueryBaseWellheadOutput extends XPageInput {
@XText("运行类型key(字典获取)") @XText("运行类型key(字典获取)")
private String runTypeKey; private String runTypeKey;
@XText("运行类型Name(字典获取)") @XText("运行类型Name(字典获取)")
private String runTypeName; private String runTypeName;
@XText("运行功率(KW)") @XText("运行功率(KW)")
private BigDecimal serviceRating; private BigDecimal serviceRating;
public String getId() {
return this.id;
}
public void setId(String value) {
this.id = value;
}
public Integer getIsDeleted() {
return this.isDeleted;
}
public void setIsDeleted(Integer value) {
this.isDeleted = value;
}
public String getCreateById() {
return this.createById;
}
public void setCreateById(String value) {
this.createById = value;
}
public String getCreateByName() {
return this.createByName;
}
public void setCreateByName(String value) {
this.createByName = value;
}
public Date getCreateTime() {
return this.createTime;
}
public void setCreateTime(Date value) {
this.createTime = value;
}
public String getModifyById() {
return this.modifyById;
}
public void setModifyById(String value) {
this.modifyById = value;
}
public String getModifyByName() {
return this.modifyByName;
}
public void setModifyByName(String value) {
this.modifyByName = value;
}
public Date getModifyTime() {
return this.modifyTime;
}
public void setModifyTime(Date value) {
this.modifyTime = value;
}
public String getOuId() {
return this.ouId;
}
public void setOuId(String value) {
this.ouId = value;
}
public String getWellNumber() {
return this.wellNumber;
}
public void setWellNumber(String value) {
this.wellNumber = value;
}
public String getRunTypeKey() {
return this.runTypeKey;
}
public void setRunTypeKey(String value) {
this.runTypeKey = value;
}
public BigDecimal getServiceRating() {
return this.serviceRating;
}
public void setServiceRating(BigDecimal value) {
this.serviceRating = value;
}
public String getOuName() {
return ouName;
}
public void setOuName(String ouName) {
this.ouName = ouName;
}
public String getRunTypeName() {
return runTypeName;
}
public void setRunTypeName(String runTypeName) {
this.runTypeName = runTypeName;
}
} }
...@@ -24,7 +24,7 @@ public class CronConstant { ...@@ -24,7 +24,7 @@ public class CronConstant {
public static final String EVERY_DAY = "0 15 0 * * ?"; public static final String EVERY_DAY = "0 15 0 * * ?";
/** /**
* 每一天结束时间 23:30:00 * 每一天结束时间 23:50:00
*/ */
public static final String END_OF_DAY = "0 30 23 * * ?"; public static final String END_OF_DAY = "0 50 23 * * ?";
} }
\ No newline at end of file
...@@ -37,4 +37,4 @@ public class SpaceOptimizeShortJob implements XJob { ...@@ -37,4 +37,4 @@ public class SpaceOptimizeShortJob implements XJob {
logger.info("------ SpaceOptimizeShortJob end:{}", System.currentTimeMillis()); logger.info("------ SpaceOptimizeShortJob end:{}", System.currentTimeMillis());
return XServiceResult.OK; return XServiceResult.OK;
} }
} }
\ No newline at end of file
...@@ -7,6 +7,7 @@ import pps.core.common.entity.BaseModel; ...@@ -7,6 +7,7 @@ import pps.core.common.entity.BaseModel;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* 间开制度小间开时段配置 * 间开制度小间开时段配置
...@@ -41,4 +42,12 @@ public class SpaceInstitutionDurationEnt extends BaseModel implements Serializab ...@@ -41,4 +42,12 @@ public class SpaceInstitutionDurationEnt extends BaseModel implements Serializab
@XText("关井时间") @XText("关井时间")
@TableField @TableField
private String closeWellTime; private String closeWellTime;
@XText("开井时间")
@TableField(exist = false)
private Date openTime;
@XText("关井时间")
@TableField(exist = false)
private Date closeTime;
} }
...@@ -6,6 +6,7 @@ import pps.core.common.entity.BaseModel; ...@@ -6,6 +6,7 @@ import pps.core.common.entity.BaseModel;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* 间开优化井口制度记录 * 间开优化井口制度记录
...@@ -43,4 +44,12 @@ public class SpaceOptimizeDurationDTO extends BaseModel implements Serializable ...@@ -43,4 +44,12 @@ public class SpaceOptimizeDurationDTO extends BaseModel implements Serializable
@XText("关井时间") @XText("关井时间")
@TableField @TableField
private String closeWellTime; private String closeWellTime;
@XText("开井时间")
@TableField(exist = false)
private Date openTime;
@XText("关井时间")
@TableField(exist = false)
private Date closeTime;
} }
...@@ -28,11 +28,11 @@ public enum BusinessError implements XError { ...@@ -28,11 +28,11 @@ public enum BusinessError implements XError {
@Override @Override
public int getCode() { public int getCode() {
return 0; return code;
} }
@Override @Override
public String getText() { public String getText() {
return null; return text;
} }
} }
...@@ -2,7 +2,9 @@ package pps.core.space.mapper; ...@@ -2,7 +2,9 @@ package pps.core.space.mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import pps.core.space.entity.*; import pps.core.space.entity.SpaceOptimizeDurationDTO;
import pps.core.space.entity.SpaceOptimizePeriodDTO;
import pps.core.space.entity.SpaceOptimizeWellheadDTO;
import java.util.List; import java.util.List;
...@@ -40,7 +42,7 @@ public interface SpaceOptimizeViewMapper { ...@@ -40,7 +42,7 @@ public interface SpaceOptimizeViewMapper {
int longDurationBatchInsertList(@Param(value = "list") List<SpaceOptimizeDurationDTO> list); int longDurationBatchInsertList(@Param(value = "list") List<SpaceOptimizeDurationDTO> list);
/** /**
* 期间开优化批量新增 * 中短期间开优化批量新增
* *
* @param list 列表 * @param list 列表
* @return int * @return int
...@@ -48,7 +50,7 @@ public interface SpaceOptimizeViewMapper { ...@@ -48,7 +50,7 @@ public interface SpaceOptimizeViewMapper {
int midPeriodBatchInsertList(@Param(value = "list") List<SpaceOptimizePeriodDTO> list); int midPeriodBatchInsertList(@Param(value = "list") List<SpaceOptimizePeriodDTO> list);
/** /**
* 期间开优化井口批量新增 * 中短期间开优化井口批量新增
* *
* @param list 列表 * @param list 列表
* @return int * @return int
...@@ -56,10 +58,34 @@ public interface SpaceOptimizeViewMapper { ...@@ -56,10 +58,34 @@ public interface SpaceOptimizeViewMapper {
int midWellheadBatchInsertList(@Param(value = "list") List<SpaceOptimizeWellheadDTO> list); int midWellheadBatchInsertList(@Param(value = "list") List<SpaceOptimizeWellheadDTO> list);
/** /**
* 期间开优化井口配置批量新增 * 中短期间开优化井口配置批量新增
* *
* @param list 列表 * @param list 列表
* @return int * @return int
*/ */
int midDurationBatchInsertList(@Param(value = "list") List<SpaceOptimizeDurationDTO> list); int midDurationBatchInsertList(@Param(value = "list") List<SpaceOptimizeDurationDTO> list);
/**
* 短期间开优化批量新增
*
* @param list 列表
* @return int
*/
int shortPeriodBatchInsertList(@Param(value = "list") List<SpaceOptimizePeriodDTO> list);
/**
* 短期间开优化井口批量新增
*
* @param list 列表
* @return int
*/
int shortWellheadBatchInsertList(@Param(value = "list") List<SpaceOptimizeWellheadDTO> list);
/**
* 短期间开优化井口配置批量新增
*
* @param list 列表
* @return int
*/
int shortDurationBatchInsertList(@Param(value = "list") List<SpaceOptimizeDurationDTO> list);
} }
...@@ -13,7 +13,7 @@ import pps.cloud.base.service.IBasePowerLineCloudService; ...@@ -13,7 +13,7 @@ import pps.cloud.base.service.IBasePowerLineCloudService;
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.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.storage_predicted_power_data.DynamicQueryStoragePredictedPowerInput;
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.session.PpsUserSession; import pps.core.common.session.PpsUserSession;
...@@ -290,6 +290,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -290,6 +290,7 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
@XApiPost @XApiPost
@XText("基础间开配置--设为基础制度") @XText("基础间开配置--设为基础制度")
public XServiceResult updateBasicInstitution(XContext context, UpdateSpaceInstitutionDetailInput input) { public XServiceResult updateBasicInstitution(XContext context, UpdateSpaceInstitutionDetailInput input) {
PpsUserSession session = context.getSession(PpsUserSession.class);
String ouId = input.getOuId(); String ouId = input.getOuId();
String lineId = input.getLineId(); String lineId = input.getLineId();
String institutionId = input.getId(); String institutionId = input.getId();
...@@ -309,11 +310,17 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -309,11 +310,17 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
.eq(SpaceInstitutionDetailEnt::getLineId, lineId) .eq(SpaceInstitutionDetailEnt::getLineId, lineId)
.eq(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ZERO) .eq(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ZERO)
.set(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ONE) .set(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ONE)
.set(BaseModel::getModifyById, session.getId())
.set(BaseModel::getModifyByName, session.getUserName())
.set(BaseModel::getModifyTime, DateUtil.date())
); );
//设定当前制度为基础制度 //设定当前制度为基础制度
mapper.update(null, new LambdaUpdateWrapper<SpaceInstitutionDetailEnt>() mapper.update(null, new LambdaUpdateWrapper<SpaceInstitutionDetailEnt>()
.eq(BaseModel::getId, institutionId) .eq(BaseModel::getId, institutionId)
.set(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ZERO) .set(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ZERO)
.set(BaseModel::getModifyById, session.getId())
.set(BaseModel::getModifyByName, session.getUserName())
.set(BaseModel::getModifyTime, DateUtil.date())
); );
//长期/中短期制度优化初始化 //长期/中短期制度优化初始化
this.institutionOptimizeInitialize(context, detail); this.institutionOptimizeInitialize(context, detail);
...@@ -372,35 +379,45 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -372,35 +379,45 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
String lineId = detail.getLineId(); String lineId = detail.getLineId();
//取年份 //取年份
int year = currentTime.year(); int year = currentTime.year();
int monthIndex = currentTime.month();
//月份要加一 //月份要加一
int monthNum = currentTime.month() + 1; int monthNum = monthIndex + 1;
String month; //上一月
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;
} }
SpaceOptimizeLineRelation wellheadAndPlant = super.getWellheadAndPlant(context, ListUtil.toList(detail)); SpaceOptimizeLineRelation relation = super.getOptimizeLineRelation(context, ListUtil.toList(detail));
//长期间开优化 //长期间开优化
List<DynamicQueryPlantPredictedPowerOutput> longAvgPowerList = super.getAveragePowerGenerationListByPlantIds(context, this.institutionalOptimization(context, longPeriodDTOList, longWellheadDTOList, longDurationDTOList, longUnOptimizeDurationList, relation,
DynamicQueryPlantPredictedPowerInput.builder() detail, BaseUtils.getExecutionCycleForMonth(currentTime), endOfMonth, monthNum, DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(wellheadAndPlant.getPlantIdsByLineIdMap().get(lineId)) .plantIds(relation.getPlantIdsByLineIdMap().get(lineId))
.yearTime(String.valueOf(year)) .yearTime(String.valueOf(year))
.monthTime(month) .monthTime(BaseUtils.getMonthString(monthNum))
.build() .dateType(BusinessConstant.ZERO)
); .build(),
this.institutionalOptimization(context, longPeriodDTOList, longWellheadDTOList, longDurationDTOList, longUnOptimizeDurationList, wellheadAndPlant, DynamicQueryStoragePredictedPowerInput.builder()
longAvgPowerList, detail, BaseUtils.getExecutionCycleForMonth(currentTime), endOfMonth, monthNum); .storageIds(relation.getPlantIdsByLineIdMap().get(detail.getLineId()))
.yearTime(String.valueOf(lastYear))
.monthTime(BaseUtils.getMonthString(lastMonthNum))
.build());
//中短期间开优化 //中短期间开优化
List<DynamicQueryPlantPredictedPowerOutput> midAvgPowerList = super.getAveragePowerGenerationListByPlantIds(context, this.institutionalOptimization(context, midPeriodDTOList, midWellheadDTOList, midDurationDTOList, midUnOptimizeDurationList, relation,
detail, BaseUtils.getExecutionCycleForWeek(currentTime), endOfWeek, monthNum,
DynamicQueryPlantPredictedPowerInput.builder() DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(wellheadAndPlant.getPlantIdsByLineIdMap().get(lineId)) .plantIds(relation.getPlantIdsByLineIdMap().get(lineId))
.startTime(DateUtil.beginOfWeek(currentTime).toString(BusinessConstant.DATE_FORMAT_DAY)) .startTime(DateUtil.beginOfWeek(currentTime).toString(BusinessConstant.DATE_FORMAT_DAY))
.endTime(DateUtil.beginOfWeek(DateUtil.nextWeek()).toString(BusinessConstant.DATE_FORMAT_DAY)) .endTime(DateUtil.beginOfWeek(DateUtil.nextWeek()).toString(BusinessConstant.DATE_FORMAT_DAY))
.dateType(BusinessConstant.ONE)
.build(),
DynamicQueryStoragePredictedPowerInput.builder()
.storageIds(relation.getPlantIdsByLineIdMap().get(lineId))
.startTime(DateUtil.offsetDay(currentTime, -7).toString(BusinessConstant.DATE_FORMAT_DAY))
.endTime(currentTime.toString(BusinessConstant.DATE_FORMAT_DAY))
.build() .build()
); );
this.institutionalOptimization(context, midPeriodDTOList, midWellheadDTOList, midDurationDTOList, midUnOptimizeDurationList, wellheadAndPlant,
midAvgPowerList, detail, BaseUtils.getExecutionCycleForWeek(currentTime), endOfWeek, monthNum);
//逻辑删除已创建的长期优化数据 //逻辑删除已创建的长期优化数据
SpaceOptimizeLongPeriodMapper longPeriodMapper = context.getBean(SpaceOptimizeLongPeriodMapper.class); SpaceOptimizeLongPeriodMapper longPeriodMapper = context.getBean(SpaceOptimizeLongPeriodMapper.class);
List<SpaceOptimizeLongPeriodEnt> longPeriodEntList = longPeriodMapper.selectList(new LambdaQueryWrapper<SpaceOptimizeLongPeriodEnt>() List<SpaceOptimizeLongPeriodEnt> longPeriodEntList = longPeriodMapper.selectList(new LambdaQueryWrapper<SpaceOptimizeLongPeriodEnt>()
...@@ -665,7 +682,6 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -665,7 +682,6 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
mapper.updateById(entity); mapper.updateById(entity);
} }
/** /**
* 制度优化 * 制度优化
* *
...@@ -674,30 +690,33 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService { ...@@ -674,30 +690,33 @@ public class SpaceInstitutionDetailService extends SpaceOptimizeBaseService {
* @param wellheadDTOList 井口dtolist * @param wellheadDTOList 井口dtolist
* @param durationDTOList 持续时间dtolist * @param durationDTOList 持续时间dtolist
* @param unOptimizeDurationList 取消优化工期列表 * @param unOptimizeDurationList 取消优化工期列表
* @param avgPowerList 平均功率列表 * @param relation 关系
* @param detail 细节 * @param detail 细节
* @param executionCycle 执行周期 * @param executionCycle 执行周期
* @param optimizeDeadline 优化截止日期 * @param optimizeDeadline 优化截止日期
* @param monthNum 月份 * @param monthNum 月份
* @param plantPowerInput 电厂功率输入
* @param storagePowerinput 存储电源输入
*/ */
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,
SpaceOptimizeLineRelation wellheadAndPlant, List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, SpaceInstitutionDetailEnt detail, SpaceOptimizeLineRelation relation, SpaceInstitutionDetailEnt detail,
String executionCycle, Date optimizeDeadline, int monthNum) { String executionCycle, Date optimizeDeadline, int monthNum,
String detailId = detail.getId(); DynamicQueryPlantPredictedPowerInput plantPowerInput, DynamicQueryStoragePredictedPowerInput storagePowerinput) {
String lineId = detail.getLineId();
List<SpaceInstitutionWellheadView> spaceWellheadList = wellheadAndPlant.getSpaceWellheadList();
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
//创建记录 //创建记录
String periodId = super.createOptimizePeriod(periodDTOList, detailId, lineId, executionCycle, optimizeDeadline); String periodId = super.createOptimizePeriod(periodDTOList, detail.getId(), detail.getLineId(), executionCycle, optimizeDeadline);
switch (detail.getGridTypeKey()) { switch (detail.getGridTypeKey()) {
//并网型优化 //并网型优化
case "1": case "1":
super.gridConnectedOptimization(context, durationMapper, wellheadDTOList, durationDTOList, unOptimizeDurationList, super.gridConnectedOptimization(context, wellheadDTOList, durationDTOList, unOptimizeDurationList,
spaceWellheadList, avgPowerList, detail, monthNum, detailId, periodId, lineId); relation.getWellheadsByInstitutionIdIdMap().get(detail.getId()), detail, monthNum, periodId, plantPowerInput);
break; break;
//离网型优化 //离网型优化
case "0": case "0":
super.offGridOptimization(context, wellheadDTOList, durationDTOList, unOptimizeDurationList,
relation.getWellheadsByInstitutionIdIdMap().get(detail.getId()),
relation.getStorageAvgMap(), detail, periodId,
storagePowerinput, plantPowerInput);
break; break;
default: default:
//电网类型不存在 //电网类型不存在
......
...@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateTime; ...@@ -6,6 +6,7 @@ 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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import pps.cloud.base.service.IBasePowerLineCloudService; import pps.cloud.base.service.IBasePowerLineCloudService;
import pps.cloud.base.service.IBaseWellheadCloudService; import pps.cloud.base.service.IBaseWellheadCloudService;
...@@ -38,6 +39,7 @@ import xstartup.base.exception.XServiceException; ...@@ -38,6 +39,7 @@ import xstartup.base.exception.XServiceException;
import xstartup.data.XListResult; import xstartup.data.XListResult;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -79,7 +81,7 @@ public class SpaceOptimizeBaseService { ...@@ -79,7 +81,7 @@ public class SpaceOptimizeBaseService {
* @param detailEntList 详细ent列表 * @param detailEntList 详细ent列表
* @return {@link SpaceOptimizeLineRelation} * @return {@link SpaceOptimizeLineRelation}
*/ */
public SpaceOptimizeLineRelation getWellheadAndPlant(XContext context, List<SpaceInstitutionDetailEnt> detailEntList) { public SpaceOptimizeLineRelation getOptimizeLineRelation(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) {
...@@ -101,7 +103,8 @@ public class SpaceOptimizeBaseService { ...@@ -101,7 +103,8 @@ public class SpaceOptimizeBaseService {
throw new XServiceException(BusinessError.DidNotFindPlant); throw new XServiceException(BusinessError.DidNotFindPlant);
} }
return SpaceOptimizeLineRelation.builder() return SpaceOptimizeLineRelation.builder()
.spaceWellheadList(spaceWellheadList) .wellheadsByInstitutionIdIdMap(spaceWellheadList.stream()
.collect(Collectors.groupingBy(SpaceInstitutionWellheadView::getInstitutionId)))
.plantIdsByLineIdMap( .plantIdsByLineIdMap(
plantList.stream() plantList.stream()
.collect( .collect(
...@@ -115,190 +118,311 @@ public class SpaceOptimizeBaseService { ...@@ -115,190 +118,311 @@ public class SpaceOptimizeBaseService {
} }
/** /**
* 条件获取获取光伏预测各时段平均值列表 * 并网优化
*
* @param context 上下文
* @param input 输入
* @return {@link List}<{@link DynamicQueryPlantPredictedPowerOutput}>
*/
public List<DynamicQueryPlantPredictedPowerOutput> getAveragePowerGenerationListByPlantIds(XContext context, DynamicQueryPlantPredictedPowerInput input) {
IPlantPredictedPowerCloudService cloudService = context.getBean(IPlantPredictedPowerCloudService.class);
XListResult<DynamicQueryPlantPredictedPowerOutput> result = cloudService.queryAveragePowerGenerationListByParam(context, input);
result.throwIfFail();
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();
}
/**
* 获得最大功率
*
* @param avgPowerList 平均功率列表
* @return {@link BigDecimal}
*/
public BigDecimal getPowerMax(List<DynamicQueryPlantPredictedPowerOutput> avgPowerList) {
return avgPowerList.stream()
.map(DynamicQueryPlantPredictedPowerOutput::getPower)
.max(BigDecimal::compareTo)
.orElse(BigDecimal.ZERO);
}
/**
* 获取井口总功率
*
* @param spaceWellheadList 空间井口清单
* @param detailId 详细信息id
* @return {@link BigDecimal}
*/
public BigDecimal getWellheadTotalPower(List<SpaceInstitutionWellheadView> spaceWellheadList, String detailId) {
return spaceWellheadList.stream()
.filter(w -> StringUtils.equals(detailId, w.getInstitutionId()))
.map(SpaceInstitutionWellheadView::getServiceRating)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
/**
* 获取井口视图列表
*
* @param spaceWellheadList 空间井口清单
* @param detailId 详细信息id
* @return {@link List}<{@link SpaceInstitutionWellheadView}>
*/
public List<SpaceInstitutionWellheadView> getWellheadViewList(List<SpaceInstitutionWellheadView> spaceWellheadList, String detailId) {
return 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());
}
/**
* 获取井口间开时间段
* *
* @param durationMapper 持续时间映射器 * @param context 上下文
* @param detailId 详细信息id * @param wellheadDTOList 井口dtolist
* @return {@link Map}<{@link String}, {@link List}<{@link SpaceInstitutionDurationEnt}>> * @param durationDTOList 持续时间dtolist
* @param unOptimizeDurationList 取消优化工期列表
* @param spaceWellheadList 空间井口清单
* @param detail 细节
* @param monthNum 月份
* @param periodId 期间id
* @param plantPowerInput 电厂功率输入
*/ */
public Map<String, List<SpaceInstitutionDurationEnt>> getDurationMap(SpaceInstitutionDurationMapper durationMapper, String detailId) { public void gridConnectedOptimization(XContext context, List<SpaceOptimizeWellheadDTO> wellheadDTOList,
//通过间开ID和井口ID查所有井口时段配置 List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
List<SpaceInstitutionDurationEnt> durationList = durationMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionDurationEnt>() List<SpaceInstitutionWellheadView> spaceWellheadList,
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE) SpaceInstitutionDetailEnt detail, int monthNum, String periodId,
.eq(SpaceInstitutionDurationEnt::getInstitutionId, detailId) DynamicQueryPlantPredictedPowerInput plantPowerInput) {
.orderByAsc(SpaceInstitutionDurationEnt::getOpenWellTime) //获取当前制度对应的光伏预测数据列表
); List<DynamicQueryPlantPredictedPowerOutput> avgPowerList = this.getAveragePowerGenerationListByPlantIds(context, plantPowerInput);
if (CollUtil.isEmpty(durationList)) { if (CollUtil.isEmpty(avgPowerList)) {
return;
}
//取光伏出力峰值
BigDecimal powerMax = this.getPowerMax(avgPowerList);
//取当前制度下井口的总功率
BigDecimal wellheadTotalPower = this.getWellheadTotalPower(spaceWellheadList, detail.getId());
Map<String, List<SpaceInstitutionDurationEnt>> durationMap = this.getDurationMap(context, detail.getId());
//根据类型过滤井口:大间开,连抽井不优化
Map<Boolean, List<SpaceInstitutionWellheadView>> wellheadViewMap = this.getWellheadViewList(spaceWellheadList, detail.getId());
//保存不需要优化的井口
this.setUnOptimizeWellheadConfig(durationDTOList, unOptimizeDurationList, wellheadDTOList,
wellheadViewMap.get(false), durationMap, periodId);
List<SpaceInstitutionWellheadView> wellheadViewList = wellheadViewMap.get(true);
if (CollUtil.isEmpty(wellheadViewList)) {
return;
}
if (CollUtil.isEmpty(durationMap)) {
//没有设置时间段,无法优化 //没有设置时间段,无法优化
return null; return;
} }
return durationList.stream() //光伏出力峰值大于等于井口总功率:绿电消纳优先策略
.collect( if (powerMax.compareTo(wellheadTotalPower) >= BusinessConstant.ZERO) {
Collectors.groupingBy(SpaceInstitutionDurationEnt::getWellheadId) //---------------------------------绿电消纳策略---------------------------------
); this.greenElectricityConsumptionStrategy(wellheadDTOList, unOptimizeDurationList, durationDTOList,
} wellheadViewList, avgPowerList, durationMap, detail, periodId);
/*-----------------------------------private-----------------------------------*/
/**
* 获取井口Map通过最大功率区分
*
* @param wellheadViewList 井口视图列表
* @param powerMax 最大功率
* @return {@link Map}<{@link Boolean}, {@link List}<{@link SpaceInstitutionWellheadView}>>
*/
private Map<Boolean, List<SpaceInstitutionWellheadView>> getWellheadViewMapByPower(List<SpaceInstitutionWellheadView> wellheadViewList, BigDecimal powerMax) {
return wellheadViewList.stream()
.collect(
Collectors.partitioningBy(w -> powerMax.compareTo(w.getServiceRating()) >= BusinessConstant.ZERO)
);
}
/**
* 按线路ID集合获取电站列表
*
* @param context 上下文
* @param lineIds 线路ID
* @return {@link List}<{@link DynamicQueryBasePowerLinePlantOutput}>
*/
private List<DynamicQueryBasePowerLinePlantOutput> getPowerLinePlantListByLineIds(XContext context, Set<String> lineIds) {
IBasePowerLineCloudService cloudService = context.getBean(IBasePowerLineCloudService.class);
XListResult<DynamicQueryBasePowerLinePlantOutput> result = cloudService.queryPowerLinePlantListByParam(context,
DynamicQueryBasePowerLinePlantInput.builder()
.lineIds(lineIds)
.build()
);
result.throwIfFail();
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 { } else {
collect = list.stream() //遍历井口,按发电功率大于等于光伏出力峰值条件分组
.collect(Collectors.groupingBy(DynamicQueryBasePowerLineStorageViewOutput::getLineId)); Map<Boolean, List<SpaceInstitutionWellheadView>> collect = this.getWellheadViewMapByPower(wellheadViewList, powerMax);
List<SpaceInstitutionWellheadView> lowWellheadList = collect.get(false);
int size = spaceWellheadList.size();
int lowWellheadListSize = lowWellheadList.size();
//光伏出力峰值<任何一口井的运行功率:消峰平谷策略
if (size == lowWellheadListSize) {
//---------------------------------消峰平谷策略---------------------------------
this.peakEliminationAndValleyLevelingStrategy(context, wellheadDTOList, unOptimizeDurationList, durationDTOList, wellheadViewList,
durationMap, detail, monthNum, periodId);
}
//光伏出力峰值>=线路哪部分井口运行功率:满足的部分井口采用绿电消纳优先,不满足的井采用消峰平谷
else {
List<SpaceInstitutionWellheadView> highWellheadList = collect.get(true);
this.greenElectricityConsumptionStrategy(wellheadDTOList, unOptimizeDurationList, durationDTOList,
highWellheadList, avgPowerList, durationMap, detail, periodId);
this.peakEliminationAndValleyLevelingStrategy(context, wellheadDTOList, unOptimizeDurationList, durationDTOList,
lowWellheadList, durationMap, detail, monthNum, periodId);
}
} }
return collect;
} }
/** /**
* 为间开井口列表设置发电功率 * 离网优化
* *
* @param context 上下文 * @param context 上下文
* @param spaceWellheadList 空间井口清单 * @param wellheadDTOList 井口dtolist
* @param durationDTOList 持续时间dtolist
* @param unOptimizeDurationList 取消优化工期列表
* @param spaceWellheadList 空间井口清单
* @param storageAvgMap 存储平均值映射
* @param detail 细节
* @param periodId 期间id
* @param input 输入
* @param plantPowerInput 电厂功率输入
*/ */
private void setServiceRatingForSpaceWellheadList(XContext context, List<SpaceInstitutionWellheadView> spaceWellheadList) { public void offGridOptimization(XContext context, List<SpaceOptimizeWellheadDTO> wellheadDTOList, List<SpaceOptimizeDurationDTO> durationDTOList,
IBaseWellheadCloudService cloudService = context.getBean(IBaseWellheadCloudService.class); List<SpaceOptimizeDurationDTO> unOptimizeDurationList, List<SpaceInstitutionWellheadView> spaceWellheadList,
XListResult<DynamicQueryBaseWellheadOutput> result = cloudService.queryBaseWellheadListByParam(context, Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> storageAvgMap, SpaceInstitutionDetailEnt detail, String periodId,
DynamicQueryBaseWellheadInput.builder() DynamicQueryStoragePredictedPowerInput input, DynamicQueryPlantPredictedPowerInput plantPowerInput) {
.wellheadIds(spaceWellheadList.stream() //获取当前制度对应的光伏预测数据列表
.map(SpaceInstitutionWellheadView::getWellheadId) List<DynamicQueryPlantPredictedPowerOutput> avgPowerList = this.getAveragePowerGenerationListByPlantIds(context, plantPowerInput);
.collect(Collectors.toList()) if (CollUtil.isEmpty(avgPowerList)) {
)
.build());
result.throwIfFail();
List<DynamicQueryBaseWellheadOutput> wellheadOutputList = result.getResult();
if (CollUtil.isEmpty(wellheadOutputList)) {
return; return;
} }
spaceWellheadList.forEach(s -> { //根据类型过滤井口:大间开,连抽井不优化
s.setServiceRating( Map<Boolean, List<SpaceInstitutionWellheadView>> wellheadViewMap = this.getWellheadViewList(spaceWellheadList, detail.getId());
wellheadOutputList.stream() //获取井口间开时间段
.filter(w -> StringUtils.equals(s.getWellheadId(), w.getId())) Map<String, List<SpaceInstitutionDurationEnt>> durationMap = this.getDurationMap(context, detail.getId());
.findAny() //保存不需要优化的井口
.map(DynamicQueryBaseWellheadOutput::getServiceRating) this.setUnOptimizeWellheadConfig(durationDTOList, unOptimizeDurationList, wellheadDTOList,
.orElse(BigDecimal.ZERO) wellheadViewMap.get(false), durationMap, periodId);
); List<SpaceInstitutionWellheadView> wellheadViewList = wellheadViewMap.get(true);
}); if (CollUtil.isEmpty(wellheadViewList)) {
return;
}
if (CollUtil.isEmpty(durationMap)) {
//没有设置时间段,无法优化
return;
}
//时间差
int between = 0;
//启动间隔累积
int startInterval = 0;
//判断是否第一口井
boolean isFirstWellhead;
//第一口井启动时间
DateTime firstStartTime = null;
//第一口井开井时间
int firstIndex = 0;
//井口累积运行总功率
BigDecimal totalOperatingPower = BigDecimal.ZERO;
//离网时间段
List<SpaceOptimizeDurationDTO> offGridPeriodList = new ArrayList<>(32);
for (int w = 0, wellheadSize = wellheadViewList.size(); w < wellheadSize; w++) {
SpaceInstitutionWellheadView wellhead = wellheadViewList.get(w);
String wellheadId = wellhead.getWellheadId();
String recordId = this.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
//取当前井口最大发电量
BigDecimal serviceRating = wellhead.getServiceRating();
List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellheadId);
if (CollUtil.isEmpty(durationConfigList)) {
//没有设置时间段,无法优化
continue;
}
//保存原始记录
for (SpaceInstitutionDurationEnt durationEnt : durationConfigList) {
this.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
}
totalOperatingPower = totalOperatingPower.add(serviceRating);
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);
DateTime startTime = DateUtil.date(duration.getOpenTime());
DateTime endTime = DateUtil.date(duration.getCloseTime());
//第一次启动
if (d == 0) {
//第一口井的启动时间
if (isFirstWellhead) {
//计算开井时间
for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) {
DynamicQueryPlantPredictedPowerOutput predictedPower = avgPowerList.get(a);
//当日时间段平均光伏出力>=第一口井运行负荷时,该时间为第一口井运行时间
if (predictedPower.getPower().compareTo(serviceRating) >= BusinessConstant.ZERO) {
firstIndex = a;
break;
}
}
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(firstIndex);
DateTime startTimeOptimize = DateUtil.date(start.getCreateTime());
firstStartTime = startTimeOptimize;
//计算第一次关井时间,按照间开时间段顺延
int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration);
this.createDurationOffGridPeriod(offGridPeriodList, wellheadId, startTimeOptimize, endTimeOptimize);
//计算时间偏移,取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(startTimeOptimize, startTime);
}
//其它井口的第一次启动时间
else {
DateTime startTimeOffset = firstStartTime.offset(DateField.MINUTE, startInterval);
int startIndex = -1;
for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) {
DynamicQueryPlantPredictedPowerOutput predictedPower = avgPowerList.get(a);
if (DateUtil.date(predictedPower.getCreateTime()).compareTo(startTimeOffset) >= 0) {
//判断第一口井启动时间+启动间隔时日平均光伏出力-前两口井的运行功率是否为正数
if (predictedPower.getPower().compareTo(totalOperatingPower) >= 0) {
//确定第二口井第一次开井时间为第一口井启动时间+启动间隔
startIndex = a;
break;
}
}
}
if (startIndex > -1) {
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex);
DateTime startTimeOptimize = DateUtil.date(start.getCreateTime());
//计算未优化启动间隔
int openDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTimeOptimize.offset(DateField.MINUTE, openDuration);
this.createDurationOffGridPeriod(offGridPeriodList, wellheadId, startTimeOptimize, endTimeOptimize);
//取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(endTimeOptimize, endTime);
} else {
//无法优化
}
}
} else {
DateTime offset = startTime.offset(DateField.MINUTE, between);
if (offset.compareTo(BusinessConstant.DATE_FLAG) > 0) {
//如果时间超过当天,舍弃
continue;
}
//计算偏移
this.createDurationOffGridPeriod(offGridPeriodList, wellheadId, offset,
endTime.offset(DateField.MINUTE, between)
);
}
}
}
//离网优化
if (CollUtil.isNotEmpty(offGridPeriodList)) {
if (!storageAvgMap.containsKey(detail.getLineId())) {
//没有储能设备,无法计算
return;
}
//截取从第一次开井时间往后的时间段
List<DynamicQueryPlantPredictedPowerOutput> subAvgPowerList = CollUtil.sub(avgPowerList, firstIndex + 1, avgPowerList.size());
if (CollUtil.isEmpty(subAvgPowerList)) {
//没有时间段,无法计算
return;
}
//查获取前一个月该时间点储能剩余电量,求平均数
List<DynamicQueryStoragePredictedPowerOutput> averageEnergyStorageList = this.getAverageEnergyStorageListByParam(context, input);
if (CollUtil.isEmpty(averageEnergyStorageList)) {
//没有储能发电量,无法计算
return;
}
//取储能计算参数
List<DynamicQueryBasePowerLineStorageViewOutput> avgStorageViewList = storageAvgMap.get(detail.getLineId());
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) {
if (avg.getPower().compareTo(totalOperatingPower) >= 0) {
//电量不足,计算储能可用时长
avg.setBatteryLowFlag(false);
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();
}
} else {
avg.setBatteryLowFlag(true);
}
}
//拆分时间段
for (SpaceOptimizeDurationDTO durationDTO : offGridPeriodList) {
Date openTime = durationDTO.getOpenTime();
Date closeTime = durationDTO.getCloseTime();
if (closeTime.compareTo(BusinessConstant.DATE_FLAG) > 0) {
closeTime = DateUtil.endOfDay(DateUtil.date());
}
//匹配时间
for (int i = 0, size = subAvgPowerList.size(); i < size; i++) {
DynamicQueryPlantPredictedPowerOutput avg = subAvgPowerList.get(i);
DateTime createTime = DateUtil.date(avg.getCreateTime());
//计算时间范围:大于等于开始时间,小于等于结束时间
if (openTime.compareTo(createTime) >= 0 && closeTime.compareTo(createTime) <= 0) {
String endString = createTime.offset(DateField.MINUTE, 15).toString(BusinessConstant.MINUTES_FORMAT);
String startString = createTime.toString(BusinessConstant.MINUTES_FORMAT);
//电量满足跳过
if (avg.getBatteryLowFlag()) {
//创建光伏
this.createOptimizeDuration(durationDTOList, periodId, durationDTO.getRecordId(), durationDTO.getWellheadId(), BusinessConstant.PHOTOVOLTAIC,
startString, endString
);
} else {
int powerDuration = avg.getPowerDuration();
String offset = createTime.offset(DateField.MINUTE, powerDuration).toString(BusinessConstant.MINUTES_FORMAT);
//储能发电时长
this.createOptimizeDuration(durationDTOList, periodId, durationDTO.getRecordId(), durationDTO.getWellheadId(), BusinessConstant.STORED_ENERGY,
startString, offset
);
//柴发发电时长
this.createOptimizeDuration(durationDTOList, periodId, durationDTO.getRecordId(), durationDTO.getWellheadId(), BusinessConstant.DIESEL_POWER,
offset, endString
);
}
}
}
}
}
} }
/** /**
...@@ -344,6 +468,22 @@ public class SpaceOptimizeBaseService { ...@@ -344,6 +468,22 @@ public class SpaceOptimizeBaseService {
return wellheadDTO.getId(); return wellheadDTO.getId();
} }
/**
* 创建间开原始间开区间
*
* @param unOptimizeDurationList 取消优化工期列表
* @param durationEnt 持续时间ent
* @param periodId 期间id
* @param recordId 记录id
* @param wellheadId 井口id
*/
public void createUnOptimizeDuration(List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
SpaceInstitutionDurationEnt durationEnt,
String periodId, String recordId, String wellheadId) {
this.createDuration(unOptimizeDurationList, recordId, periodId, wellheadId, BusinessConstant.ONE,
durationEnt.getOpenWellTime(), durationEnt.getCloseWellTime(), null);
}
/** /**
* 创建间开优化井口区间配置信息 * 创建间开优化井口区间配置信息
* *
...@@ -355,44 +495,42 @@ public class SpaceOptimizeBaseService { ...@@ -355,44 +495,42 @@ public class SpaceOptimizeBaseService {
* @param openWellTime 开井时间 * @param openWellTime 开井时间
* @param endTimeString 结束时间字符串 * @param endTimeString 结束时间字符串
*/ */
public void createOptimizeDuration(List<SpaceOptimizeDurationDTO> durationDTOList, String periodId, public void createOptimizeDuration(List<SpaceOptimizeDurationDTO> durationDTOList, String periodId,
String recordId, String wellheadId, String generationTypeKey, String recordId, String wellheadId, String generationTypeKey,
String openWellTime, String endTimeString) { String openWellTime, String endTimeString) {
SpaceOptimizeDurationDTO durationDTO = new SpaceOptimizeDurationDTO(); this.createDuration(durationDTOList, recordId, periodId, wellheadId, BusinessConstant.ZERO,
BaseUtils.setBaseModelDefaultForJob(durationDTO); openWellTime, endTimeString, generationTypeKey);
durationDTO.setRecordId(recordId);
durationDTO.setPeriodId(periodId);
durationDTO.setWellheadId(wellheadId);
durationDTO.setGenerationTypeKey(generationTypeKey);
durationDTO.setIsOptimize(BusinessConstant.ZERO);
durationDTO.setOpenWellTime(openWellTime);
durationDTO.setCloseWellTime(endTimeString);
durationDTOList.add(durationDTO);
} }
/** /**
* 创建间开原始间开区 * 创建持续时
* *
* @param unOptimizeDurationList 取消优化工期列表 * @param durationDTOList 持续时间dtolist
* @param durationEnt 持续时间ent * @param recordId 记录id
* @param periodId 期间id * @param periodId 期间id
* @param recordId 记录id * @param wellheadId 井口id
* @param wellheadId 井口id * @param isOptimize 正在优化
* @param openWellTime 开井时间
* @param closeWellTime 关井时间
* @param generationTypeKey 生成类型密钥
*/ */
public void createUnOptimizeDuration(List<SpaceOptimizeDurationDTO> unOptimizeDurationList, public void createDuration(List<SpaceOptimizeDurationDTO> durationDTOList, String recordId,
SpaceInstitutionDurationEnt durationEnt, String periodId, String wellheadId, Integer isOptimize,
String periodId, String recordId, String wellheadId) { String openWellTime, String closeWellTime, String generationTypeKey) {
SpaceOptimizeDurationDTO durationDTO = new SpaceOptimizeDurationDTO(); SpaceOptimizeDurationDTO durationDTO = new SpaceOptimizeDurationDTO();
BaseUtils.setBaseModelDefaultForJob(durationDTO); BaseUtils.setBaseModelDefaultForJob(durationDTO);
durationDTO.setRecordId(recordId); durationDTO.setRecordId(recordId);
durationDTO.setPeriodId(periodId); durationDTO.setPeriodId(periodId);
durationDTO.setWellheadId(wellheadId); durationDTO.setWellheadId(wellheadId);
durationDTO.setIsOptimize(BusinessConstant.ONE); durationDTO.setIsOptimize(isOptimize);
durationDTO.setOpenWellTime(durationEnt.getOpenWellTime()); durationDTO.setOpenWellTime(openWellTime);
durationDTO.setCloseWellTime(durationEnt.getCloseWellTime()); durationDTO.setCloseWellTime(closeWellTime);
unOptimizeDurationList.add(durationDTO); durationDTO.setGenerationTypeKey(generationTypeKey);
durationDTOList.add(durationDTO);
} }
/*-----------------------------------private-----------------------------------*/
/** /**
* 绿电消纳策略 * 绿电消纳策略
* *
...@@ -405,10 +543,10 @@ public class SpaceOptimizeBaseService { ...@@ -405,10 +543,10 @@ public class SpaceOptimizeBaseService {
* @param detail 细节 * @param detail 细节
* @param periodId 期间id * @param periodId 期间id
*/ */
public void greenElectricityConsumptionStrategy(List<SpaceOptimizeWellheadDTO> wellheadDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList, private void greenElectricityConsumptionStrategy(List<SpaceOptimizeWellheadDTO> wellheadDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceInstitutionWellheadView> wellheadViewList, List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceInstitutionWellheadView> wellheadViewList,
List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, Map<String, List<SpaceInstitutionDurationEnt>> durationMap, List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, Map<String, List<SpaceInstitutionDurationEnt>> durationMap,
SpaceInstitutionDetailEnt detail, String periodId) { SpaceInstitutionDetailEnt detail, String periodId) {
//时间差 //时间差
int between = 0; int between = 0;
//启动间隔累积 //启动间隔累积
...@@ -425,7 +563,7 @@ public class SpaceOptimizeBaseService { ...@@ -425,7 +563,7 @@ public class SpaceOptimizeBaseService {
String recordId = this.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber()); String recordId = this.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
//取当前井口最大发电量 //取当前井口最大发电量
BigDecimal serviceRating = wellhead.getServiceRating(); BigDecimal serviceRating = wellhead.getServiceRating();
List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellhead); List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellheadId);
if (CollUtil.isEmpty(durationConfigList)) { if (CollUtil.isEmpty(durationConfigList)) {
//没有设置时间段,无法优化 //没有设置时间段,无法优化
continue; continue;
...@@ -445,14 +583,12 @@ public class SpaceOptimizeBaseService { ...@@ -445,14 +583,12 @@ public class SpaceOptimizeBaseService {
} }
for (int d = 0, durationSize = durationConfigList.size(); d < durationSize; d++) { for (int d = 0, durationSize = durationConfigList.size(); d < durationSize; d++) {
SpaceInstitutionDurationEnt duration = durationConfigList.get(d); SpaceInstitutionDurationEnt duration = durationConfigList.get(d);
String openWellTime = duration.getOpenWellTime(); DateTime startTime = DateUtil.date(duration.getOpenTime());
DateTime startTime = DateUtil.parse(openWellTime + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT); DateTime endTime = DateUtil.date(duration.getCloseTime());
DateTime endTime = DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
//第一次启动 //第一次启动
if (d == 0) { if (d == 0) {
//第一口井的启动时间 //第一口井的启动时间
if (isFirstWellhead) { if (isFirstWellhead) {
firstStartTime = startTime;
//计算开井时间 //计算开井时间
int startIndex = 0; int startIndex = 0;
for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) { for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) {
...@@ -464,16 +600,15 @@ public class SpaceOptimizeBaseService { ...@@ -464,16 +600,15 @@ public class SpaceOptimizeBaseService {
} }
} }
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex); DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex);
String startTimeString = start.getHourTime() + start.getMinTime(); DateTime startTimeOptimize = DateUtil.date(start.getCreateTime());
//计算第一次关井时间,按照间开时间段顺延 //计算第一次关井时间,按照间开时间段顺延
int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE); int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration); DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration);
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null, this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startTimeString, endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT) startTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT), endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT)
); );
//计算时间偏移 firstStartTime = startTimeOptimize;
DateTime startTimeOptimize = DateUtil.parse(startTimeString, BusinessConstant.TIME_FORMAT); //计算时间偏移,取时间间隔(分钟)
//取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(startTimeOptimize, startTime); between = BaseUtils.getTimeDifferenceMinute(startTimeOptimize, startTime);
} }
//其它井口的第一次启动时间 //其它井口的第一次启动时间
...@@ -494,12 +629,12 @@ public class SpaceOptimizeBaseService { ...@@ -494,12 +629,12 @@ public class SpaceOptimizeBaseService {
} }
if (startIndex > -1) { if (startIndex > -1) {
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex); DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(startIndex);
DateTime startTimeOptimize = DateUtil.parse(start.getHourTime() + start.getMinTime(), BusinessConstant.TIME_FORMAT); DateTime startTimeOptimize = DateUtil.date(start.getCreateTime());
//计算未优化启动间隔 //计算未优化启动间隔
int openDuration = (int) startTime.between(endTime, DateUnit.MINUTE); int openDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTimeOptimize.offset(DateField.MINUTE, openDuration); DateTime endTimeOptimize = startTimeOptimize.offset(DateField.MINUTE, openDuration);
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null, this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
openWellTime, BaseUtils.getEndTimeString(endTimeOptimize) startTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT), BaseUtils.getEndTimeString(endTimeOptimize)
); );
//取时间间隔(分钟) //取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(endTimeOptimize, endTime); between = BaseUtils.getTimeDifferenceMinute(endTimeOptimize, endTime);
...@@ -516,8 +651,7 @@ public class SpaceOptimizeBaseService { ...@@ -516,8 +651,7 @@ public class SpaceOptimizeBaseService {
//计算偏移 //计算偏移
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null, this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
offset.toString(BusinessConstant.MINUTES_FORMAT), offset.toString(BusinessConstant.MINUTES_FORMAT),
BaseUtils.getEndTimeString(DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT) BaseUtils.getEndTimeString(endTime.offset(DateField.MINUTE, between))
.offset(DateField.MINUTE, between))
); );
} }
} }
...@@ -534,18 +668,17 @@ public class SpaceOptimizeBaseService { ...@@ -534,18 +668,17 @@ public class SpaceOptimizeBaseService {
* @param wellheadViewList 井口视图列表 * @param wellheadViewList 井口视图列表
* @param durationMap 持续时间图 * @param durationMap 持续时间图
* @param detail 细节 * @param detail 细节
* @param lineId 线路id
* @param monthNum 月份 * @param monthNum 月份
* @param midPeriodId 中期id * @param periodId id
*/ */
public void peakEliminationAndValleyLevelingStrategy(XContext context, List<SpaceOptimizeWellheadDTO> wellheadDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList, private void peakEliminationAndValleyLevelingStrategy(XContext context, List<SpaceOptimizeWellheadDTO> wellheadDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceInstitutionWellheadView> wellheadViewList, List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceInstitutionWellheadView> wellheadViewList,
Map<String, List<SpaceInstitutionDurationEnt>> durationMap, SpaceInstitutionDetailEnt detail, Map<String, List<SpaceInstitutionDurationEnt>> durationMap, SpaceInstitutionDetailEnt detail,
String lineId, int monthNum, String midPeriodId) { int monthNum, String periodId) {
//通过线路ID和月份获取市电峰谷策略明细配置 //通过线路ID和月份获取市电峰谷策略明细配置
List<GetBasePriceStrategyDetailOutput> strategyDetailList = ServiceUtil.getStrategyDetailList(context, List<GetBasePriceStrategyDetailOutput> strategyDetailList = ServiceUtil.getStrategyDetailList(context,
GetBasePriceStrategyDetailInput.builder() GetBasePriceStrategyDetailInput.builder()
.lineId(lineId) .lineId(detail.getLineId())
.strategyMonth(String.valueOf(monthNum)) .strategyMonth(String.valueOf(monthNum))
.build() .build()
); );
...@@ -574,15 +707,15 @@ public class SpaceOptimizeBaseService { ...@@ -574,15 +707,15 @@ public class SpaceOptimizeBaseService {
for (int w = 0, wellheadSize = wellheadViewList.size(); w < wellheadSize; w++) { for (int w = 0, wellheadSize = wellheadViewList.size(); w < wellheadSize; w++) {
SpaceInstitutionWellheadView wellhead = wellheadViewList.get(w); SpaceInstitutionWellheadView wellhead = wellheadViewList.get(w);
String wellheadId = wellhead.getWellheadId(); String wellheadId = wellhead.getWellheadId();
String recordId = this.createOptimizeWellhead(wellheadDTOList, midPeriodId, wellheadId, wellhead.getWellNumber()); String recordId = this.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellhead); List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellheadId);
if (CollUtil.isEmpty(durationConfigList)) { if (CollUtil.isEmpty(durationConfigList)) {
//没有设置时间段,无法优化 //没有设置时间段,无法优化
continue; continue;
} }
//保存原始记录 //保存原始记录
for (SpaceInstitutionDurationEnt durationEnt : durationConfigList) { for (SpaceInstitutionDurationEnt durationEnt : durationConfigList) {
this.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, midPeriodId, recordId, wellheadId); this.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
} }
if (w == 0) { if (w == 0) {
//第一个井口 //第一个井口
...@@ -594,9 +727,8 @@ public class SpaceOptimizeBaseService { ...@@ -594,9 +727,8 @@ public class SpaceOptimizeBaseService {
} }
for (int d = 0, durationSize = durationConfigList.size(); d < durationSize; d++) { for (int d = 0, durationSize = durationConfigList.size(); d < durationSize; d++) {
SpaceInstitutionDurationEnt duration = durationConfigList.get(d); SpaceInstitutionDurationEnt duration = durationConfigList.get(d);
String openWellTime = duration.getOpenWellTime(); DateTime startTime = DateUtil.date(duration.getOpenTime());
DateTime startTime = DateUtil.parse(openWellTime + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT); DateTime endTime = DateUtil.date(duration.getCloseTime());
DateTime endTime = DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT);
//第一次启动 //第一次启动
if (d == 0) { if (d == 0) {
//第一口井的启动时间 //第一口井的启动时间
...@@ -605,7 +737,7 @@ public class SpaceOptimizeBaseService { ...@@ -605,7 +737,7 @@ public class SpaceOptimizeBaseService {
int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE); int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
//第一次关井时间按照启动时长顺延 //第一次关井时间按照启动时长顺延
DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration); DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration);
this.createOptimizeDuration(durationDTOList, midPeriodId, recordId, wellheadId, null, this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
strategyDetailOutput.getStartTime(), endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT) strategyDetailOutput.getStartTime(), endTimeOptimize.toString(BusinessConstant.MINUTES_FORMAT)
); );
//取时间间隔(分钟) //取时间间隔(分钟)
...@@ -617,7 +749,7 @@ public class SpaceOptimizeBaseService { ...@@ -617,7 +749,7 @@ public class SpaceOptimizeBaseService {
DateTime endTimeOffset = firstEndTime.offset(DateField.MINUTE, startInterval); DateTime endTimeOffset = firstEndTime.offset(DateField.MINUTE, startInterval);
//取时间间隔(分钟) //取时间间隔(分钟)
between = BaseUtils.getTimeDifferenceMinute(firstEndTime, endTime); between = BaseUtils.getTimeDifferenceMinute(firstEndTime, endTime);
this.createOptimizeDuration(durationDTOList, midPeriodId, recordId, wellheadId, null, this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
startTimeOffset.toString(BusinessConstant.MINUTES_FORMAT), endTimeOffset.toString(BusinessConstant.MINUTES_FORMAT) startTimeOffset.toString(BusinessConstant.MINUTES_FORMAT), endTimeOffset.toString(BusinessConstant.MINUTES_FORMAT)
); );
} }
...@@ -628,10 +760,9 @@ public class SpaceOptimizeBaseService { ...@@ -628,10 +760,9 @@ public class SpaceOptimizeBaseService {
//如果时间超过当天,舍弃 //如果时间超过当天,舍弃
continue; continue;
} }
this.createOptimizeDuration(durationDTOList, midPeriodId, recordId, wellheadId, null, this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
offset.toString(BusinessConstant.MINUTES_FORMAT), BaseUtils.getEndTimeString( offset.toString(BusinessConstant.MINUTES_FORMAT), BaseUtils.getEndTimeString(
DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT) endTime.offset(DateField.MINUTE, between)
.offset(DateField.MINUTE, between)
) )
); );
} }
...@@ -640,64 +771,257 @@ public class SpaceOptimizeBaseService { ...@@ -640,64 +771,257 @@ public class SpaceOptimizeBaseService {
} }
/** /**
* 并网优化 * 保存不需要优化的井口
* *
* @param context 上下文
* @param durationMapper 持续时间映射器
* @param wellheadDTOList 井口dtolist
* @param durationDTOList 持续时间dtolist * @param durationDTOList 持续时间dtolist
* @param unOptimizeDurationList 取消优化工期列表 * @param unOptimizeDurationList 取消优化工期列表
* @param spaceWellheadList 空间井口清单 * @param wellheadDTOList 井口dtolist
* @param avgPowerList 平均功率列表 * @param unOptimizeWellheadList 取消优化井口列表
* @param detail 细节 * @param durationMap 持续时间图
* @param monthNum 月份
* @param detailId 详细信息id
* @param periodId 期间id * @param periodId 期间id
* @param lineId 线路id
*/ */
public void gridConnectedOptimization(XContext context, SpaceInstitutionDurationMapper durationMapper, List<SpaceOptimizeWellheadDTO> wellheadDTOList, private void setUnOptimizeWellheadConfig(List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList,
List<SpaceOptimizeDurationDTO> durationDTOList, List<SpaceOptimizeDurationDTO> unOptimizeDurationList, List<SpaceOptimizeWellheadDTO> wellheadDTOList, List<SpaceInstitutionWellheadView> unOptimizeWellheadList,
List<SpaceInstitutionWellheadView> spaceWellheadList, List<DynamicQueryPlantPredictedPowerOutput> avgPowerList, Map<String, List<SpaceInstitutionDurationEnt>> durationMap, String periodId) {
SpaceInstitutionDetailEnt detail, int monthNum, String detailId, String periodId, String lineId) { if (CollUtil.isNotEmpty(unOptimizeWellheadList)) {
//取光伏出力峰值 for (SpaceInstitutionWellheadView wellhead : unOptimizeWellheadList) {
BigDecimal powerMax = this.getPowerMax(avgPowerList); String wellheadId = wellhead.getWellheadId();
//取当前制度下井口的总功率 String recordId = this.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
BigDecimal wellheadTotalPower = this.getWellheadTotalPower(spaceWellheadList, detailId); switch (wellhead.getIntervalTypeKey()) {
//根据类型过滤井口:大间开,连抽井不优化 //小间开(不优化)
List<SpaceInstitutionWellheadView> wellheadViewList = this.getWellheadViewList(spaceWellheadList, detailId); case "0":
if (CollUtil.isEmpty(wellheadViewList)) { if (!durationMap.containsKey(wellheadId)) {
return; continue;
}
//初始化未优化间开
List<SpaceInstitutionDurationEnt> durationList = durationMap.get(wellheadId);
for (SpaceInstitutionDurationEnt durationEnt : durationList) {
this.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
this.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
durationEnt.getOpenWellTime(), durationEnt.getCloseWellTime()
);
}
break;
//大间开
case "1":
//创建间开记录
this.createDuration(unOptimizeDurationList, recordId, periodId, wellheadId, BusinessConstant.ONE, BusinessConstant.START_OF_DAY_TIME, BusinessConstant.END_OF_DAY_TIME, null);
this.createDuration(durationDTOList, recordId, periodId, wellheadId, BusinessConstant.ZERO, BusinessConstant.START_OF_DAY_TIME, BusinessConstant.END_OF_DAY_TIME, null);
break;
default:
//未配置不处理
}
}
} }
Map<String, List<SpaceInstitutionDurationEnt>> durationMap = this.getDurationMap(durationMapper, detailId); }
if (CollUtil.isEmpty(durationMap)) {
/**
* 获得最大功率
*
* @param avgPowerList 平均功率列表
* @return {@link BigDecimal}
*/
private BigDecimal getPowerMax(List<DynamicQueryPlantPredictedPowerOutput> avgPowerList) {
return avgPowerList.stream()
.map(DynamicQueryPlantPredictedPowerOutput::getPower)
.max(BigDecimal::compareTo)
.orElse(BigDecimal.ZERO);
}
/**
* 获取井口总功率
*
* @param spaceWellheadList 空间井口清单
* @param detailId 详细信息id
* @return {@link BigDecimal}
*/
private BigDecimal getWellheadTotalPower(List<SpaceInstitutionWellheadView> spaceWellheadList, String detailId) {
return spaceWellheadList.stream()
.filter(w -> StringUtils.equals(detailId, w.getInstitutionId()))
.map(SpaceInstitutionWellheadView::getServiceRating)
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
/**
* 获取当前制度关联的井口按照是否可优化分组
*
* @param spaceWellheadList 空间井口清单
* @param detailId 详细信息id
* @return {@link Map}<{@link Boolean}, {@link List}<{@link SpaceInstitutionWellheadView}>>
*/
private Map<Boolean, List<SpaceInstitutionWellheadView>> getWellheadViewList(List<SpaceInstitutionWellheadView> spaceWellheadList, String detailId) {
return spaceWellheadList.stream()
.sorted(Comparator.comparing(SpaceInstitutionWellheadView::getStartSeq))
.collect(
Collectors.partitioningBy(w -> StringUtils.equals(detailId, w.getInstitutionId()) &&
StringUtils.equals(BusinessConstant.INTERVAL_PUMPING_WELL, w.getRunTypeKey()) &&
StringUtils.equals("0", w.getIntervalTypeKey())
)
);
}
/**
* 获取井口间开时间段
*
* @param context 上下文
* @param detailId 详细信息id
* @return {@link Map}<{@link String}, {@link List}<{@link SpaceInstitutionDurationEnt}>>
*/
private Map<String, List<SpaceInstitutionDurationEnt>> getDurationMap(XContext context, String detailId) {
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
//通过间开ID和井口ID查所有井口时段配置
List<SpaceInstitutionDurationEnt> durationList = durationMapper.selectList(new QueryWrapper<SpaceInstitutionDurationEnt>()
.select("*",
"STR_TO_DATE( CONCAT( open_well_time, ':00' ), '%H:%i:%s' ) AS openTime",
"STR_TO_DATE( CONCAT( close_well_time, ':00' ), '%H:%i:%s' ) AS closeTime"
)
.lambda()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionDurationEnt::getInstitutionId, detailId)
.orderByAsc(SpaceInstitutionDurationEnt::getOpenWellTime)
);
if (CollUtil.isEmpty(durationList)) {
//没有设置时间段,无法优化 //没有设置时间段,无法优化
return; return new HashMap<>(0);
} }
//光伏出力峰值大于等于井口总功率:绿电消纳优先策略 return durationList.stream()
if (powerMax.compareTo(wellheadTotalPower) >= BusinessConstant.ZERO) { .collect(
//---------------------------------绿电消纳策略--------------------------------- Collectors.groupingBy(SpaceInstitutionDurationEnt::getWellheadId)
this.greenElectricityConsumptionStrategy(wellheadDTOList, unOptimizeDurationList, durationDTOList, );
wellheadViewList, avgPowerList, durationMap, detail, periodId); }
/**
* 按线路ID集合获取电站列表
*
* @param context 上下文
* @param lineIds 线路ID
* @return {@link List}<{@link DynamicQueryBasePowerLinePlantOutput}>
*/
private List<DynamicQueryBasePowerLinePlantOutput> getPowerLinePlantListByLineIds(XContext context, Set<String> lineIds) {
IBasePowerLineCloudService cloudService = context.getBean(IBasePowerLineCloudService.class);
XListResult<DynamicQueryBasePowerLinePlantOutput> result = cloudService.queryPowerLinePlantListByParam(context,
DynamicQueryBasePowerLinePlantInput.builder()
.lineIds(lineIds)
.build()
);
result.throwIfFail();
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 { } else {
//遍历井口,按发电功率大于等于光伏出力峰值条件分组 collect = list.stream()
Map<Boolean, List<SpaceInstitutionWellheadView>> collect = this.getWellheadViewMapByPower(wellheadViewList, powerMax); .collect(Collectors.groupingBy(DynamicQueryBasePowerLineStorageViewOutput::getLineId));
List<SpaceInstitutionWellheadView> lowWellheadList = collect.get(false); }
int size = spaceWellheadList.size(); return collect;
int lowWellheadListSize = lowWellheadList.size(); }
//光伏出力峰值<任何一口井的运行功率:消峰平谷策略
if (size == lowWellheadListSize) { /**
//---------------------------------消峰平谷策略--------------------------------- * 为间开井口列表设置发电功率
this.peakEliminationAndValleyLevelingStrategy(context, wellheadDTOList, unOptimizeDurationList, durationDTOList, wellheadViewList, *
durationMap, detail, lineId, monthNum, periodId); * @param context 上下文
} * @param spaceWellheadList 空间井口清单
//光伏出力峰值>=线路哪部分井口运行功率:满足的部分井口采用绿电消纳优先,不满足的井采用消峰平谷 */
else { private void setServiceRatingForSpaceWellheadList(XContext context, List<SpaceInstitutionWellheadView> spaceWellheadList) {
List<SpaceInstitutionWellheadView> highWellheadList = collect.get(true); IBaseWellheadCloudService cloudService = context.getBean(IBaseWellheadCloudService.class);
this.greenElectricityConsumptionStrategy(wellheadDTOList, unOptimizeDurationList, durationDTOList, XListResult<DynamicQueryBaseWellheadOutput> result = cloudService.queryBaseWellheadListByParam(context,
highWellheadList, avgPowerList, durationMap, detail, periodId); DynamicQueryBaseWellheadInput.builder()
this.peakEliminationAndValleyLevelingStrategy(context, wellheadDTOList, unOptimizeDurationList, durationDTOList, .wellheadIds(spaceWellheadList.stream()
lowWellheadList, durationMap, detail, lineId, monthNum, periodId); .map(SpaceInstitutionWellheadView::getWellheadId)
} .collect(Collectors.toList())
)
.build());
result.throwIfFail();
List<DynamicQueryBaseWellheadOutput> wellheadOutputList = result.getResult();
if (CollUtil.isEmpty(wellheadOutputList)) {
return;
} }
spaceWellheadList.forEach(s -> {
s.setServiceRating(
wellheadOutputList.stream()
.filter(w -> StringUtils.equals(s.getWellheadId(), w.getId()))
.findAny()
.map(DynamicQueryBaseWellheadOutput::getServiceRating)
.orElse(BigDecimal.ZERO)
);
});
}
/**
* 条件获取获取光伏预测各时段平均值列表
*
* @param context 上下文
* @param input 输入
* @return {@link List}<{@link DynamicQueryPlantPredictedPowerOutput}>
*/
private List<DynamicQueryPlantPredictedPowerOutput> getAveragePowerGenerationListByPlantIds(XContext context, DynamicQueryPlantPredictedPowerInput input) {
IPlantPredictedPowerCloudService cloudService = context.getBean(IPlantPredictedPowerCloudService.class);
XListResult<DynamicQueryPlantPredictedPowerOutput> result = cloudService.queryAveragePowerGenerationListByParam(context, input);
result.throwIfFail();
return result.getResult();
}
/**
* 条件查询时段储能电量平均值(模拟测试用)
* todo: 模拟测试用,后续替换
*
* @param context 上下文
* @param input 输入
* @return {@link List}<{@link DynamicQueryStoragePredictedPowerOutput}>
*/
private 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();
}
/**
* 获取井口Map通过最大功率区分
*
* @param wellheadViewList 井口视图列表
* @param powerMax 最大功率
* @return {@link Map}<{@link Boolean}, {@link List}<{@link SpaceInstitutionWellheadView}>>
*/
private Map<Boolean, List<SpaceInstitutionWellheadView>> getWellheadViewMapByPower(List<SpaceInstitutionWellheadView> wellheadViewList, BigDecimal powerMax) {
return wellheadViewList.stream()
.collect(
Collectors.partitioningBy(w -> powerMax.compareTo(w.getServiceRating()) >= BusinessConstant.ZERO)
);
}
/**
* 离网型间开记录
*
* @param offGridPeriodList 离网时段列表
* @param wellheadId 井口id
* @param openTime 断开时间
* @param closeTime 关闭时间
*/
private void createDurationOffGridPeriod(List<SpaceOptimizeDurationDTO> offGridPeriodList, String wellheadId,
Date openTime, Date closeTime) {
SpaceOptimizeDurationDTO durationDTO = new SpaceOptimizeDurationDTO();
durationDTO.setWellheadId(wellheadId);
durationDTO.setOpenTime(openTime);
durationDTO.setCloseTime(closeTime);
offGridPeriodList.add(durationDTO);
} }
} }
\ No newline at end of file
package pps.core.space.service; package pps.core.space.service;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
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.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.storage_predicted_power_data.DynamicQueryStoragePredictedPowerInput; 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.SpaceInstitutionDetailEnt;
import pps.core.space.mapper.SpaceInstitutionDurationMapper; import pps.core.space.entity.SpaceOptimizeDurationDTO;
import pps.core.space.entity.SpaceOptimizePeriodDTO;
import pps.core.space.entity.SpaceOptimizeWellheadDTO;
import pps.core.space.mapper.SpaceOptimizeViewMapper; import pps.core.space.mapper.SpaceOptimizeViewMapper;
import pps.core.space.service.data.SpaceOptimizeLineRelation; import pps.core.space.service.data.SpaceOptimizeLineRelation;
import xstartup.annotation.XService; import xstartup.annotation.XService;
...@@ -23,12 +19,8 @@ import xstartup.base.XContext; ...@@ -23,12 +19,8 @@ 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.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;
/** /**
* 长期间开优化Cloud模块 * 长期间开优化Cloud模块
...@@ -51,10 +43,7 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService ...@@ -51,10 +43,7 @@ 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));
SpaceOptimizeLineRelation relation = super.getWellheadAndPlant(context, detailEntList); SpaceOptimizeLineRelation relation = super.getOptimizeLineRelation(context, detailEntList);
List<SpaceInstitutionWellheadView> spaceWellheadList = relation.getSpaceWellheadList();
Map<String, List<String>> plantIdsByLineIdMap = relation.getPlantIdsByLineIdMap();
Map<String, List<DynamicQueryBasePowerLineStorageViewOutput>> storageAvgMap = relation.getStorageAvgMap();
//取年份 //取年份
int year = date.year(); int year = date.year();
//月份要加一 //月份要加一
...@@ -66,224 +55,45 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService ...@@ -66,224 +55,45 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService
lastMonthNum = 12; lastMonthNum = 12;
lastYear = year - 1; lastYear = year - 1;
} }
String month = BaseUtils.getMonthString(lastMonthNum); String month = BaseUtils.getMonthString(monthNum);
String lastMonth = BaseUtils.getMonthString(date.month()); String lastMonth = BaseUtils.getMonthString(lastMonthNum);
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);
List<SpaceOptimizeDurationDTO> durationDTOList = new ArrayList<>(128); List<SpaceOptimizeDurationDTO> durationDTOList = new ArrayList<>(128);
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 lineId = detail.getLineId();
//创建记录 //创建记录
String periodId = super.createOptimizePeriod(periodDTOList, detailId, lineId, executionCycleForMonth, optimizeDeadline); String periodId = super.createOptimizePeriod(periodDTOList, detail.getId(), detail.getLineId(), executionCycleForMonth, optimizeDeadline);
//获取当前制度对应的光伏预测数据列表
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":
super.gridConnectedOptimization(context, durationMapper, wellheadDTOList, durationDTOList, unOptimizeDurationList, super.gridConnectedOptimization(context, wellheadDTOList, durationDTOList, unOptimizeDurationList,
spaceWellheadList, avgPowerList, detail, monthNum, detailId, periodId, lineId); relation.getWellheadsByInstitutionIdIdMap().get(detail.getId()), detail, monthNum, periodId,
DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(relation.getPlantIdsByLineIdMap().get(detail.getLineId()))
.yearTime(String.valueOf(year))
.monthTime(month)
.dateType(BusinessConstant.ZERO)
.build());
break; break;
//离网型优化 //离网型优化
case "0": case "0":
//根据类型过滤井口:大间开,连抽井不优化 super.offGridOptimization(context, wellheadDTOList, durationDTOList, unOptimizeDurationList, relation.getWellheadsByInstitutionIdIdMap().get(detail.getId()),
List<SpaceInstitutionWellheadView> wellheadViewList = this.getWellheadViewList(spaceWellheadList, detailId); relation.getStorageAvgMap(), detail, periodId,
if (CollUtil.isEmpty(wellheadViewList)) { DynamicQueryStoragePredictedPowerInput.builder()
continue; .storageIds(relation.getPlantIdsByLineIdMap().get(detail.getLineId()))
} .yearTime(String.valueOf(lastYear))
//获取井口间开时间段 .monthTime(lastMonth)
Map<String, List<SpaceInstitutionDurationEnt>> durationMap = this.getDurationMap(durationMapper, detailId); .build(),
if (CollUtil.isEmpty(durationMap)) { DynamicQueryPlantPredictedPowerInput.builder()
//没有设置时间段,无法优化 .plantIds(relation.getPlantIdsByLineIdMap().get(detail.getLineId()))
continue; .yearTime(String.valueOf(year))
} .monthTime(month)
//时间差 .dateType(BusinessConstant.ZERO)
int between = 0; .build());
//启动间隔累积
int startInterval = 0;
//判断是否第一口井
boolean isFirstWellhead;
//第一口井启动时间
DateTime firstStartTime = null;
//第一口井开井时间
int firstIndex = 0;
//井口累积运行总功率
BigDecimal totalOperatingPower = BigDecimal.ZERO;
//离网时间段
List<SpaceOptimizeDurationDTO> offGridPeriodList = new ArrayList<>(32);
for (int w = 0, wellheadSize = wellheadViewList.size(); w < wellheadSize; w++) {
SpaceInstitutionWellheadView wellhead = wellheadViewList.get(w);
String wellheadId = wellhead.getWellheadId();
String recordId = this.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
//取当前井口最大发电量
BigDecimal serviceRating = wellhead.getServiceRating();
List<SpaceInstitutionDurationEnt> durationConfigList = durationMap.get(wellhead);
if (CollUtil.isEmpty(durationConfigList)) {
//没有设置时间段,无法优化
continue;
}
//保存原始记录
for (SpaceInstitutionDurationEnt durationEnt : durationConfigList) {
this.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
}
totalOperatingPower = totalOperatingPower.add(serviceRating);
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) {
firstStartTime = startTime;
//计算开井时间
for (int a = 0, avgPowerSize = avgPowerList.size(); a < avgPowerSize; a++) {
DynamicQueryPlantPredictedPowerOutput predictedPower = avgPowerList.get(a);
//当日时间段平均光伏出力>=第一口井运行负荷时,该时间为第一口井运行时间
if (predictedPower.getPower().compareTo(serviceRating) >= BusinessConstant.ZERO) {
firstIndex = a;
break;
}
}
DynamicQueryPlantPredictedPowerOutput start = avgPowerList.get(firstIndex);
String startTimeString = start.getHourTime() + start.getMinTime();
//计算第一次关井时间,按照间开时间段顺延
int startDuration = (int) startTime.between(endTime, DateUnit.MINUTE);
DateTime endTimeOptimize = startTime.offset(DateField.MINUTE, startDuration);
this.createDurationOffGridPeriod(offGridPeriodList, wellheadId, 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;
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(totalOperatingPower) >= 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.createDurationOffGridPeriod(offGridPeriodList, wellheadId, 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.createDurationOffGridPeriod(offGridPeriodList, wellheadId,
offset.toString(BusinessConstant.MINUTES_FORMAT),
BaseUtils.getEndTimeString(DateUtil.parse(duration.getCloseWellTime() + BusinessConstant.INITIALIZATION_SECOND, BusinessConstant.TIME_FORMAT)
.offset(DateField.MINUTE, between))
);
}
}
}
//离网优化
if (CollUtil.isNotEmpty(offGridPeriodList)) {
if (!storageAvgMap.containsKey(lineId)) {
//没有储能设备,无法计算
continue;
}
//截取从第一次开井时间往后的时间段
List<DynamicQueryPlantPredictedPowerOutput> subAvgPowerList = CollUtil.sub(avgPowerList, firstIndex + 1, avgPowerList.size());
if (CollUtil.isEmpty(subAvgPowerList)) {
//没有时间段,无法计算
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;
}
//取储能计算参数
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) {
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;
default: default:
//电网类型不存在 //电网类型不存在
...@@ -332,16 +142,4 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService ...@@ -332,16 +142,4 @@ public class SpaceOptimizeLongCloudServiceImpl extends SpaceOptimizeBaseService
return XServiceResult.OK; return XServiceResult.OK;
}); });
} }
/*-----------------------------------private-----------------------------------*/
public void createDurationOffGridPeriod(List<SpaceOptimizeDurationDTO> offGridPeriodList, String wellheadId,
String openWellTime, String endTimeString) {
SpaceOptimizeDurationDTO durationDTO = new SpaceOptimizeDurationDTO();
durationDTO.setWellheadId(wellheadId);
durationDTO.setOpenWellTime(openWellTime);
durationDTO.setCloseWellTime(endTimeString);
offGridPeriodList.add(durationDTO);
}
} }
\ No newline at end of file
...@@ -69,7 +69,7 @@ public class SpaceOptimizeLongPeriodService { ...@@ -69,7 +69,7 @@ public class SpaceOptimizeLongPeriodService {
output.setLineName(lineName); output.setLineName(lineName);
output.setOuName(ouMap.get(output.getOuId())); output.setOuName(ouMap.get(output.getOuId()));
output.setGridTypeName(gridTypeMap.get(output.getGridTypeKey())); output.setGridTypeName(gridTypeMap.get(output.getGridTypeKey()));
output.setOptimizeStateValue(output.getOptimizeState().equals(0) ? "已优化" : "未优化"); output.setOptimizeStateValue(output.getOptimizeState().equals(0) ? BusinessConstant.OPTIMIZED_C : BusinessConstant.NO_OPTIMIZATION_C);
}); });
} }
return XPageResult.success(outputs, input, pageInfo.getTotal()); return XPageResult.success(outputs, input, pageInfo.getTotal());
......
...@@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
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.storage_predicted_power_data.DynamicQueryStoragePredictedPowerInput;
import pps.cloud.space.service.ISpaceOptimizeMidCloudService; import pps.cloud.space.service.ISpaceOptimizeMidCloudService;
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.SpaceInstitutionDetailEnt;
import pps.core.space.mapper.SpaceInstitutionDurationMapper; import pps.core.space.entity.SpaceOptimizeDurationDTO;
import pps.core.space.entity.SpaceOptimizePeriodDTO;
import pps.core.space.entity.SpaceOptimizeWellheadDTO;
import pps.core.space.mapper.SpaceOptimizeViewMapper; import pps.core.space.mapper.SpaceOptimizeViewMapper;
import pps.core.space.service.data.SpaceOptimizeLineRelation; import pps.core.space.service.data.SpaceOptimizeLineRelation;
import xstartup.annotation.XService; import xstartup.annotation.XService;
...@@ -19,7 +21,6 @@ import xstartup.helper.XTransactionHelper; ...@@ -19,7 +21,6 @@ import xstartup.helper.XTransactionHelper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 中短期间开优化Cloud模块 * 中短期间开优化Cloud模块
...@@ -43,12 +44,10 @@ public class SpaceOptimizeMidCloudServiceImpl extends SpaceOptimizeBaseService i ...@@ -43,12 +44,10 @@ 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);
SpaceOptimizeLineRelation wellheadAndPlant = super.getWellheadAndPlant(context, detailEntList); SpaceOptimizeLineRelation relation = super.getOptimizeLineRelation(context, detailEntList);
List<SpaceInstitutionWellheadView> spaceWellheadList = wellheadAndPlant.getSpaceWellheadList();
Map<String, List<String>> plantIdsByLineIdMap = wellheadAndPlant.getPlantIdsByLineIdMap();
//月份要加一 //月份要加一
int monthNum = date.month() + 1; int monthNum = date.month() + 1;
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class); DateTime lastWeek = DateUtil.lastWeek();
List<SpaceOptimizePeriodDTO> periodDTOList = new ArrayList<>(32); List<SpaceOptimizePeriodDTO> periodDTOList = new ArrayList<>(32);
List<SpaceOptimizeWellheadDTO> wellheadDTOList = new ArrayList<>(64); List<SpaceOptimizeWellheadDTO> wellheadDTOList = new ArrayList<>(64);
List<SpaceOptimizeDurationDTO> durationDTOList = new ArrayList<>(128); List<SpaceOptimizeDurationDTO> durationDTOList = new ArrayList<>(128);
...@@ -67,19 +66,31 @@ public class SpaceOptimizeMidCloudServiceImpl extends SpaceOptimizeBaseService i ...@@ -67,19 +66,31 @@ public class SpaceOptimizeMidCloudServiceImpl extends SpaceOptimizeBaseService i
switch (detail.getGridTypeKey()) { switch (detail.getGridTypeKey()) {
//并网型优化 //并网型优化
case "1": case "1":
//获取当前制度对应的光伏预测数据列表 super.gridConnectedOptimization(context, wellheadDTOList, durationDTOList, unOptimizeDurationList,
List<DynamicQueryPlantPredictedPowerOutput> avgPowerList = super.getAveragePowerGenerationListByPlantIds(context, relation.getWellheadsByInstitutionIdIdMap().get(detail.getId()), detail, monthNum, periodId,
DynamicQueryPlantPredictedPowerInput.builder() DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(plantIdsByLineIdMap.get(lineId)) .plantIds(relation.getPlantIdsByLineIdMap().get(lineId))
.startTime(startWeek) .startTime(startWeek)
.endTime(nextWeek) .endTime(nextWeek)
.dateType(BusinessConstant.ONE)
.build() .build()
); );
super.gridConnectedOptimization(context, durationMapper, wellheadDTOList, durationDTOList, unOptimizeDurationList,
spaceWellheadList, avgPowerList, detail, monthNum, detailId, periodId, lineId);
break; break;
//离网型优化 //离网型优化
case "0": case "0":
super.offGridOptimization(context, wellheadDTOList, durationDTOList, unOptimizeDurationList,
relation.getWellheadsByInstitutionIdIdMap().get(detail.getId()), relation.getStorageAvgMap(), detail, periodId,
DynamicQueryStoragePredictedPowerInput.builder()
.storageIds(relation.getPlantIdsByLineIdMap().get(detail.getLineId()))
.startTime(DateUtil.beginOfWeek(lastWeek).toString(BusinessConstant.DATE_FORMAT_DAY))
.endTime(DateUtil.endOfWeek(lastWeek).toString(BusinessConstant.DATE_FORMAT_DAY))
.build(),
DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(relation.getPlantIdsByLineIdMap().get(lineId))
.startTime(startWeek)
.endTime(nextWeek)
.dateType(BusinessConstant.ONE)
.build());
break; break;
default: default:
//电网类型不存在 //电网类型不存在
......
...@@ -69,7 +69,7 @@ public class SpaceOptimizeMidPeriodService { ...@@ -69,7 +69,7 @@ public class SpaceOptimizeMidPeriodService {
output.setLineName(lineName); output.setLineName(lineName);
output.setOuName(ouMap.get(output.getOuId())); output.setOuName(ouMap.get(output.getOuId()));
output.setGridTypeName(gridTypeMap.get(output.getGridTypeKey())); output.setGridTypeName(gridTypeMap.get(output.getGridTypeKey()));
output.setOptimizeStateValue(output.getOptimizeState().equals(0) ? "已优化" : "未优化"); output.setOptimizeStateValue(output.getOptimizeState().equals(0) ? BusinessConstant.OPTIMIZED_C : BusinessConstant.NO_OPTIMIZATION_C);
}); });
} }
return XPageResult.success(outputs, input, pageInfo.getTotal()); return XPageResult.success(outputs, input, pageInfo.getTotal());
......
package pps.core.space.service; package pps.core.space.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import pps.cloud.space.service.ISpaceOptimizeShortCloudService; import pps.cloud.space.service.ISpaceOptimizeShortCloudService;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
import pps.core.common.utils.BaseUtils;
import pps.core.space.entity.*;
import pps.core.space.mapper.*;
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 java.util.*;
import java.util.stream.Collectors;
/** /**
* 短期间开优化Cloud模块 * 短期间开优化Cloud模块
...@@ -12,7 +26,7 @@ import xstartup.data.XServiceResult; ...@@ -12,7 +26,7 @@ import xstartup.data.XServiceResult;
* @date 2023/09/20 11:44 * @date 2023/09/20 11:44
*/ */
@XService @XService
public class SpaceOptimizeShortCloudServiceImpl implements ISpaceOptimizeShortCloudService { public class SpaceOptimizeShortCloudServiceImpl extends SpaceOptimizeBaseService implements ISpaceOptimizeShortCloudService {
/** /**
* 短期间开优化Cloud模块--定时任务 * 短期间开优化Cloud模块--定时任务
...@@ -22,6 +36,242 @@ public class SpaceOptimizeShortCloudServiceImpl implements ISpaceOptimizeShortCl ...@@ -22,6 +36,242 @@ public class SpaceOptimizeShortCloudServiceImpl implements ISpaceOptimizeShortCl
*/ */
@Override @Override
public XServiceResult optimizeShortJob(XContext context) { public XServiceResult optimizeShortJob(XContext context) {
return XServiceResult.OK; //取生效中的基础间开
DateTime date = DateUtil.date();
String curDate = date.toString(BusinessConstant.DATE_FORMAT_DAY);
List<SpaceInstitutionDetailEnt> detailEntList = super.getEffectiveSpaceInstitution(context, curDate);
List<SpaceOptimizePeriodDTO> periodDTOList = new ArrayList<>(32);
List<SpaceOptimizeWellheadDTO> wellheadDTOList = new ArrayList<>(64);
List<SpaceOptimizeDurationDTO> durationDTOList = new ArrayList<>(128);
List<SpaceOptimizeDurationDTO> unOptimizeDurationList = new ArrayList<>(128);
DateTime beginOfDay = DateUtil.beginOfDay(date);
//优化
for (SpaceInstitutionDetailEnt detail : detailEntList) {
String detailId = detail.getId();
String lineId = detail.getLineId();
//查是否已经存有短期历史数据
SpaceOptimizeShortPeriodMapper shortPeriodMapper = context.getBean(SpaceOptimizeShortPeriodMapper.class);
SpaceOptimizeShortPeriodEnt shortPeriod = shortPeriodMapper.selectOne(new LambdaQueryWrapper<SpaceOptimizeShortPeriodEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ZERO)
.eq(SpaceOptimizeShortPeriodEnt::getOptimizeDate, beginOfDay)
.eq(SpaceOptimizeShortPeriodEnt::getInstitutionId, detailId)
);
String periodId;
if (Objects.isNull(shortPeriod)) {
//创建记录
periodId = super.createOptimizePeriod(periodDTOList, detailId, lineId, null, beginOfDay);
} else {
periodId = shortPeriod.getId();
}
//查未记录的井口
SpaceInstitutionWellheadMapper wellheadMapper = context.getBean(SpaceInstitutionWellheadMapper.class);
List<SpaceInstitutionWellheadEnt> wellheadEntList = wellheadMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionWellheadEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionWellheadEnt::getInstitutionId, detailId)
.notExists("SELECT 1 FROM space_optimize_short_wellhead WHERE is_deleted = 1 AND short_period_id = {0}", periodId)
);
if (CollUtil.isEmpty(wellheadEntList)) {
continue;
}
List<String> wellheadIdList = wellheadEntList.stream()
.map(SpaceInstitutionWellheadEnt::getWellheadId)
.collect(Collectors.toList());
//查需要初始化的时段配置
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
List<SpaceInstitutionDurationEnt> durationEntList = durationMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionDurationEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionDurationEnt::getInstitutionId, detailId)
.in(SpaceInstitutionDurationEnt::getWellheadId, wellheadIdList)
);
if (CollUtil.isEmpty(durationEntList)) {
continue;
}
Map<String, List<SpaceInstitutionDurationEnt>> durationListMap = durationEntList.stream()
.collect(Collectors.groupingBy(SpaceInstitutionDurationEnt::getWellheadId));
//按类型拆分井口
Map<Boolean, List<SpaceInstitutionWellheadEnt>> interval = wellheadEntList.stream()
.sorted(Comparator.comparing(SpaceInstitutionWellheadEnt::getStartSeq))
.collect(
Collectors.partitioningBy(w -> StringUtils.equals(detailId, w.getInstitutionId()) &&
StringUtils.equals(BusinessConstant.INTERVAL_PUMPING_WELL, w.getRunTypeKey()) &&
StringUtils.equals("0", w.getIntervalTypeKey())
)
);
//不需要优化的井口
List<SpaceInstitutionWellheadEnt> unOptimizeWellheadList = interval.get(false);
if (CollUtil.isNotEmpty(unOptimizeWellheadList)) {
for (SpaceInstitutionWellheadEnt wellhead : unOptimizeWellheadList) {
String wellheadId = wellhead.getWellheadId();
String recordId = super.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
switch (wellhead.getIntervalTypeKey()) {
//小间开(不优化)
case "0":
if (!durationListMap.containsKey(wellheadId)) {
continue;
}
//初始化未优化间开
List<SpaceInstitutionDurationEnt> durationList = durationListMap.get(wellheadId);
for (SpaceInstitutionDurationEnt durationEnt : durationList) {
super.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
super.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
durationEnt.getOpenWellTime(), durationEnt.getCloseWellTime()
);
}
break;
//大间开
case "1":
boolean openFlag = true;
//计算开关井周期总天数
Integer openWellDay = Objects.isNull(wellhead.getOpenWellDay()) ? 0 : wellhead.getOpenWellDay();
Integer closeWellDay = Objects.isNull(wellhead.getCloseWellDay()) ? 0 : wellhead.getCloseWellDay();
Integer totalDays = openWellDay + closeWellDay;
if (!totalDays.equals(0)) {
//获取间开井口创建时间和当天的时间差
int betweenDay = (int) DateUtil.betweenDay(wellhead.getCreateTime(), date, true);
switch (totalDays.compareTo(betweenDay)) {
case -1:
//按周期取余数和开井时间比较,超过开井时间就是关井
if (openWellDay.compareTo(betweenDay % totalDays) >= 0) {
//开井
openFlag = true;
} else {
//关井
openFlag = false;
}
break;
case 0:
//相等为周期最后一天,只要关井天数不为0就是关井
if (closeWellDay.equals(0)) {
//开井
openFlag = true;
} else {
//关井
openFlag = false;
}
break;
case 1:
//当前未过一个执行周期,判断开井时间是否大于时差,大于就是开井
if (openWellDay.compareTo(betweenDay) >= 0) {
//开井
openFlag = true;
} else {
//关井
openFlag = false;
}
break;
default:
}
String closeWellTime = BusinessConstant.START_OF_DAY_TIME;
if (openFlag) {
closeWellTime = BusinessConstant.END_OF_DAY_TIME;
}
//创建间开记录
super.createDuration(unOptimizeDurationList, recordId, periodId, wellheadId, BusinessConstant.ONE, BusinessConstant.START_OF_DAY_TIME, closeWellTime, null);
super.createDuration(durationDTOList, recordId, periodId, wellheadId, BusinessConstant.ZERO, BusinessConstant.START_OF_DAY_TIME, closeWellTime, null);
}
break;
default:
//未配置不处理
}
}
}
//需要优化的井口(匹配中短期优化配置)
List<SpaceInstitutionWellheadEnt> needToOptimizeWellheadList = interval.get(true);
if (CollUtil.isNotEmpty(needToOptimizeWellheadList)) {
//查最近的中短期优化记录
SpaceOptimizeMidPeriodMapper midPeriodMapper = context.getBean(SpaceOptimizeMidPeriodMapper.class);
SpaceOptimizeMidPeriodEnt midPeriodEnt = midPeriodMapper.selectOne(new LambdaQueryWrapper<SpaceOptimizeMidPeriodEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceOptimizeMidPeriodEnt::getInstitutionId, detailId)
.orderByDesc(BaseModel::getCreateTime)
.last("LIMIT 1")
);
//如果有中短期优化记录,通过记录ID查优化过的时段按井口ID分组
Map<String, List<SpaceOptimizeMidDurationEnt>> optimizeMidDurationMap = new HashMap<>(0);
if (Objects.nonNull(midPeriodEnt)) {
SpaceOptimizeMidDurationMapper midDurationMapper = context.getBean(SpaceOptimizeMidDurationMapper.class);
List<SpaceOptimizeMidDurationEnt> optimizeMidDurationEntList = midDurationMapper.selectList(new LambdaQueryWrapper<SpaceOptimizeMidDurationEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceOptimizeMidDurationEnt::getIsOptimize, BusinessConstant.ZERO)
.eq(SpaceOptimizeMidDurationEnt::getMidPeriodId, midPeriodEnt.getId())
.orderByAsc(BaseModel::getCreateTime)
);
if (CollUtil.isNotEmpty(optimizeMidDurationEntList)) {
optimizeMidDurationMap = optimizeMidDurationEntList.stream()
.collect(Collectors.groupingBy(SpaceOptimizeMidDurationEnt::getWellheadId));
}
}
for (SpaceInstitutionWellheadEnt wellhead : needToOptimizeWellheadList) {
String wellheadId = wellhead.getWellheadId();
String recordId = super.createOptimizeWellhead(wellheadDTOList, periodId, wellheadId, wellhead.getWellNumber());
if (!durationListMap.containsKey(wellheadId)) {
continue;
}
List<SpaceInstitutionDurationEnt> durationList = durationListMap.get(wellheadId);
if (optimizeMidDurationMap.containsKey(wellheadId)) {
//优化记录转换
List<SpaceOptimizeMidDurationEnt> midDurationEntList = optimizeMidDurationMap.get(wellheadId);
for (SpaceOptimizeMidDurationEnt midDurationEnt : midDurationEntList) {
super.createDuration(durationDTOList, recordId, periodId, wellheadId, BusinessConstant.ZERO,
midDurationEnt.getOpenWellTime(), midDurationEnt.getCloseWellTime(), midDurationEnt.getGenerationTypeKey());
}
//初始化未优化间开
for (SpaceInstitutionDurationEnt durationEnt : durationList) {
super.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
}
} else {
//缺少优化记录,不优化
for (SpaceInstitutionDurationEnt durationEnt : durationList) {
super.createUnOptimizeDuration(unOptimizeDurationList, durationEnt, periodId, recordId, wellheadId);
super.createOptimizeDuration(durationDTOList, periodId, recordId, wellheadId, null,
durationEnt.getOpenWellTime(), durationEnt.getCloseWellTime()
);
}
}
}
}
}
//开启事务
return XTransactionHelper.begin(context, () -> {
int size;
SpaceOptimizeViewMapper optimizeViewMapper = context.getBean(SpaceOptimizeViewMapper.class);
if (CollUtil.isNotEmpty(periodDTOList)) {
size = periodDTOList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizePeriodDTO>> subList = BaseUtils.getSubList(periodDTOList);
subList.forEach(b -> optimizeViewMapper.shortPeriodBatchInsertList(b));
} else {
optimizeViewMapper.shortPeriodBatchInsertList(periodDTOList);
}
}
if (CollUtil.isNotEmpty(wellheadDTOList)) {
size = wellheadDTOList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeWellheadDTO>> subList = BaseUtils.getSubList(wellheadDTOList);
subList.forEach(b -> optimizeViewMapper.shortWellheadBatchInsertList(b));
} else {
optimizeViewMapper.shortWellheadBatchInsertList(wellheadDTOList);
}
}
if (CollUtil.isNotEmpty(unOptimizeDurationList)) {
size = unOptimizeDurationList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeDurationDTO>> subList = BaseUtils.getSubList(unOptimizeDurationList);
subList.forEach(b -> optimizeViewMapper.shortDurationBatchInsertList(b));
} else {
optimizeViewMapper.shortDurationBatchInsertList(unOptimizeDurationList);
}
}
if (CollUtil.isNotEmpty(durationDTOList)) {
size = durationDTOList.size();
if (size > BaseUtils.BATCH_SIZE) {
List<List<SpaceOptimizeDurationDTO>> subList = BaseUtils.getSubList(durationDTOList);
subList.forEach(b -> optimizeViewMapper.shortDurationBatchInsertList(b));
} else {
optimizeViewMapper.shortDurationBatchInsertList(durationDTOList);
}
}
return XServiceResult.OK;
});
} }
} }
\ No newline at end of file
package pps.core.space.service; package pps.core.space.service;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import pps.core.space.entity.SpaceInstitutionDetailEnt; import pps.core.common.constant.BusinessConstant;
import pps.core.space.entity.SpaceOptimizeShortDurationView; import pps.core.common.entity.BaseModel;
import pps.core.space.entity.SpaceOptimizeShortPeriodEnt; import pps.core.space.entity.*;
import pps.core.space.entity.SpaceOptimizeShortWellheadEnt; import pps.core.space.mapper.*;
import pps.core.space.mapper.SpaceInstitutionDetailMapper;
import pps.core.space.mapper.SpaceOptimizeShortDurationViewMapper;
import pps.core.space.mapper.SpaceOptimizeShortPeriodMapper;
import pps.core.space.mapper.SpaceOptimizeShortWellheadMapper;
import pps.core.space.service.data.SpaceOptimizeDateDuration; import pps.core.space.service.data.SpaceOptimizeDateDuration;
import pps.core.space.service.data.space_optimize_short_period.GetSpaceOptimizeShortPeriodViewInput; import pps.core.space.service.data.space_optimize_short_period.GetSpaceOptimizeShortPeriodViewInput;
import pps.core.space.service.data.space_optimize_short_period.GetSpaceOptimizeShortPeriodViewOutput; import pps.core.space.service.data.space_optimize_short_period.GetSpaceOptimizeShortPeriodViewOutput;
...@@ -23,10 +21,7 @@ import xstartup.data.XSingleResult; ...@@ -23,10 +21,7 @@ import xstartup.data.XSingleResult;
import xstartup.feature.api.annotation.XApiAnonymous; import xstartup.feature.api.annotation.XApiAnonymous;
import xstartup.feature.api.annotation.XApiGet; import xstartup.feature.api.annotation.XApiGet;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -51,49 +46,78 @@ public class SpaceOptimizeShortPeriodService { ...@@ -51,49 +46,78 @@ public class SpaceOptimizeShortPeriodService {
@XText("短期间开优化--详情") @XText("短期间开优化--详情")
public XSingleResult<GetSpaceOptimizeShortPeriodViewOutput> getSpaceOptimizeShortPeriodView(XContext context, GetSpaceOptimizeShortPeriodViewInput input) { public XSingleResult<GetSpaceOptimizeShortPeriodViewOutput> getSpaceOptimizeShortPeriodView(XContext context, GetSpaceOptimizeShortPeriodViewInput input) {
SpaceOptimizeShortPeriodMapper mapper = context.getBean(SpaceOptimizeShortPeriodMapper.class); SpaceOptimizeShortPeriodMapper mapper = context.getBean(SpaceOptimizeShortPeriodMapper.class);
//查当日记录 GetSpaceOptimizeShortPeriodViewOutput output = new GetSpaceOptimizeShortPeriodViewOutput();
SpaceInstitutionDetailMapper detailMapper = context.getBean(SpaceInstitutionDetailMapper.class);
//查询当前线路的基础制度
DateTime date = DateUtil.date();
SpaceInstitutionDetailEnt detailEnt = detailMapper.selectOne(new LambdaQueryWrapper<SpaceInstitutionDetailEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionDetailEnt::getIsCurrentBasic, BusinessConstant.ZERO)
.le(SpaceInstitutionDetailEnt::getInstitutionStartDate, date)
.ge(SpaceInstitutionDetailEnt::getInstitutionEndDate, date)
.last("LIMIT 1")
);
if (Objects.isNull(detailEnt)) {
//当前线路没有基础制度
output.setWellheadList(new ArrayList<>(0));
}
output.setGridTypeKey(detailEnt.getGridTypeKey());
//查出当前制度所有的井口
String institutionId = detailEnt.getId();
SpaceInstitutionWellheadMapper wellheadMapper = context.getBean(SpaceInstitutionWellheadMapper.class);
List<SpaceInstitutionWellheadEnt> wellheadEntList = wellheadMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionWellheadEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionWellheadEnt::getInstitutionId, institutionId)
.orderByAsc(BaseModel::getCreateTime)
);
if (CollUtil.isEmpty(wellheadEntList)) {
//缺少井口
output.setWellheadList(new ArrayList<>(0));
}
//查当日是否存在优化记录
SpaceOptimizeShortPeriodEnt period = mapper.selectOne( SpaceOptimizeShortPeriodEnt period = mapper.selectOne(
new LambdaQueryWrapper<SpaceOptimizeShortPeriodEnt>() new LambdaQueryWrapper<SpaceOptimizeShortPeriodEnt>()
.eq(SpaceOptimizeShortPeriodEnt::getLineId, input.getLineId()) .eq(SpaceOptimizeShortPeriodEnt::getLineId, input.getLineId())
.apply("DATE_FORMAT( optimize_date, '%Y-%m-%d' ) = curdate()") .eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.apply("DATE_FORMAT( optimize_date, '%Y-%m-%d' ) = CURDATE()")
); );
GetSpaceOptimizeShortPeriodViewOutput output = new GetSpaceOptimizeShortPeriodViewOutput(); Map<String, List<SpaceOptimizeDateDuration>> collect = new HashMap<>(0);
if (Objects.nonNull(period)) { if (Objects.nonNull(period)) {
//查间开制度详情 //如果存在,查出优化过的区间
SpaceInstitutionDetailMapper detailMapper = context.getBean(SpaceInstitutionDetailMapper.class); SpaceOptimizeShortDurationViewMapper durationViewMapper = context.getBean(SpaceOptimizeShortDurationViewMapper.class);
SpaceInstitutionDetailEnt detailEnt = detailMapper.selectById(period.getInstitutionId()); List<SpaceOptimizeShortDurationView> durationViewList = durationViewMapper.selectList(SpaceOptimizeShortDurationView.builder()
output.setGridTypeKey(detailEnt.getGridTypeKey()); .shortPeriodId(period.getId())
String shortPeriodId = period.getId(); .build()
//查井口列表
SpaceOptimizeShortWellheadMapper wellheadMapper = context.getBean(SpaceOptimizeShortWellheadMapper.class);
List<SpaceOptimizeShortWellheadEnt> wellheadList = wellheadMapper.selectList(new LambdaQueryWrapper<SpaceOptimizeShortWellheadEnt>()
.eq(SpaceOptimizeShortWellheadEnt::getShortPeriodId, shortPeriodId)
); );
if (CollUtil.isNotEmpty(wellheadList)) { if (CollUtil.isNotEmpty(durationViewList)) {
List<GetSpaceOptimizeShortWellheadViewOutput> wellheadViewOutputs = XCopyUtils.copyNewList(wellheadList, GetSpaceOptimizeShortWellheadViewOutput.class); collect = XCopyUtils.copyNewList(durationViewList, SpaceOptimizeDateDuration.class)
//查井口间隔配置 .stream()
SpaceOptimizeShortDurationViewMapper durationViewMapper = context.getBean(SpaceOptimizeShortDurationViewMapper.class); .collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getWellheadId));
List<SpaceOptimizeShortDurationView> durationViewList = durationViewMapper.selectList(SpaceOptimizeShortDurationView.builder()
.shortPeriodId(shortPeriodId)
.build()
);
if (CollUtil.isNotEmpty(durationViewList)) {
Map<String, List<SpaceOptimizeDateDuration>> collect = XCopyUtils.copyNewList(durationViewList, SpaceOptimizeDateDuration.class)
.stream()
.collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getWellheadId));
wellheadViewOutputs.forEach(w -> {
if (collect.containsKey(w.getWellheadId())) {
w.setDurationList(ServiceUtil.getAllDateDuration(collect.get(w.getWellheadId())));
} else {
w.setDurationList(new ArrayList<>(0));
}
});
}
output.setWellheadList(wellheadViewOutputs);
} }
} else { } else {
output.setWellheadList(new ArrayList<>(0)); //如果没有,查初始区间
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
List<SpaceInstitutionDurationEnt> durationEntList = durationMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionDurationEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionDurationEnt::getInstitutionId, institutionId)
.orderByAsc(BaseModel::getCreateTime)
);
if (CollUtil.isNotEmpty(durationEntList)) {
collect = XCopyUtils.copyNewList(durationEntList, SpaceOptimizeDateDuration.class)
.stream()
.collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getWellheadId));
}
}
//遍历井口,添加区间
List<GetSpaceOptimizeShortWellheadViewOutput> wellheadViewOutputs = XCopyUtils.copyNewList(wellheadEntList, GetSpaceOptimizeShortWellheadViewOutput.class);
for (GetSpaceOptimizeShortWellheadViewOutput wellheadViewOutput : wellheadViewOutputs) {
if (collect.containsKey(wellheadViewOutput.getWellheadId())) {
wellheadViewOutput.setDurationList(ServiceUtil.getAllDateDuration(collect.get(wellheadViewOutput.getWellheadId())));
} else {
wellheadViewOutput.setDurationList(new ArrayList<>(0));
}
} }
output.setWellheadList(wellheadViewOutputs);
return XSingleResult.success(output); return XSingleResult.success(output);
} }
} }
\ No newline at end of file
...@@ -25,7 +25,7 @@ public class SpaceOptimizeLineRelation { ...@@ -25,7 +25,7 @@ public class SpaceOptimizeLineRelation {
/** /**
* 井口列表 * 井口列表
*/ */
List<SpaceInstitutionWellheadView> spaceWellheadList; Map<String, List<SpaceInstitutionWellheadView>> wellheadsByInstitutionIdIdMap;
/** /**
* 电站Map * 电站Map
......
...@@ -158,7 +158,7 @@ public class ServiceUtil { ...@@ -158,7 +158,7 @@ public class ServiceUtil {
SpaceOptimizeDateOutput spaceOptimizeDateOutput = new SpaceOptimizeDateOutput(); SpaceOptimizeDateOutput spaceOptimizeDateOutput = new SpaceOptimizeDateOutput();
spaceOptimizeDateOutput.setDateTime(r); spaceOptimizeDateOutput.setDateTime(r);
spaceOptimizeDateOutput.setOptimizeCode(BusinessConstant.ZERO); spaceOptimizeDateOutput.setOptimizeCode(BusinessConstant.ZERO);
spaceOptimizeDateOutput.setOptimizeValue("已优化"); spaceOptimizeDateOutput.setOptimizeValue(BusinessConstant.OPTIMIZED_C);
return spaceOptimizeDateOutput; return spaceOptimizeDateOutput;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
...@@ -174,8 +174,8 @@ public class ServiceUtil { ...@@ -174,8 +174,8 @@ public class ServiceUtil {
if (CollUtil.isEmpty(optimizeList)) { if (CollUtil.isEmpty(optimizeList)) {
allList.add( allList.add(
SpaceOptimizeDateDuration.builder() SpaceOptimizeDateDuration.builder()
.openWellTime("00:00") .openWellTime(BusinessConstant.START_OF_DAY_TIME)
.closeWellTime("23:59") .closeWellTime(BusinessConstant.END_OF_DAY_TIME)
.isOpen(0) .isOpen(0)
.build() .build()
); );
...@@ -189,10 +189,10 @@ public class ServiceUtil { ...@@ -189,10 +189,10 @@ public class ServiceUtil {
optimize.setIsOpen(1); optimize.setIsOpen(1);
if (i == 0) { if (i == 0) {
//如果开始时间不是从00:00开始,初始化开始时间为关井时间 //如果开始时间不是从00:00开始,初始化开始时间为关井时间
if (!StringUtils.equals("00:00", openWellTime)) { if (!StringUtils.equals(BusinessConstant.START_OF_DAY_TIME, openWellTime)) {
allList.add( allList.add(
SpaceOptimizeDateDuration.builder() SpaceOptimizeDateDuration.builder()
.openWellTime("00:00") .openWellTime(BusinessConstant.START_OF_DAY_TIME)
.closeWellTime(openWellTime) .closeWellTime(openWellTime)
.isOpen(0) .isOpen(0)
.build() .build()
...@@ -219,11 +219,11 @@ public class ServiceUtil { ...@@ -219,11 +219,11 @@ public class ServiceUtil {
} }
if (i == last) { if (i == last) {
//如果结束时间不是24:00开始,初始化最终关井时间 //如果结束时间不是24:00开始,初始化最终关井时间
if (!StringUtils.equals("23:59", closeWellTime)) { if (!StringUtils.equals(BusinessConstant.END_OF_DAY_TIME, closeWellTime)) {
allList.add( allList.add(
SpaceOptimizeDateDuration.builder() SpaceOptimizeDateDuration.builder()
.openWellTime(closeWellTime) .openWellTime(closeWellTime)
.closeWellTime("23:59") .closeWellTime(BusinessConstant.END_OF_DAY_TIME)
.isOpen(0) .isOpen(0)
.build() .build()
); );
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<result column="institution_id" property="institutionId" jdbcType="VARCHAR"/> <result column="institution_id" property="institutionId" jdbcType="VARCHAR"/>
<result column="execution_cycle" property="executionCycle" jdbcType="VARCHAR"/> <result column="execution_cycle" property="executionCycle" jdbcType="VARCHAR"/>
<result column="optimize_state" property="optimizeState" jdbcType="INTEGER"/> <result column="optimize_state" property="optimizeState" jdbcType="INTEGER"/>
<result column="optimize_deadline" property="optimizeDeadline" jdbcType="DATE"/> <result column="optimize_deadline" property="optimizeDeadline" jdbcType="TIMESTAMP"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
<result column="institution_id" property="institutionId" jdbcType="VARCHAR"/> <result column="institution_id" property="institutionId" jdbcType="VARCHAR"/>
<result column="execution_cycle" property="executionCycle" jdbcType="VARCHAR"/> <result column="execution_cycle" property="executionCycle" jdbcType="VARCHAR"/>
<result column="optimize_state" property="optimizeState" jdbcType="INTEGER"/> <result column="optimize_state" property="optimizeState" jdbcType="INTEGER"/>
<result column="optimize_deadline" property="optimizeDeadline" jdbcType="DATE"/> <result column="optimize_deadline" property="optimizeDeadline" jdbcType="TIMESTAMP"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
<result column="line_id" property="lineId" jdbcType="VARCHAR"/> <result column="line_id" property="lineId" jdbcType="VARCHAR"/>
<result column="institution_id" property="institutionId" jdbcType="VARCHAR"/> <result column="institution_id" property="institutionId" jdbcType="VARCHAR"/>
<result column="optimize_state" property="optimizeState" jdbcType="INTEGER"/> <result column="optimize_state" property="optimizeState" jdbcType="INTEGER"/>
<result column="optimize_date" property="optimizeDate" jdbcType="DATE"/> <result column="optimize_date" property="optimizeDate" jdbcType="TIMESTAMP"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
......
...@@ -177,4 +177,77 @@ ...@@ -177,4 +177,77 @@
) )
</foreach> </foreach>
</insert> </insert>
<insert id="shortPeriodBatchInsertList" parameterType="list">
INSERT INTO space_optimize_short_period (id, create_by_id, create_by_name, create_time, modify_by_id,
modify_by_name, modify_time, line_id, institution_id, optimize_state, optimize_date)
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.optimizeState},
#{item.optimizeDeadline}
)
</foreach>
</insert>
<insert id="shortWellheadBatchInsertList" parameterType="list">
INSERT INTO space_optimize_short_wellhead (id, create_by_id, create_by_name, create_time, modify_by_id,
modify_by_name, modify_time, short_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.periodId},
#{item.wellheadId},
#{item.wellNumber}
)
</foreach>
</insert>
<insert id="shortDurationBatchInsertList" parameterType="list">
INSERT INTO space_optimize_short_duration (id, create_by_id, create_by_name, create_time,
modify_by_id, modify_by_name, modify_time, record_id, short_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.periodId},
#{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> </mapper>
\ No newline at end of file
package pps.cloud.prediction.service.data.plant_predicted_power_data; package pps.cloud.prediction.service.data.plant_predicted_power_data;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -37,4 +38,8 @@ public class DynamicQueryPlantPredictedPowerInput { ...@@ -37,4 +38,8 @@ public class DynamicQueryPlantPredictedPowerInput {
@XText("结束时间") @XText("结束时间")
private String endTime; private String endTime;
@NotNull(message = "缺少日期类型")
@XText("日期类型:0_长期;1_中短期")
private Integer dateType;
} }
...@@ -4,6 +4,7 @@ import lombok.Data; ...@@ -4,6 +4,7 @@ import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/** /**
* 光伏预测Cloud模块 * 光伏预测Cloud模块
...@@ -29,9 +30,12 @@ public class DynamicQueryPlantPredictedPowerOutput { ...@@ -29,9 +30,12 @@ public class DynamicQueryPlantPredictedPowerOutput {
@XText("预测功率") @XText("预测功率")
private BigDecimal power; private BigDecimal power;
@XText("是否满足") @XText("电量是否满足标识")
private boolean meetFlag; private Boolean batteryLowFlag;
@XText("可供电时长") @XText("可供电时长")
private int powerDuration; private int powerDuration;
@XText("创建时间")
private Date createTime;
} }
...@@ -7,7 +7,9 @@ import pps.cloud.prediction.service.IPlantPredictedPowerCloudService; ...@@ -7,7 +7,9 @@ import pps.cloud.prediction.service.IPlantPredictedPowerCloudService;
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.core.prediction.entity.PlantPredictedPowerDataEnt; import pps.core.prediction.entity.PlantPredictedPowerDataEnt;
import pps.core.prediction.entity.PlantPredictedPowerLongTermDataEnt;
import pps.core.prediction.mapper.PlantPredictedPowerDataMapper; import pps.core.prediction.mapper.PlantPredictedPowerDataMapper;
import pps.core.prediction.mapper.PlantPredictedPowerLongTermDataMapper;
import xstartup.annotation.XService; import xstartup.annotation.XService;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils; import xstartup.base.util.XCopyUtils;
...@@ -40,25 +42,55 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower ...@@ -40,25 +42,55 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower
String monthTime = input.getMonthTime(); String monthTime = input.getMonthTime();
String startTime = input.getStartTime(); String startTime = input.getStartTime();
String endTime = input.getEndTime(); String endTime = input.getEndTime();
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class); Integer dateType = input.getDateType();
List<PlantPredictedPowerDataEnt> list = mapper.selectList( List list = null;
new QueryWrapper<PlantPredictedPowerDataEnt>() switch (dateType) {
.select("year_time", case 0:
"month_time", PlantPredictedPowerLongTermDataMapper longTermDataMapper = context.getBean(PlantPredictedPowerLongTermDataMapper.class);
"hour_time", list = longTermDataMapper.selectList(
"min_time", new QueryWrapper<PlantPredictedPowerLongTermDataEnt>()
"AVG( power ) AS power") .select("year_time",
.lambda() "month_time",
.eq(StringUtils.isNotBlank(plantId), PlantPredictedPowerDataEnt::getPlantId, plantId) "hour_time",
.in(CollUtil.isNotEmpty(plantIds), PlantPredictedPowerDataEnt::getPlantId, plantIds) "min_time",
.eq(StringUtils.isNotBlank(yearTime), PlantPredictedPowerDataEnt::getYearTime, yearTime) "AVG( power ) AS power",
.eq(StringUtils.isNotBlank(monthTime), PlantPredictedPowerDataEnt::getMonthTime, monthTime) "STR_TO_DATE( CONCAT( hour_time, ':', min_time ), '%H:%i:%s' ) AS create_time")
.between(!StringUtils.isAnyBlank(startTime, endTime), PlantPredictedPowerDataEnt::getDataDate, startTime, endTime) .lambda()
.groupBy(PlantPredictedPowerDataEnt::getYearTime, .eq(StringUtils.isNotBlank(plantId), PlantPredictedPowerLongTermDataEnt::getPlantId, plantId)
PlantPredictedPowerDataEnt::getMonthTime, .in(CollUtil.isNotEmpty(plantIds), PlantPredictedPowerLongTermDataEnt::getPlantId, plantIds)
PlantPredictedPowerDataEnt::getHourTime, .eq(StringUtils.isNotBlank(yearTime), PlantPredictedPowerLongTermDataEnt::getYearTime, yearTime)
PlantPredictedPowerDataEnt::getMinTime) .eq(StringUtils.isNotBlank(monthTime), PlantPredictedPowerLongTermDataEnt::getMonthTime, monthTime)
); .between(!StringUtils.isAnyBlank(startTime, endTime), PlantPredictedPowerLongTermDataEnt::getDataDate, startTime, endTime)
.groupBy(PlantPredictedPowerLongTermDataEnt::getYearTime,
PlantPredictedPowerLongTermDataEnt::getMonthTime,
PlantPredictedPowerLongTermDataEnt::getHourTime,
PlantPredictedPowerLongTermDataEnt::getMinTime)
);
break;
case 1:
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class);
list = mapper.selectList(
new QueryWrapper<PlantPredictedPowerDataEnt>()
.select("year_time",
"month_time",
"hour_time",
"min_time",
"AVG( power ) AS power",
"STR_TO_DATE( CONCAT( hour_time, ':', min_time ), '%H:%i:%s' ) AS create_time")
.lambda()
.eq(StringUtils.isNotBlank(plantId), PlantPredictedPowerDataEnt::getPlantId, plantId)
.in(CollUtil.isNotEmpty(plantIds), PlantPredictedPowerDataEnt::getPlantId, plantIds)
.eq(StringUtils.isNotBlank(yearTime), PlantPredictedPowerDataEnt::getYearTime, yearTime)
.eq(StringUtils.isNotBlank(monthTime), PlantPredictedPowerDataEnt::getMonthTime, monthTime)
.between(!StringUtils.isAnyBlank(startTime, endTime), PlantPredictedPowerDataEnt::getDataDate, startTime, endTime)
.groupBy(PlantPredictedPowerDataEnt::getYearTime,
PlantPredictedPowerDataEnt::getMonthTime,
PlantPredictedPowerDataEnt::getHourTime,
PlantPredictedPowerDataEnt::getMinTime)
);
break;
default:
}
List<DynamicQueryPlantPredictedPowerOutput> outputs; List<DynamicQueryPlantPredictedPowerOutput> outputs;
if (CollUtil.isEmpty(list)) { if (CollUtil.isEmpty(list)) {
outputs = new ArrayList<>(0); outputs = new ArrayList<>(0);
......
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