0918优化-电表报表-尖峰平谷日差值显示

This commit is contained in:
2025-10-10 16:10:37 +08:00
parent 636a2ab73b
commit b861ad7593
14 changed files with 766 additions and 34 deletions

View File

@ -0,0 +1,211 @@
package com.xzzn.ems.domain;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xzzn.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.xzzn.common.annotation.Excel;
/**
* 站点电每日数据对象 ems_daily_energy_data
*
* @author xzzn
* @date 2025-10-09
*/
public class EmsDailyEnergyData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** */
private Long id;
/** 站点id */
@Excel(name = "站点id")
private String siteId;
/** 数据日期:yyyy-MM-dd */
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "数据日期:yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd")
private Date dataDate;
/** 尖峰时段充电差值 */
@Excel(name = "尖峰时段充电差值")
private BigDecimal peakChargeDiff;
/** 尖峰时段放电差值 */
@Excel(name = "尖峰时段放电差值")
private BigDecimal peakDischargeDiff;
/** 峰时时段充电差值 */
@Excel(name = "峰时时段充电差值")
private BigDecimal highChargeDiff;
/** 峰时时段放电差值 */
@Excel(name = "峰时时段放电差值")
private BigDecimal highDischargeDiff;
/** 平时时段充电差值 */
@Excel(name = "平时时段充电差值")
private BigDecimal flatChargeDiff;
/** 平时时段放电差值 */
@Excel(name = "平时时段放电差值")
private BigDecimal flatDischargeDiff;
/** 谷时时段充电差值 */
@Excel(name = "谷时时段充电差值")
private BigDecimal valleyChargeDiff;
/** 谷时时段放电差值 */
@Excel(name = "谷时时段放电差值")
private BigDecimal valleyDischargeDiff;
/** 差值计算时间如2025-10-10 23:59:00 */
@Excel(name = "差值计算时间", readConverterExp = "如=2025-10-10,2=3:59:00")
private Date calcTime;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setSiteId(String siteId)
{
this.siteId = siteId;
}
public String getSiteId()
{
return siteId;
}
public void setDataDate(Date dataDate)
{
this.dataDate = dataDate;
}
public Date getDataDate()
{
return dataDate;
}
public void setPeakChargeDiff(BigDecimal peakChargeDiff)
{
this.peakChargeDiff = peakChargeDiff;
}
public BigDecimal getPeakChargeDiff()
{
return peakChargeDiff;
}
public void setPeakDischargeDiff(BigDecimal peakDischargeDiff)
{
this.peakDischargeDiff = peakDischargeDiff;
}
public BigDecimal getPeakDischargeDiff()
{
return peakDischargeDiff;
}
public void setHighChargeDiff(BigDecimal highChargeDiff)
{
this.highChargeDiff = highChargeDiff;
}
public BigDecimal getHighChargeDiff()
{
return highChargeDiff;
}
public void setHighDischargeDiff(BigDecimal highDischargeDiff)
{
this.highDischargeDiff = highDischargeDiff;
}
public BigDecimal getHighDischargeDiff()
{
return highDischargeDiff;
}
public void setFlatChargeDiff(BigDecimal flatChargeDiff)
{
this.flatChargeDiff = flatChargeDiff;
}
public BigDecimal getFlatChargeDiff()
{
return flatChargeDiff;
}
public void setFlatDischargeDiff(BigDecimal flatDischargeDiff)
{
this.flatDischargeDiff = flatDischargeDiff;
}
public BigDecimal getFlatDischargeDiff()
{
return flatDischargeDiff;
}
public void setValleyChargeDiff(BigDecimal valleyChargeDiff)
{
this.valleyChargeDiff = valleyChargeDiff;
}
public BigDecimal getValleyChargeDiff()
{
return valleyChargeDiff;
}
public void setValleyDischargeDiff(BigDecimal valleyDischargeDiff)
{
this.valleyDischargeDiff = valleyDischargeDiff;
}
public BigDecimal getValleyDischargeDiff()
{
return valleyDischargeDiff;
}
public void setCalcTime(Date calcTime)
{
this.calcTime = calcTime;
}
public Date getCalcTime()
{
return calcTime;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("siteId", getSiteId())
.append("dataDate", getDataDate())
.append("peakChargeDiff", getPeakChargeDiff())
.append("peakDischargeDiff", getPeakDischargeDiff())
.append("highChargeDiff", getHighChargeDiff())
.append("highDischargeDiff", getHighDischargeDiff())
.append("flatChargeDiff", getFlatChargeDiff())
.append("flatDischargeDiff", getFlatDischargeDiff())
.append("valleyChargeDiff", getValleyChargeDiff())
.append("valleyDischargeDiff", getValleyDischargeDiff())
.append("calcTime", getCalcTime())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -0,0 +1,67 @@
package com.xzzn.ems.mapper;
import java.util.List;
import com.xzzn.ems.domain.EmsDailyEnergyData;
import org.apache.ibatis.annotations.Param;
/**
* 站点电每日数据Mapper接口
*
* @author xzzn
* @date 2025-10-09
*/
public interface EmsDailyEnergyDataMapper
{
/**
* 查询站点电每日数据
*
* @param id 站点电每日数据主键
* @return 站点电每日数据
*/
public EmsDailyEnergyData selectEmsDailyEnergyDataById(Long id);
/**
* 查询站点电每日数据列表
*
* @param emsDailyEnergyData 站点电每日数据
* @return 站点电每日数据集合
*/
public List<EmsDailyEnergyData> selectEmsDailyEnergyDataList(EmsDailyEnergyData emsDailyEnergyData);
/**
* 新增站点电每日数据
*
* @param emsDailyEnergyData 站点电每日数据
* @return 结果
*/
public int insertEmsDailyEnergyData(EmsDailyEnergyData emsDailyEnergyData);
/**
* 修改站点电每日数据
*
* @param emsDailyEnergyData 站点电每日数据
* @return 结果
*/
public int updateEmsDailyEnergyData(EmsDailyEnergyData emsDailyEnergyData);
/**
* 删除站点电每日数据
*
* @param id 站点电每日数据主键
* @return 结果
*/
public int deleteEmsDailyEnergyDataById(Long id);
/**
* 批量删除站点电每日数据
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteEmsDailyEnergyDataByIds(Long[] ids);
// 获取站点某日电表数据
public EmsDailyEnergyData getDataByDate(@Param("siteId")String siteId,@Param("today") String today);
// 插入或更新每日尖峰平谷差值
public void insertOrUpdateData(EmsDailyEnergyData energyData);
}

View File

@ -3,6 +3,7 @@ package com.xzzn.ems.mapper;
import java.util.List;
import com.xzzn.ems.domain.EmsEnergyPriceConfig;
import com.xzzn.ems.domain.vo.EnergyPriceTimeRange;
import org.apache.ibatis.annotations.Param;
/**
@ -66,4 +67,6 @@ public interface EmsEnergyPriceConfigMapper
public EmsEnergyPriceConfig getConfigListByYearAndMonth(@Param("currentYear") String currentYear, @Param("month")String month);
// 插入或更新
public void insertOrUpdateEmsEnergyPriceConfig(EmsEnergyPriceConfig priceConfig);
// 获取指定年月的电价时间配置
public List<EnergyPriceTimeRange> getTimeRangeByDate(@Param("currentYear")int currentYear, @Param("currentMonth")int currentMonth);
}

View File

@ -58,4 +58,7 @@ public interface IEmsEnergyPriceConfigService
* @return 结果
*/
public int deleteEmsEnergyPriceConfigById(Long id);
// 初始化当月电价
public void initCurrentMonthPrice();
}

View File

@ -77,6 +77,8 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
@Autowired
private IEmsAlarmRecordsService iEmsAlarmRecordsService;
@Autowired
private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper;
public DDSDataProcessServiceImpl(ObjectMapper objectMapper) {
super(objectMapper);
@ -926,31 +928,32 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
dealDDSDailyChargeDate(obj,deviceId);
}
private EmsDailyEnergyData initEnergyData() {
EmsDailyEnergyData energyData = new EmsDailyEnergyData();
energyData.setSiteId(SITE_ID);
energyData.setDataDate(DateUtils.getNowDate());
energyData.setCreateBy("system");
energyData.setCreateTime(DateUtils.getNowDate());
energyData.setUpdateBy("system");
energyData.setUpdateTime(DateUtils.getNowDate());
return energyData;
}
private void dealDDSDailyChargeDate(Map<String, Object> obj, String deviceId) {
log.info("start dealDDSDailyChargeDate");
// 初始化今日充放电
BigDecimal dailyDisChargeDate = new BigDecimal(0);
BigDecimal dailyChargeDate = new BigDecimal(0);
BigDecimal nowTotalDisChargeDate = StringUtils.getBigDecimal(obj.get("DQFXZYGDN"));
BigDecimal nowTotalChargeDate = StringUtils.getBigDecimal(obj.get("DQZXZYGDN"));
// 初始化当日数据
EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData();
emsDailyChargeData.setSiteId(SITE_ID);
emsDailyChargeData.setDeviceId(deviceId);
emsDailyChargeData.setDateTime(DateUtils.getNowDate());
emsDailyChargeData.setTotalChargeData(nowTotalChargeDate);
emsDailyChargeData.setTotalDischargeData(nowTotalDisChargeDate);
emsDailyChargeData.setCreateBy("system");
emsDailyChargeData.setCreateTime(DateUtils.getNowDate());
emsDailyChargeData.setUpdateBy("system");
emsDailyChargeData.setUpdateTime(DateUtils.getNowDate());
// 初始化当日数据-总的
EmsDailyChargeData emsDailyChargeData = initDailyChargeData(deviceId,nowTotalChargeDate,nowTotalDisChargeDate);
// 获取redis存放昨日最晚数据
String yestData = DateUtils.getYesterdayDate();
String yestDateRedisKey = RedisKeyConstants.AMMETER + SITE_ID + "_" + deviceId + "_" + yestData;
EmsAmmeterData yestDate = redisCache.getCacheObject(yestDateRedisKey);
if (yestDate == null) {
// redis没有这查电表总数据表
// redis没有这查电表总数据表取截止到昨日最新第一条数据
yestDate = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,yestData);
// 数据存redis-有效期1天
redisCache.setCacheObject(yestDateRedisKey, yestDate , Constants.DATE_VALID_TIME, TimeUnit.DAYS);
@ -968,7 +971,44 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
// 插入或更新每日充放电数据表
emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData);
log.info("end dealDDSDailyChargeDate");
// 初始化数据-尖峰平谷
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()));// 反向-谷
energyData.setCalcTime(DateUtils.getNowDate());
// 插入或更新电表每日差值数据表
emsDailyEnergyDataMapper.insertOrUpdateData(energyData);
}
private EmsDailyChargeData initDailyChargeData(String deviceId, BigDecimal nowTotalChargeDate,
BigDecimal nowTotalDisChargeDate) {
EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData();
emsDailyChargeData.setSiteId(SITE_ID);
emsDailyChargeData.setDeviceId(deviceId);
emsDailyChargeData.setDateTime(DateUtils.getNowDate());
emsDailyChargeData.setTotalChargeData(nowTotalChargeDate);
emsDailyChargeData.setTotalDischargeData(nowTotalDisChargeDate);
emsDailyChargeData.setCreateBy("system");
emsDailyChargeData.setCreateTime(DateUtils.getNowDate());
emsDailyChargeData.setUpdateBy("system");
emsDailyChargeData.setUpdateTime(DateUtils.getNowDate());
return emsDailyChargeData;
}
// 数据分组处理

View File

@ -3,7 +3,10 @@ package com.xzzn.ems.service.impl;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.utils.DateUtils;
import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsPriceTimeConfig;
@ -30,6 +33,8 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer
private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper;
@Autowired
private EmsPriceTimeConfigMapper emsPriceTimeConfigMapper;
@Autowired
private RedisCache redisCache;
/**
* 查询电价配置
@ -195,4 +200,19 @@ public class EmsEnergyPriceConfigServiceImpl implements IEmsEnergyPriceConfigSer
{
return emsEnergyPriceConfigMapper.deleteEmsEnergyPriceConfigById(id);
}
/**
* 初始化当月的电价
*/
@Override
public void initCurrentMonthPrice() {
// 获取当年和当月的电价
int currentMonth = LocalDate.now().getMonthValue();
int currentYear = LocalDate.now().getYear();
List<EnergyPriceTimeRange> timeRanges = emsEnergyPriceConfigMapper.getTimeRangeByDate(currentYear,currentMonth);
String key = RedisKeyConstants.ENERGY_PRICE_TIME + currentYear + currentMonth;
redisCache.setCacheObject(key,timeRanges, 31, TimeUnit.DAYS);
}
}

View File

@ -13,20 +13,26 @@ 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.EnergyPriceTimeRange;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
@ -69,6 +75,10 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
private IEmsAlarmRecordsService iEmsAlarmRecordsService;
@Autowired
private EmsCoolingDataMapper emsCoolingDataMapper;
@Autowired
private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper;
@Autowired
private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper;
// 构造方法(调用父类构造)
public FXXDataProcessServiceImpl(ObjectMapper objectMapper) {
@ -84,6 +94,8 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
String deviceId = obj.get("Device").toString();
String jsonData = obj.get("Data").toString();
Long timestamp = Long.valueOf(obj.get("timestamp").toString());
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
log.info("deviceId:" + deviceId);
boolean isEmpty = checkJsonDataEmpty(jsonData);
@ -102,16 +114,16 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
} else if (deviceId.contains("BMSC")) {
log.info("BMSC data:"+ jsonData);
batteryClusterDataProcess(deviceId, jsonData);
batteryDataProcess(deviceId, jsonData);
batteryDataProcess(deviceId, jsonData,dataUpdateTime);
} else if (deviceId.contains("PCS")) {
pcsDataProcess(deviceId, jsonData);
pcsDataProcess(deviceId, jsonData,dataUpdateTime);
pcsBranchDataProcess(deviceId, jsonData);
dealFXXDailyChargeDate(deviceId, jsonData);
} else if (deviceId.contains("LOAD")) {
loadDataProcess(deviceId, jsonData);
loadDataProcess(deviceId, jsonData, dataUpdateTime);
} else if (deviceId.contains("METE")) {
meteDataProcess(deviceId, jsonData);
meteDataProcess(deviceId, jsonData, dataUpdateTime);
} else if (deviceId.contains("donghuan")) {
dhDataProcess(deviceId, jsonData);
} else if (deviceId.contains("ZSLQ")) {
@ -330,7 +342,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
}
private void batteryDataProcess(String deviceId, String dataJson) {
private void batteryDataProcess(String deviceId, String dataJson, Date dataUpdateTime) {
EmsDevicesSetting joken = new EmsDevicesSetting();
joken.setDeviceId(deviceId);
List<EmsDevicesSetting> up = emsDevicesSettingMapper.selectEmsDevicesSettingList(joken);
@ -367,7 +379,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
batteryData.setBatteryPack(stackDeviceId);
// 时间戳
batteryData.setDataTimestamp(new Date());
batteryData.setDataTimestamp(dataUpdateTime);
// 系统管理字段
batteryData.setCreateBy("system");
batteryData.setCreateTime(DateUtils.getNowDate());
@ -413,13 +425,13 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
}
}
private void pcsDataProcess(String deviceId, String dataJson) {
private void pcsDataProcess(String deviceId, String dataJson, Date dataUpdateTime) {
Map<String, Object> obj = JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {
});
//pcs
EmsPcsData pcsData = new EmsPcsData();
// 时间与状态类字段
pcsData.setDataUpdateTime(new Date());
pcsData.setDataUpdateTime(dataUpdateTime);
pcsData.setWorkStatus(WorkStatus.NORMAL.getCode());
pcsData.setGridStatus(GridStatus.GRID.getCode());
pcsData.setDeviceStatus(DeviceStatus.ONLINE.getCode());
@ -541,7 +553,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
}
private void loadDataProcess(String deviceId, String dataJson) {
private void loadDataProcess(String deviceId, String dataJson, Date dataUpdateTime) {
//总表
Map<String, Object> obj = JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {
@ -549,7 +561,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
EmsAmmeterData dataLoad = new EmsAmmeterData();
// 更新时间
dataLoad.setDataUpdateTime(new Date());
dataLoad.setDataUpdateTime(dataUpdateTime);
// 电能设置-组合有功
dataLoad.setCurrentCombActiveTotal(StringUtils.getBigDecimal(obj.get("DQZHYGZDN")));
@ -664,7 +676,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
log.info("end dealFXXDailyChargeDate");
}
private void meteDataProcess(String deviceId, String dataJson) {
private void meteDataProcess(String deviceId, String dataJson, Date dataUpdateTime) {
//总表
Map<String, Object> obj = JSON.parseObject(dataJson, new TypeReference<Map<String, Object>>() {
@ -672,7 +684,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
EmsAmmeterData dataLoad = new EmsAmmeterData();
// 更新时间
dataLoad.setDataUpdateTime(new Date());
dataLoad.setDataUpdateTime(dataUpdateTime);
// 电压+电流
dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY")));
@ -756,7 +768,148 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad);
redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad);
// 处理电表每日充放电数据
dealAmmeterDailyDate(obj, deviceId, dataUpdateTime);
}
private void dealAmmeterDailyDate(Map<String, Object> obj, String deviceId, Date dataUpdateTime) {
// 先获取当月电价配置redis没有这查数据库都没有则返回
String priceKey = RedisKeyConstants.ENERGY_PRICE_TIME + LocalDate.now().getYear() + LocalDate.now().getMonthValue();
List<EnergyPriceTimeRange> timeRanges = redisCache.getCacheObject(priceKey);
if (timeRanges == null) {
timeRanges = emsEnergyPriceConfigMapper.getTimeRangeByDate(LocalDate.now().getYear(),LocalDate.now().getMonthValue());
if (timeRanges == null) {
return;
}
redisCache.setCacheObject(priceKey,timeRanges, 31, TimeUnit.DAYS);
}
// 根据时间范围判断数据类型(尖峰平谷),无法确定数据类型则不处理
String costType = "";
String startTime = "";
for (EnergyPriceTimeRange timeRange : timeRanges) {
startTime = timeRange.getStartTime();
if (isInPriceTimeRange(startTime,timeRange.getEndTime(),dataUpdateTime)) {
costType = timeRange.getCostType();
break;
}
}
if (StringUtils.isEmpty(costType)) {
return;
}
// 确定数据类型,获取小于等于开始时刻的最新数据。
startTime = concateCurrentDayTime(startTime);
String startTimeDataKey = RedisKeyConstants.DIFF_CHARGE_START + SITE_ID +"_" + startTime;
Map<String, BigDecimal> 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);
// 插入或更新电表每日差值数据表
emsDailyEnergyDataMapper.insertOrUpdateData(energyData);
}
private void setDiffByCostType(String costType, EmsDailyEnergyData energyData, Map<String, BigDecimal> redisHash, Map<String, Object> 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));
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));
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));
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));
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));
break;
default:
return;
}
}
private boolean isInPriceTimeRange(String startTime, String endTime, Date dataUpdateTime) {
if (startTime == null || endTime == null || dataUpdateTime == null) {
return false;
}
LocalDateTime time = DateUtils.toLocalDateTime(dataUpdateTime);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
String dataTimeStr = time.format(formatter);
// 比较时间范围
return dataTimeStr.compareTo(startTime) >= 0
&& dataTimeStr.compareTo(endTime) < 0;
}
private String concateCurrentDayTime(String startTime) {
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
LocalTime time = LocalTime.parse(startTime, timeFormatter);
LocalDate today = LocalDate.now();
LocalDateTime targetDateTime = LocalDateTime.of(today, time);
DateTimeFormatter resultFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
return targetDateTime.format(resultFormatter);
}
private EmsDailyEnergyData initEnergyData() {
// 先获取数据库当天数据,存在则更新时间,不存在则初始化
EmsDailyEnergyData energyData = emsDailyEnergyDataMapper.getDataByDate(SITE_ID,DateUtils.getDate());
if (energyData == null) {
energyData = new EmsDailyEnergyData();
energyData.setSiteId(SITE_ID);
energyData.setDataDate(DateUtils.getNowDate());
energyData.setCreateBy("system");
energyData.setCreateTime(DateUtils.getNowDate());
}
energyData.setUpdateBy("system");
energyData.setCalcTime(DateUtils.getNowDate());
return energyData;
}
// 数据分组处理
private static Map<String, Map<String, Object>> processData(Map<String, Object> rawData) {
Map<String, Map<String, Object>> records = new HashMap<>();