数据20250904优化-单站监控首页点位数据展示
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@ -8,5 +8,5 @@
|
|||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="openjdk-24" project-jdk-type="JavaSDK" />
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_24" default="true" project-jdk-name="openjdk-24" project-jdk-type="JavaSDK" />
|
||||||
</project>
|
</project>
|
||||||
@ -3,6 +3,7 @@ package com.xzzn.web.controller.ems;
|
|||||||
import com.xzzn.common.core.controller.BaseController;
|
import com.xzzn.common.core.controller.BaseController;
|
||||||
import com.xzzn.common.core.domain.AjaxResult;
|
import com.xzzn.common.core.domain.AjaxResult;
|
||||||
import com.xzzn.common.core.page.TableDataInfo;
|
import com.xzzn.common.core.page.TableDataInfo;
|
||||||
|
import com.xzzn.common.utils.StringUtils;
|
||||||
import com.xzzn.ems.domain.vo.BMSBatteryDataList;
|
import com.xzzn.ems.domain.vo.BMSBatteryDataList;
|
||||||
import com.xzzn.ems.domain.vo.BatteryDataStatsListVo;
|
import com.xzzn.ems.domain.vo.BatteryDataStatsListVo;
|
||||||
import com.xzzn.ems.domain.vo.DateSearchRequest;
|
import com.xzzn.ems.domain.vo.DateSearchRequest;
|
||||||
@ -184,4 +185,19 @@ public class EmsSiteMonitorController extends BaseController{
|
|||||||
{
|
{
|
||||||
return success(iSingleSiteService.getAmmeterDataList(siteId));
|
return success(iSingleSiteService.getAmmeterDataList(siteId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单站监控-首页-点位展示
|
||||||
|
* 储能功率、电网功率、负荷功率、光伏功率
|
||||||
|
* SOC、SOH、电池平均温度
|
||||||
|
*/
|
||||||
|
@GetMapping("/getPointData")
|
||||||
|
public AjaxResult getPointData(DateSearchRequest requestVo)
|
||||||
|
{
|
||||||
|
if (!StringUtils.isEmpty(requestVo.getSiteId())) {
|
||||||
|
return success(iSingleSiteService.getPointData(requestVo));
|
||||||
|
} else {
|
||||||
|
return error("缺少必传项");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,103 @@
|
|||||||
|
package com.xzzn.ems.domain.vo;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单站监控-首页-点位重点数据展示
|
||||||
|
*/
|
||||||
|
public class PointDataResponse{
|
||||||
|
/** 数据日期 */
|
||||||
|
private String statisDate;
|
||||||
|
/** 电网功率-total_active_power(LOAD) */
|
||||||
|
private BigDecimal gridPower;
|
||||||
|
/** 负载功率 */
|
||||||
|
private BigDecimal loadPower;
|
||||||
|
/** 储能功率-secondary_total_active_power(METE) */
|
||||||
|
private BigDecimal storagePower;
|
||||||
|
/** 光伏功率-total_active_power(METEGT) */
|
||||||
|
private BigDecimal pvPower;
|
||||||
|
/** SOC */
|
||||||
|
private BigDecimal avgSoc;
|
||||||
|
/** SOH */
|
||||||
|
private BigDecimal avgSoh;
|
||||||
|
/** 电池平均温度 */
|
||||||
|
private BigDecimal avgTemp;
|
||||||
|
|
||||||
|
public PointDataResponse(String statisDate,
|
||||||
|
BigDecimal pvPower, BigDecimal storagePower, BigDecimal loadPower, BigDecimal gridPower,
|
||||||
|
BigDecimal avgSoh, BigDecimal avgSoc,BigDecimal avgTemp
|
||||||
|
) {
|
||||||
|
this.avgTemp = avgTemp;
|
||||||
|
this.avgSoh = avgSoh;
|
||||||
|
this.avgSoc = avgSoc;
|
||||||
|
this.pvPower = pvPower;
|
||||||
|
this.storagePower = storagePower;
|
||||||
|
this.loadPower = loadPower;
|
||||||
|
this.gridPower = gridPower;
|
||||||
|
this.statisDate = statisDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAvgTemp() {
|
||||||
|
return avgTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvgTemp(BigDecimal avgTemp) {
|
||||||
|
this.avgTemp = avgTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAvgSoc() {
|
||||||
|
return avgSoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvgSoc(BigDecimal avgSoc) {
|
||||||
|
this.avgSoc = avgSoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAvgSoh() {
|
||||||
|
return avgSoh;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvgSoh(BigDecimal avgSoh) {
|
||||||
|
this.avgSoh = avgSoh;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatisDate() {
|
||||||
|
return statisDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatisDate(String statisDate) {
|
||||||
|
this.statisDate = statisDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getGridPower() {
|
||||||
|
return gridPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGridPower(BigDecimal gridPower) {
|
||||||
|
this.gridPower = gridPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getLoadPower() {
|
||||||
|
return loadPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadPower(BigDecimal loadPower) {
|
||||||
|
this.loadPower = loadPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getStoragePower() {
|
||||||
|
return storagePower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStoragePower(BigDecimal storagePower) {
|
||||||
|
this.storagePower = storagePower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getPvPower() {
|
||||||
|
return pvPower;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPvPower(BigDecimal pvPower) {
|
||||||
|
this.pvPower = pvPower;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
package com.xzzn.ems.domain.vo;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单站监控-首页-电池堆点位数据
|
||||||
|
*/
|
||||||
|
public class StackPointVo{
|
||||||
|
private String statisDate;
|
||||||
|
/** SOC */
|
||||||
|
private BigDecimal avgSoc;
|
||||||
|
|
||||||
|
/** SOH */
|
||||||
|
private BigDecimal avgSoh;
|
||||||
|
|
||||||
|
/** 电池平均温度 */
|
||||||
|
private BigDecimal avgTemp;
|
||||||
|
|
||||||
|
public String getStatisDate() {
|
||||||
|
return statisDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatisDate(String statisDate) {
|
||||||
|
this.statisDate = statisDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAvgTemp() {
|
||||||
|
return avgTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvgTemp(BigDecimal avgTemp) {
|
||||||
|
this.avgTemp = avgTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAvgSoc() {
|
||||||
|
return avgSoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvgSoc(BigDecimal avgSoc) {
|
||||||
|
this.avgSoc = avgSoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getAvgSoh() {
|
||||||
|
return avgSoh;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvgSoh(BigDecimal avgSoh) {
|
||||||
|
this.avgSoh = avgSoh;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,12 +12,12 @@ public class StackStatisListVo {
|
|||||||
private String statisDate;
|
private String statisDate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 有功
|
* 温度
|
||||||
*/
|
*/
|
||||||
private BigDecimal temp;
|
private BigDecimal temp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 无功
|
* 电压
|
||||||
*/
|
*/
|
||||||
private BigDecimal voltage;
|
private BigDecimal voltage;
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,10 @@
|
|||||||
package com.xzzn.ems.mapper;
|
package com.xzzn.ems.mapper;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import com.xzzn.ems.domain.EmsBatteryCluster;
|
import com.xzzn.ems.domain.EmsBatteryCluster;
|
||||||
import com.xzzn.ems.domain.vo.*;
|
import com.xzzn.ems.domain.vo.*;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
@ -83,4 +86,9 @@ public interface EmsBatteryClusterMapper
|
|||||||
|
|
||||||
/** 堆电池温度数据-获取当天每小时簇 */
|
/** 堆电池温度数据-获取当天每小时簇 */
|
||||||
public List<ClusterStatisListVo> getClusterDataByHour(StatisClusterDateRequest requestVo);
|
public List<ClusterStatisListVo> getClusterDataByHour(StatisClusterDateRequest requestVo);
|
||||||
|
|
||||||
|
// 奉贤-电池平均温度
|
||||||
|
public List<Map<String, BigDecimal>> getAvgTempByHour(DateSearchRequest requestVo);
|
||||||
|
public List<Map<String, BigDecimal>> getAvgTempByDay(DateSearchRequest requestVo);
|
||||||
|
public List<Map<String, BigDecimal>> getAvgTempByMonth(DateSearchRequest requestVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@ import java.util.List;
|
|||||||
import com.xzzn.ems.domain.EmsBatteryStack;
|
import com.xzzn.ems.domain.EmsBatteryStack;
|
||||||
import com.xzzn.ems.domain.vo.DateSearchRequest;
|
import com.xzzn.ems.domain.vo.DateSearchRequest;
|
||||||
import com.xzzn.ems.domain.vo.StackAveTempVo;
|
import com.xzzn.ems.domain.vo.StackAveTempVo;
|
||||||
|
import com.xzzn.ems.domain.vo.StackPointVo;
|
||||||
import com.xzzn.ems.domain.vo.StackStatisListVo;
|
import com.xzzn.ems.domain.vo.StackStatisListVo;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
@ -85,4 +86,9 @@ public interface EmsBatteryStackMapper
|
|||||||
public List<StackStatisListVo> getStackDataByMonth(DateSearchRequest requestVo);
|
public List<StackStatisListVo> getStackDataByMonth(DateSearchRequest requestVo);
|
||||||
|
|
||||||
public EmsBatteryStack getSiteSumStackInfo(String siteId);
|
public EmsBatteryStack getSiteSumStackInfo(String siteId);
|
||||||
|
|
||||||
|
// 点位数据 - soc/soh/temp
|
||||||
|
public List<StackPointVo> getStackPointByHour(DateSearchRequest requestVo);
|
||||||
|
public List<StackPointVo> getStackPointByDay(DateSearchRequest requestVo);
|
||||||
|
public List<StackPointVo> getStackPointByMonth(DateSearchRequest requestVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,4 +39,6 @@ public interface ISingleSiteService
|
|||||||
public SiteMonitorRuningInfoVo getRunningGraphBatteryTemp(String siteId);
|
public SiteMonitorRuningInfoVo getRunningGraphBatteryTemp(String siteId);
|
||||||
|
|
||||||
public List<BMSBatteryDataList> getClusterBatteryList(String siteId, String stackDeviceId, String clusterDeviceId);
|
public List<BMSBatteryDataList> getClusterBatteryList(String siteId, String stackDeviceId, String clusterDeviceId);
|
||||||
|
|
||||||
|
public List<PointDataResponse> getPointData(DateSearchRequest requestVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,10 +40,6 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
|
|||||||
@Autowired
|
@Autowired
|
||||||
private EmsDevicesSettingMapper emsDevicesSettingMapper;
|
private EmsDevicesSettingMapper emsDevicesSettingMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsBatteryDataMapper emsBatteryDataMapper;
|
|
||||||
@Autowired
|
|
||||||
private EmsBatteryDailyLatestMapper emsBatteryDailyLatestMapper;
|
|
||||||
@Autowired
|
|
||||||
private EmsBatteryDataDayMapper emsBatteryDataDayMapper;
|
private EmsBatteryDataDayMapper emsBatteryDataDayMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
|
private EmsDailyChargeDataMapper emsDailyChargeDataMapper;
|
||||||
@ -353,8 +349,6 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void dealDataPower(String siteId, List<PowerStatisListVo> dataList) {
|
private void dealDataPower(String siteId, List<PowerStatisListVo> dataList) {
|
||||||
DecimalFormat df = new DecimalFormat("0.####");
|
|
||||||
|
|
||||||
if (dataList == null || dataList.size() == 0){
|
if (dataList == null || dataList.size() == 0){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import com.alibaba.fastjson2.TypeReference;
|
|||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
import com.fasterxml.jackson.databind.JsonNode;
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.xzzn.common.constant.Constants;
|
|
||||||
import com.xzzn.common.constant.RedisKeyConstants;
|
import com.xzzn.common.constant.RedisKeyConstants;
|
||||||
import com.xzzn.common.core.redis.RedisCache;
|
import com.xzzn.common.core.redis.RedisCache;
|
||||||
import com.xzzn.common.enums.*;
|
import com.xzzn.common.enums.*;
|
||||||
@ -23,12 +22,10 @@ import org.springframework.beans.BeanUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService {
|
public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService {
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import com.xzzn.common.constant.RedisKeyConstants;
|
|||||||
import com.xzzn.common.core.redis.RedisCache;
|
import com.xzzn.common.core.redis.RedisCache;
|
||||||
import com.xzzn.common.enums.AmmeterCategory;
|
import com.xzzn.common.enums.AmmeterCategory;
|
||||||
import com.xzzn.common.enums.DeviceCategory;
|
import com.xzzn.common.enums.DeviceCategory;
|
||||||
|
import com.xzzn.common.enums.SiteEnum;
|
||||||
import com.xzzn.common.utils.DateUtils;
|
import com.xzzn.common.utils.DateUtils;
|
||||||
import com.xzzn.common.utils.StringUtils;
|
import com.xzzn.common.utils.StringUtils;
|
||||||
import com.xzzn.ems.domain.*;
|
import com.xzzn.ems.domain.*;
|
||||||
@ -38,19 +39,26 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
|
|||||||
|
|
||||||
private static final String AMMETER_DEVICE_METE = "METE";
|
private static final String AMMETER_DEVICE_METE = "METE";
|
||||||
|
|
||||||
|
private static Map<String, BigDecimal> storageFactor = new HashMap<>();
|
||||||
|
static {
|
||||||
|
storageFactor.put("021_DDS_01", new BigDecimal("0.1"));
|
||||||
|
storageFactor.put("default", BigDecimal.ONE); // 默认1
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, BigDecimal> pvFactor = new HashMap<>();
|
||||||
|
static {
|
||||||
|
pvFactor.put("021_DDS_01", new BigDecimal("-0.001"));
|
||||||
|
pvFactor.put("default", BigDecimal.ONE); // Convert to Basic Latin
|
||||||
|
}
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsPcsDataMapper emsPcsDataMapper;
|
private EmsPcsDataMapper emsPcsDataMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsAlarmRecordsMapper emsAlarmRecordsMapper;
|
private EmsAlarmRecordsMapper emsAlarmRecordsMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsBatteryDataMapper emsBatteryDataMapper;
|
|
||||||
@Autowired
|
|
||||||
private EmsBatteryStackMapper emsBatteryStackMapper;
|
private EmsBatteryStackMapper emsBatteryStackMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsPcsBranchDataMapper emsPcsBranchDataMapper;
|
|
||||||
@Autowired
|
|
||||||
private EmsCoolingDataMapper emsCoolingDataMapper;
|
private EmsCoolingDataMapper emsCoolingDataMapper;
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsAmmeterDataMapper emsAmmeterDataMapper;
|
private EmsAmmeterDataMapper emsAmmeterDataMapper;
|
||||||
@ -537,4 +545,160 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单站监控-首页-获取重点数据
|
||||||
|
* @param requestVo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<PointDataResponse> getPointData(DateSearchRequest requestVo) {
|
||||||
|
List<PointDataResponse> responseList = new ArrayList<>();
|
||||||
|
List<PowerStatisListVo> powerList = new ArrayList<>();//功率数据
|
||||||
|
List<StackPointVo> stackList = new ArrayList<>();//电池堆数据
|
||||||
|
List<Map<String,BigDecimal>> fxAvgTempList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 默认时间-7天
|
||||||
|
dealRequestTime(requestVo);
|
||||||
|
Date startDate = requestVo.getStartDate();
|
||||||
|
Date endDate = requestVo.getEndDate();
|
||||||
|
List<String> timeList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 开始日期和结束日期同一天,展示 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);
|
||||||
|
}
|
||||||
|
} 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);
|
||||||
|
}
|
||||||
|
} 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果奉贤数据:电池平均温度单独取值。将其塞入stackList里面
|
||||||
|
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
||||||
|
processFXXTempData(stackList,fxAvgTempList);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 数据转换为Map
|
||||||
|
Map<String, PowerStatisListVo> powerMap = powerList.stream()
|
||||||
|
.collect(Collectors.toMap(PowerStatisListVo::getStatisDate, stat -> stat));
|
||||||
|
Map<String, StackPointVo> stackMap = stackList.stream()
|
||||||
|
.collect(Collectors.toMap(StackPointVo::getStatisDate, stat -> stat));
|
||||||
|
// 收集所有日期
|
||||||
|
Set<String> allDates = new HashSet<>();
|
||||||
|
allDates.addAll(powerMap.keySet());
|
||||||
|
allDates.addAll(stackMap.keySet());
|
||||||
|
|
||||||
|
// 按日期合并数据
|
||||||
|
responseList = allDates.stream()
|
||||||
|
.map(date -> {
|
||||||
|
PowerStatisListVo powerStat = powerMap.get(date);
|
||||||
|
StackPointVo stackStat = stackMap.get(date);
|
||||||
|
|
||||||
|
// null时取0
|
||||||
|
BigDecimal pvPower = powerStat != null ? powerStat.getPvPower() : BigDecimal.ZERO;
|
||||||
|
BigDecimal storagePower = powerStat != null ? powerStat.getStoragePower() : BigDecimal.ZERO;
|
||||||
|
BigDecimal gridPower = powerStat != null ? powerStat.getGridPower() : BigDecimal.ZERO;
|
||||||
|
BigDecimal avgSoh = stackStat != null ? stackStat.getAvgSoh() : BigDecimal.ZERO;
|
||||||
|
BigDecimal avgSoc = stackStat != null ? stackStat.getAvgSoc() : BigDecimal.ZERO;
|
||||||
|
BigDecimal avgTemp = stackStat != null ? stackStat.getAvgTemp() : BigDecimal.ZERO;
|
||||||
|
|
||||||
|
// 假设完整构造参数(补充原代码中缺失的部分)
|
||||||
|
return new PointDataResponse(date, pvPower, storagePower, BigDecimal.ZERO, gridPower, avgSoh, avgSoc, avgTemp);
|
||||||
|
})
|
||||||
|
// 按日期排序
|
||||||
|
.sorted(Comparator.comparing(PointDataResponse::getStatisDate))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 处理数据系数 &负荷功率
|
||||||
|
dealDataPower(requestVo.getSiteId(),responseList);
|
||||||
|
|
||||||
|
return responseList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dealDataPower(String siteId, List<PointDataResponse> dataList) {
|
||||||
|
if (dataList == null || dataList.size() == 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (PointDataResponse pointDataResponse : dataList) {
|
||||||
|
BigDecimal gridPower = pointDataResponse.getGridPower() == null ? BigDecimal.ZERO : pointDataResponse.getGridPower();
|
||||||
|
BigDecimal storagePower = pointDataResponse.getStoragePower() == null ? BigDecimal.ZERO : pointDataResponse.getStoragePower();
|
||||||
|
BigDecimal pvPower = pointDataResponse.getPvPower() == null ? BigDecimal.ZERO : pointDataResponse.getPvPower();
|
||||||
|
BigDecimal loadPower = new BigDecimal(0);
|
||||||
|
|
||||||
|
// 电动所:储能功率=储能功率乘0.1;光伏功率=光伏功率*乘-0.001;负荷功率=电网功率+光伏功率-储能功率
|
||||||
|
// 奉贤:负荷功率=电网功率-储能功率;
|
||||||
|
// 电动所:储能功率=储能功率乘0.1;光伏功率=光伏功率*乘-0.001;负荷功率=电网功率+光伏功率-储能功率
|
||||||
|
if (SiteEnum.DDS.getCode().equals(siteId)){
|
||||||
|
pointDataResponse.setStoragePower(storagePower.multiply(storageFactor.get(siteId)).stripTrailingZeros());
|
||||||
|
pointDataResponse.setPvPower(pvPower.multiply(pvFactor.get(siteId)).stripTrailingZeros());
|
||||||
|
loadPower = gridPower.add(pointDataResponse.getPvPower()).subtract(pointDataResponse.getStoragePower());
|
||||||
|
pointDataResponse.setLoadPower(loadPower);
|
||||||
|
} else if (SiteEnum.FX.getCode().equals(siteId)){
|
||||||
|
// 奉贤:负荷功率=电网功率-储能功率;
|
||||||
|
loadPower = gridPower.subtract(storagePower);
|
||||||
|
pointDataResponse.setLoadPower(loadPower);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processFXXTempData(List<StackPointVo> stackList, List<Map<String, BigDecimal>> fxAvgTempList) {
|
||||||
|
if (stackList == null || fxAvgTempList == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String,BigDecimal> fxAvgTempMap = fxAvgTempList.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) {
|
||||||
|
// 从map中获取temp
|
||||||
|
BigDecimal mapTemp = (fxAvgTempMap != null) ? fxAvgTempMap.get(stackPointVo.getStatisDate()) : null;
|
||||||
|
if (mapTemp != null) {
|
||||||
|
stackPointVo.setAvgTemp(mapTemp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 统计入参时间处理
|
||||||
|
public void dealRequestTime(DateSearchRequest requestVo){
|
||||||
|
Date startDate = requestVo.getStartDate();
|
||||||
|
Date endDate = requestVo.getEndDate();
|
||||||
|
if (startDate == null && endDate == null) {
|
||||||
|
// 如果没有传时间,默认从今天往前7天
|
||||||
|
LocalDate sevenDaysAgo = LocalDate.now().minusDays(6);
|
||||||
|
startDate = DateUtils.toDate(sevenDaysAgo);
|
||||||
|
endDate = new Date();
|
||||||
|
requestVo.setStartDate(startDate);
|
||||||
|
requestVo.setEndDate(endDate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -984,7 +984,7 @@
|
|||||||
<select id="getPowerDataByHour" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PowerStatisListVo">
|
<select id="getPowerDataByHour" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PowerStatisListVo">
|
||||||
select latest.dateHour as statisDate,
|
select latest.dateHour as statisDate,
|
||||||
<include refid="powerFilter"/>
|
<include refid="powerFilter"/>
|
||||||
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H')+1 AS dateHour,MAX(p.data_update_time) as max_update_time
|
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H:00') AS dateHour,MAX(p.data_update_time) as max_update_time
|
||||||
FROM ems_ammeter_data p
|
FROM ems_ammeter_data p
|
||||||
<include refid="commonFilter"/>
|
<include refid="commonFilter"/>
|
||||||
GROUP BY p.site_id,p.device_id,dateHour
|
GROUP BY p.site_id,p.device_id,dateHour
|
||||||
|
|||||||
@ -374,4 +374,53 @@
|
|||||||
AND latest.max_update_time = t.update_time
|
AND latest.max_update_time = t.update_time
|
||||||
ORDER BY statisDate
|
ORDER BY statisDate
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<sql id="statisCommonFilter">
|
||||||
|
WHERE p.site_id = #{siteId}
|
||||||
|
<if test="startDate != null">
|
||||||
|
AND p.update_time >= #{startDate}
|
||||||
|
</if>
|
||||||
|
<if test="endDate != null">
|
||||||
|
AND p.update_time < #{endDate}
|
||||||
|
</if>
|
||||||
|
</sql>
|
||||||
|
|
||||||
|
<select id="getAvgTempByHour" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="java.util.Map">
|
||||||
|
SELECT latest.statisDate, avg(t.avg_cell_temp) as avgTemp
|
||||||
|
FROM ( SELECT p.site_id, p.device_id, DATE_FORMAT( p.update_time, '%H:00') AS statisDate, MAX(p.update_time) AS max_update_time
|
||||||
|
FROM ems_battery_cluster p
|
||||||
|
<include refid="statisCommonFilter"/>
|
||||||
|
GROUP BY p.site_id, p.device_id, statisDate
|
||||||
|
) latest INNER JOIN ems_battery_cluster t ON latest.site_id = t.site_id
|
||||||
|
AND latest.device_id = t.device_id
|
||||||
|
AND latest.max_update_time = t.update_time
|
||||||
|
GROUP BY statisDate
|
||||||
|
ORDER BY statisDate
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getAvgTempByDay" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="java.util.Map">
|
||||||
|
SELECT latest.statisDate, avg(t.avg_cell_temp) as avgTemp
|
||||||
|
FROM ( SELECT p.site_id, p.device_id, DATE( p.update_time) AS statisDate, MAX(p.update_time) AS max_update_time
|
||||||
|
FROM ems_battery_cluster p
|
||||||
|
<include refid="statisCommonFilter"/>
|
||||||
|
GROUP BY p.site_id, p.device_id, statisDate
|
||||||
|
) latest INNER JOIN ems_battery_cluster t ON latest.site_id = t.site_id
|
||||||
|
AND latest.device_id = t.device_id
|
||||||
|
AND latest.max_update_time = t.update_time
|
||||||
|
GROUP BY statisDate
|
||||||
|
ORDER BY statisDate
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getAvgTempByMonth" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="java.util.Map">
|
||||||
|
SELECT latest.statisDate, avg(t.avg_cell_temp) as avgTemp
|
||||||
|
FROM ( SELECT p.site_id, p.device_id, DATE_FORMAT(p.update_time, '%Y-%m') AS statisDate, MAX(p.update_time) AS max_update_time
|
||||||
|
FROM ems_battery_cluster p
|
||||||
|
<include refid="statisCommonFilter"/>
|
||||||
|
GROUP BY p.site_id, p.device_id, statisDate
|
||||||
|
) latest INNER JOIN ems_battery_cluster t ON latest.site_id = t.site_id
|
||||||
|
AND latest.device_id = t.device_id
|
||||||
|
AND latest.max_update_time = t.update_time
|
||||||
|
GROUP BY statisDate
|
||||||
|
ORDER BY statisDate
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
@ -391,7 +391,7 @@
|
|||||||
select latest.dateHour as statisDate,
|
select latest.dateHour as statisDate,
|
||||||
t.device_id as deviceId,
|
t.device_id as deviceId,
|
||||||
<include refid="dataTypeChooseFilter"/>
|
<include refid="dataTypeChooseFilter"/>
|
||||||
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.update_time, '%H')+1 AS dateHour,MAX(p.update_time) as max_update_time
|
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.update_time, '%H:00') AS dateHour,MAX(p.update_time) as max_update_time
|
||||||
FROM ems_battery_stack p
|
FROM ems_battery_stack p
|
||||||
<include refid="statisCommonFilter"/>
|
<include refid="statisCommonFilter"/>
|
||||||
GROUP BY p.site_id,p.device_id,dateHour
|
GROUP BY p.site_id,p.device_id,dateHour
|
||||||
@ -443,4 +443,52 @@
|
|||||||
and t.create_time = latest.max_time
|
and t.create_time = latest.max_time
|
||||||
where t.site_id = #{siteId}
|
where t.site_id = #{siteId}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="getStackPointByHour" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.StackPointVo">
|
||||||
|
select latest.dateHour as statisDate,
|
||||||
|
avg(t.stack_soc) as avgSoc,
|
||||||
|
avg(t.stack_soh) as avgSoh,
|
||||||
|
avg(t.avg_temperature) as avgTemp
|
||||||
|
from ( SELECT p.site_id, p.device_id, DATE_FORMAT(p.update_time, '%H:00') AS dateHour,MAX(p.update_time) as max_update_time
|
||||||
|
FROM ems_battery_stack p
|
||||||
|
<include refid="statisCommonFilter"/>
|
||||||
|
GROUP BY p.site_id,p.device_id,dateHour
|
||||||
|
) latest inner join ems_battery_stack t ON latest.site_id = t.site_id
|
||||||
|
AND latest.device_id = t.device_id
|
||||||
|
AND latest.max_update_time = t.update_time
|
||||||
|
GROUP BY latest.dateHour
|
||||||
|
ORDER BY statisDate
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getStackPointByDay" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.StackPointVo">
|
||||||
|
select latest.dateDay as statisDate,
|
||||||
|
avg(t.stack_soc) as avgSoc,
|
||||||
|
avg(t.stack_soh) as avgSoh,
|
||||||
|
avg(t.avg_temperature) as avgTemp
|
||||||
|
from ( SELECT p.site_id, p.device_id, DATE(p.update_time) AS dateDay,MAX(p.update_time) as max_update_time
|
||||||
|
FROM ems_battery_stack p
|
||||||
|
<include refid="statisCommonFilter"/>
|
||||||
|
GROUP BY p.site_id,p.device_id,dateDay
|
||||||
|
) latest inner join ems_battery_stack t ON latest.site_id = t.site_id
|
||||||
|
AND latest.device_id = t.device_id
|
||||||
|
AND latest.max_update_time = t.update_time
|
||||||
|
GROUP BY latest.dateDay
|
||||||
|
ORDER BY statisDate
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="getStackPointByMonth" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.StackPointVo">
|
||||||
|
select latest.dateMonth as statisDate,
|
||||||
|
avg(t.stack_soc) as avgSoc,
|
||||||
|
avg(t.stack_soh) as avgSoh,
|
||||||
|
avg(t.avg_temperature) as avgTemp
|
||||||
|
from ( SELECT p.site_id, p.device_id, DATE_FORMAT(p.update_time, '%Y-%m') AS dateMonth,MAX(p.update_time) as max_update_time
|
||||||
|
FROM ems_battery_stack p
|
||||||
|
<include refid="statisCommonFilter"/>
|
||||||
|
GROUP BY p.site_id,p.device_id,dateMonth
|
||||||
|
) latest inner join ems_battery_stack t ON latest.site_id = t.site_id
|
||||||
|
AND latest.device_id = t.device_id
|
||||||
|
AND latest.max_update_time = t.update_time
|
||||||
|
GROUP BY latest.dateMonth
|
||||||
|
ORDER BY statisDate
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
@ -456,7 +456,7 @@
|
|||||||
select latest.dateHour as ammeterDate,
|
select latest.dateHour as ammeterDate,
|
||||||
sum(t.daily_ac_charge_energy) as chargedCap,
|
sum(t.daily_ac_charge_energy) as chargedCap,
|
||||||
sum(t.daily_ac_discharge_energy) as disChargedCap
|
sum(t.daily_ac_discharge_energy) as disChargedCap
|
||||||
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H')+1 AS dateHour,MAX(p.data_update_time) as max_update_time
|
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H:00') AS dateHour,MAX(p.data_update_time) as max_update_time
|
||||||
FROM ems_pcs_data p
|
FROM ems_pcs_data p
|
||||||
<include refid="commonFilter"/>
|
<include refid="commonFilter"/>
|
||||||
GROUP BY p.site_id,p.device_id,dateHour
|
GROUP BY p.site_id,p.device_id,dateHour
|
||||||
@ -530,7 +530,7 @@
|
|||||||
select latest.dateHour as statisDate,
|
select latest.dateHour as statisDate,
|
||||||
t.device_id as deviceId,
|
t.device_id as deviceId,
|
||||||
<include refid="dataTypeChooseFilter"/>
|
<include refid="dataTypeChooseFilter"/>
|
||||||
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H')+1 AS dateHour,MAX(p.data_update_time) as max_update_time
|
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H:00') AS dateHour,MAX(p.data_update_time) as max_update_time
|
||||||
FROM ems_pcs_data p
|
FROM ems_pcs_data p
|
||||||
<include refid="statisCommonFilter"/>
|
<include refid="statisCommonFilter"/>
|
||||||
GROUP BY p.site_id,p.device_id,dateHour
|
GROUP BY p.site_id,p.device_id,dateHour
|
||||||
|
|||||||
Reference in New Issue
Block a user