0918优化-电表报表-尖峰平谷日差值显示
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -58,4 +58,7 @@ public interface IEmsEnergyPriceConfigService
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteEmsEnergyPriceConfigById(Long id);
|
||||
|
||||
// 初始化当月电价
|
||||
public void initCurrentMonthPrice();
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
// 数据分组处理
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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<>();
|
||||
|
||||
Reference in New Issue
Block a user