From aadf66d5ad495fa2262c435e7c21e2cb388f3764 Mon Sep 17 00:00:00 2001 From: mashili Date: Mon, 13 Oct 2025 14:24:13 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E4=BD=8D=E6=B8=85=E5=8D=95-=E6=8C=89?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xzzn/ems/domain/vo/PointDataRequest.java | 10 ++ .../impl/EmsDeviceSettingServiceImpl.java | 113 ++++++++++++++++-- 2 files changed, 110 insertions(+), 13 deletions(-) diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java index cdbe913..9fbeaac 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java @@ -27,6 +27,16 @@ public class PointDataRequest { /** 点位数据-范围上下限 */ private BigDecimal lower; private BigDecimal upper; + /** 排序字段 */ + private String sortData; + + public String getSortData() { + return sortData; + } + + public void setSortData(String sortData) { + this.sortData = sortData; + } public String getSiteId() { return siteId; diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java index af9ef50..94d6319 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java @@ -187,20 +187,48 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService }).collect(Collectors.toList()); } - // 结果排序 - String sortMethod = request.getSortMethod(); - if (sortMethod==null || sortMethod.isEmpty() || "asc".equals(sortMethod)) {// 升序 - response = response.stream() - .filter(p -> p.getPointValue() != null) - .sorted(Comparator.comparing(PointQueryResponse::getUpdateTime)).collect(Collectors.toList()); - } else if ("desc".equals(sortMethod)) {//降序 - response = response.stream() - .filter(p -> p.getPointValue() != null) - .sorted(Comparator.comparing(PointQueryResponse::getUpdateTime).reversed()).collect(Collectors.toList()); - } - return response; - } + // 确保赋值后不会被修改 + final List resultResponse = response; + // 根据排序字段和排序方式进行排序 + Comparator comparator; + String sortData = request.getSortData(); + if ("pointValue".equals(sortData)) {// 按pointValue排序 + comparator = Comparator.comparing( + PointQueryResponse::getPointValue, + EmsDeviceSettingServiceImpl::compareMultiType); + } else {// 默认按updateTime排序 + comparator = Comparator.comparing(PointQueryResponse::getUpdateTime); + } + // 排序方式 + String sortMethod = request.getSortMethod(); + boolean isAsc = sortMethod == null || sortMethod.isEmpty() || "asc".equals(sortMethod); + Comparator finalComparator = Comparator.comparing( + PointQueryResponse::getPointValue, // 用于判断null的字段 + (v1, v2) -> { // 核心逻辑:null值始终返回1(排在后面) + if (v1 == v2) return 0; + if (v1 == null) return 1; + if (v2 == null) return -1; + // 非null值使用基础比较器逻辑 + return isAsc ? + comparator.compare(findByValue(resultResponse, v1), findByValue(resultResponse, v2)) : + comparator.reversed().compare(findByValue(resultResponse, v1), findByValue(resultResponse, v2)); + } + ); + return resultResponse.stream() + .sorted(finalComparator) + .collect(Collectors.toList()); + } + // 辅助方法:根据值查找对应的对象(用于比较器中获取完整对象) + private PointQueryResponse findByValue(List list, Object value) { + return list.stream() + .filter(p -> { + Object val = p.getPointValue(); + return val == value || (val != null && val.equals(value)); + }) + .findFirst() + .orElse(null); + } // Object转BigDecimal(支持多种类型) private BigDecimal parseToBigDecimal(Object dataValue) { if (dataValue instanceof BigDecimal) { @@ -276,5 +304,64 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService // 3. 转换为Date return new Date(updateTime); } + /** + * 自定义多类型比较器,支持BigDecimal、Integer、String等类型比较 + */ + private static int compareMultiType(Object o1, Object o2) { + // 统一转换为Comparable进行比较 + try { + // 对于数字类型(BigDecimal、Integer等) + if (o1 instanceof Number && o2 instanceof Number) { + Number numObj1 = (Number) o1; + Number numObj2 = (Number) o2; + BigDecimal num1 = toBigDecimal(numObj1); + BigDecimal num2 = toBigDecimal(numObj2); + return num1.compareTo(num2); + } + + // 对于字符串类型 + if (o1 instanceof String && o2 instanceof String) { + String str1 = (String) o1; + String str2 = (String) o2; + + if (isNumericString(str1) && isNumericString(str2)) { + return new BigDecimal(str1).compareTo(new BigDecimal(str2)); + } + return str1.compareTo(str2); + } + + // 其他类型默认按toString比较 + return o1.toString().compareTo(o2.toString()); + + } catch (Exception e) { + // 比较失败时按toString兜底 + return o1.toString().compareTo(o2.toString()); + } + } + + /** + * 将Number类型转换为BigDecimal + */ + private static BigDecimal toBigDecimal(Number number) { + if (number instanceof BigDecimal) { + return (BigDecimal) number; + } + return new BigDecimal(number.toString()); + } + + /** + * 判断字符串是否为数字格式 + */ + private static boolean isNumericString(String str) { + if (str == null || str.isEmpty()) { + return false; + } + try { + new BigDecimal(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } }