Compare commits
5 Commits
619c05e965
...
9f2c303047
| Author | SHA1 | Date | |
|---|---|---|---|
| 9f2c303047 | |||
| 7199677d7b | |||
| 4b58838d5d | |||
| 14904ea6b2 | |||
| 5225f03195 |
@ -1,5 +1,8 @@
|
|||||||
package com.xzzn.common.utils;
|
package com.xzzn.common.utils;
|
||||||
|
|
||||||
|
import com.xzzn.common.constant.Constants;
|
||||||
|
import com.xzzn.common.core.text.StrFormatter;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -7,9 +10,8 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.AntPathMatcher;
|
||||||
import com.xzzn.common.constant.Constants;
|
|
||||||
import com.xzzn.common.core.text.StrFormatter;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 字符串工具类
|
* 字符串工具类
|
||||||
@ -743,6 +745,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getString(Object s){
|
public static String getString(Object s){
|
||||||
|
if (s == null) return null;
|
||||||
String result;
|
String result;
|
||||||
try {
|
try {
|
||||||
result = String.valueOf(s);
|
result = String.valueOf(s);
|
||||||
|
|||||||
@ -31,6 +31,8 @@ public class PowerStatisListVo {
|
|||||||
*/
|
*/
|
||||||
private BigDecimal pvPower;
|
private BigDecimal pvPower;
|
||||||
|
|
||||||
|
public PowerStatisListVo() {}
|
||||||
|
|
||||||
public PowerStatisListVo(String statisDate, BigDecimal gridPower, BigDecimal storagePower, BigDecimal pvPower) {
|
public PowerStatisListVo(String statisDate, BigDecimal gridPower, BigDecimal storagePower, BigDecimal pvPower) {
|
||||||
this.statisDate = statisDate;
|
this.statisDate = statisDate;
|
||||||
this.gridPower = gridPower;
|
this.gridPower = gridPower;
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import java.math.BigDecimal;
|
|||||||
* 单站监控-首页-电池堆点位数据
|
* 单站监控-首页-电池堆点位数据
|
||||||
*/
|
*/
|
||||||
public class StackPointVo{
|
public class StackPointVo{
|
||||||
|
|
||||||
private String statisDate;
|
private String statisDate;
|
||||||
/** SOC */
|
/** SOC */
|
||||||
private BigDecimal avgSoc;
|
private BigDecimal avgSoc;
|
||||||
|
|||||||
@ -1,9 +1,18 @@
|
|||||||
package com.xzzn.ems.mapper;
|
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.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.xzzn.ems.domain.EmsAmmeterData;
|
|
||||||
import com.xzzn.ems.domain.vo.*;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,4 +108,6 @@ public interface EmsAmmeterDataMapper
|
|||||||
List<AmmeterStatisListVo> selectDailyAmmeterData(@Param("siteId") String siteId,
|
List<AmmeterStatisListVo> selectDailyAmmeterData(@Param("siteId") String siteId,
|
||||||
@Param("startTime") String startTime,
|
@Param("startTime") String startTime,
|
||||||
@Param("endTime") String endTime);
|
@Param("endTime") String endTime);
|
||||||
|
|
||||||
|
List<PowerStatisListVo> getPowerDataByMinute(DateSearchRequest requestVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +1,17 @@
|
|||||||
package com.xzzn.ems.mapper;
|
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.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.xzzn.ems.domain.EmsBatteryCluster;
|
|
||||||
import com.xzzn.ems.domain.vo.*;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
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>> getAvgTempByHour(DateSearchRequest requestVo);
|
||||||
public List<Map<String, BigDecimal>> getAvgTempByDay(DateSearchRequest requestVo);
|
public List<Map<String, BigDecimal>> getAvgTempByDay(DateSearchRequest requestVo);
|
||||||
public List<Map<String, BigDecimal>> getAvgTempByMonth(DateSearchRequest requestVo);
|
public List<Map<String, BigDecimal>> getAvgTempByMonth(DateSearchRequest requestVo);
|
||||||
|
|
||||||
|
List<Map<String, BigDecimal>> getAvgTempByMinute(DateSearchRequest requestVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,15 @@
|
|||||||
package com.xzzn.ems.mapper;
|
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.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.xzzn.ems.domain.EmsBatteryStack;
|
|
||||||
import com.xzzn.ems.domain.vo.*;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
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);
|
public List<BatteryAveSOCVo> getAveSocList(@Param("siteId") String siteId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
|
||||||
// 实时运行-DDS平均温度
|
// 实时运行-DDS平均温度
|
||||||
public List<BatteryAveTempVo> getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date yesterday, @Param("endDate") Date today);
|
public List<BatteryAveTempVo> getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date yesterday, @Param("endDate") Date today);
|
||||||
|
|
||||||
|
List<StackPointVo> getStackPointByMinute(DateSearchRequest requestVo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -85,6 +85,8 @@ public interface IEmsAlarmRecordsService
|
|||||||
// topic 内没有数据,按照设备维度告警
|
// topic 内没有数据,按照设备维度告警
|
||||||
public void addEmptyDataAlarmRecord(String siteId, String deviceId);
|
public void addEmptyDataAlarmRecord(String siteId, String deviceId);
|
||||||
|
|
||||||
|
public void deleteEmptyDataAlarmRecord(String siteId, String deviceId);
|
||||||
|
|
||||||
// 告警字段和告警信息
|
// 告警字段和告警信息
|
||||||
public void initAlarmMatchInfo();
|
public void initAlarmMatchInfo();
|
||||||
|
|
||||||
|
|||||||
@ -72,6 +72,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@ -91,6 +92,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)");
|
private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)");
|
||||||
// 匹配DTDC+数字格式的正则(提取序号)
|
// 匹配DTDC+数字格式的正则(提取序号)
|
||||||
private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)");
|
private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)");
|
||||||
|
private final Map<String, Integer> topicEmptyCounts = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
private EmsBatteryClusterMapper emsBatteryClusterMapper;
|
||||||
@ -166,12 +168,27 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
|
Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp);
|
||||||
|
|
||||||
log.info("deviceId:" + deviceId);
|
log.info("deviceId:" + deviceId);
|
||||||
|
String deviceNumber = siteId + deviceId;
|
||||||
boolean isEmpty = checkJsonDataEmpty(jsonData);
|
boolean isEmpty = checkJsonDataEmpty(jsonData);
|
||||||
if (isEmpty) {
|
if (isEmpty) {
|
||||||
// 添加设备告警
|
// 增加失败计数
|
||||||
iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId);
|
int failureCount = topicEmptyCounts.getOrDefault(deviceNumber, 0) + 1;
|
||||||
|
topicEmptyCounts.put(deviceNumber, failureCount);
|
||||||
|
|
||||||
|
log.warn("设备 {} topic内没有数据,当前连续次数: {}", deviceId, failureCount);
|
||||||
|
|
||||||
|
// 连续5次失败触发报警
|
||||||
|
if (failureCount >= 5) {
|
||||||
|
// 添加设备告警
|
||||||
|
iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId);
|
||||||
|
log.error("设备 {} 连续 {} 次topic内没有数据,触发告警", deviceNumber, failureCount);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// 数据读取成功,重置计数器
|
||||||
|
topicEmptyCounts.remove(deviceNumber);
|
||||||
|
// 读取到数据后告警自恢复
|
||||||
|
iEmsAlarmRecordsService.deleteEmptyDataAlarmRecord(siteId, deviceId);
|
||||||
|
|
||||||
// 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据
|
// 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据
|
||||||
redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj);
|
redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj);
|
||||||
@ -407,7 +424,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
String status = dataStack.getWorkStatus();
|
String status = dataStack.getWorkStatus();
|
||||||
int result = 5;
|
int result = 5;
|
||||||
|
|
||||||
if (status != null && !status.trim().isEmpty() && status.contains("null")) {
|
if (status != null && !status.trim().isEmpty()) {
|
||||||
// 1.0 -> 1, 2.0 -> 2
|
// 1.0 -> 1, 2.0 -> 2
|
||||||
result = (int) Double.parseDouble(status.trim());
|
result = (int) Double.parseDouble(status.trim());
|
||||||
}
|
}
|
||||||
@ -863,7 +880,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
//TODO 临时解决上送数据为浮点的问题 start
|
//TODO 临时解决上送数据为浮点的问题 start
|
||||||
String status = pcsData.getWorkStatus();
|
String status = pcsData.getWorkStatus();
|
||||||
int result = 0;
|
int result = 0;
|
||||||
if (status != null && !status.trim().isEmpty() && status.contains("null")) {
|
if (status != null && !status.trim().isEmpty()) {
|
||||||
// 1.0 -> 1, 2.0 -> 2
|
// 1.0 -> 1, 2.0 -> 2
|
||||||
result = (int) Double.parseDouble(status.trim());
|
result = (int) Double.parseDouble(status.trim());
|
||||||
}
|
}
|
||||||
@ -1003,7 +1020,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
log.info("临时解决上送数据为浮点的问题");
|
log.info("临时解决上送数据为浮点的问题");
|
||||||
String status = data.getWorkStatus();
|
String status = data.getWorkStatus();
|
||||||
int result = 5;
|
int result = 5;
|
||||||
if (status != null && !status.trim().isEmpty() && status.contains("null")) {
|
if (status != null && !status.trim().isEmpty()) {
|
||||||
// 1.0 -> 1, 2.0 -> 2
|
// 1.0 -> 1, 2.0 -> 2
|
||||||
result = (int) Double.parseDouble(status.trim());
|
result = (int) Double.parseDouble(status.trim());
|
||||||
}
|
}
|
||||||
@ -1891,12 +1908,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i
|
|||||||
boolean flag = false;
|
boolean flag = false;
|
||||||
try {
|
try {
|
||||||
if (StringUtils.isEmpty(jsonData)) {
|
if (StringUtils.isEmpty(jsonData)) {
|
||||||
flag = true;
|
return true;
|
||||||
}
|
}
|
||||||
JsonNode jsonNode = objectMapper.readTree(jsonData);
|
JsonNode jsonNode = objectMapper.readTree(jsonData);
|
||||||
// 判断是否为空对象({})
|
// 判断是否为空对象({})
|
||||||
if (jsonNode.isObject() && jsonNode.isEmpty()) {
|
if (jsonNode.isObject() && jsonNode.isEmpty()) {
|
||||||
flag = true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (JsonProcessingException e) {
|
} catch (JsonProcessingException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
|
|||||||
@ -231,7 +231,7 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
|
|||||||
if (emsAlarmRecords != null) {
|
if (emsAlarmRecords != null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.EMERGENCY.getCode());
|
emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.GENERAL.getCode());
|
||||||
emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords);
|
emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords);
|
||||||
|
|
||||||
// 存redis-防止重复插入-有效期一天
|
// 存redis-防止重复插入-有效期一天
|
||||||
@ -252,6 +252,21 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
|
|||||||
return emsAlarmRecords;
|
return emsAlarmRecords;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteEmptyDataAlarmRecord(String siteId, String topicDevice) {
|
||||||
|
String key = RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice;
|
||||||
|
EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key);
|
||||||
|
if (emsAlarmRecords == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode());
|
||||||
|
emsAlarmRecords.setUpdateTime(new Date());
|
||||||
|
emsAlarmRecords.setAlarmEndTime(new Date());
|
||||||
|
emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords);
|
||||||
|
|
||||||
|
redisCache.deleteObject(key);
|
||||||
|
}
|
||||||
|
|
||||||
private String createRandomTicketNo() {
|
private String createRandomTicketNo() {
|
||||||
String ticketNo = "";
|
String ticketNo = "";
|
||||||
String nowDate = DateUtils.dateTime();
|
String nowDate = DateUtils.dateTime();
|
||||||
|
|||||||
@ -4,7 +4,6 @@ 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.EmsAmmeterData;
|
import com.xzzn.ems.domain.EmsAmmeterData;
|
||||||
@ -936,7 +935,8 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
|
|||||||
List<PointDataResponse> responseList = new ArrayList<>();
|
List<PointDataResponse> responseList = new ArrayList<>();
|
||||||
List<PowerStatisListVo> powerList = new ArrayList<>();//功率数据
|
List<PowerStatisListVo> powerList = new ArrayList<>();//功率数据
|
||||||
List<StackPointVo> stackList = 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天
|
// 默认时间-7天
|
||||||
dealRequestTime(requestVo);
|
dealRequestTime(requestVo);
|
||||||
@ -944,40 +944,54 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
|
|||||||
Date endDate = requestVo.getEndDate();
|
Date endDate = requestVo.getEndDate();
|
||||||
List<String> timeList = new ArrayList<>();
|
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)){
|
if (DateUtils.isSameDay(startDate, endDate)){
|
||||||
endDate = DateUtils.addDays(endDate, 1);
|
endDate = DateUtils.addDays(endDate, 1);
|
||||||
requestVo.setEndDate(endDate);
|
requestVo.setEndDate(endDate);
|
||||||
powerList = emsAmmeterDataMapper.getPowerDataByHour(requestVo);//功率数据
|
powerList = emsAmmeterDataMapper.getPowerDataByMinute(requestVo);//功率数据
|
||||||
stackList = emsBatteryStackMapper.getStackPointByHour(requestVo);//电池堆数据
|
stackList = emsBatteryStackMapper.getStackPointByMinute(requestVo);//电池堆数据
|
||||||
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
avgTempList = emsBatteryClusterMapper.getAvgTempByMinute(requestVo);//电池簇数据
|
||||||
fxAvgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo);
|
}
|
||||||
}
|
else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1
|
||||||
} else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1
|
|
||||||
&& DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){
|
&& DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){
|
||||||
endDate = DateUtils.addDays(endDate, 1);
|
endDate = DateUtils.addDays(endDate, 1);
|
||||||
requestVo.setEndDate(endDate);
|
requestVo.setEndDate(endDate);
|
||||||
// 开始日期-结束日期大于 1 天,小于30 天,按天展示数据
|
// 开始日期-结束日期大于 1 天,小于30 天,按天展示数据
|
||||||
powerList = emsAmmeterDataMapper.getPowerDataByDay(requestVo);//功率数据
|
powerList = emsAmmeterDataMapper.getPowerDataByDay(requestVo);//功率数据
|
||||||
stackList = emsBatteryStackMapper.getStackPointByDay(requestVo);//电池堆数据
|
stackList = emsBatteryStackMapper.getStackPointByDay(requestVo);//电池堆数据
|
||||||
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
||||||
fxAvgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);
|
// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);
|
||||||
}
|
// }
|
||||||
|
avgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo);//电池簇数据
|
||||||
} else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){
|
} else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){
|
||||||
endDate = DateUtils.addDays(endDate, 1);
|
endDate = DateUtils.addDays(endDate, 1);
|
||||||
requestVo.setEndDate(endDate);
|
requestVo.setEndDate(endDate);
|
||||||
// 开始日期-结束日期大于 1 个月,按月展示数据
|
// 开始日期-结束日期大于 1 个月,按月展示数据
|
||||||
powerList = emsAmmeterDataMapper.getPowerDataByMonth(requestVo);//功率数据
|
powerList = emsAmmeterDataMapper.getPowerDataByMonth(requestVo);//功率数据
|
||||||
stackList = emsBatteryStackMapper.getStackPointByMonth(requestVo);//电池堆数据
|
stackList = emsBatteryStackMapper.getStackPointByMonth(requestVo);//电池堆数据
|
||||||
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
||||||
fxAvgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);
|
// fxAvgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);
|
||||||
}
|
// }
|
||||||
|
avgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo);//电池簇数据
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果奉贤数据:电池平均温度单独取值。将其塞入stackList里面
|
// // 如果奉贤数据:电池平均温度单独取值。将其塞入stackList里面
|
||||||
if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
// if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){
|
||||||
processFXXTempData(stackList,fxAvgTempList);
|
// processFXXTempData(stackList,fxAvgTempList);
|
||||||
}
|
// }
|
||||||
|
// 优先从电池堆取,电池堆没有的话再从电池簇取
|
||||||
|
processTempData(stackList, avgTempList);
|
||||||
|
|
||||||
// 数据转换为Map
|
// 数据转换为Map
|
||||||
Map<String, PowerStatisListVo> powerMap = powerList.stream()
|
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 pvPower = pointDataResponse.getPvPower() == null ? BigDecimal.ZERO : pointDataResponse.getPvPower();
|
||||||
BigDecimal loadPower = new BigDecimal(0);
|
BigDecimal loadPower = new BigDecimal(0);
|
||||||
|
|
||||||
// 电动所:负荷功率=电网功率+光伏功率-储能功率
|
// // 电动所:负荷功率=电网功率+光伏功率-储能功率
|
||||||
// 奉贤:负荷功率=电网功率-储能功率;
|
// // 奉贤:负荷功率=电网功率-储能功率;
|
||||||
if (SiteEnum.DDS.getCode().equals(siteId)){
|
// if (SiteEnum.DDS.getCode().equals(siteId)){
|
||||||
loadPower = gridPower.add(pvPower).subtract(storagePower);
|
// loadPower = gridPower.add(pvPower).subtract(storagePower);
|
||||||
pointDataResponse.setLoadPower(loadPower);
|
// pointDataResponse.setLoadPower(loadPower);
|
||||||
} else if (SiteEnum.FX.getCode().equals(siteId)){
|
// } else if (SiteEnum.FX.getCode().equals(siteId)){
|
||||||
// 奉贤:负荷功率=电网功率-储能功率;
|
// // 奉贤:负荷功率=电网功率-储能功率;
|
||||||
loadPower = gridPower.subtract(storagePower);
|
// loadPower = gridPower.subtract(storagePower);
|
||||||
pointDataResponse.setLoadPower(loadPower);
|
// 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) {
|
private void processFXXTempData(List<StackPointVo> stackList, List<Map<String, BigDecimal>> fxAvgTempList) {
|
||||||
|
|||||||
@ -128,6 +128,8 @@
|
|||||||
from ems_alarm_records t INNER JOIN ems_devices_setting t2 on t.site_id = t2.site_id and t.device_id = t2.device_id
|
from ems_alarm_records t INNER JOIN ems_devices_setting t2 on t.site_id = t2.site_id and t.device_id = t2.device_id
|
||||||
where t.site_id = #{siteId}
|
where t.site_id = #{siteId}
|
||||||
and t.status != 1
|
and t.status != 1
|
||||||
|
and t.alarm_level in ('C','D')
|
||||||
|
order by t.alarm_start_time desc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getAlarmTrendList" resultType="com.xzzn.ems.domain.vo.AlarmTrendList">
|
<select id="getAlarmTrendList" resultType="com.xzzn.ems.domain.vo.AlarmTrendList">
|
||||||
|
|||||||
@ -1141,4 +1141,24 @@
|
|||||||
dataTime
|
dataTime
|
||||||
) temp
|
) temp
|
||||||
</select>
|
</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>
|
</mapper>
|
||||||
@ -428,4 +428,23 @@
|
|||||||
GROUP BY statisDate
|
GROUP BY statisDate
|
||||||
ORDER BY statisDate
|
ORDER BY statisDate
|
||||||
</select>
|
</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>
|
</mapper>
|
||||||
@ -509,6 +509,27 @@
|
|||||||
ORDER BY statisDate
|
ORDER BY statisDate
|
||||||
</select>
|
</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">
|
<select id="getAveSocList" resultType="com.xzzn.ems.domain.vo.BatteryAveSOCVo">
|
||||||
WITH ranked AS (
|
WITH ranked AS (
|
||||||
SELECT
|
SELECT
|
||||||
|
|||||||
Reference in New Issue
Block a user