Commit ccd5e276 authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.邮件发送服务代码修改,修改配置文件及发送逻辑,解决邮件名称唯一性;
2.邮件接收功能修改,解决邮件接收协议修改后导致的一系列问题;
3.长期间开优化功能修改,修改定时任务处理逻辑及执行周期;
4.中期间开优化功能修改,修改定时任务处理逻辑及执行周期;
5.超长期间开优化功能开发,开发相关接口及定时任务,创建对应数据表,生成对应接口文档并完成接口冒烟测试;
6.超短期间开优化功能开发,开发相关接口及定时任务,创建对应数据表,生成对应接口文档并完成接口冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 258070df
......@@ -111,11 +111,11 @@ public class SpaceOptimizeLongPeriodService extends SpaceOptimizeBaseService {
} else {
output.setStrategyDetailList(new ArrayList<>(0));
}
DateTime beginOfMonth = DateUtil.beginOfMonth(period.getOptimizeDeadline());
if (beginOfMonth.compareTo(detailEnt.getInstitutionStartDate()) < 0) {
beginOfMonth = DateUtil.date(detailEnt.getInstitutionStartDate());
DateTime begin = DateUtil.date(period.getOptimizeDeadline());
if (begin.compareTo(detailEnt.getInstitutionStartDate()) < 0) {
begin = DateUtil.date(detailEnt.getInstitutionStartDate());
}
output.setDateList(ServiceUtil.getOptimizeDateList(beginOfMonth, period.getOptimizeDeadline()));
output.setDateList(ServiceUtil.getOptimizeDateList(begin, period.getOptimizeDeadline()));
output.setGridTypeKey(detailEnt.getGridTypeKey());
//查井口列表
SpaceOptimizeLongWellheadMapper wellheadMapper = context.getBean(SpaceOptimizeLongWellheadMapper.class);
......
......@@ -100,11 +100,11 @@ public class SpaceOptimizeMidPeriodService extends SpaceOptimizeBaseService {
//查间开制度详情
SpaceInstitutionDetailMapper detailMapper = context.getBean(SpaceInstitutionDetailMapper.class);
SpaceInstitutionDetailEnt detailEnt = detailMapper.selectById(period.getInstitutionId());
DateTime beginOfWeek = DateUtil.beginOfWeek(period.getOptimizeDeadline());
if (beginOfWeek.compareTo(detailEnt.getInstitutionStartDate()) < 0) {
beginOfWeek = DateUtil.date(detailEnt.getInstitutionStartDate());
DateTime begin = DateUtil.date(period.getOptimizeDeadline());
if (begin.compareTo(detailEnt.getInstitutionStartDate()) < 0) {
begin = DateUtil.date(detailEnt.getInstitutionStartDate());
}
List<SpaceOptimizeDateOutput> optimizeDateList = ServiceUtil.getOptimizeDateList(beginOfWeek, period.getOptimizeDeadline());
List<SpaceOptimizeDateOutput> optimizeDateList = ServiceUtil.getOptimizeDateList(begin, period.getOptimizeDeadline());
output.setDateList(optimizeDateList);
if (StringUtils.equals(String.valueOf(BusinessConstant.ONE), Optional.ofNullable(detailEnt.getGridTypeKey())
.orElse(String.valueOf(BusinessConstant.ZERO)))) {
......
......@@ -4,21 +4,30 @@ 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.github.pagehelper.PageInfo;
import com.github.pagehelper.page.PageMethod;
import org.apache.commons.lang3.StringUtils;
import pps.cloud.base.service.data.base_price_strategy_detail.GetBasePriceStrategyDetailInput;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerInput;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
import pps.core.space.entity.*;
import pps.core.space.mapper.*;
import pps.core.space.service.data.SpaceOptimizeDateDuration;
import pps.core.space.service.data.SpaceOptimizeDateOutput;
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_wellhead.GetSpaceOptimizeShortWellheadViewOutput;
import pps.core.space.service.data.space_optimize_short_period.QuerySpaceOptimizeShortPeriodViewInput;
import pps.core.space.service.data.space_optimize_short_period.QuerySpaceOptimizeShortPeriodViewOutput;
import pps.core.space.service.data.space_optimize_short_wellhead.GetSpaceOptimizeShortWellheadOutput;
import pps.core.space.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XPageResult;
import xstartup.data.XSingleResult;
import xstartup.error.XError;
import xstartup.feature.api.annotation.XApiAnonymous;
import xstartup.feature.api.annotation.XApiGet;
......@@ -33,10 +42,45 @@ import java.util.stream.Collectors;
*/
@XService
@XText("极短期间开优化模块")
public class SpaceOptimizeShortPeriodService {
public class SpaceOptimizeShortPeriodService extends SpaceOptimizeBaseService {
/**
* 极短期间开优化--详情
* 极短期间开开优化--分页列表
*
* @param context 上下文
* @param input 输入
* @return {@link XPageResult}<{@link QuerySpaceOptimizeShortPeriodViewOutput}>
*/
@XApiAnonymous
@XApiGet
@XText("极短期间开开优化--分页列表")
public XPageResult<QuerySpaceOptimizeShortPeriodViewOutput> querySpaceOptimizeShortPeriodView(XContext context, QuerySpaceOptimizeShortPeriodViewInput input) {
SpaceOptimizeShortPeriodViewMapper mapper = context.getBean(SpaceOptimizeShortPeriodViewMapper.class);
SpaceOptimizeShortPeriodView record = XCopyUtils.copyNewObject(input, SpaceOptimizeShortPeriodView.class);
PageMethod.startPage(input.getPage(), input.getLimit());
List<SpaceOptimizeShortPeriodView> list = mapper.selectList(record);
PageInfo<SpaceOptimizeShortPeriodView> pageInfo = new PageInfo<>(list);
List<QuerySpaceOptimizeShortPeriodViewOutput> outputs = XCopyUtils.copyNewList(pageInfo.getList(), QuerySpaceOptimizeShortPeriodViewOutput.class);
if (CollUtil.isNotEmpty(outputs)) {
Map<String, String> gridTypeMap = ServiceUtil.getDictMap(context, BusinessConstant.GRID_TYPE);
Map<String, String> ouMap = ServiceUtil.getOuMapByOuIds(context, outputs.stream()
.map(QuerySpaceOptimizeShortPeriodViewOutput::getOuId)
.distinct()
.collect(Collectors.toList())
);
String lineName = ServiceUtil.getPowerLineNameById(context, input.getLineId());
outputs.forEach(output -> {
output.setLineName(lineName);
output.setOuName(ouMap.get(output.getOuId()));
output.setGridTypeName(gridTypeMap.get(output.getGridTypeKey()));
output.setOptimizeStateValue(output.getOptimizeState().equals(0) ? BusinessConstant.OPTIMIZED_C : BusinessConstant.NO_OPTIMIZATION_C);
});
}
return XPageResult.success(outputs, input, pageInfo.getTotal());
}
/**
* 极短期间开开优化--详情
*
* @param context 上下文
* @param input 输入
......@@ -44,109 +88,102 @@ public class SpaceOptimizeShortPeriodService {
*/
@XApiAnonymous
@XApiGet
@XText("极短期间开优化--详情")
@XText("极短期间开优化--详情")
public XSingleResult<GetSpaceOptimizeShortPeriodViewOutput> getSpaceOptimizeShortPeriodView(XContext context, GetSpaceOptimizeShortPeriodViewInput input) {
GetSpaceOptimizeShortPeriodViewOutput output = new GetSpaceOptimizeShortPeriodViewOutput();
SpaceOptimizeShortPeriodMapper mapper = context.getBean(SpaceOptimizeShortPeriodMapper.class);
String shortPeriodId = input.getId();
SpaceOptimizeShortPeriodEnt period = mapper.selectById(shortPeriodId);
if (Objects.isNull(period)) {
return XSingleResult.error(context, XError.NotFound);
}
GetSpaceOptimizeShortPeriodViewOutput output = XCopyUtils.copyNewObject(period, GetSpaceOptimizeShortPeriodViewOutput.class);
//查间开制度详情
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)
.eq(SpaceInstitutionDetailEnt::getLineId, input.getLineId())
.le(SpaceInstitutionDetailEnt::getInstitutionStartDate, date)
.ge(SpaceInstitutionDetailEnt::getInstitutionEndDate, date)
.last("LIMIT 1")
);
if (Objects.isNull(detailEnt)) {
//当前线路没有基础制度
output.setWellheadList(new ArrayList<>(0));
SpaceInstitutionDetailEnt detailEnt = detailMapper.selectById(period.getInstitutionId());
DateTime begin = DateUtil.date(period.getOptimizeDate());
if (begin.compareTo(detailEnt.getInstitutionStartDate()) < 0) {
begin = DateUtil.date(detailEnt.getInstitutionStartDate());
}
List<SpaceOptimizeDateOutput> optimizeDateList = ServiceUtil.getOptimizeDateList(begin, period.getOptimizeDate());
output.setDateList(optimizeDateList);
if (StringUtils.equals(String.valueOf(BusinessConstant.ONE), Optional.ofNullable(detailEnt.getGridTypeKey())
.orElse(String.valueOf(BusinessConstant.ZERO)))) {
int month;
if (CollUtil.isNotEmpty(optimizeDateList)) {
month = DateUtil.month(optimizeDateList.get(optimizeDateList.size() - 1).getDateTime());
} else {
Calendar calendar = Calendar.getInstance();
calendar.setTime(period.getOptimizeDate());
month = calendar.get(Calendar.MONTH);
}
output.setStrategyDetailList(ServiceUtil.getStrategyDetailList(context,
GetBasePriceStrategyDetailInput.builder()
.lineId(period.getLineId())
.strategyMonth(String.valueOf(month + 1))
.build()));
} else {
output.setStrategyDetailList(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>()
//查井口列表
SpaceOptimizeShortWellheadMapper wellheadMapper = context.getBean(SpaceOptimizeShortWellheadMapper.class);
List<SpaceOptimizeShortWellheadEnt> wellheadList = wellheadMapper.selectList(new LambdaQueryWrapper<SpaceOptimizeShortWellheadEnt>()
.eq(SpaceOptimizeShortWellheadEnt::getShortPeriodId, shortPeriodId)
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionWellheadEnt::getInstitutionId, institutionId)
.orderByAsc(SpaceInstitutionWellheadEnt::getStartSeq)
.orderByAsc(SpaceOptimizeShortWellheadEnt::getStartSeq)
);
if (CollUtil.isEmpty(wellheadEntList)) {
//缺少井口
output.setWellheadList(new ArrayList<>(0));
}
SpaceOptimizeShortPeriodMapper mapper = context.getBean(SpaceOptimizeShortPeriodMapper.class);
//查当日是否存在优化记录
SpaceOptimizeShortPeriodEnt period = mapper.selectOne(
new LambdaQueryWrapper<SpaceOptimizeShortPeriodEnt>()
.eq(SpaceOptimizeShortPeriodEnt::getLineId, input.getLineId())
if (CollUtil.isNotEmpty(wellheadList)) {
List<GetSpaceOptimizeShortWellheadOutput> wellheadOutputs = XCopyUtils.copyNewList(wellheadList, GetSpaceOptimizeShortWellheadOutput.class);
//查井口配置列表
SpaceOptimizeShortDurationMapper durationMapper = context.getBean(SpaceOptimizeShortDurationMapper.class);
List<SpaceOptimizeShortDurationEnt> durationList = durationMapper.selectList(new LambdaQueryWrapper<SpaceOptimizeShortDurationEnt>()
.eq(SpaceOptimizeShortDurationEnt::getShortPeriodId, shortPeriodId)
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.ge(SpaceOptimizeShortPeriodEnt::getOptimizeDate, DateUtil.beginOfDay(DateUtil.date()))
.orderByAsc(SpaceOptimizeShortDurationEnt::getIsOptimize, SpaceOptimizeShortDurationEnt::getOpenWellTime)
);
Map<String, List<SpaceOptimizeDateDuration>> collect = new HashMap<>(0);
if (Objects.nonNull(period)) {
//如果存在,查出优化过的区间
SpaceOptimizeShortDurationViewMapper durationViewMapper = context.getBean(SpaceOptimizeShortDurationViewMapper.class);
List<SpaceOptimizeShortDurationView> durationViewList = durationViewMapper.selectList(SpaceOptimizeShortDurationView.builder()
.shortPeriodId(period.getId())
.build()
);
if (CollUtil.isNotEmpty(durationViewList)) {
collect = XCopyUtils.copyNewList(durationViewList, SpaceOptimizeDateDuration.class)
.stream()
.collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getWellheadId));
if (CollUtil.isNotEmpty(durationList)) {
List<SpaceOptimizeDateDuration> durationOutputs = XCopyUtils.copyNewList(durationList, SpaceOptimizeDateDuration.class);
Map<String, List<SpaceOptimizeDateDuration>> collect = new HashMap<>(16);
for (SpaceOptimizeDateDuration durationOutput : durationOutputs) {
if (StringUtils.isEmpty(durationOutput.getGenerationTypeKey())) {
durationOutput.setGenerationTypeKey(BusinessConstant.PHOTOVOLTAIC);
}
List<SpaceOptimizeDateDuration> tmpList = collect.get(durationOutput.getWellheadId());
if (CollUtil.isEmpty(tmpList)) {
tmpList = new ArrayList<>(16);
tmpList.add(durationOutput);
collect.put(durationOutput.getWellheadId(), tmpList);
} else {
//如果没有,查初始区间
SpaceInstitutionDurationMapper durationMapper = context.getBean(SpaceInstitutionDurationMapper.class);
List<SpaceInstitutionDurationEnt> durationEntList = durationMapper.selectList(new LambdaQueryWrapper<SpaceInstitutionDurationEnt>()
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.eq(SpaceInstitutionDurationEnt::getInstitutionId, institutionId)
.orderByAsc(SpaceInstitutionDurationEnt::getOpenWellTime)
);
if (CollUtil.isNotEmpty(durationEntList)) {
collect = XCopyUtils.copyNewList(durationEntList, SpaceOptimizeDateDuration.class)
.stream()
.collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getWellheadId));
tmpList.add(durationOutput);
}
}
//遍历井口,添加区间
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())));
wellheadOutputs.forEach(w -> {
if (collect.containsKey(w.getWellheadId())) {
Map<Integer, List<SpaceOptimizeDateDuration>> listMap = collect.get(w.getWellheadId()).stream()
.collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getIsOptimize));
w.setOptimizeList(ServiceUtil.getAllDateDuration(listMap.get(0)));
w.setInitializeList(ServiceUtil.getAllDateDuration(listMap.get(1)));
} else {
//大间开处理
if (StringUtils.equals(BusinessConstant.STRING_ONE, wellheadViewOutput.getIntervalTypeKey())) {
Integer isOpen = BusinessConstant.ZERO;
String closeWellTime = BusinessConstant.START_OF_DAY_TIME;
if (ServiceUtil.checkWellIsOpen(wellheadViewOutput.getOpenWellDay(), wellheadViewOutput.getCloseWellDay(), wellheadViewOutput.getCreateTime(), date)) {
isOpen = BusinessConstant.ONE;
closeWellTime = BusinessConstant.END_OF_DAY_TIME;
w.setOptimizeList(new ArrayList<>(0));
w.setInitializeList(new ArrayList<>(0));
}
wellheadViewOutput.setDurationList(
CollUtil.newArrayList(SpaceOptimizeDateDuration.builder()
.openWellTime(BusinessConstant.START_OF_DAY_TIME)
.closeWellTime(closeWellTime)
.isOpen(isOpen)
.isOptimize(BusinessConstant.ONE)
.build())
);
});
}
output.setWellheadList(wellheadOutputs);
} else {
//全关
wellheadViewOutput.setDurationList(
CollUtil.newArrayList(SpaceOptimizeDateDuration.builder()
.openWellTime(BusinessConstant.START_OF_DAY_TIME)
.closeWellTime(BusinessConstant.END_OF_DAY_TIME)
.isOpen(BusinessConstant.ZERO)
.isOptimize(BusinessConstant.ONE)
output.setWellheadList(new ArrayList<>(0));
}
//查功率预测信息
output.setPowerGenerationList(
super.getAveragePowerGenerationHourList(context, DynamicQueryPlantPredictedPowerInput.builder()
.plantIds(super.getOptimizeLineRelation(context, CollUtil.newArrayList(detailEnt))
.getPlantIdsByLineIdMap()
.get(detailEnt.getLineId()))
.startTime(DateUtil.beginOfDay(period.getCreateTime()).toString())
.endTime(DateUtil.beginOfDay(period.getOptimizeDate()).toString())
.dateType(BusinessConstant.ONE)
.build())
);
}
}
}
output.setWellheadList(wellheadViewOutputs);
}
return XSingleResult.success(output);
}
}
\ No newline at end of file
......@@ -13,7 +13,7 @@ import xstartup.annotation.XText;
@Data
public class GetSpaceOptimizeShortPeriodViewInput {
@XText("线路ID")
@NotBlank(message = "缺少线路ID")
private String lineId;
@XText("ID")
@NotBlank(message = "缺少极短期ID")
private String id;
}
package pps.core.space.service.data.space_optimize_short_period;
import lombok.Data;
import pps.core.space.service.data.space_optimize_short_wellhead.GetSpaceOptimizeShortWellheadViewOutput;
import pps.cloud.base.service.data.base_price_strategy_detail.GetBasePriceStrategyDetailOutput;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerOutput;
import pps.core.space.service.data.SpaceOptimizeDateOutput;
import pps.core.space.service.data.space_optimize_short_wellhead.GetSpaceOptimizeShortWellheadOutput;
import xstartup.annotation.XText;
import java.util.Date;
import java.util.List;
/**
......@@ -15,6 +19,24 @@ import java.util.List;
@Data
public class GetSpaceOptimizeShortPeriodViewOutput {
@XText("ID")
private String id;
@XText("线路ID")
private String lineId;
@XText("间开制度ID")
private String institutionId;
@XText("执行周期")
private String executionCycle;
@XText("优化状态(0_已优化;1_未优化)")
private Integer optimizeState;
@XText("优化截止日期")
private Date optimizeDate;
/**
* 电网类型key
*/
......@@ -22,8 +44,26 @@ public class GetSpaceOptimizeShortPeriodViewOutput {
private String gridTypeKey;
/**
* 井口列表
* 已优化日期列表
*/
@XText("已优化日期列表")
List<SpaceOptimizeDateOutput> dateList;
/**
* 策略配置列表
*/
@XText("策略配置列表")
List<GetBasePriceStrategyDetailOutput> strategyDetailList;
/**
* 井口信息
*/
@XText("井口信息")
List<GetSpaceOptimizeShortWellheadOutput> wellheadList;
/**
* 功率预测列表
*/
@XText("井口列表")
private List<GetSpaceOptimizeShortWellheadViewOutput> wellheadList;
@XText("功率预测列表")
List<DynamicQueryPlantPredictedPowerOutput> powerGenerationList;
}
package pps.core.space.service.data.space_optimize_short_period;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
/**
* 短期间开开优化周期记录
*
* @author ZWT
* @date 2023/09/07
*/
@Data
public class QuerySpaceOptimizeShortPeriodViewInput extends XPageInput {
@XText("线路ID")
@NotBlank(message = "缺少线路ID")
private String lineId;
}
package pps.core.space.service.data.space_optimize_short_period;
import lombok.Data;
import xstartup.annotation.XText;
import java.util.Date;
/**
* 短期间开开优化周期记录
*
* @author ZWT
* @date 2023/09/07
*/
@Data
public class QuerySpaceOptimizeShortPeriodViewOutput {
@XText("ID")
private String id;
@XText("线路ID")
private String lineId;
@XText("间开制度ID")
private String institutionId;
@XText("执行周期")
private String executionCycle;
@XText("优化状态(0_已优化;1_未优化)")
private Integer optimizeState;
@XText("优化截止日期")
private Date optimizeDeadline;
/**
* 组织机构ID
*/
@XText("组织机构ID")
private String ouId;
/**
* 电网类型key(字典获取)
*/
@XText("电网类型key(字典获取)")
private String gridTypeKey;
/**
* 制度名称
*/
@XText("制度名称")
private String institutionName;
/**
* 线路名称
*/
@XText("线路名称")
private String lineName;
/**
* 组织机构名称
*/
@XText("组织机构名称")
private String ouName;
/**
* 电网类型名称
*/
@XText("电网类型名称")
private String gridTypeName;
/**
* 优化状态值
*/
@XText("优化状态(0_已优化;1_未优化)")
private String optimizeStateValue;
}
package pps.core.space.service.data.space_optimize_short_wellhead;
import lombok.Data;
import pps.core.space.service.data.SpaceOptimizeDateDuration;
import xstartup.annotation.XText;
import java.util.List;
/**
* 极短期间开优化井口记录
*
* @author ZWT
* @date 2024/03/22
*/
@Data
public class GetSpaceOptimizeShortWellheadOutput {
@XText("ID")
private String id;
@XText("井口ID")
private String wellheadId;
@XText("井号")
private String wellNumber;
/**
* 井口配置(未优化)
*/
@XText("井口配置(未优化)")
private List<SpaceOptimizeDateDuration> initializeList;
/**
* 井口配置(已优化)
*/
@XText("井口配置(已优化)")
private List<SpaceOptimizeDateDuration> optimizeList;
}
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