From 6ebeb48b6236549f766bc5da35d0fee05dd59862 Mon Sep 17 00:00:00 2001 From: mashili Date: Sun, 12 Oct 2025 19:47:55 +0800 Subject: [PATCH] =?UTF-8?q?0918=E7=94=B5=E4=BB=B7-=E7=AB=99=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E6=97=B6=E6=80=BB=E6=94=B6=E5=85=A5=E5=92=8C?= =?UTF-8?q?=E5=AE=9E=E6=97=B6=E5=BD=93=E6=97=A5=E6=94=B6=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/RedisKeyConstants.java | 8 +- .../xzzn/ems/domain/EmsDailyEnergyData.java | 30 +++++ .../xzzn/ems/domain/vo/SiteMonitorHomeVo.java | 26 ++++ .../ems/mapper/EmsDailyEnergyDataMapper.java | 7 ++ .../mapper/EmsEnergyPriceConfigMapper.java | 3 + .../service/IEmsEnergyPriceConfigService.java | 2 + .../impl/DDSDataProcessServiceImpl.java | 108 ++++++++++++---- .../impl/EmsEnergyPriceConfigServiceImpl.java | 53 ++++++-- .../impl/FXXDataProcessServiceImpl.java | 117 +++++++++++++----- .../service/impl/SingleSiteServiceImpl.java | 35 +++--- .../mapper/ems/EmsDailyEnergyDataMapper.xml | 35 +++++- .../mapper/ems/EmsEnergyPriceConfigMapper.xml | 8 ++ 12 files changed, 348 insertions(+), 84 deletions(-) diff --git a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java index 2df12f2..46971ca 100644 --- a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java +++ b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java @@ -73,9 +73,11 @@ public class RedisKeyConstants /** 现有的告警数据 */ public static final String LATEST_ALARM_RECORD = "LATEST_ALARM_RECORD"; - /** fx-电表电量差值起始数据 */ - public static final String DIFF_CHARGE_START = "diff_charge_start_"; - /** 预存电价时间配置 */ public static final String ENERGY_PRICE_TIME = "energy_price_time_"; + + /** dds昨日累计总收益 */ + public static final String DDS_TOTAL_REVENUE = "total_revenue_"; + /** fx实时总收益和当日实时收益 */ + public static final String FXX_REALTIME_REVENUE = "realtime_revenue_"; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java index e7ea25e..91f1630 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsDailyEnergyData.java @@ -30,6 +30,14 @@ public class EmsDailyEnergyData extends BaseEntity @Excel(name = "数据日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd") private Date dataDate; + /** 总收入 */ + @Excel(name = "总收入") + private BigDecimal totalRevenue; + + /** 当日实时收入 */ + @Excel(name = "当日实时收入") + private BigDecimal dayRevenue; + /** 尖峰时段充电差值 */ @Excel(name = "尖峰时段充电差值") private BigDecimal peakChargeDiff; @@ -96,6 +104,26 @@ public class EmsDailyEnergyData extends BaseEntity return dataDate; } + public void setTotalRevenue(BigDecimal totalRevenue) + { + this.totalRevenue = totalRevenue; + } + + public BigDecimal getTotalRevenue() + { + return totalRevenue; + } + + public void setDayRevenue(BigDecimal dayRevenue) + { + this.dayRevenue = dayRevenue; + } + + public BigDecimal getDayRevenue() + { + return dayRevenue; + } + public void setPeakChargeDiff(BigDecimal peakChargeDiff) { this.peakChargeDiff = peakChargeDiff; @@ -192,6 +220,8 @@ public class EmsDailyEnergyData extends BaseEntity .append("id", getId()) .append("siteId", getSiteId()) .append("dataDate", getDataDate()) + .append("totalRevenue", getTotalRevenue()) + .append("dayRevenue", getDayRevenue()) .append("peakChargeDiff", getPeakChargeDiff()) .append("peakDischargeDiff", getPeakDischargeDiff()) .append("highChargeDiff", getHighChargeDiff()) diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java index d0991df..d7bcc6a 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/SiteMonitorHomeVo.java @@ -65,6 +65,32 @@ public class SiteMonitorHomeVo { */ private StrategyTempInfo strategyTempInfo; + /** + * 总收入 + */ + private BigDecimal totalRevenue; + + /** + * 当日实时收入 + */ + private BigDecimal dayRevenue; + + public BigDecimal getTotalRevenue() { + return totalRevenue; + } + + public void setTotalRevenue(BigDecimal totalRevenue) { + this.totalRevenue = totalRevenue; + } + + public BigDecimal getDayRevenue() { + return dayRevenue; + } + + public void setDayRevenue(BigDecimal dayRevenue) { + this.dayRevenue = dayRevenue; + } + public BigDecimal getDayChargedCap() { return dayChargedCap; } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java index 047ac45..eeac437 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsDailyEnergyDataMapper.java @@ -1,6 +1,9 @@ package com.xzzn.ems.mapper; +import java.math.BigDecimal; import java.util.List; +import java.util.Map; + import com.xzzn.ems.domain.EmsDailyEnergyData; import com.xzzn.ems.domain.vo.AmmeterStatisListVo; import org.apache.ibatis.annotations.Param; @@ -67,4 +70,8 @@ public interface EmsDailyEnergyDataMapper public void insertOrUpdateData(EmsDailyEnergyData energyData); // 电表报表 public List getDataBySiteId(@Param("siteId")String siteId, @Param("startTime")String startTime, @Param("endTime")String endTime); + // dds-获取今天之前最晚的总收入 + public BigDecimal getLastTotalRevenue(String siteId); + // fx-获取实时总收益和当日实时收益 + public Map getRealTimeRevenue(String siteId); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java index 816ae73..4e80ad0 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java @@ -73,4 +73,7 @@ public interface EmsEnergyPriceConfigMapper public List getTimeRangeByDate(@Param("siteId")String siteId, @Param("currentYear")int currentYear, @Param("currentMonth")int currentMonth); + // 获取所有有效站点的电价配置 + public List getAllSitePriceConfig( @Param("currentYear")int currentYear, + @Param("currentMonth")int currentMonth); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java index 3828d4a..52acc2a 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsEnergyPriceConfigService.java @@ -61,4 +61,6 @@ public interface IEmsEnergyPriceConfigService // 初始化当月电价 public void initCurrentMonthPrice(); + // 获取指定站点的当月电价 + public EnergyPriceVo getCurrentMonthPrice(String siteId); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java index 2104c13..bf2ac4c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/DDSDataProcessServiceImpl.java @@ -13,6 +13,7 @@ import com.xzzn.common.enums.*; import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.*; +import com.xzzn.ems.domain.vo.EnergyPriceVo; import com.xzzn.ems.mapper.*; import com.xzzn.ems.service.IDDSDataProcessService; import com.xzzn.ems.service.IEmsAlarmRecordsService; @@ -25,6 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @@ -949,19 +951,19 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl // 初始化当日数据-总的 EmsDailyChargeData emsDailyChargeData = initDailyChargeData(deviceId,nowTotalChargeDate,nowTotalDisChargeDate); // 获取redis存放昨日最晚数据 - String yestData = DateUtils.getYesterdayDate(); - String yestDateRedisKey = RedisKeyConstants.AMMETER + SITE_ID + "_" + deviceId + "_" + yestData; - EmsAmmeterData yestDate = redisCache.getCacheObject(yestDateRedisKey); + String yestDate = DateUtils.getYesterdayDate(); + String yestDateRedisKey = RedisKeyConstants.AMMETER + SITE_ID + "_" + deviceId + "_" + yestDate; + EmsAmmeterData yestData = redisCache.getCacheObject(yestDateRedisKey); if (yestDate == null) { // redis没有这查电表总数据表取截止到昨日最新第一条数据 - yestDate = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,yestData); + yestData = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,yestDate); // 数据存redis-有效期1天 redisCache.setCacheObject(yestDateRedisKey, yestDate , Constants.DATE_VALID_TIME, TimeUnit.DAYS); } if (yestDate != null) { // 今日总数据-昨日总数据=今日充放电 - BigDecimal yestTotalDisChargeDate = yestDate.getCurrentReverseActiveTotal(); - BigDecimal yestTotalChargeDate = yestDate.getCurrentForwardActiveTotal(); + BigDecimal yestTotalDisChargeDate = yestData.getCurrentReverseActiveTotal(); + BigDecimal yestTotalChargeDate = yestData.getCurrentForwardActiveTotal(); dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate); dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate); @@ -974,28 +976,88 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl // 初始化数据-尖峰平谷 EmsDailyEnergyData energyData = initEnergyData(); - // 计算尖峰平谷差值 - energyData.setPeakChargeDiff(StringUtils.getBigDecimal(obj.get("DQZXYGJDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentForwardActivePeak()));// 正向-尖 - energyData.setHighChargeDiff(StringUtils.getBigDecimal(obj.get("DQZXYGFDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentForwardActiveHigh()));// 正向-峰 - energyData.setFlatChargeDiff(StringUtils.getBigDecimal(obj.get("DQZXYGPDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentForwardActiveFlat()));// 正向-平 - energyData.setValleyChargeDiff(StringUtils.getBigDecimal(obj.get("DQZXYGGDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentForwardActiveValley()));// 正向-谷 - energyData.setPeakDischargeDiff(StringUtils.getBigDecimal(obj.get("DQFXYGJDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentReverseActivePeak()));// 反向-尖 - energyData.setHighDischargeDiff(StringUtils.getBigDecimal(obj.get("DQFXYGFDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentReverseActiveHigh()));// 反向-峰 - energyData.setFlatDischargeDiff(StringUtils.getBigDecimal(obj.get("DQFXYGPDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentReverseActiveFlat()));// 反向-平 - energyData.setValleyDischargeDiff(StringUtils.getBigDecimal(obj.get("DQFXYGGDN")) - .subtract(yestDate == null ? new BigDecimal(0) : yestDate.getCurrentReverseActiveValley()));// 反向-谷 + // 计算尖峰平谷差值,更新表 + calcEnergyDiffAndRevenue(energyData,obj,yestData); energyData.setCalcTime(DateUtils.getNowDate()); // 插入或更新电表每日差值数据表 emsDailyEnergyDataMapper.insertOrUpdateData(energyData); } + private void calcEnergyDiffAndRevenue(EmsDailyEnergyData energyData, Map obj, EmsAmmeterData yestData) { + + // 获取当月电价 + String key = RedisKeyConstants.ENERGY_PRICE_TIME + SITE_ID + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(key); + + // 计算尖峰平谷差值 + // 正反向-尖 + BigDecimal peakChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGJDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActivePeak()); + energyData.setPeakChargeDiff(peakChargeDiff); + BigDecimal peakDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGJDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActivePeak()); + energyData.setPeakDischargeDiff(peakDischargeDiff); + // 正反向-峰 + BigDecimal highChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGFDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveHigh()); + energyData.setHighChargeDiff(highChargeDiff); + BigDecimal highDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGFDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveHigh()); + energyData.setHighDischargeDiff(highDischargeDiff); + // 正反向-平 + BigDecimal flatChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGPDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveFlat()); + energyData.setFlatChargeDiff(flatChargeDiff); + BigDecimal flatDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGPDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveFlat()); + energyData.setFlatDischargeDiff(flatDisChargeDiff); + // 正反向-谷 + BigDecimal valleyChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGGDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveValley()); + energyData.setValleyChargeDiff(valleyChargeDiff); + BigDecimal valleyDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGGDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveValley()); + energyData.setValleyDischargeDiff(valleyDisChargeDiff); + + + BigDecimal totalRevenue = getYestLastData(SITE_ID); + BigDecimal dayRevenue = BigDecimal.ZERO; + BigDecimal price = BigDecimal.ZERO; + // 计算当日收益,尖峰平谷收益累加,(放电量-充电量)*电价 + if (priceVo != null) { + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + BigDecimal peakRevenue = peakDischargeDiff.subtract(peakChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(peakRevenue); + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + BigDecimal highRevenue = highDischargeDiff.subtract(highChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(highRevenue); + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + BigDecimal flatRevenue = flatDisChargeDiff.subtract(flatChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(flatRevenue); + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + BigDecimal valleyRevenue = valleyDisChargeDiff.subtract(valleyChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(valleyRevenue); + energyData.setDayRevenue(dayRevenue); + } + // 总收益 = 昨日总收益+今日实时收益 + totalRevenue = totalRevenue.add(dayRevenue); + energyData.setTotalRevenue(totalRevenue); + } + + private BigDecimal getYestLastData(String siteId) { + // dds存的是累计到昨日总收益 + String redisKey = RedisKeyConstants.DDS_TOTAL_REVENUE + siteId; + BigDecimal yestLastTotalRevenue = redisCache.getCacheObject(redisKey); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = emsDailyEnergyDataMapper.getLastTotalRevenue(siteId); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = BigDecimal.ZERO; + } + redisCache.setCacheObject(redisKey, yestLastTotalRevenue); + } + return yestLastTotalRevenue; + } + private EmsDailyChargeData initDailyChargeData(String deviceId, BigDecimal nowTotalChargeDate, BigDecimal nowTotalDisChargeDate) { EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java index 69d2fd5..d8f1704 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsEnergyPriceConfigServiceImpl.java @@ -127,7 +127,15 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer priceConfig.setUpdateBy("system"); emsEnergyPriceConfigMapper.insertOrUpdateEmsEnergyPriceConfig(priceConfig); - return batchInsetPriceTimeRange(priceVo,priceConfig.getId()); + batchInsetPriceTimeRange(priceVo,priceConfig.getId()); + + // 判断是否当月电价,是则更新当月电价缓存 + int currentMonth = LocalDate.now().getMonthValue(); + if (currentMonth == Integer.parseInt(month)) { + initCurrentMonthPrice(); + } + + return 1; } private int batchInsetPriceTimeRange(EnergyPriceVo priceVo, Long priceId) { @@ -176,7 +184,14 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer // 时间配置,全删,全插入 Long[] priceIds = {priceVo.getId()}; emsPriceTimeConfigMapper.deleteTimeRangeByPriceId(priceIds); - return batchInsetPriceTimeRange(priceVo,priceConfig.getId()); + batchInsetPriceTimeRange(priceVo,priceConfig.getId()); + + // 判断是否当月电价,是则更新当月电价缓存 + int currentMonth = LocalDate.now().getMonthValue(); + if (currentMonth == Integer.parseInt(priceVo.getMonth())) { + initCurrentMonthPrice(); + } + return 1; } /** @@ -191,7 +206,10 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer // 先删时间配置 emsPriceTimeConfigMapper.deleteTimeRangeByPriceId(ids); // 再删月电价 - return emsEnergyPriceConfigMapper.deleteEmsEnergyPriceConfigByIds(ids); + emsEnergyPriceConfigMapper.deleteEmsEnergyPriceConfigByIds(ids); + // 更新当月电价缓存 + initCurrentMonthPrice(); + return 1; } /** @@ -207,7 +225,7 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer } /** - * 初始化当月的电价 + * 初始化当月的电价存redis */ @Override public void initCurrentMonthPrice() { @@ -215,15 +233,34 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer int currentMonth = LocalDate.now().getMonthValue(); int currentYear = LocalDate.now().getYear(); - List siteIds = emsSiteSettingMapper.getAllSiteId(); - if (siteIds == null || siteIds.size() == 0) { + List siteIdConfig = emsEnergyPriceConfigMapper.getAllSitePriceConfig(currentYear,currentMonth); + if (siteIdConfig == null || siteIdConfig.size() == 0) { return; } - for (String siteId : siteIds) { + for (EmsEnergyPriceConfig priceConfig : siteIdConfig) { + EnergyPriceVo priceVo = new EnergyPriceVo(); + BeanUtils.copyProperties(priceConfig,priceVo); + String siteId = priceConfig.getSiteId(); List timeRanges = emsEnergyPriceConfigMapper.getTimeRangeByDate(siteId,currentYear,currentMonth); + priceVo.setRange(timeRanges); String key = RedisKeyConstants.ENERGY_PRICE_TIME + siteId + "_" + currentYear + currentMonth; - redisCache.setCacheObject(key,timeRanges, 31, TimeUnit.DAYS); + redisCache.setCacheObject(key,priceVo, 31, TimeUnit.DAYS); } } + + public EnergyPriceVo getCurrentMonthPrice(String siteId) { + EnergyPriceVo priceVo = new EnergyPriceVo(); + // 获取当年和当月的电价 + int currentMonth = LocalDate.now().getMonthValue(); + int currentYear = LocalDate.now().getYear(); + + EmsEnergyPriceConfig priceConfig = emsEnergyPriceConfigMapper.getConfigListByYearAndMonth(siteId,String.valueOf(currentYear),String.valueOf(currentMonth)); + if (priceConfig != null) { + BeanUtils.copyProperties(priceConfig,priceVo); + List timeRanges = emsPriceTimeConfigMapper.getTimeRangeByPriceId(priceConfig.getId()); + priceVo.setRange(timeRanges); + } + return priceVo; + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java index 49af4ff..a25939c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java @@ -14,8 +14,10 @@ import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.*; import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import com.xzzn.ems.domain.vo.EnergyPriceVo; import com.xzzn.ems.mapper.*; import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; import com.xzzn.ems.service.IFXXDataProcessService; import com.xzzn.ems.utils.AbstractBatteryDataProcessor; import org.apache.commons.logging.Log; @@ -78,6 +80,8 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; @Autowired private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper; + @Autowired + private IEmsEnergyPriceConfigService emsEnergyPriceConfigService; // 构造方法(调用父类构造) public FXXDataProcessServiceImpl(ObjectMapper objectMapper) { @@ -772,7 +776,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); // 处理电表每日充放电数据 - dealAmmeterDailyDate(obj, deviceId, dataUpdateTime, lastAmmeterData); + dealAmmeterDailyDate(obj, dataUpdateTime, lastAmmeterData); } private EmsAmmeterData getLastAmmeterData(String deviceId) { @@ -791,16 +795,20 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl return lastData; } - private void dealAmmeterDailyDate(Map obj, String deviceId, Date dataUpdateTime, EmsAmmeterData lastData) { + private void dealAmmeterDailyDate(Map obj, Date dataUpdateTime, EmsAmmeterData lastData) { // 先获取当月电价配置,redis没有这查数据库,都没有则返回 String priceKey = RedisKeyConstants.ENERGY_PRICE_TIME + SITE_ID + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); - List timeRanges = redisCache.getCacheObject(priceKey); - if (timeRanges == null) { - timeRanges = emsEnergyPriceConfigMapper.getTimeRangeByDate(SITE_ID, LocalDate.now().getYear(),LocalDate.now().getMonthValue()); - if (timeRanges == null) { + EnergyPriceVo priceVo = redisCache.getCacheObject(priceKey); + if (priceVo == null) { + priceVo = emsEnergyPriceConfigService.getCurrentMonthPrice(SITE_ID); + redisCache.setCacheObject(priceKey, priceVo, 31, TimeUnit.DAYS); + if (priceVo == null) { return; } - redisCache.setCacheObject(priceKey,timeRanges, 31, TimeUnit.DAYS); + } + List timeRanges = priceVo.getRange(); + if (timeRanges == null) { + return; } // 根据时间范围判断数据类型(尖峰平谷),无法确定数据类型则不处理 @@ -808,7 +816,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl String startTime = ""; for (EnergyPriceTimeRange timeRange : timeRanges) { startTime = timeRange.getStartTime(); - if (isInPriceTimeRange(startTime,timeRange.getEndTime(),dataUpdateTime)) { + if (isInPriceTimeRange(startTime, timeRange.getEndTime(), dataUpdateTime)) { costType = timeRange.getCostType(); break; } @@ -821,19 +829,26 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl EmsDailyEnergyData energyData = initEnergyData(); // 根据 costType,计算本次与上次数据差值,累加到对应的数据类型里面 - setDiffByCostType(costType,energyData,lastData,obj); + setDiffByCostType(costType,energyData,lastData,obj,priceVo); // 插入或更新电表每日差值数据表 emsDailyEnergyDataMapper.insertOrUpdateData(energyData); } - private void setDiffByCostType(String costType, EmsDailyEnergyData energyData, EmsAmmeterData lastData, Map obj) { + private void setDiffByCostType(String costType, EmsDailyEnergyData energyData, EmsAmmeterData lastData, + Map obj, EnergyPriceVo priceVo) { BigDecimal currentChargeData = StringUtils.getBigDecimal(obj.get("ZXYGDN")); BigDecimal currentDischargeData = StringUtils.getBigDecimal(obj.get("FXYGDN")); currentChargeData = currentChargeData != null ? currentChargeData : BigDecimal.ZERO; currentDischargeData = currentDischargeData != null ? currentDischargeData : BigDecimal.ZERO; + // 获取上次实时总收益+当日实时总收益,初始化电价 + Map revenueMap = getLastData(SITE_ID); + BigDecimal totalRevenue = revenueMap.get("totalRevenue") == null ? BigDecimal.ZERO : revenueMap.get("totalRevenue"); + BigDecimal dayRevenue = revenueMap.get("dayRevenue") == null ? BigDecimal.ZERO : revenueMap.get("dayRevenue"); + BigDecimal price = BigDecimal.ZERO; // 计算时段差值,按照数据类型累加 + // 计算当日累加收益,尖峰平谷收益在当日原基础累加,(放电量-充电量)*电价 BigDecimal chargeDiffData = currentChargeData.subtract( lastData.getCurrentForwardActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentForwardActiveTotal()); BigDecimal disChargeDiffData = currentDischargeData.subtract( @@ -841,40 +856,72 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl ); switch (costType) { case "peak": - BigDecimal peakCharge = energyData.getPeakChargeDiff(); - energyData.setPeakChargeDiff((peakCharge == null ? BigDecimal.ZERO : peakCharge) - .add(chargeDiffData)); - BigDecimal peakDischarge = energyData.getPeakDischargeDiff(); - energyData.setPeakDischargeDiff((peakDischarge == null ? BigDecimal.ZERO : peakDischarge) - .add(disChargeDiffData)); + // 增加电量 + BigDecimal peakCharge = energyData.getPeakChargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakChargeDiff(); + energyData.setPeakChargeDiff(peakCharge.add(chargeDiffData)); + BigDecimal peakDischarge = energyData.getPeakDischargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakDischargeDiff(); + energyData.setPeakDischargeDiff(peakDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); break; case "high": - BigDecimal highCharge = energyData.getHighChargeDiff(); - energyData.setHighChargeDiff((highCharge == null ? BigDecimal.ZERO : highCharge) - .add(chargeDiffData)); - BigDecimal highDischarge = energyData.getHighDischargeDiff(); - energyData.setHighDischargeDiff((highDischarge == null ? BigDecimal.ZERO : highDischarge) - .add(disChargeDiffData)); + // 增加电量 + BigDecimal highCharge = energyData.getHighChargeDiff() == null ? BigDecimal.ZERO : energyData.getHighChargeDiff(); + energyData.setHighChargeDiff(highCharge.add(chargeDiffData)); + BigDecimal highDischarge = energyData.getHighDischargeDiff() == null ? BigDecimal.ZERO : energyData.getHighDischargeDiff(); + energyData.setHighDischargeDiff(highDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); break; case "flat": - BigDecimal flatCharge = energyData.getFlatChargeDiff(); - energyData.setFlatChargeDiff((flatCharge == null ? BigDecimal.ZERO : flatCharge) - .add(chargeDiffData)); - BigDecimal flatDischarge = energyData.getFlatDischargeDiff(); - energyData.setFlatDischargeDiff((flatDischarge == null ? BigDecimal.ZERO : flatDischarge) - .add(disChargeDiffData)); + // 增加电量 + BigDecimal flatCharge = energyData.getFlatChargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatChargeDiff(); + energyData.setFlatChargeDiff(flatCharge.add(chargeDiffData)); + BigDecimal flatDischarge = energyData.getFlatDischargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatDischargeDiff(); + energyData.setFlatDischargeDiff(flatDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); break; case "valley": - BigDecimal valleyCharge = energyData.getValleyChargeDiff(); - energyData.setValleyChargeDiff((valleyCharge == null ? BigDecimal.ZERO : valleyCharge) - .add(chargeDiffData)); - BigDecimal valleyDischarge = energyData.getValleyDischargeDiff(); - energyData.setValleyDischargeDiff((valleyDischarge == null ? BigDecimal.ZERO : valleyDischarge) - .add(disChargeDiffData)); + // 增加电量 + BigDecimal valleyCharge = energyData.getValleyChargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyChargeDiff(); + energyData.setValleyChargeDiff(valleyCharge.add(chargeDiffData)); + BigDecimal valleyDischarge = energyData.getValleyDischargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyDischargeDiff(); + energyData.setValleyDischargeDiff(valleyDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); break; default: return; } + + // 计算本次累加收益 + BigDecimal addRevenue = disChargeDiffData.subtract(chargeDiffData).multiply(price); + dayRevenue = dayRevenue.add(addRevenue); + energyData.setDayRevenue(dayRevenue); + // 总收益 = 上次实时总收益+今日实时增加的收益 + totalRevenue = totalRevenue.add(addRevenue); + energyData.setTotalRevenue(totalRevenue); + } + + private Map getLastData(String siteId) { + // dds存的是累计到昨日总收益 + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + siteId; + Map realTimeRevenue = redisCache.getCacheObject(redisKey); + if (realTimeRevenue == null) { + realTimeRevenue = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId); + if (realTimeRevenue == null) { + realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", BigDecimal.ZERO); + realTimeRevenue.put("dayRevenue", BigDecimal.ZERO); + } + redisCache.setCacheObject(redisKey, realTimeRevenue); + } + return realTimeRevenue; } private boolean isInPriceTimeRange(String startTime, String endTime, Date dataUpdateTime) { @@ -907,6 +954,8 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl energyData = new EmsDailyEnergyData(); energyData.setSiteId(SITE_ID); energyData.setDataDate(DateUtils.getNowDate()); + energyData.setTotalRevenue(BigDecimal.ZERO); + energyData.setDayRevenue(BigDecimal.ZERO); energyData.setCreateBy("system"); energyData.setCreateTime(DateUtils.getNowDate()); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java index 7ee278d..96bd173 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java @@ -37,18 +37,6 @@ public class SingleSiteServiceImpl implements ISingleSiteService { private static final String CLUSTER_DATA_SOC = "SOC"; - private static Map storageFactor = new HashMap<>(); - static { - storageFactor.put("021_DDS_01", new BigDecimal("0.1")); - storageFactor.put("default", BigDecimal.ONE); // 默认1 - } - - private static Map pvFactor = new HashMap<>(); - static { - pvFactor.put("021_DDS_01", new BigDecimal("-0.001")); - pvFactor.put("default", BigDecimal.ONE); // Convert to Basic Latin - } - // 初始化List,存储指定的电表deviceId List ammeterDeviceIds = Arrays.asList( "LOAD", "METE", "METEGF" @@ -62,8 +50,6 @@ public class SingleSiteServiceImpl implements ISingleSiteService { @Autowired private EmsBatteryClusterMapper emsBatteryClusterMapper; @Autowired - private EmsCoolingDataMapper emsCoolingDataMapper; - @Autowired private EmsAmmeterDataMapper emsAmmeterDataMapper; @Autowired private EmsDevicesSettingMapper emsDevicesSettingMapper; @@ -76,6 +62,8 @@ public class SingleSiteServiceImpl implements ISingleSiteService { private EmsStrategyTempMapper emsStrategyTempMapper; @Autowired private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; @Override public SiteMonitorHomeVo getSiteMonitorDataVo(String siteId) { @@ -90,9 +78,14 @@ public class SingleSiteServiceImpl implements ISingleSiteService { siteMonitorHomeVo.setTotalDischargedCap(dataMap.get("totalDischargedCap")); //siteMonitorHomeVo.setGridNrtPower(dataMap.get("gridNrtPower")); } + + // 总收入+当日实时收入 + setRevenueInfo(siteMonitorHomeVo,siteId); + // 实时告警数据 名称+状态+告警内容 List siteMonitorHomeAlarmVo = emsAlarmRecordsMapper.getAlarmRecordsBySiteId(siteId); siteMonitorHomeVo.setSiteMonitorHomeAlarmVo(siteMonitorHomeAlarmVo); + // 策略运行-主策略模板数据 List runningVo = emsStrategyRunningMapper.getRunningList(siteId); if (runningVo != null && runningVo.size() > 0) { @@ -103,6 +96,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService { siteTempInfo.setSiteMonitorDataVo(tempList); siteMonitorHomeVo.setStrategyTempInfo(siteTempInfo); } + // 能量数据 LocalDate sevenDaysAgo = LocalDate.now().minusDays(6); Date startDate = DateUtils.toDate(sevenDaysAgo); @@ -122,12 +116,25 @@ public class SingleSiteServiceImpl implements ISingleSiteService { BigDecimal energyStorageAvailElec = siteMonitorHomeVo.getTotalDischargedCap().subtract(siteMonitorHomeVo.getTotalChargedCap()); siteMonitorHomeVo.setEnergyStorageAvailElec(energyStorageAvailElec); } + siteMonitorHomeVo.setSiteMonitorDataVo(siteMonitorDataVoList); } return siteMonitorHomeVo; } + private void setRevenueInfo(SiteMonitorHomeVo siteMonitorHomeVo, String siteId) { + BigDecimal totalRevenue = BigDecimal.ZERO; + BigDecimal dayRevenue = BigDecimal.ZERO; + Map realTimeRevenue = emsDailyEnergyDataMapper.getRealTimeRevenue(siteId); + if (realTimeRevenue != null) { + totalRevenue = realTimeRevenue.get("totalRevenue") == null ? BigDecimal.ZERO : realTimeRevenue.get("totalRevenue"); + dayRevenue = realTimeRevenue.get("dayRevenue") == null ? BigDecimal.ZERO : realTimeRevenue.get("dayRevenue"); + } + siteMonitorHomeVo.setTotalRevenue(totalRevenue); + siteMonitorHomeVo.setDayRevenue(dayRevenue); + } + // 获取单站监控实时运行头部数据 @Override public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId) { diff --git a/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml index cee2e05..d7a1782 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsDailyEnergyDataMapper.xml @@ -8,6 +8,8 @@ + + @@ -25,7 +27,7 @@ - select id, site_id, data_date, peak_charge_diff, peak_discharge_diff, high_charge_diff, high_discharge_diff, flat_charge_diff, flat_discharge_diff, valley_charge_diff, valley_discharge_diff, calc_time, create_by, create_time, update_by, update_time, remark from ems_daily_energy_data + select id, site_id, data_date, total_revenue, day_revenue, peak_charge_diff, peak_discharge_diff, high_charge_diff, high_discharge_diff, flat_charge_diff, flat_discharge_diff, valley_charge_diff, valley_discharge_diff, calc_time, create_by, create_time, update_by, update_time, remark from ems_daily_energy_data + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml index 99bb6c9..a9a19ff 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml @@ -169,4 +169,12 @@ and t.`year` = #{currentYear} and t.`month` = #{currentMonth} + + \ No newline at end of file