diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java index b63d33a..62a1bdf 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsAmmeterDataMapper.java @@ -89,4 +89,8 @@ public interface EmsAmmeterDataMapper public List getPowerDataByDay(DateSearchRequest requestVo); public List getPowerDataByMonth(DateSearchRequest requestVo); public List getPowerDataByMinutes(DateSearchRequest requestVo); + + // 获取最新数据 + public EmsAmmeterData getLastData(@Param("siteId")String siteId, @Param("deviceId")String deviceId); + } 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 2b844a4..49af4ff 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 @@ -18,7 +18,6 @@ import com.xzzn.ems.mapper.*; import com.xzzn.ems.service.IEmsAlarmRecordsService; import com.xzzn.ems.service.IFXXDataProcessService; import com.xzzn.ems.utils.AbstractBatteryDataProcessor; -import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanUtils; @@ -682,6 +681,9 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl Map obj = JSON.parseObject(dataJson, new TypeReference>() { }); + // 获取上次数据,便于后面计算差值均无则默认0 + EmsAmmeterData lastAmmeterData = getLastAmmeterData(deviceId); + EmsAmmeterData dataLoad = new EmsAmmeterData(); // 更新时间 dataLoad.setDataUpdateTime(dataUpdateTime); @@ -770,10 +772,26 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); // 处理电表每日充放电数据 - dealAmmeterDailyDate(obj, deviceId, dataUpdateTime); + dealAmmeterDailyDate(obj, deviceId, dataUpdateTime, lastAmmeterData); } - private void dealAmmeterDailyDate(Map obj, String deviceId, Date dataUpdateTime) { + private EmsAmmeterData getLastAmmeterData(String deviceId) { + // 先从redis取,取不到查数据 + EmsAmmeterData lastData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId); + if (lastData == null) { + lastData = emsAmmeterDataMapper.getLastData(SITE_ID,deviceId); + if (lastData == null) { + lastData = new EmsAmmeterData(); + lastData.setSiteId(SITE_ID); + lastData.setDeviceId(deviceId); + lastData.setCurrentForwardActiveTotal(BigDecimal.ZERO); + lastData.setCurrentReverseActiveTotal(BigDecimal.ZERO); + } + } + return lastData; + } + + private void dealAmmeterDailyDate(Map obj, String deviceId, Date dataUpdateTime, EmsAmmeterData lastData) { // 先获取当月电价配置,redis没有这查数据库,都没有则返回 String priceKey = RedisKeyConstants.ENERGY_PRICE_TIME + SITE_ID + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); List timeRanges = redisCache.getCacheObject(priceKey); @@ -799,41 +817,28 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl return; } - // 确定数据类型,获取小于等于开始时刻的最新数据。 - startTime = concateCurrentDayTime(startTime); - String startTimeDataKey = RedisKeyConstants.DIFF_CHARGE_START + SITE_ID +"_" + startTime; - Map redisHash = redisCache.getCacheObject(startTimeDataKey); - // redis无,就取数据库 - if (redisHash == null) { - // 查询数据库-电表表数据取截止到昨日最新一条数据,均无默认初始值0 - EmsAmmeterData ammeterData = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,startTime); - redisHash = new HashMap<>(); - redisHash.put("charge", ammeterData == null ? - new BigDecimal(0) : ammeterData.getCurrentForwardActiveTotal()); - redisHash.put("discharge", ammeterData == null ? - new BigDecimal(0) : ammeterData.getCurrentReverseActiveTotal()); - redisCache.setCacheObject(startTimeDataKey, redisHash, 24, TimeUnit.HOURS); - } - //初始化电表每日差值对象 EmsDailyEnergyData energyData = initEnergyData(); - // 根据 costType 计算差值 - setDiffByCostType(costType,energyData,redisHash,obj); + // 根据 costType,计算本次与上次数据差值,累加到对应的数据类型里面 + setDiffByCostType(costType,energyData,lastData,obj); // 插入或更新电表每日差值数据表 emsDailyEnergyDataMapper.insertOrUpdateData(energyData); } - private void setDiffByCostType(String costType, EmsDailyEnergyData energyData, Map redisHash, Map obj) { + private void setDiffByCostType(String costType, EmsDailyEnergyData energyData, EmsAmmeterData lastData, Map obj) { 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; - // 计算差值,根据类型累加 - BigDecimal chargeDiffData = currentChargeData.subtract(redisHash.getOrDefault("charge", BigDecimal.ZERO)); - BigDecimal disChargeDiffData = currentDischargeData.subtract(redisHash.getOrDefault("discharge", BigDecimal.ZERO)); + // 计算时段差值,按照数据类型累加 + BigDecimal chargeDiffData = currentChargeData.subtract( + lastData.getCurrentForwardActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentForwardActiveTotal()); + BigDecimal disChargeDiffData = currentDischargeData.subtract( + lastData.getCurrentReverseActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentReverseActiveTotal() + ); switch (costType) { case "peak": BigDecimal peakCharge = energyData.getPeakChargeDiff(); diff --git a/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml index 53fc6d4..f49a05a 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml @@ -1048,4 +1048,17 @@ GROUP BY statisDate order by statisDate desc + + \ No newline at end of file