0918优化-点位列表数据值反向搜索

This commit is contained in:
2025-09-24 14:09:29 +08:00
parent 2810f5e204
commit f3b34e7fb5

View File

@ -9,6 +9,7 @@ import com.xzzn.common.enums.DeviceCategory;
import com.xzzn.common.utils.DateUtils;
import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsDevicesSetting;
import com.xzzn.ems.domain.vo.PointDataRequest;
import com.xzzn.ems.domain.vo.PointQueryResponse;
import com.xzzn.ems.mapper.EmsDevicesSettingMapper;
import com.xzzn.ems.mapper.EmsPointMatchMapper;
@ -16,6 +17,7 @@ import com.xzzn.ems.service.IEmsDeviceSettingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@ -120,10 +122,13 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
}
@Override
public List<PointQueryResponse> getSingleSiteDevicePoints(String siteId, String deviceId,
String deviceCategory, String dataPointName,
String dataPoint, String sortMethod) {
List<PointQueryResponse> response = emsPointMatchMapper.getSingleSiteDevicePoints(siteId,deviceCategory,dataPointName,dataPoint);
public List<PointQueryResponse> getSingleSiteDevicePoints(PointDataRequest request) {
String siteId = request.getSiteId();
String deviceId = request.getDeviceId();
String deviceCategory = request.getDeviceCategory();
List<PointQueryResponse> response = emsPointMatchMapper.getSingleSiteDevicePoints(siteId,deviceCategory,
request.getDataPointName(),request.getDataPoint());
// 电动所的电池簇特殊处理-来源pcs+bmsd
if (siteId.equals(DDS_SITE_ID) && DeviceCategory.CLUSTER.getCode().equals(deviceCategory)) {
@ -158,7 +163,30 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
if (response == null || response.isEmpty()) {
return response;
}
BigDecimal lowerBound = request.getLower();
BigDecimal upperBound = request.getUpper();
// 数据反向筛选
if (lowerBound == null && upperBound == null) {
return response;
}
response = response.stream() .filter(point -> {
Object dataValue = point.getPointValue();
if (dataValue == null) {
return false;
}
// 转换为BigDecimal进行精确比较避免double精度损失
BigDecimal value = parseToBigDecimal(dataValue);
if (value == null) {
return false;
}
// 比较使用BigDecimal的compareTo方法
boolean meetLower = (lowerBound == null) || (value.compareTo(lowerBound) >= 0);
boolean meetUpper = (upperBound == null) || (value.compareTo(upperBound) <= 0);
return meetLower && meetUpper;
}).collect(Collectors.toList());
// 结果排序
String sortMethod = request.getSortMethod();
if (sortMethod==null || sortMethod.isEmpty() || "asc".equals(sortMethod)) {// 升序
response = response.stream().sorted(Comparator.comparing(PointQueryResponse::getUpdateTime)).collect(Collectors.toList());
} else if ("desc".equals(sortMethod)) {//降序
@ -167,6 +195,23 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService
return response;
}
// Object转BigDecimal支持多种类型
private BigDecimal parseToBigDecimal(Object dataValue) {
if (dataValue instanceof BigDecimal) {
return (BigDecimal) dataValue;
} else if (dataValue instanceof Number) {
return new BigDecimal(((Number) dataValue).toString());
} else if (dataValue instanceof String) {
try {
return new BigDecimal((String) dataValue);
} catch (NumberFormatException e) {
return null;
}
} else {
return null;
}
}
// 对于dds的电池簇点位最新数据获取特殊处理
private List<PointQueryResponse> specialDealWithDDSCluster(List<PointQueryResponse> response, String siteId, String deviceId) {
JSONObject mergedData = new JSONObject();