Commit ad41c4c6 authored by ZWT's avatar ZWT

feat(能源管理系统): 邮件接收

1.统计分析-能耗分析模块重构,删除原有接口及代码,新建能耗分析测试用数据表,生成相关代码并集成到项目中并上传git;
2.统计分析-能耗分析模块能耗概览接口开发,输电线路Cloud模块新增通过组织结构ID列表查询线路列表接口,完成能耗分析模块能耗概览接口业务逻辑开发,添加线上接口文档并完成接口冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent f9253eb2
......@@ -52,6 +52,17 @@ public interface IBasePowerLineCloudService {
@XApiPost
XListResult<DynamicQueryBasePowerLineOutput> getBasePowerLineList(XContext context, DynamicQueryBasePowerLineInput input);
/**
* 输电线路配置Cloud模块--查询组织列表下所有线路
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult}<{@link DynamicQueryBasePowerLineOutput}>
*/
@XText("输电线路配置Cloud模块--查询组织列表下所有线路")
@XApiPost
XListResult<DynamicQueryBasePowerLineOutput> getBasePowerLineListByOuIdList(XContext context, DynamicQueryBasePowerLineInput input);
/**
* 输电线路配置Cloud模块--条件查询线路关联井口信息
*
......
......@@ -29,6 +29,9 @@ public class DynamicQueryBasePowerLineInput {
@XText("组织机构ID")
private String ouId;
@XText("组织机构ID集合")
private List<String> ouIdList;
@XText("上级线路ID")
private String upperLineId;
......
......@@ -18,6 +18,7 @@ public enum BusinessError implements XError {
WellheadReferenceSpace(2006, "当前井口已被间开引用"),
WellNumberExists(2007, "井号已存在"),
MakerNumberExists(2008, "出场编号已存在"),
Missing_Organization_ID(2009, "缺少组织ID"),
;
private int code;
......
......@@ -16,6 +16,7 @@ import pps.cloud.base.service.data.base_power_line_storage.DynamicQueryBasePower
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadInput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput;
import pps.core.base.entity.*;
import pps.core.base.enums.BusinessError;
import pps.core.base.mapper.*;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.entity.BaseModel;
......@@ -73,6 +74,7 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService
BasePowerLineMapper mapper = context.getBean(BasePowerLineMapper.class);
List<BasePowerLineEnt> selectList = mapper.selectList(new LambdaQueryWrapper<BasePowerLineEnt>()
.select(BaseModel::getId, BasePowerLineEnt::getLineName)
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.in(CollUtil.isNotEmpty(lineIds), BaseModel::getId, lineIds)
.eq(StringUtils.isNotBlank(lineId), BaseModel::getId, lineId)
.eq(StringUtils.isNotBlank(ouId), BasePowerLineEnt::getOuId, ouId)
......@@ -86,6 +88,28 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService
return XListResult.success(XCopyUtils.copyNewList(selectList, DynamicQueryBasePowerLineOutput.class));
}
/**
* 输电线路配置Cloud模块--查询组织列表下所有线路
*
* @param context 上下文
* @param input 输入
* @return {@link XListResult}<{@link DynamicQueryBasePowerLineOutput}>
*/
@Override
public XListResult<DynamicQueryBasePowerLineOutput> getBasePowerLineListByOuIdList(XContext context, DynamicQueryBasePowerLineInput input) {
List<String> ouIdList = input.getOuIdList();
if (CollUtil.isEmpty(ouIdList)) {
return XListResult.error(context, BusinessError.Missing_Organization_ID);
}
BasePowerLineMapper mapper = context.getBean(BasePowerLineMapper.class);
List<BasePowerLineEnt> selectList = mapper.selectList(new LambdaQueryWrapper<BasePowerLineEnt>()
.select(BaseModel::getId, BasePowerLineEnt::getLineName)
.eq(BaseModel::getIsDeleted, BusinessConstant.ONE)
.in(BasePowerLineEnt::getOuId, ouIdList)
);
return XListResult.success(XCopyUtils.copyNewList(selectList, DynamicQueryBasePowerLineOutput.class));
}
/**
* 输电线路配置Cloud模块--条件查询线路关联井口信息
*
......
package pps.core.prediction.enums;
import xstartup.error.XError;
/**
* 业务错误
*
* @author ZWT
* @date 2023/11/23
*/
public enum BusinessError implements XError {
DateTypeError(2200, "日期类型错误"),
;
private int code;
private String text;
BusinessError(int code, String text) {
this.code = code;
this.text = text;
}
@Override
public int getCode() {
return code;
}
@Override
public String getText() {
return text;
}
}
package pps.core.prediction.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.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import pps.cloud.base.service.IBasePowerLineCloudService;
import pps.cloud.base.service.data.base_power_line.DynamicQueryBasePowerLineInput;
import pps.cloud.base.service.data.base_power_line.DynamicQueryBasePowerLineOutput;
import pps.cloud.system.service.SysOrganizationCloudService;
import pps.cloud.system.service.data.GetAllOuListByOuIdInput;
import pps.cloud.system.service.data.GetSysOrganizationViewOutput;
import pps.core.prediction.entity.EnergyConsumptionAnalysisEnt;
import pps.core.prediction.entity.EnergyConsumptionAnalysisView;
import pps.core.prediction.enums.BusinessError;
import pps.core.prediction.mapper.EnergyConsumptionAnalysisMapper;
import pps.core.prediction.mapper.EnergyConsumptionAnalysisViewMapper;
import pps.core.prediction.service.data.energy_consumption_analysis.*;
......@@ -13,14 +23,18 @@ import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.data.CustomQueryInput;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XListResult;
import xstartup.data.XPageResult;
import xstartup.data.XSingleResult;
import xstartup.error.XError;
import xstartup.feature.api.annotation.XApiAnonymous;
import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.mybatis.helper.XMapperHelper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* 能耗分析模块(测试用)
......@@ -33,33 +47,80 @@ import java.util.List;
@XService
public class EnergyConsumptionAnalysisService {
/**
* 能耗分析--能耗概览
*
* @param context 上下文
* @param input 输入
* @return {@link XSingleResult}<{@link GetEnergyConsumptionAnalysisViewOutput}>
*/
@XText("能耗分析--能耗概览")
@XApiAnonymous
@XApiGet
public XSingleResult<GetEnergyConsumptionAnalysisOutput> getEnergyConsumptionAnalysis(XContext context, GetEnergyConsumptionAnalysisInput input) {
EnergyConsumptionAnalysisMapper mapper = context.getBean(EnergyConsumptionAnalysisMapper.class);
QueryWrapper<EnergyConsumptionAnalysisEnt> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(EnergyConsumptionAnalysisEnt::getId, input.getId());
EnergyConsumptionAnalysisEnt entity = mapper.selectOne(queryWrapper);
if (entity == null) {
return XSingleResult.error(context, XError.NotFound);
public XSingleResult<GetEnergyConsumptionAnalysisViewOutput> getEnergyConsumptionAnalysisView(XContext context, GetEnergyConsumptionAnalysisViewInput input) {
Date endTime, startTime;
//近7天:昨天开始前七天;近30天:昨天开始前30天;上期:所选周期往前推一个周期
switch (input.getDateType()) {
case 1:
endTime = DateUtil.beginOfDay(DateTime.now());
startTime = DateUtil.offsetDay(endTime, -7);
break;
case 2:
endTime = DateUtil.beginOfDay(DateTime.now());
startTime = DateUtil.offsetDay(endTime, -30);
break;
case 3:
endTime = input.getEndTime();
startTime = input.getStartTime();
break;
default:
return XSingleResult.error(context, BusinessError.DateTypeError);
}
GetEnergyConsumptionAnalysisViewOutput output = new GetEnergyConsumptionAnalysisViewOutput();
List<DynamicQueryBasePowerLineOutput> lineList = this.getBasePowerLineListByOuIdList(context, this.getOrgIdsByPath(context, input.getOuId()));
if (CollUtil.isEmpty(lineList)) {
output.setPowerGeneration(BigDecimal.ZERO);
output.setPowerConsumption(BigDecimal.ZERO);
output.setAbsorptionRate(BigDecimal.ZERO);
} else {
List<String> lineIdList = lineList.stream()
.map(DynamicQueryBasePowerLineOutput::getId)
.collect(Collectors.toList());
EnergyConsumptionAnalysisMapper mapper = context.getBean(EnergyConsumptionAnalysisMapper.class);
EnergyConsumptionAnalysisEnt analysisEnt = mapper.selectOne(new QueryWrapper<EnergyConsumptionAnalysisEnt>()
.select("IFNULL( SUM( power_generation ), 0 ) AS power_generation",
"IFNULL( SUM( power_consumption ), 0 ) AS power_consumption")
.lambda()
.in(EnergyConsumptionAnalysisEnt::getLineId, lineIdList)
.between(EnergyConsumptionAnalysisEnt::getDataDate, startTime, endTime)
);
output.setPowerGeneration(analysisEnt.getPowerGeneration());
output.setPowerConsumption(analysisEnt.getPowerConsumption());
//消纳率:光伏发电/累计用电*100%
if (analysisEnt.getPowerConsumption().compareTo(BigDecimal.ZERO) > 0) {
output.setAbsorptionRate(analysisEnt.getPowerGeneration().divide(analysisEnt.getPowerConsumption(), 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100)));
} else {
output.setAbsorptionRate(BigDecimal.ZERO);
}
}
GetEnergyConsumptionAnalysisOutput output = new GetEnergyConsumptionAnalysisOutput();
XCopyUtils.copyObject(entity, output);
return XSingleResult.success(output);
}
@XApiAnonymous
@XApiGet
public XPageResult<QueryEnergyConsumptionAnalysisOutput> queryEnergyConsumptionAnalysis(XContext context, QueryEnergyConsumptionAnalysisInput input) {
EnergyConsumptionAnalysisMapper mapper = context.getBean(EnergyConsumptionAnalysisMapper.class);
QueryWrapper<EnergyConsumptionAnalysisEnt> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(EnergyConsumptionAnalysisEnt::getId, input.getId())
.like(EnergyConsumptionAnalysisEnt::getLineId, input.getLineId())
.eq(EnergyConsumptionAnalysisEnt::getPowerGeneration, input.getPowerGeneration())
.eq(EnergyConsumptionAnalysisEnt::getPowerConsumption, input.getPowerConsumption())
.eq(EnergyConsumptionAnalysisEnt::getDataDate, input.getDataDate());
return XMapperHelper.query(mapper, input, queryWrapper, QueryEnergyConsumptionAnalysisOutput.class);
}
//
// @XApiAnonymous
// @XApiGet
// public XPageResult<QueryEnergyConsumptionAnalysisOutput> queryEnergyConsumptionAnalysis(XContext context, QueryEnergyConsumptionAnalysisInput input) {
// EnergyConsumptionAnalysisMapper mapper = context.getBean(EnergyConsumptionAnalysisMapper.class);
// QueryWrapper<EnergyConsumptionAnalysisEnt> queryWrapper = new QueryWrapper<>();
// queryWrapper.lambda().eq(EnergyConsumptionAnalysisEnt::getId, input.getId())
// .like(EnergyConsumptionAnalysisEnt::getLineId, input.getLineId())
// .eq(EnergyConsumptionAnalysisEnt::getPowerGeneration, input.getPowerGeneration())
// .eq(EnergyConsumptionAnalysisEnt::getPowerConsumption, input.getPowerConsumption())
// .eq(EnergyConsumptionAnalysisEnt::getDataDate, input.getDataDate());
// return XMapperHelper.query(mapper, input, queryWrapper, QueryEnergyConsumptionAnalysisOutput.class);
// }
@XApiAnonymous
@XApiGet
......@@ -68,20 +129,6 @@ public class EnergyConsumptionAnalysisService {
return XMapperHelper.query(mapper, input, EnergyConsumptionAnalysisEnt.class, QueryEnergyConsumptionAnalysisOutput.class);
}
@XApiAnonymous
@XApiGet
public XSingleResult<GetEnergyConsumptionAnalysisViewOutput> getEnergyConsumptionAnalysisView(XContext context, GetEnergyConsumptionAnalysisViewInput input) {
EnergyConsumptionAnalysisViewMapper mapper = context.getBean(EnergyConsumptionAnalysisViewMapper.class);
EnergyConsumptionAnalysisView record = new EnergyConsumptionAnalysisView();
XCopyUtils.copyObject(input, record);
EnergyConsumptionAnalysisView view = mapper.selectOne(record);
if (view == null) {
return XSingleResult.error(context, XError.NotFound);
}
GetEnergyConsumptionAnalysisViewOutput output = new GetEnergyConsumptionAnalysisViewOutput();
XCopyUtils.copyObject(view, output);
return XSingleResult.success(output);
}
@XApiAnonymous
@XApiGet
......@@ -96,4 +143,39 @@ public class EnergyConsumptionAnalysisService {
return XPageResult.success(outputs, input, pageInfo.getTotal());
}
/*-----------------------------------private-----------------------------------*/
/**
* 获取所有path包含组织ID的组织
*
* @param context 上下文
* @param ouId ou id
* @return {@link List}<{@link String}>
*/
private List<String> getOrgIdsByPath(XContext context, String ouId) {
SysOrganizationCloudService organizationCloudService = context.getBean(SysOrganizationCloudService.class);
GetAllOuListByOuIdInput ouIdInput = new GetAllOuListByOuIdInput();
ouIdInput.setOuId(ouId);
XListResult<GetSysOrganizationViewOutput> allListByOuId = organizationCloudService.getAllListByOuId(context, ouIdInput);
allListByOuId.throwIfFail();
return allListByOuId.getResult().stream()
.map(GetSysOrganizationViewOutput::getId)
.collect(Collectors.toList());
}
/**
* 查询组织列表下所有线路
*
* @param context 上下文
* @param ouIdList ou-id列表
* @return {@link List}<{@link DynamicQueryBasePowerLineOutput}>
*/
private List<DynamicQueryBasePowerLineOutput> getBasePowerLineListByOuIdList(XContext context, List<String> ouIdList) {
IBasePowerLineCloudService basePowerLineCloudService = context.getBean(IBasePowerLineCloudService.class);
XListResult<DynamicQueryBasePowerLineOutput> lineList = basePowerLineCloudService.getBasePowerLineListByOuIdList(context, DynamicQueryBasePowerLineInput.builder()
.ouIdList(ouIdList)
.build());
lineList.throwIfFail();
return lineList.getResult();
}
}
package pps.core.prediction.service.data.energy_consumption_analysis;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
......@@ -14,18 +15,29 @@ import java.util.Date;
*/
@Data
public class DynamicQueryEnergyConsumptionAnalysisInput {
@XText("ID")
private Long id;
/**
* 组织机构ID
*/
@NotBlank(message = "缺少组织机构ID")
@XText("组织机构ID")
private String ouId;
@XText("线路ID")
private String lineId;
/**
* 日期类型(1_近7天,2_近30天,3_自定义)
*/
@NotNull(message = "缺少日期类型")
@XText("日期类型(1_近7天,2_近30天,3_自定义)")
private Integer dateType;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
/**
* 开始时间
*/
@XText("开始时间")
private Date startTime;
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
/**
* 结束时间
*/
@XText("结束时间")
private Date endTime;
}
package pps.core.prediction.service.data.energy_consumption_analysis;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 能耗分析表(测试用)
*
* @author ZWT
* @date 2023/11/23
*/
@Data
public class GetEnergyConsumptionAnalysisInput {
@XText("ID")
private Long id;
@XText("线路ID")
private String lineId;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
}
package pps.core.prediction.service.data.energy_consumption_analysis;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 能耗分析表(测试用)
*
* @author ZWT
* @date 2023/11/23
*/
@Data
public class GetEnergyConsumptionAnalysisOutput {
@XText("ID")
private Long id;
@XText("线路ID")
private String lineId;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
}
package pps.core.prediction.service.data.energy_consumption_analysis;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
......@@ -14,18 +15,29 @@ import java.util.Date;
*/
@Data
public class GetEnergyConsumptionAnalysisViewInput {
@XText("ID")
private Long id;
/**
* 组织机构ID
*/
@NotBlank(message = "缺少组织机构ID")
@XText("组织机构ID")
private String ouId;
@XText("线路ID")
private String lineId;
/**
* 日期类型(1_近7天,2_近30天,3_自定义)
*/
@NotNull(message = "缺少日期类型")
@XText("日期类型(1_近7天,2_近30天,3_自定义)")
private Integer dateType;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
/**
* 开始时间
*/
@XText("开始时间")
private Date startTime;
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
/**
* 结束时间
*/
@XText("结束时间")
private Date endTime;
}
......@@ -4,7 +4,6 @@ import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 能耗分析表(测试用)
......@@ -14,11 +13,6 @@ import java.util.Date;
*/
@Data
public class GetEnergyConsumptionAnalysisViewOutput {
@XText("ID")
private Long id;
@XText("线路ID")
private String lineId;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
......@@ -26,6 +20,6 @@ public class GetEnergyConsumptionAnalysisViewOutput {
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
@XText("消纳率")
private BigDecimal absorptionRate;
}
package pps.core.prediction.service.data.energy_consumption_analysis;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
import java.math.BigDecimal;
import java.util.Date;
/**
......@@ -15,18 +16,29 @@ import java.util.Date;
*/
@Data
public class QueryEnergyConsumptionAnalysisInput extends XPageInput {
@XText("ID")
private Long id;
/**
* 组织机构ID
*/
@NotBlank(message = "缺少组织机构ID")
@XText("组织机构ID")
private String ouId;
@XText("线路ID")
private String lineId;
/**
* 日期类型(1_近7天,2_近30天,3_自定义)
*/
@NotNull(message = "缺少日期类型")
@XText("日期类型(1_近7天,2_近30天,3_自定义)")
private Integer dateType;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
/**
* 开始时间
*/
@XText("开始时间")
private Date startTime;
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
/**
* 结束时间
*/
@XText("结束时间")
private Date endTime;
}
package pps.core.prediction.service.data.energy_consumption_analysis;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import xstartup.annotation.XText;
import xstartup.base.data.XPageInput;
import java.math.BigDecimal;
import java.util.Date;
/**
......@@ -15,18 +16,29 @@ import java.util.Date;
*/
@Data
public class QueryEnergyConsumptionAnalysisViewInput extends XPageInput {
@XText("ID")
private Long id;
/**
* 组织机构ID
*/
@NotBlank(message = "缺少组织机构ID")
@XText("组织机构ID")
private String ouId;
@XText("线路ID")
private String lineId;
/**
* 日期类型(1_近7天,2_近30天,3_自定义)
*/
@NotNull(message = "缺少日期类型")
@XText("日期类型(1_近7天,2_近30天,3_自定义)")
private Integer dateType;
@XText("发电量(kWh)")
private BigDecimal powerGeneration;
/**
* 开始时间
*/
@XText("开始时间")
private Date startTime;
@XText("用电量(kWh)")
private BigDecimal powerConsumption;
@XText("日期")
private Date dataDate;
/**
* 结束时间
*/
@XText("结束时间")
private Date endTime;
}
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