新增光伏Mppt相关功能

This commit is contained in:
2025-11-28 10:04:04 +08:00
parent 6c23c4a9c4
commit 861155b2e5
46 changed files with 1722 additions and 512 deletions

View File

@ -15,6 +15,7 @@ import com.ho.business.vo.resp.DeviceRespVO;
import com.ho.business.vo.resp.EnvironmentalControlVo;
import com.ho.business.vo.resp.cabin.TemperatureVoltageNewResp;
import com.ho.business.vo.resp.point.ElecDataResp;
import com.ho.common.tools.annotation.TokenIgnore;
import com.ho.common.tools.constant.CommonConstant;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.BaseResponseCode;
@ -192,6 +193,10 @@ public class CommonController {
retInfo.putAll(dd);
}
}
// mppt
if (deviceType != null && deviceType.contains(DeviceTypeConstant.MPPT)) {
retInfo = commonService.getRealInfo(device, cols);
}
}
//虚拟设备
else if (device.getVirtual() == 1) {

View File

@ -8,11 +8,13 @@ import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.ho.business.entity.*;
import com.ho.business.service.EarningsCalculateMpptService;
import com.ho.business.service.EarningsCalculateService;
import com.ho.business.service.StationService;
import com.ho.business.util.QueuesUtil;
import com.ho.business.vo.OneKeyComputationVo;
import com.ho.business.vo.req.carbin.EarningsCalculateReq;
import com.ho.business.vo.resp.InverterResp.PowerGenerateRespVO;
import com.ho.business.vo.resp.cabin.EarningsCalculateResp;
import com.ho.common.tools.annotation.HzPermission;
import com.ho.common.tools.annotation.TokenIgnore;
@ -24,6 +26,7 @@ import com.ho.common.tools.exception.BaseResponseCode;
import com.ho.common.tools.exception.BusinessException;
import com.ho.common.tools.exception.DataResult;
import com.ho.common.tools.service.RedisService;
import com.ho.common.tools.util.BigDecimalUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -60,9 +63,15 @@ public class EarningsCalculateController {
@Autowired
EarningsCalculateService earningsCalculateService;
@Autowired
EarningsCalculateMpptService earningsCalculateMpptService;
@Autowired
private StationService stationService;
@Autowired
BigDecimalUtil bigDecimalUtil;
@PostMapping("/getTotal")
@ApiOperation(value = "获取月发电量报表")
@TokenIgnore
@ -87,6 +96,17 @@ public class EarningsCalculateController {
return DataResult.success(total);
}
@PostMapping("/getPvMonthData")
@ApiOperation(value = "mppt月发电、收益(使用mppt计算)")
public DataResult<List<PowerGenerateRespVO>> getPvMonthData(@RequestBody EarningsCalculateReq req) {
//获取光伏放电、收益
List<PowerGenerateRespVO> pvList = earningsCalculateService.getPvMonthData(req);
for (PowerGenerateRespVO pcsElecData : pvList) {
bigDecimalUtil.keepTwoDecimalPlaces(pcsElecData);
bigDecimalUtil.ifIsNUll(pcsElecData);
}
return DataResult.success(pvList);
}
@TokenIgnore
@PostMapping("/all")
@ApiOperation(value = "查询所有电站接口")
@ -114,6 +134,49 @@ public class EarningsCalculateController {
earningsCalculateService.queryDeviceByStationId(stations,null,beginTime);
}
@TokenIgnore
@PostMapping("/allMpptIncome")
@ApiOperation(value = "计算所有电站Mppt电价收益")
public void allMpptIncome(@RequestBody(required = false) String beginTime) {
try {
/*
* 定时任务 如果没有时间参数 就每天跑昨日数据
* 如果有 beginTime 参数不为空则先清除beginTime 时间的收益数据重新计算
*/
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = DateUtil.formatDate(yesterday);
if ( beginTime != null ) {
int i = earningsCalculateMpptService.deleteByDay(beginTime, null);
} else {
beginTime = yesterdayStr;
int i = earningsCalculateMpptService.deleteByDay(yesterdayStr, null);
}
} catch (Exception e) {
log.error("删除昨日数据失败:{}",e.getMessage());
}
List<Station> stations = stationService.selectAll();
//批量算的时候只计算电站是在投的且是接入光伏mppt的
stations = stations.stream().filter(i -> CommonConstant.ONE.equals(i.getStatus())
&&CommonConstant.ONE.equals(i.getInverterFlag())).collect(Collectors.toList());
earningsCalculateMpptService.allMpptIncome(stations,beginTime);
}
@TokenIgnore
@PostMapping("/allTodayMpptIncome")
@ApiOperation(value = "计算所有电站Mppt-今日收益")
public void allTodayMpptIncome(@RequestBody(required = false) String beginTime) {
DateTime nowDay = DateUtil.date();
String nowDayStr = DateUtil.formatDate(nowDay);
if ( beginTime == null ) {
beginTime = nowDayStr;
}
List<Station> stations = stationService.selectAll();
//批量算的时候只计算电站是在投的且是接入光伏mppt的
stations = stations.stream().filter(i -> CommonConstant.ONE.equals(i.getStatus())
&&CommonConstant.ONE.equals(i.getInverterFlag())).collect(Collectors.toList());
earningsCalculateMpptService.todayMpptIncome(stations,beginTime);
}
private List<String> getBetweenDate(String begin,String end){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
List<String> betweenList = new ArrayList<String>();

View File

@ -6,11 +6,7 @@ import com.ho.business.feignclient.UserFeignClient;
import com.ho.business.service.IargeScreenShowService;
import com.ho.business.service.StationService;
import com.ho.business.vo.req.cockpit.CockpitReqVO;
import com.ho.business.vo.resp.DeviceRespVO;
import com.ho.business.vo.resp.iargeScreen.AnnualChartValue;
import com.ho.business.vo.resp.iargeScreen.AnnualOverviewResp;
import com.ho.business.vo.resp.iargeScreen.EnergySavingRespVo;
import com.ho.business.vo.resp.iargeScreen.Subdata;
import com.ho.business.vo.resp.iargeScreen.*;
import com.ho.common.tools.annotation.CommonLargeScreenToken;
import com.ho.common.tools.annotation.TokenIgnore;
import com.ho.common.tools.constant.ContextConstant;
@ -419,5 +415,88 @@ public class IargeScreenShowController {
return DataResult.success(regionList);
}
/************************************************************************/
/*********************************以下为中自-光伏大屏接口***************************************/
@PostMapping("getZhongZiPvDistribution")
@ApiOperation(value = "中自-光伏电站区域分布")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiPvDistribution(@RequestBody CockpitReqVO vo) {
List<Subdata> regionList = iargeScreenShowService.getCommonPvRegionList((getByDeptId(vo.getDeptId())));
regionList.sort(Comparator.comparing((Subdata::getRegionValue)).reversed());
return DataResult.success(regionList);
}
@PostMapping("getZhongZiPvOverviewData")
@ApiOperation(value = "中自储能-光伏年度概览/年度收益概览接口返回")
@TokenIgnore
public DataResult<AnnualPvOverviewResp> getZhongZiPvOverviewData(@RequestBody CockpitReqVO vo) {
AnnualPvOverviewResp annualOverviewResp = iargeScreenShowService.getPvOverviewData(getByDeptId(vo.getDeptId()));
bigDecimalUtil.keepTwoDecimalPlaces(annualOverviewResp);
bigDecimalUtil.ifIsNUll(annualOverviewResp);
return DataResult.success(annualOverviewResp);
}
@PostMapping("getZhongZiPvEnergySaving")
@ApiOperation(value = "中自-光伏节能减排")
@TokenIgnore
public DataResult<EnergySavingRespVo> getZhongZiPvEnergySaving(@RequestBody CockpitReqVO vo) {
EnergySavingRespVo energySaving = iargeScreenShowService.getPvEnergySaving(getByDeptId(vo.getDeptId()));
bigDecimalUtil.keepTwoDecimalPlaces(energySaving);
bigDecimalUtil.ifIsNUll(energySaving);
return DataResult.success(energySaving);
}
@PostMapping("getZhongZiPvIncomeCurve")
@ApiOperation(value = "中自光伏收益曲线")
@TokenIgnore
public DataResult<List<AnnualChartValue>> getZhongZiPvIncomeCurve(@RequestBody CockpitReqVO vo) {
List<AnnualChartValue> list = iargeScreenShowService.getPVCommonProfitCurve(vo, getByDeptId(vo.getDeptId()));
for (AnnualChartValue annualChartValue : list) {
bigDecimalUtil.keepTwoDecimalPlaces(annualChartValue);
bigDecimalUtil.ifIsNUll(annualChartValue);
}
return DataResult.success(list);
}
@PostMapping("getZhongZiPvIncomeList")
@ApiOperation(value = "中自-光伏电站收益排名")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiPvIncomeList(@RequestBody CockpitReqVO vo) {
List<Subdata> regionList = iargeScreenShowService.getPvCommonProfit(null,null,getByDeptId(vo.getDeptId()));
if (regionList.size() > maxSize) {
regionList = regionList.subList(0, maxSize);
}
for (Subdata subdata : regionList) {
bigDecimalUtil.keepTwoDecimalPlaces(subdata);
bigDecimalUtil.ifIsNUll(subdata);
}
return DataResult.success(regionList);
}
@PostMapping("getZhongZiPvElecList")
@ApiOperation(value = "中自-光伏电站发电量排名")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiPvElecList(@RequestBody CockpitReqVO vo) {
List<Subdata> regionList = iargeScreenShowService.getPvCommonElec(null,null,getByDeptId(vo.getDeptId()));
if (regionList.size() > maxSize) {
regionList = regionList.subList(0, maxSize);
}
for (Subdata subdata : regionList) {
bigDecimalUtil.keepTwoDecimalPlaces(subdata);
bigDecimalUtil.ifIsNUll(subdata);
}
return DataResult.success(regionList);
}
@PostMapping("getZhongZiPvRelease")
@ApiOperation(value = "中自pv日发电量")
@TokenIgnore
public DataResult<List<AnnualChartValue>> getZhongZiPvRelease(@RequestBody CockpitReqVO vo) {
List<AnnualChartValue> list = iargeScreenShowService.getCommonPvRelease(getByDeptId(vo.getDeptId()));
for (AnnualChartValue subdata : list) {
bigDecimalUtil.keepTwoDecimalPlaces(subdata);
bigDecimalUtil.ifIsNUll(subdata);
}
return DataResult.success(list);
}
}

View File

@ -10,6 +10,7 @@ import com.ho.business.vo.req.StationReq;
import com.ho.business.vo.req.dynamicConfig.DynamicConfigQuery;
import com.ho.business.vo.req.pcsStation.PcsStationReq;
import com.ho.business.vo.resp.DeviceRespVO;
import com.ho.business.vo.resp.InverterResp.PowerGenerateRespVO;
import com.ho.business.vo.resp.cabin.CircleCtrlResp;
import com.ho.business.vo.resp.cabin.EarningsCalculateCountResp;
import com.ho.business.vo.resp.openStationHome.OpenStationMiddle;
@ -274,19 +275,7 @@ public class OpenStationController {
req.setDeviceType(deviceType);
}
List<PcsElecData> list = stationHomeService.getPcsElecData(req);
//获取光伏充电
List<PcsElecData> pvList = stationHomeService.getPvChargeElec(req);
Map<String, List<PcsElecData>> dataMap = pvList.stream().collect(Collectors.groupingBy(PcsElecData::getDate));
for (PcsElecData pcsElecData : list) {
if (dataMap.containsKey(pcsElecData.getDate())) {
List<PcsElecData> pcsElecData1 = dataMap.get(pcsElecData.getDate());
if (pcsElecData1.get(CommonConstant.ZERO).getPvChargeElec() != null) {
pcsElecData.setPvChargeElec(pcsElecData1.get(CommonConstant.ZERO).getPvChargeElec());
}
}
}
for (PcsElecData pcsElecData : list) {
bigDecimalUtil.keepTwoDecimalPlaces(pcsElecData);
bigDecimalUtil.ifIsNUll(pcsElecData);
@ -294,6 +283,20 @@ public class OpenStationController {
return DataResult.success(list);
}
@PostMapping("/getPvData")
@ApiOperation(value = "mppt放电、收益(使用mppt计算)")
public DataResult<List<PowerGenerateRespVO>> getPvData(@RequestBody PcsStationReq req) throws ParseException {
//获取光伏放电、收益
List<PowerGenerateRespVO> pvList = stationHomeService.getPvData(req);
for (PowerGenerateRespVO pcsElecData : pvList) {
bigDecimalUtil.keepTwoDecimalPlaces(pcsElecData);
bigDecimalUtil.ifIsNUll(pcsElecData);
}
return DataResult.success(pvList);
}
/**
* 导出累计充放电量数据
*

View File

@ -420,11 +420,11 @@ public class OuterApiController {
public DataResult jobIntegratedCabinet(@RequestBody MonitorQuery monitorQuery) {
log.info("jobIntegratedCabinet, {}", monitorQuery);
outApiService.dayChargeDeal(monitorQuery);
outApiService.currentMonthYearDeal(monitorQuery);
outApiService.dayPVCharge(monitorQuery);
// outApiService.currentMonthYearDeal(monitorQuery);
// outApiService.dayPVCharge(monitorQuery);
outApiService.dayPVMpptCharge(monitorQuery);
return DataResult.success();
}
//暴露接口加工一体柜 充电量放电量,当月充电量,放电量
@PostMapping("jobCabinet")
@ApiOperation(value = "暴露接口加工一体柜 充电量放电量,当月充电量,放电量")

View File

@ -8,6 +8,7 @@ import com.ho.business.vo.req.pcs.PcsUpdateReqVo;
import com.ho.business.vo.resp.AppRealTimeCurveRespVo;
import com.ho.business.vo.resp.pcs.PcsRunDataSetting;
import com.ho.common.tools.annotation.LogAnnotation;
import com.ho.common.tools.annotation.TokenIgnore;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.constant.RedisKeyConstant;
import com.ho.common.tools.entity.SimpleUser;
@ -77,6 +78,18 @@ public class PcsController {
return DataResult.success(resList);
}
@PostMapping("/pvCurve")
@ApiOperation(value = "mppt曲线")
public DataResult<List<AppRealTimeCurveRespVo>> pvCurve(@RequestBody MonitorQuery monitorQuery) {
List<AppRealTimeCurveRespVo> resList = stationHomeService.pvCurve(monitorQuery);
//返回值的BigDecimal类型保留两位小数
for (AppRealTimeCurveRespVo realTimeCurveRespVo : resList) {
bigDecimalUtil.keepTwoDecimalPlaces(realTimeCurveRespVo);
bigDecimalUtil.ifIsNUll(realTimeCurveRespVo);
}
return DataResult.success(resList);
}
@PostMapping("/opticalStorageCurve")
@ApiOperation(value = "光储逆变器曲线")