20250808优化-充放电逻辑修改

This commit is contained in:
2025-08-28 14:15:19 +08:00
parent 1a1558f8cd
commit 26bbe6deee
10 changed files with 199 additions and 57 deletions

View File

@ -4,6 +4,7 @@ import java.util.List;
import com.xzzn.ems.domain.EmsAmmeterData;
import com.xzzn.ems.domain.vo.AmmeterStatisListVo;
import com.xzzn.ems.domain.vo.StatisAmmeterDateRequest;
import org.apache.ibatis.annotations.Param;
/**
* 总数据Mapper接口
@ -67,4 +68,7 @@ public interface EmsAmmeterDataMapper
* @return
*/
public List<AmmeterStatisListVo> getLoadDataByHour(StatisAmmeterDateRequest requestVo);
// 获取昨天最晚数据
public EmsAmmeterData getYestLatestDate(@Param("siteId")String siteId, @Param("deviceId")String deviceId, @Param("yestData")String yestData);
}

View File

@ -6,6 +6,7 @@ import com.alibaba.fastjson2.TypeReference;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xzzn.common.constant.Constants;
import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.enums.*;
@ -27,6 +28,7 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -70,6 +72,8 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
private EmsBatteryGroupMapper emsBatteryGroupMapper;
@Autowired
private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
public DDSDataProcessServiceImpl(ObjectMapper objectMapper) {
super(objectMapper);
@ -894,7 +898,57 @@ public class DDSDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
emsAmmeterDataMapper.insertEmsAmmeterData(dataMete);
redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataMete);
// 处理每日充放电数据
dealDDSDailyChargeDate(obj,deviceId);
}
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("DQZXZYGDN"));
BigDecimal nowTotalChargeDate = StringUtils.getBigDecimal(obj.get("DQFXZYGDN"));
// 初始化当日数据
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());
// 获取redis存放昨日最晚数据
String yestData = DateUtils.getYesterdayDate();
String yestDateRedisKey = RedisKeyConstants.AMMETER + SITE_ID + "_" + deviceId + "_" + yestData;
EmsAmmeterData yestDate = redisCache.getCacheObject(yestDateRedisKey);
if (yestDate == null) {
// redis没有这查电表总数据表
yestDate = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,yestData);
}
if (yestDate != null) {
// 今日总数据-昨日总数据=今日充放电
BigDecimal yestTotalDisChargeDate = yestDate.getCurrentForwardActiveTotal();
BigDecimal yestTotalChargeDate = yestDate.getCurrentReverseActiveTotal();
dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate);
dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate);
emsDailyChargeData.setChargeData(dailyChargeDate);
emsDailyChargeData.setDischargeData(dailyDisChargeDate);
// 最新数据存redis
redisCache.setCacheObject(yestDateRedisKey, yestDate , Constants.DATE_VALID_TIME, TimeUnit.DAYS);
}
// 插入或更新每日充放电数据表
emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData);
log.info("end dealDDSDailyChargeDate");
}
// 数据分组处理
private static Map<String, Map<String, Object>> processData(Map<String, Object> rawData) {
Map<String, Map<String, Object>> records = new HashMap<>();

View File

@ -41,6 +41,8 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
private EmsBatteryDailyLatestMapper emsBatteryDailyLatestMapper;
@Autowired
private EmsBatteryDataDayMapper emsBatteryDataDayMapper;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
// 电量指标
@Override
@ -53,7 +55,8 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
Date endDate = requestVo.getEndDate();
// 总充总放
Map<String, BigDecimal> totalMap = emsPcsDataMapper.getPcsTotalChargeData(requestVo.getSiteId());
String nowData = DateUtils.getDate();
Map<String, BigDecimal> totalMap = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,requestVo.getSiteId());
BigDecimal totalDischarge = totalMap.get("totalDischargedCap") != null ? totalMap.get("totalDischargedCap") : BigDecimal.ZERO;
BigDecimal totalCharge = totalMap.get("totalChargedCap") != null ? totalMap.get("totalChargedCap") : BigDecimal.ZERO;
BigDecimal efficiency = new BigDecimal(0);

View File

@ -7,6 +7,7 @@ import com.alibaba.fastjson2.TypeReference;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xzzn.common.constant.Constants;
import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.enums.*;
@ -22,10 +23,12 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService {
@ -59,6 +62,8 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
private EmsBatteryDailyLatestServiceImpl emsBatteryDailyLatestServiceImpl;
@Autowired
private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
// 构造方法(调用父类构造)
public FXXDataProcessServiceImpl(ObjectMapper objectMapper) {
@ -81,7 +86,7 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
return;
}
if (deviceId.contains("BMSD")) {
/*if (deviceId.contains("BMSD")) {
batteryStackDataProcess(deviceId, jsonData);
} else if (deviceId.contains("BMSC")) {
@ -92,11 +97,11 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
} else if (deviceId.contains("PCS")) {
pcsDataProcess(deviceId, jsonData);
pcsBranchDataProcess(deviceId, jsonData);
} else if (deviceId.contains("LOAD")) {
} else*/ if (deviceId.contains("LOAD")) {
loadDataProcess(deviceId, jsonData);
} else if (deviceId.contains("METE")) {
} /*else if (deviceId.contains("METE")) {
meteDataProcess(deviceId, jsonData);
}
}*/
}
}
@ -560,6 +565,53 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad);
redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad);
// 处理每日充放电数据
dealFXXDailyChargeDate(obj,deviceId);
}
private void dealFXXDailyChargeDate(Map<String, Object> obj, String deviceId) {
log.info("start dealFXXDailyChargeDate");
// 初始化今日充放电
BigDecimal dailyChargeDate = new BigDecimal(0);
BigDecimal dailyDisChargeDate = new BigDecimal(0);
BigDecimal nowTotalDisChargeDate = StringUtils.getBigDecimal(obj.get("DQZXYGZDN"));
BigDecimal nowTotalChargeDate = StringUtils.getBigDecimal(obj.get("DQFXYGZDN"));
// 初始化当日数据
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());
// 获取redis存放昨日最晚数据
String yestData = DateUtils.getYesterdayDate();
String yestDateRedisKey = RedisKeyConstants.AMMETER + SITE_ID + "_" + deviceId + "_" + yestData;
EmsAmmeterData yestDate = redisCache.getCacheObject(yestDateRedisKey);
if (yestDate == null) {
// redis没有这查电表总数据表
yestDate = emsAmmeterDataMapper.getYestLatestDate(SITE_ID,deviceId,yestData);
}
if (yestDate != null) {
// 今日总数据-昨日总数据=今日充放电
BigDecimal yestTotalDisChargeDate = yestDate.getCurrentForwardActiveTotal();
BigDecimal yestTotalChargeDate = yestDate.getCurrentReverseActiveTotal();
dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate);
dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate);
emsDailyChargeData.setChargeData(dailyChargeDate);
emsDailyChargeData.setDischargeData(dailyDisChargeDate);
// 存下redis-有效期1天
redisCache.setCacheObject(yestDateRedisKey, yestDate , Constants.DATE_VALID_TIME, TimeUnit.DAYS);
}
// 插入或更新每日充放电数据表
emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData);
log.info("end dealFXXDailyChargeDate");
}
private void meteDataProcess(String deviceId, String dataJson) {

View File

@ -5,6 +5,7 @@ import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsSiteSetting;
import com.xzzn.ems.domain.vo.*;
import com.xzzn.ems.mapper.EmsAlarmRecordsMapper;
import com.xzzn.ems.mapper.EmsDailyChargeDataMapper;
import com.xzzn.ems.mapper.EmsPcsDataMapper;
import com.xzzn.ems.mapper.EmsSiteSettingMapper;
import com.xzzn.ems.service.IEmsSiteService;
@ -34,16 +35,19 @@ public class HomePageServiceImpl implements IHomePageService
private EmsSiteSettingMapper emsSiteMapper;
@Autowired
private EmsAlarmRecordsMapper alarmRecordsMapper;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
@Override
public SiteTotalInfoVo getSiteTotalInfo() {
SiteTotalInfoVo siteTotalInfoVo = new SiteTotalInfoVo();
siteTotalInfoVo = emsSiteService.getSiteTotalInfo();
// 获取总充+总放
Map<String,BigDecimal> pcsMap = emsPcsDataMapper.getPcsTotalChargeData(null);
if(pcsMap != null){
siteTotalInfoVo.setTotalChargedCap(pcsMap.get("totalChargedCap"));
siteTotalInfoVo.setTotalDischargedCap(pcsMap.get("totalDischargedCap"));
String nowData = DateUtils.getDate();
Map<String,BigDecimal> data = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,null);
if(data != null){
siteTotalInfoVo.setTotalChargedCap(data.get("totalChargedCap"));
siteTotalInfoVo.setTotalDischargedCap(data.get("totalDischargedCap"));
}
return siteTotalInfoVo;
}
@ -69,31 +73,32 @@ public class HomePageServiceImpl implements IHomePageService
singleSiteBaseInfo.setRunningTime(emsSite.getRunningTime() == null ? null :
DateUtils.parseDateToStr("yyyy-MM-dd",emsSite.getRunningTime()));//投运时间
// 获取单站点的总充+总放
Map<String,BigDecimal> pcsMap = emsPcsDataMapper.getPcsTotalChargeData(siteId);
if (pcsMap != null) {
singleSiteBaseInfo.setTotalChargedCap(pcsMap.get("totalChargedCap"));
singleSiteBaseInfo.setTotalDisChargedCap(pcsMap.get("totalDischargedCap"));
String nowData = DateUtils.getDate();
Map<String,BigDecimal> data = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,siteId);
if (data != null) {
singleSiteBaseInfo.setTotalChargedCap(data.get("totalChargedCap"));
singleSiteBaseInfo.setTotalDisChargedCap(data.get("totalDischargedCap"));
}
// 七天放电数据统计 默认从今天往前7天
LocalDate sevenDaysAgo = LocalDate.now().minusDays(LIMIT_TIME);
Date startDate = DateUtils.toDate(sevenDaysAgo);
Date endDate = new Date();
List<SiteMonitorDataVo> siteMonitorDataVoList = emsPcsDataMapper.getPcsDataBySiteId(siteId,startDate,endDate);
List<SiteMonitorDataVo> siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate);
singleSiteBaseInfo.setSevenDayDisChargeStats(siteMonitorDataVoList);
// 充放电基本数据处理
dealSitePCSDate(singleSiteBaseInfo,siteMonitorDataVoList);
dealSiteChargeDate(singleSiteBaseInfo,siteMonitorDataVoList);
}
}
return singleSiteBaseInfo;
}
private void dealSitePCSDate(SingleSiteBaseInfo singleSiteBaseInfo, List<SiteMonitorDataVo> siteMonitorDataVoList) {
private void dealSiteChargeDate(SingleSiteBaseInfo singleSiteBaseInfo, List<SiteMonitorDataVo> siteMonitorDataVoList) {
if (siteMonitorDataVoList != null && !siteMonitorDataVoList.isEmpty()) {
for (SiteMonitorDataVo sitePcsData : siteMonitorDataVoList) {
// 获取当天的充电量+放电量
String pcsDate = sitePcsData.getAmmeterDate();
boolean isToday= checkIsToday(pcsDate);
String dayDate = sitePcsData.getAmmeterDate();
boolean isToday= DateUtils.checkIsToday(dayDate);
if(isToday){
singleSiteBaseInfo.setDayChargedCap(sitePcsData.getChargedCap());
singleSiteBaseInfo.setDayDisChargedCap(sitePcsData.getDisChargedCap());
@ -102,21 +107,6 @@ public class HomePageServiceImpl implements IHomePageService
}
}
private boolean checkIsToday(String pcsDate) {
boolean flag = false;
Calendar calendar = Calendar.getInstance();
int todayMonth = calendar.get(Calendar.MONTH) + 1;
int todayDay = calendar.get(Calendar.DAY_OF_MONTH);
if (StringUtils.isNotEmpty(pcsDate)){
String[] pcsDateArray = pcsDate.split("-");
if (todayMonth == Integer.parseInt(pcsDateArray[0]) &&
todayDay == Integer.parseInt(pcsDateArray[1])) {
flag = true;
}
}
return flag;
}
/**
* 首页看板-数据概览
*/
@ -179,7 +169,7 @@ public class HomePageServiceImpl implements IHomePageService
Date startDate = requestVo.getStartDate();
Date endDate = requestVo.getEndDate();
// 七天放电数据统计
List<SiteMonitorDataVo> siteMonitorDataVoList = emsPcsDataMapper.getPcsDataBySiteId(siteId,startDate,endDate);
List<SiteMonitorDataVo> siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate);
return siteMonitorDataVoList;
}

View File

@ -61,6 +61,8 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
private EmsStrategyRunningMapper emsStrategyRunningMapper;
@Autowired
private EmsStrategyTempMapper emsStrategyTempMapper;
@Autowired
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
@Override
public SiteMonitorHomeVo getSiteMonitorDataVo(String siteId) {
@ -68,11 +70,12 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
if (!StringUtils.isEmpty(siteId)) {
// 获取单站点的总充+总放+电网实时功率
Map<String,BigDecimal> pcsMap = emsPcsDataMapper.getPcsTotalChargeData(siteId);
if (pcsMap != null) {
siteMonitorHomeVo.setTotalChargedCap(pcsMap.get("totalChargedCap"));
siteMonitorHomeVo.setTotalDischargedCap(pcsMap.get("totalDischargedCap"));
siteMonitorHomeVo.setGridNrtPower(pcsMap.get("gridNrtPower"));
String nowData = DateUtils.getDate();
Map<String,BigDecimal> dataMap = emsDailyChargeDataMapper.getAllSiteChargeData(nowData,siteId);
if (dataMap != null) {
siteMonitorHomeVo.setTotalChargedCap(dataMap.get("totalChargedCap"));
siteMonitorHomeVo.setTotalDischargedCap(dataMap.get("totalDischargedCap"));
siteMonitorHomeVo.setGridNrtPower(dataMap.get("gridNrtPower"));
}
// 实时告警数据 名称+状态+告警内容
List<SiteMonitorHomeAlarmVo> siteMonitorHomeAlarmVo = emsAlarmRecordsMapper.getAlarmRecordsBySiteId(siteId);
@ -91,12 +94,12 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
LocalDate sevenDaysAgo = LocalDate.now().minusDays(6);
Date startDate = DateUtils.toDate(sevenDaysAgo);
Date endDate = new Date();
List<SiteMonitorDataVo> siteMonitorDataVoList = emsPcsDataMapper.getPcsDataBySiteId(siteId,startDate,endDate);
List<SiteMonitorDataVo> siteMonitorDataVoList = emsDailyChargeDataMapper.getSingleSiteChargeData(siteId,startDate,endDate);
if (!CollectionUtils.isEmpty(siteMonitorDataVoList)) {
for (SiteMonitorDataVo sitePcsData : siteMonitorDataVoList) {
// 获取当天的充电量+放电量
String pcsDate = sitePcsData.getAmmeterDate();
boolean isToday= checkIsToday(pcsDate);
boolean isToday= DateUtils.checkIsToday(pcsDate);
if(isToday){
siteMonitorHomeVo.setDayChargedCap(sitePcsData.getChargedCap());
siteMonitorHomeVo.setDayDisChargedCap(sitePcsData.getDisChargedCap());
@ -112,21 +115,6 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
return siteMonitorHomeVo;
}
private boolean checkIsToday(String pcsDate) {
boolean flag = false;
Calendar calendar = Calendar.getInstance();
int todayMonth = calendar.get(Calendar.MONTH) + 1;
int todayDay = calendar.get(Calendar.DAY_OF_MONTH);
if (StringUtils.isNotEmpty(pcsDate)){
String[] pcsDateArray = pcsDate.split("-");
if (todayMonth == Integer.parseInt(pcsDateArray[0]) &&
todayDay == Integer.parseInt(pcsDateArray[1])) {
flag = true;
}
}
return flag;
}
// 获取单站监控实时运行头部数据
@Override
public SiteMonitorRunningHeadInfoVo getSiteRunningHeadInfo(String siteId) {

View File

@ -883,4 +883,12 @@
and t.data_update_time = latest.max_update_time
order by dataTime
</select>
<select id="getYestLatestDate" resultMap="EmsAmmeterDataResult">
<include refid="selectEmsAmmeterDataVo"/>
where site_id = #{siteId}
and device_id = #{deviceId}
and DATE(data_update_time) = #{yestData}
order by data_update_time desc limit 1
</select>
</mapper>

View File

@ -343,7 +343,7 @@
avg(t.avg_cell_temp) as batteryTemp,
DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00') AS createDate
from ems_battery_cluster t
where t.site_id = '021_FXX_01'
where t.site_id = #{siteId}
AND t.create_time &gt;= Date(#{startDate})
AND t.create_time &lt;= #{endDate}
GROUP BY t.site_id,DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00')