统计报表-收益报表:统一逻辑,电表尖、峰、平、谷差值直接乘以对应类型电价

This commit is contained in:
zq
2025-12-23 14:43:17 +08:00
parent 289fbc4d3a
commit d0bab53dee
2 changed files with 25 additions and 50 deletions

View File

@ -11,7 +11,7 @@ public class AmmeterStatisListVo {
/** 类别 */ /** 类别 */
private String dataTime; private String dataTime;
private String timePart; // private String timePart;
/** 组合有功-总 (kWh) */ /** 组合有功-总 (kWh) */
private BigDecimal activeTotalKwh = BigDecimal.ZERO; private BigDecimal activeTotalKwh = BigDecimal.ZERO;
@ -53,14 +53,14 @@ public class AmmeterStatisListVo {
public void setDataTime(String dataTime) { public void setDataTime(String dataTime) {
this.dataTime = dataTime; this.dataTime = dataTime;
} }
//
public String getTimePart() { // public String getTimePart() {
return timePart; // return timePart;
} // }
//
public void setTimePart(String timePart) { // public void setTimePart(String timePart) {
this.timePart = timePart; // this.timePart = timePart;
} // }
public BigDecimal getActiveTotalKwh() { public BigDecimal getActiveTotalKwh() {
return activeTotalKwh; return activeTotalKwh;

View File

@ -1,7 +1,6 @@
package com.xzzn.ems.service.impl; package com.xzzn.ems.service.impl;
import com.xzzn.common.enums.CostType; import com.xzzn.common.enums.CostType;
import com.xzzn.common.enums.SiteEnum;
import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.DateUtils;
import com.xzzn.ems.domain.EmsAmmeterData; import com.xzzn.ems.domain.EmsAmmeterData;
import com.xzzn.ems.domain.vo.AmmeterRevenueStatisListVo; import com.xzzn.ems.domain.vo.AmmeterRevenueStatisListVo;
@ -345,65 +344,41 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
@Override @Override
public List<AmmeterRevenueStatisListVo> getAmmeterRevenueDataResult(StatisAmmeterDateRequest requestVo) { public List<AmmeterRevenueStatisListVo> getAmmeterRevenueDataResult(StatisAmmeterDateRequest requestVo) {
String siteId = requestVo.getSiteId(); String siteId = requestVo.getSiteId();
String startTime = DateUtils.getDayBeginString(requestVo.getStartTime());
String endTime = DateUtils.getDayEndString(requestVo.getEndTime());
List<AmmeterRevenueStatisListVo> resultList = new ArrayList<>(); List<AmmeterRevenueStatisListVo> resultList = new ArrayList<>();
List<AmmeterStatisListVo> dataList = new ArrayList<>();
//查询电价配置 //查询电价配置
List<EnergyPriceConfigVo> priceConfigList = emsEnergyPriceConfigMapper.getConfigListByTimeFrame(siteId, requestVo.getStartTime(), requestVo.getEndTime()); List<EnergyPriceConfigVo> priceConfigList = emsEnergyPriceConfigMapper.getConfigListByTimeFrame(siteId, requestVo.getStartTime(), requestVo.getEndTime());
if (CollectionUtils.isEmpty(priceConfigList)){ if (CollectionUtils.isEmpty(priceConfigList)){
return Collections.emptyList(); return Collections.emptyList();
} }
//查询电表数据 //查询电表数据
if (SiteEnum.FX.getCode().equals(siteId)) { List<AmmeterStatisListVo> dataList = this.getAmmeterDataResult(requestVo);
dataList = emsAmmeterDataMapper.selectHourlyAmmeterData(siteId, startTime, endTime);
} else {
// 其他站点暂时默认与电动所内部一致处理,按天查询数据
dataList = emsAmmeterDataMapper.selectDailyAmmeterData(siteId, startTime, endTime);
}
if (CollectionUtils.isEmpty(dataList)) { if (CollectionUtils.isEmpty(dataList)) {
return Collections.emptyList(); return Collections.emptyList();
} }
Map<String, List<EnergyPriceConfigVo>> priceConfigMap = priceConfigList.stream().collect(Collectors.groupingBy(EnergyPriceConfigVo::getYearMonth)); Map<String, List<EnergyPriceConfigVo>> priceConfigMap = priceConfigList.stream().collect(Collectors.groupingBy(EnergyPriceConfigVo::getYearMonth));
Map<String, List<AmmeterStatisListVo>> ammeterMap = dataList.stream().collect(Collectors.groupingBy(AmmeterStatisListVo::getDataTime)); dataList.forEach(ammeter -> {
List<LocalDate> dateList = generateTargetDates(requestVo.getStartTime(), requestVo.getEndTime()); List<EnergyPriceConfigVo> priceConfigs = priceConfigMap.get(ammeter.getDataTime().substring(0, 7));
dateList.forEach(date -> { resultList.add(calculateDailyBill(ammeter, priceConfigs));
String dateTime = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List<EnergyPriceConfigVo> priceConfigs = priceConfigMap.get(dateTime.substring(0, 7));
List<AmmeterStatisListVo> ammeterStatisListVos = ammeterMap.get(dateTime);
resultList.add(calculateDailyBill(siteId, dateTime, ammeterStatisListVos, priceConfigs));
}); });
return resultList; return resultList;
} }
public static AmmeterRevenueStatisListVo calculateDailyBill(String siteId, String dateTime, List<AmmeterStatisListVo> ammeterList, List<EnergyPriceConfigVo> priceList) { public static AmmeterRevenueStatisListVo calculateDailyBill(AmmeterStatisListVo ammeter, List<EnergyPriceConfigVo> priceList) {
AmmeterRevenueStatisListVo ammeterRevenue = new AmmeterRevenueStatisListVo(); AmmeterRevenueStatisListVo ammeterRevenue = new AmmeterRevenueStatisListVo();
ammeterRevenue.setDataTime(dateTime); ammeterRevenue.setDataTime(ammeter.getDataTime());
if (CollectionUtils.isEmpty(ammeterList) || CollectionUtils.isEmpty(priceList)) { if (CollectionUtils.isEmpty(priceList)) {
return ammeterRevenue; return ammeterRevenue;
} }
if (SiteEnum.FX.getCode().equals(siteId)) { EnergyPriceConfigVo price = priceList.get(0);
for (AmmeterStatisListVo ammeter : ammeterList) { ammeterRevenue.setActivePeakPrice(ammeter.getActivePeakKwh().multiply(price.getPeak()));
for (EnergyPriceConfigVo priceConfig : priceList) { ammeterRevenue.setActiveHighPrice(ammeter.getActiveHighKwh().multiply(price.getHigh()));
if (isInTimeRange(priceConfig.getStartTime(), priceConfig.getEndTime(), ammeter.getTimePart())) { ammeterRevenue.setActiveFlatPrice(ammeter.getActiveFlatKwh().multiply(price.getFlat()));
calculateByCostType(ammeter, priceConfig, ammeterRevenue); ammeterRevenue.setActiveValleyPrice(ammeter.getActiveValleyKwh().multiply(price.getValley()));
} ammeterRevenue.setReActivePeakPrice(ammeter.getReActivePeakKwh().multiply(price.getPeak()));
} ammeterRevenue.setReActiveHighPrice(ammeter.getReActiveHighKwh().multiply(price.getHigh()));
} ammeterRevenue.setReActiveFlatPrice(ammeter.getReActiveFlatKwh().multiply(price.getFlat()));
} else { ammeterRevenue.setReActiveValleyPrice(ammeter.getReActiveValleyKwh().multiply(price.getValley()));
// 其他站点暂时默认与电动所内部一致处理,按天计算逻辑
AmmeterStatisListVo ammeter = ammeterList.get(0);
EnergyPriceConfigVo price = priceList.get(0);
ammeterRevenue.setActivePeakPrice(ammeter.getActivePeakKwh().multiply(price.getPeak()));
ammeterRevenue.setActiveHighPrice(ammeter.getActiveHighKwh().multiply(price.getHigh()));
ammeterRevenue.setActiveFlatPrice(ammeter.getActiveFlatKwh().multiply(price.getFlat()));
ammeterRevenue.setActiveValleyPrice(ammeter.getActiveValleyKwh().multiply(price.getValley()));
ammeterRevenue.setReActivePeakPrice(ammeter.getReActivePeakKwh().multiply(price.getPeak()));
ammeterRevenue.setReActiveHighPrice(ammeter.getReActiveHighKwh().multiply(price.getHigh()));
ammeterRevenue.setReActiveFlatPrice(ammeter.getReActiveFlatKwh().multiply(price.getFlat()));
ammeterRevenue.setReActiveValleyPrice(ammeter.getReActiveValleyKwh().multiply(price.getValley()));
}
ammeterRevenue.setActiveTotalPrice(ammeterRevenue.getActivePeakPrice().add(ammeterRevenue.getActiveHighPrice()).add(ammeterRevenue.getActiveFlatPrice()).add(ammeterRevenue.getActiveValleyPrice())); ammeterRevenue.setActiveTotalPrice(ammeterRevenue.getActivePeakPrice().add(ammeterRevenue.getActiveHighPrice()).add(ammeterRevenue.getActiveFlatPrice()).add(ammeterRevenue.getActiveValleyPrice()));
ammeterRevenue.setReActiveTotalPrice(ammeterRevenue.getReActivePeakPrice().add(ammeterRevenue.getReActiveHighPrice()).add(ammeterRevenue.getReActiveFlatPrice()).add(ammeterRevenue.getReActiveValleyPrice())); ammeterRevenue.setReActiveTotalPrice(ammeterRevenue.getReActivePeakPrice().add(ammeterRevenue.getReActiveHighPrice()).add(ammeterRevenue.getReActiveFlatPrice()).add(ammeterRevenue.getReActiveValleyPrice()));
return ammeterRevenue; return ammeterRevenue;