Sfoglia il codice sorgente

预警页面-员工综合评估预警看板排序

chenshudong 1 settimana fa
parent
commit
fb75871a42

+ 10 - 4
airport-common/src/main/java/com/sundot/airport/common/dto/LedgerCommonQueryReqVO.java

@@ -6,6 +6,7 @@ import org.springframework.format.annotation.DateTimeFormat;
6 6
 
7 7
 import java.io.Serializable;
8 8
 import java.util.Date;
9
+import java.util.Map;
9 10
 
10 11
 /**
11 12
  * 台账统计查询 Req Entity
@@ -36,15 +37,20 @@ public class LedgerCommonQueryReqVO implements Serializable {
36 37
     /**
37 38
      * 开始时间
38 39
      */
39
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
40
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
40
+    @JsonFormat(pattern = "yyyy-MM-dd")
41
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
41 42
     private Date startDate;
42 43
 
43 44
     /**
44 45
      * 结束时间
45 46
      */
46
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
47
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
47
+    @JsonFormat(pattern = "yyyy-MM-dd")
48
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
48 49
     private Date endDate;
49 50
 
51
+    /**
52
+     * 排序
53
+     */
54
+    Map<String, String> sorts;
55
+
50 56
 }

+ 62 - 0
airport-common/src/main/java/com/sundot/airport/common/utils/StreamSortUtils.java

@@ -0,0 +1,62 @@
1
+package com.sundot.airport.common.utils;
2
+
3
+import java.lang.reflect.Field;
4
+import java.util.Comparator;
5
+import java.util.List;
6
+import java.util.Map;
7
+import java.util.stream.Collectors;
8
+
9
+/**
10
+ * 排序工具类(支持 Integer /Long / BigDecimal / String / Date)
11
+ */
12
+public class StreamSortUtils {
13
+
14
+    /**
15
+     * 根据 Map 动态排序
16
+     *
17
+     * @param list   待排序集合
18
+     * @param sorts  key=字段名, value=asc/desc
19
+     */
20
+    public static <T> List<T> sort(List<T> list, Map<String, String> sorts) {
21
+        if (list == null || list.isEmpty() || sorts == null || sorts.isEmpty()) {
22
+            return list;
23
+        }
24
+
25
+        Comparator<T> comparator = null;
26
+
27
+        for (Map.Entry<String, String> entry : sorts.entrySet()) {
28
+            String fieldName = entry.getKey();
29
+            boolean desc = "desc".equalsIgnoreCase(entry.getValue());
30
+
31
+            Comparator<T> current = Comparator.comparing(
32
+                    t -> getFieldValue(t, fieldName),
33
+                    Comparator.nullsLast(Comparator.naturalOrder())
34
+            );
35
+
36
+            if (desc) {
37
+                current = current.reversed();
38
+            }
39
+
40
+            comparator = comparator == null ? current : comparator.thenComparing(current);
41
+        }
42
+
43
+        return list.stream()
44
+                .sorted(comparator)
45
+                .collect(Collectors.toList());
46
+    }
47
+
48
+    /**
49
+     * 反射获取字段值(支持 BigDecimal / String / Date)
50
+     */
51
+    @SuppressWarnings("unchecked")
52
+    private static <T> Comparable<Object> getFieldValue(T obj, String fieldName) {
53
+        try {
54
+            Field field = obj.getClass().getDeclaredField(fieldName);
55
+            field.setAccessible(true);
56
+            return (Comparable<Object>) field.get(obj);
57
+        } catch (Exception e) {
58
+            throw new RuntimeException("排序字段不存在或不可比较: " + fieldName, e);
59
+        }
60
+    }
61
+
62
+}

+ 10 - 1
airport-ledger/src/main/java/com/sundot/airport/ledger/service/impl/LedgerWarningServiceImpl.java

@@ -13,6 +13,7 @@ import com.sundot.airport.common.enums.LedgerStatusLabelEnum;
13 13
 import com.sundot.airport.common.enums.ScoreLevelEnum;
14 14
 import com.sundot.airport.common.utils.DeptUtils;
15 15
 import com.sundot.airport.common.utils.SecurityUtils;
16
+import com.sundot.airport.common.utils.StreamSortUtils;
16 17
 import com.sundot.airport.ledger.domain.ScoreEvent;
17 18
 import com.sundot.airport.ledger.domain.ScoreIndicator;
18 19
 import com.sundot.airport.ledger.domain.vo.LedgerWarningDetailItemVO;
@@ -33,6 +34,7 @@ import java.util.ArrayList;
33 34
 import java.util.Arrays;
34 35
 import java.util.HashMap;
35 36
 import java.util.HashSet;
37
+import java.util.LinkedHashMap;
36 38
 import java.util.List;
37 39
 import java.util.Map;
38 40
 import java.util.Set;
@@ -187,7 +189,14 @@ public class LedgerWarningServiceImpl implements ILedgerWarningService {
187 189
         BigDecimal sum = ledgerWarningDetailItemList.stream().map(LedgerWarningDetailItemVO::getOverallScore).reduce(BigDecimal.ZERO, BigDecimal::add);
188 190
         BigDecimal averageComprehensiveScore = CollUtil.isEmpty(ledgerWarningDetailItemList) ? BigDecimal.ZERO : sum.divide(BigDecimal.valueOf(ledgerWarningDetailItemList.size()), 2, RoundingMode.HALF_UP);
189 191
         result.setAverageComprehensiveScore(averageComprehensiveScore);
190
-        result.setLedgerWarningDetailItemList(ledgerWarningDetailItemList);
192
+        // 排序
193
+        if (ObjUtil.isNull(queryReq.getSorts())) {
194
+            Map<String, String> sorts = new LinkedHashMap<>();
195
+            sorts.put("overallScore", "desc");
196
+            queryReq.setSorts(sorts);
197
+        }
198
+        List<LedgerWarningDetailItemVO> ledgerWarningDetailItemListSort = StreamSortUtils.sort(ledgerWarningDetailItemList, queryReq.getSorts());
199
+        result.setLedgerWarningDetailItemList(ledgerWarningDetailItemListSort);
191 200
         return result;
192 201
     }
193 202