Commit 73487724 authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.对接第三方接口,接入第三方数据,完成Token接口验证,抽取公用方法封装调用工具类;
2.对接第三方接口,完成获取日耗电日产液等信息接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
3.对接第三方接口,完成获取有功功率数据信息接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
4.对接第三方接口,完成获取甘特图数据接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
5.对接第三方接口,完成本日累计数据接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
6.对接第三方接口,完成光伏发电量接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
7.对接第三方接口,完成三叠登录接口调用,添加线上接口文档并完成接口及定时任务冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent c956b374
...@@ -23,6 +23,9 @@ public class DynamicQueryBasePowerLineWellheadInput { ...@@ -23,6 +23,9 @@ public class DynamicQueryBasePowerLineWellheadInput {
@XText("线路ID") @XText("线路ID")
private String lineId; private String lineId;
@XText("线路ID集合")
private List<String> lineIds;
@XText("井口ID集合") @XText("井口ID集合")
private List<String> wellheadIds; private List<String> wellheadIds;
} }
...@@ -66,4 +66,11 @@ public class BasePowerLineWellheadView extends BaseModel implements Serializable ...@@ -66,4 +66,11 @@ public class BasePowerLineWellheadView extends BaseModel implements Serializable
@XText("井口ID集合") @XText("井口ID集合")
@TableField(exist = false) @TableField(exist = false)
private List<String> wellheadIds; private List<String> wellheadIds;
/**
* 线路ID集合
*/
@XText("线路ID集合")
@TableField(exist = false)
private List<String> lineIds;
} }
...@@ -127,6 +127,7 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService ...@@ -127,6 +127,7 @@ public class BasePowerLineCloudServiceImpl implements IBasePowerLineCloudService
List<BasePowerLineWellheadView> wellheadViews = wellheadViewMapper.selectWellheadListByParam( List<BasePowerLineWellheadView> wellheadViews = wellheadViewMapper.selectWellheadListByParam(
BasePowerLineWellheadView.builder() BasePowerLineWellheadView.builder()
.lineId(input.getLineId()) .lineId(input.getLineId())
.lineIds(input.getLineIds())
.wellheadIds(input.getWellheadIds()) .wellheadIds(input.getWellheadIds())
.build() .build()
); );
......
...@@ -72,14 +72,23 @@ ...@@ -72,14 +72,23 @@
FROM FROM
base_power_line_wellhead l base_power_line_wellhead l
JOIN base_wellhead w ON l.wellhead_id = w.id JOIN base_wellhead w ON l.wellhead_id = w.id
WHERE <where>
l.line_id = #{lineId} <if test="lineId!=null and lineId!=''">
<if test="wellheadIds != null"> AND l.line_id = #{lineId}
AND l.wellhead_id NOT IN </if>
<foreach collection="wellheadIds" open="(" close=")" separator="," item="item"> <if test="lineIds != null">
#{item} AND l.line_id IN
</foreach> <foreach collection="lineIds" open="(" close=")" separator="," item="item">
</if> #{item}
</foreach>
</if>
<if test="wellheadIds != null">
AND l.wellhead_id NOT IN
<foreach collection="wellheadIds" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</if>
</where>
</select> </select>
<insert id="batchInsertList" parameterType="list"> <insert id="batchInsertList" parameterType="list">
......
package pps.core.prediction.service; package pps.core.prediction.service;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadInput;
import pps.cloud.base.service.data.base_power_line_wellhead.DynamicQueryBasePowerLineWellheadViewOutput;
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.ThirdPhotovoltaicPowerEnt;
import pps.core.prediction.entity.WellheadDailyProductionSituationEnt;
import pps.core.prediction.mapper.ThirdPhotovoltaicPowerMapper;
import pps.core.prediction.mapper.WellheadDailyProductionSituationMapper;
import pps.core.prediction.service.data.third_photovoltaic_power.GetThirdPhotovoltaicPowerInput;
import pps.core.prediction.service.data.third_photovoltaic_power.GetThirdPhotovoltaicPowerOutput;
import xstartup.annotation.XService; import xstartup.annotation.XService;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XListResult;
import xstartup.data.XSingleResult;
import xstartup.feature.api.annotation.XApiAnonymous;
import xstartup.feature.api.annotation.XApiGet;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* 第三方光伏日发电量 * 第三方光伏日发电量
...@@ -13,4 +44,171 @@ import xstartup.annotation.XText; ...@@ -13,4 +44,171 @@ import xstartup.annotation.XText;
@XService @XService
public class ThirdPhotovoltaicPowerService { public class ThirdPhotovoltaicPowerService {
/**
* 获取光伏发电概述
*
* @param context 上下文
* @param input 输入
* @return {@link XSingleResult}<{@link GetThirdPhotovoltaicPowerOutput}>
*/
@XText("能耗分析--能耗概览")
@XApiAnonymous
@XApiGet
public XSingleResult<GetThirdPhotovoltaicPowerOutput> getPhotovoltaicPowerOverview(XContext context, GetThirdPhotovoltaicPowerInput input) {
GetThirdPhotovoltaicPowerOutput output = new GetThirdPhotovoltaicPowerOutput();
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> lineNameList = new ArrayList<>(lineList.size());
List<String> lineIdList = new ArrayList<>(lineList.size());
lineList.forEach(line -> {
lineNameList.add(line.getLineName());
lineIdList.add(line.getId());
});
input.getBetweenDate();
BigDecimal powerConsumption;
//查井口
List<DynamicQueryBasePowerLineWellheadViewOutput> wellheadList = this.getBaseWellheadListByLineIdList(context, lineIdList);
if (CollUtil.isEmpty(lineList)) {
powerConsumption = BigDecimal.ONE;
} else {
WellheadDailyProductionSituationMapper wellheadMapper = context.getBean(WellheadDailyProductionSituationMapper.class);
WellheadDailyProductionSituationEnt wellheadSituationEnt = wellheadMapper.selectOne(new QueryWrapper<WellheadDailyProductionSituationEnt>()
.select("IFNULL( SUM( daily_electricity_consumption ), 0 ) AS daily_electricity_consumption")
.lambda()
.in(WellheadDailyProductionSituationEnt::getWellheadId, wellheadList.stream()
.map(DynamicQueryBasePowerLineWellheadViewOutput::getWellheadId)
.collect(Collectors.toSet()))
.between(WellheadDailyProductionSituationEnt::getDataDate, input.getStartTime(), input.getEndTime())
);
powerConsumption = wellheadSituationEnt.getDailyElectricityConsumption();
}
//查光伏发电
ThirdPhotovoltaicPowerMapper powerMapper = context.getBean(ThirdPhotovoltaicPowerMapper.class);
ThirdPhotovoltaicPowerEnt photovoltaicPowerEnt = powerMapper.selectOne(new QueryWrapper<ThirdPhotovoltaicPowerEnt>()
.select("IFNULL( SUM( photovoltaic_power ), 0 ) AS photovoltaic_power")
.lambda()
.in(ThirdPhotovoltaicPowerEnt::getStationName, lineNameList)
.between(ThirdPhotovoltaicPowerEnt::getCreateDate, input.getStartTime(), input.getEndTime())
);
output.setPowerGeneration(photovoltaicPowerEnt.getPhotovoltaicPower());
output.setPowerConsumption(powerConsumption);
output.setAbsorptionRate(this.getAbsorptionRate(photovoltaicPowerEnt.getPhotovoltaicPower(), powerConsumption));
}
return XSingleResult.success(output);
}
/*-----------------------------------private-----------------------------------*/
/**
* 分页功能封装查询条件
*
* @param lineIds 线路ID
* @param startTime 开始时间
* @param endTime 结束时间
* @return {@link LambdaQueryWrapper}<{@link EnergyConsumptionAnalysisEnt}>
*/
private LambdaQueryWrapper<EnergyConsumptionAnalysisEnt> getQueryWrapper4Page(Collection<String> lineIds, Date startTime, Date endTime) {
return new QueryWrapper<EnergyConsumptionAnalysisEnt>()
.select("IFNULL( SUM( power_generation ), 0 ) AS power_generation",
"IFNULL( SUM( power_consumption ), 0 ) AS power_consumption",
"line_id")
.lambda()
.in(EnergyConsumptionAnalysisEnt::getLineId, lineIds)
.between(EnergyConsumptionAnalysisEnt::getDataDate, startTime, endTime)
.groupBy(EnergyConsumptionAnalysisEnt::getLineId)
.orderByAsc(EnergyConsumptionAnalysisEnt::getPowerGeneration);
}
/**
* 获取消纳率
* 消纳率:光伏发电/累计用电*100%
*
* @param powerGeneration 发电
* @param powerConsumption 功耗
* @return {@link BigDecimal}
*/
private BigDecimal getAbsorptionRate(BigDecimal powerGeneration, BigDecimal powerConsumption) {
BigDecimal absorptionRate;
if (powerConsumption.compareTo(BigDecimal.ZERO) > 0) {
absorptionRate = powerGeneration.divide(powerConsumption, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
} else {
absorptionRate = BigDecimal.ZERO;
}
return absorptionRate;
}
/**
* 获取环比
* (本期-上期) /上期*100%
*
* @param currentPeriod 本期
* @param lastPeriod 上期
* @return {@link BigDecimal}
*/
private BigDecimal getCycleRatio(BigDecimal currentPeriod, BigDecimal lastPeriod) {
BigDecimal cycleRatio;
if (lastPeriod.compareTo(BigDecimal.ZERO) > 0) {
cycleRatio = currentPeriod.subtract(lastPeriod)
.divide(lastPeriod, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal(100));
} else {
cycleRatio = BigDecimal.ZERO;
}
return cycleRatio;
}
/**
* 获取所有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();
}
/**
* 查询线路列表下所有井口
*
* @param context 上下文
* @param lineIdList 行id列表
* @return {@link List}<{@link DynamicQueryBasePowerLineWellheadViewOutput}>
*/
private List<DynamicQueryBasePowerLineWellheadViewOutput> getBaseWellheadListByLineIdList(XContext context, List<String> lineIdList) {
IBasePowerLineCloudService basePowerLineCloudService = context.getBean(IBasePowerLineCloudService.class);
XListResult<DynamicQueryBasePowerLineWellheadViewOutput> wellheadList = basePowerLineCloudService.getPowerLineWellheadList(context, DynamicQueryBasePowerLineWellheadInput.builder()
.lineIds(lineIdList)
.build());
wellheadList.throwIfFail();
return wellheadList.getResult();
}
} }
package pps.core.prediction.service.data.third_photovoltaic_power; package pps.core.prediction.service.data.third_photovoltaic_power;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import pps.core.prediction.enums.BusinessError;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import xstartup.base.exception.XServiceException;
import java.util.Date; import java.util.Date;
import java.math.BigDecimal;
/**
* 能耗分析
*
* @author ZWT
* @date 2024/03/20
*/
@Data
public class GetThirdPhotovoltaicPowerInput { public class GetThirdPhotovoltaicPowerInput {
@XText("ID")
private Long id;
@XText("井组名称(线路/光伏电站)")
private String stationName;
@XText("创建时间")
private Date createDate;
@XText("光伏发电量(KW·h)")
private BigDecimal photovoltaicPower;
@XText("来源系统")
private String systemSource;
public Long getId() {
return this.id;
}
public void setId(Long value) {
this.id = value;
}
public String getStationName() {
return this.stationName;
}
public void setStationName(String value) {
this.stationName = value;
}
public Date getCreateDate() {
return this.createDate;
}
public void setCreateDate(Date value) {
this.createDate = value;
}
public BigDecimal getPhotovoltaicPower() {
return this.photovoltaicPower;
}
public void setPhotovoltaicPower(BigDecimal value) {
this.photovoltaicPower = value;
}
public String getSystemSource() { /**
return this.systemSource; * 组织机构ID
*/
@NotBlank(message = "缺少组织机构ID")
@XText("组织机构ID")
private String ouId;
/**
* 日期类型(1_近7天,2_近30天,3_自定义)
*/
@NotNull(message = "缺少日期类型")
@XText("日期类型(1_近7天,2_近30天,3_自定义)")
private Integer dateType;
/**
* 开始时间
*/
@XText("开始时间")
private Date startTime;
/**
* 结束时间
*/
@XText("结束时间")
private Date endTime;
/**
* 初始化开始结束日期
* 近7天:昨天开始前七天;近30天:昨天开始前30天;上期:所选周期往前推一个周期
*/
public void getBetweenDate() {
switch (this.dateType) {
case 1:
this.endTime = DateUtil.beginOfDay(DateUtil.yesterday());
this.startTime = DateUtil.offsetDay(endTime, -6);
break;
case 2:
this.endTime = DateUtil.beginOfDay(DateUtil.yesterday());
this.startTime = DateUtil.offsetDay(endTime, -29);
break;
case 3:
if (ObjectUtil.isNull(this.endTime) || ObjectUtil.isNull(this.startTime)) {
throw new XServiceException(BusinessError.TheStartEndDateIsMissing);
}
break;
default:
throw new XServiceException(BusinessError.DateTypeError);
}
} }
public void setSystemSource(String value) {
this.systemSource = value;
}
} }
package pps.core.prediction.service.data.third_photovoltaic_power; package pps.core.prediction.service.data.third_photovoltaic_power;
import lombok.Data;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.util.Date;
import java.math.BigDecimal; import java.math.BigDecimal;
/**
* 能耗分析
*
* @author ZWT
* @date 2024/03/20
*/
@Data
public class GetThirdPhotovoltaicPowerOutput { public class GetThirdPhotovoltaicPowerOutput {
@XText("ID") @XText("发电量(kWh)")
private Long id; private BigDecimal powerGeneration;
@XText("井组名称(线路/光伏电站)")
private String stationName;
@XText("创建时间")
private Date createDate;
@XText("光伏发电量(KW·h)")
private BigDecimal photovoltaicPower;
@XText("来源系统")
private String systemSource;
public Long getId() {
return this.id;
}
public void setId(Long value) {
this.id = value;
}
public String getStationName() {
return this.stationName;
}
public void setStationName(String value) {
this.stationName = value;
}
public Date getCreateDate() {
return this.createDate;
}
public void setCreateDate(Date value) {
this.createDate = value;
}
public BigDecimal getPhotovoltaicPower() {
return this.photovoltaicPower;
}
public void setPhotovoltaicPower(BigDecimal value) {
this.photovoltaicPower = value;
}
public String getSystemSource() {
return this.systemSource;
}
public void setSystemSource(String value) { @XText("用电量(kWh)")
this.systemSource = value; private BigDecimal powerConsumption;
}
@XText("消纳率(%)")
private BigDecimal absorptionRate;
} }
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