站点首页-当日功率曲线按照分钟展示数据

This commit is contained in:
zq
2026-01-27 16:47:48 +08:00
parent 619c05e965
commit 5225f03195
9 changed files with 169 additions and 34 deletions

View File

@ -31,6 +31,8 @@ public class PowerStatisListVo {
*/
private BigDecimal pvPower;
public PowerStatisListVo() {}
public PowerStatisListVo(String statisDate, BigDecimal gridPower, BigDecimal storagePower, BigDecimal pvPower) {
this.statisDate = statisDate;
this.gridPower = gridPower;

View File

@ -6,6 +6,7 @@ import java.math.BigDecimal;
* 单站监控-首页-电池堆点位数据
*/
public class StackPointVo{
private String statisDate;
/** SOC */
private BigDecimal avgSoc;

View File

@ -1,9 +1,18 @@
package com.xzzn.ems.mapper;
import com.xzzn.ems.domain.EmsAmmeterData;
import com.xzzn.ems.domain.vo.AmmeterStatisListVo;
import com.xzzn.ems.domain.vo.DateSearchRequest;
import com.xzzn.ems.domain.vo.MonthlyTimeRange;
import com.xzzn.ems.domain.vo.PowerStatisListVo;
import com.xzzn.ems.domain.vo.SiteMonitorDataVo;
import com.xzzn.ems.domain.vo.StatisAmmeterDateRequest;
import com.xzzn.ems.domain.vo.TimePointQuery;
import com.xzzn.ems.domain.vo.TimePointValue;
import java.util.Date;
import java.util.List;
import com.xzzn.ems.domain.EmsAmmeterData;
import com.xzzn.ems.domain.vo.*;
import org.apache.ibatis.annotations.Param;
/**
@ -99,4 +108,6 @@ public interface EmsAmmeterDataMapper
List<AmmeterStatisListVo> selectDailyAmmeterData(@Param("siteId") String siteId,
@Param("startTime") String startTime,
@Param("endTime") String endTime);
List<PowerStatisListVo> getPowerDataByMinute(DateSearchRequest requestVo);
}

View File

@ -1,12 +1,17 @@
package com.xzzn.ems.mapper;
import com.xzzn.ems.domain.EmsBatteryCluster;
import com.xzzn.ems.domain.vo.BMSBatteryDataList;
import com.xzzn.ems.domain.vo.BatteryAveTempVo;
import com.xzzn.ems.domain.vo.ClusterStatisListVo;
import com.xzzn.ems.domain.vo.DateSearchRequest;
import com.xzzn.ems.domain.vo.StatisClusterDateRequest;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.xzzn.ems.domain.EmsBatteryCluster;
import com.xzzn.ems.domain.vo.*;
import org.apache.ibatis.annotations.Param;
/**
@ -83,4 +88,6 @@ public interface EmsBatteryClusterMapper
public List<Map<String, BigDecimal>> getAvgTempByHour(DateSearchRequest requestVo);
public List<Map<String, BigDecimal>> getAvgTempByDay(DateSearchRequest requestVo);
public List<Map<String, BigDecimal>> getAvgTempByMonth(DateSearchRequest requestVo);
List<Map<String, BigDecimal>> getAvgTempByMinute(DateSearchRequest requestVo);
}

View File

@ -1,9 +1,15 @@
package com.xzzn.ems.mapper;
import com.xzzn.ems.domain.EmsBatteryStack;
import com.xzzn.ems.domain.vo.BatteryAveSOCVo;
import com.xzzn.ems.domain.vo.BatteryAveTempVo;
import com.xzzn.ems.domain.vo.DateSearchRequest;
import com.xzzn.ems.domain.vo.StackPointVo;
import com.xzzn.ems.domain.vo.StackStatisListVo;
import java.util.Date;
import java.util.List;
import com.xzzn.ems.domain.EmsBatteryStack;
import com.xzzn.ems.domain.vo.*;
import org.apache.ibatis.annotations.Param;
/**
@ -85,4 +91,6 @@ public interface EmsBatteryStackMapper
public List<BatteryAveSOCVo> getAveSocList(@Param("siteId") String siteId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
// 实时运行-DDS平均温度
public List<BatteryAveTempVo> getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date yesterday, @Param("endDate") Date today);
List<StackPointVo> getStackPointByMinute(DateSearchRequest requestVo);
}

View File

@ -4,7 +4,6 @@ import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.enums.AmmeterCategory;
import com.xzzn.common.enums.DeviceCategory;
import com.xzzn.common.enums.SiteEnum;
import com.xzzn.common.utils.DateUtils;
import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsAmmeterData;
@ -936,7 +935,8 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
List<PointDataResponse> responseList = new ArrayList<>();
List<PowerStatisListVo> powerList = new ArrayList<>();//功率数据
List<StackPointVo> stackList = new ArrayList<>();//电池堆数据
List<Map<String,BigDecimal>> fxAvgTempList = new ArrayList<>();
// List<Map<String,BigDecimal>> fxAvgTempList = new ArrayList<>();
List<Map<String,BigDecimal>> avgTempList = new ArrayList<>();
// 默认时间-7天
dealRequestTime(requestVo);
@ -944,40 +944,54 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date endDate = requestVo.getEndDate();
List<String> timeList = new ArrayList<>();
// 开始日期和结束日期同一天,展示 0-24 小时数据
// // 开始日期和结束日期同一天,展示 0-24 小时数据
// if (DateUtils.isSameDay(startDate, endDate)){
// endDate = DateUtils.addDays(endDate, 1);
// requestVo.setEndDate(endDate);
// powerList = emsAmmeterDataMapper.getPowerDataByHour(requestVo);//功率数据
// stackList = emsBatteryStackMapper.getStackPointByHour(requestVo);//电池堆数据
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo);
// }
// avgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo);//电池簇数据
// }
// 开始日期和结束日期同一天展示每5分钟一个点数据
if (DateUtils.isSameDay(startDate, endDate)){
endDate = DateUtils.addDays(endDate, 1);
requestVo.setEndDate(endDate);
powerList = emsAmmeterDataMapper.getPowerDataByHour(requestVo);//功率数据
stackList = emsBatteryStackMapper.getStackPointByHour(requestVo);//电池堆数据
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
fxAvgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo);
}
} else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1
powerList = emsAmmeterDataMapper.getPowerDataByMinute(requestVo);//功率数据
stackList = emsBatteryStackMapper.getStackPointByMinute(requestVo);//电池堆数据
avgTempList = emsBatteryClusterMapper.getAvgTempByMinute(requestVo);//电池簇数据
}
else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1
&& DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){
endDate = DateUtils.addDays(endDate, 1);
requestVo.setEndDate(endDate);
// 开始日期-结束日期大于 1 天小于30 天,按天展示数据
powerList = emsAmmeterDataMapper.getPowerDataByDay(requestVo);//功率数据
stackList = emsBatteryStackMapper.getStackPointByDay(requestVo);//电池堆数据
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
fxAvgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);
}
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);
// }
avgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);//电池簇数据
} else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){
endDate = DateUtils.addDays(endDate, 1);
requestVo.setEndDate(endDate);
// 开始日期-结束日期大于 1 个月,按月展示数据
powerList = emsAmmeterDataMapper.getPowerDataByMonth(requestVo);//功率数据
stackList = emsBatteryStackMapper.getStackPointByMonth(requestVo);//电池堆数据
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
fxAvgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);
}
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);
// }
avgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);//电池簇数据
}
// 如果奉贤数据电池平均温度单独取值。将其塞入stackList里面
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
processFXXTempData(stackList,fxAvgTempList);
}
// // 如果奉贤数据电池平均温度单独取值。将其塞入stackList里面
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
// processFXXTempData(stackList,fxAvgTempList);
// }
// 优先从电池堆取,电池堆没有的话再从电池簇取
processTempData(stackList, avgTempList);
// 数据转换为Map
Map<String, PowerStatisListVo> powerMap = powerList.stream()
@ -1027,17 +1041,49 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
BigDecimal pvPower = pointDataResponse.getPvPower() == null ? BigDecimal.ZERO : pointDataResponse.getPvPower();
BigDecimal loadPower = new BigDecimal(0);
// 电动所:负荷功率=电网功率+光伏功率-储能功率
// 奉贤:负荷功率=电网功率-储能功率;
if (SiteEnum.DDS.getCode().equals(siteId)){
loadPower = gridPower.add(pvPower).subtract(storagePower);
pointDataResponse.setLoadPower(loadPower);
} else if (SiteEnum.FX.getCode().equals(siteId)){
// 奉贤:负荷功率=电网功率-储能功率;
loadPower = gridPower.subtract(storagePower);
pointDataResponse.setLoadPower(loadPower);
// // 电动所:负荷功率=电网功率+光伏功率-储能功率
// // 奉贤:负荷功率=电网功率-储能功率;
// if (SiteEnum.DDS.getCode().equals(siteId)){
// loadPower = gridPower.add(pvPower).subtract(storagePower);
// pointDataResponse.setLoadPower(loadPower);
// } else if (SiteEnum.FX.getCode().equals(siteId)){
// // 奉贤:负荷功率=电网功率-储能功率;
// loadPower = gridPower.subtract(storagePower);
// pointDataResponse.setLoadPower(loadPower);
// }
// 负荷功率=电网功率+光伏功率-储能功率
loadPower = gridPower.add(pvPower).subtract(storagePower);
pointDataResponse.setLoadPower(loadPower);
}
}
private void processTempData(List<StackPointVo> stackList, List<Map<String, BigDecimal>> avgTempList) {
if (stackList == null || avgTempList == null) {
return;
}
Map<String,BigDecimal> avgTempMap = avgTempList.stream()
.filter(subMap -> subMap != null && !subMap.isEmpty())
.filter(subMap -> subMap.containsKey("statisDate") && subMap.containsKey("avgTemp"))
.collect(Collectors.toMap(
subMap -> String.valueOf(subMap.get("statisDate")),
subMap -> (BigDecimal)subMap.get("avgTemp"),
(existingValue, newValue) -> newValue,
HashMap::new
));
for (StackPointVo stackPointVo : stackList) {
if (stackPointVo.getAvgTemp() != null) {
continue;
}
// 从map中获取temp
BigDecimal mapTemp = (avgTempMap != null) ? avgTempMap.get(stackPointVo.getStatisDate()) : null;
if (mapTemp != null) {
stackPointVo.setAvgTemp(mapTemp);
}
}
}
private void processFXXTempData(List<StackPointVo> stackList, List<Map<String, BigDecimal>> fxAvgTempList) {

View File

@ -1141,4 +1141,24 @@
dataTime
) temp
</select>
<select id="getPowerDataByMinute" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PowerStatisListVo">
WITH ranked AS (
SELECT
*,
DATE_FORMAT(
DATE_ADD(DATE_FORMAT(p.update_time, '%Y-%m-%d %H:00:00'), INTERVAL FLOOR(MINUTE(p.update_time) / 5) * 5 MINUTE)
, '%Y-%m-%d %H:%i:%s') AS statisDate,
ROW_NUMBER() OVER (PARTITION BY p.device_id, date_format(p.data_update_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(p.data_update_time) / 5) ORDER BY p.data_update_time) as rn
FROM
ems_ammeter_data p
<include refid="commonFilter"/>
)
SELECT
t.site_id,
t.statisDate,
<include refid="powerFilter"/>
FROM
ranked as t
GROUP BY t.site_id, t.statisDate
</select>
</mapper>

View File

@ -428,4 +428,23 @@
GROUP BY statisDate
ORDER BY statisDate
</select>
<select id="getAvgTempByMinute" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="java.util.Map">
WITH ranked AS (
SELECT
*,
date_format(p.update_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(p.update_time) / 5) * 5 MINUTE AS group_time,
ROW_NUMBER() OVER (PARTITION BY p.device_id, date_format(p.update_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(p.update_time) / 5) ORDER BY p.update_time) as rn
FROM
ems_battery_cluster p
<include refid="statisCommonFilter"/>
)
SELECT
t.site_id,
DATE_FORMAT(t.group_time, '%Y-%m-%d %H:%i:00') as statisDate,
avg(t.avg_cell_temp) as avgTemp
FROM
ranked as t
GROUP BY t.site_id, t.group_time
</select>
</mapper>

View File

@ -509,6 +509,27 @@
ORDER BY statisDate
</select>
<select id="getStackPointByMinute" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.StackPointVo">
WITH ranked AS (
SELECT
*,
date_format(p.update_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(p.update_time) / 5) * 5 MINUTE AS group_time,
ROW_NUMBER() OVER (PARTITION BY p.device_id, date_format(p.update_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(p.update_time) / 5) ORDER BY p.update_time) as rn
FROM
ems_battery_stack p
<include refid="statisCommonFilter"/>
)
SELECT
t.site_id,
DATE_FORMAT(t.group_time, '%Y-%m-%d %H:%i:%s') as statisDate,
avg(t.stack_soc) as avgSoc,
avg(t.stack_soh) as avgSoh,
avg(t.avg_temperature) as avgTemp
FROM
ranked as t
GROUP BY t.site_id, t.group_time
</select>
<select id="getAveSocList" resultType="com.xzzn.ems.domain.vo.BatteryAveSOCVo">
WITH ranked AS (
SELECT