Просмотр исходного кода

受控文件查询优化排序代码

xiexh 4 месяцев назад
Родитель
Сommit
38bbc2a55a

+ 62 - 2
ibps-provider-root/modules/provider-business/src/main/java/com/lc/ibps/business/service/impl/ReformServiceImpl.java

@@ -20,6 +20,7 @@ import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -227,11 +228,70 @@ public class ReformServiceImpl implements ReformService {
         List<Map<String, Object>> limitLists = (List<Map<String, Object>>) commonDao.query(sxsql);
         List<Map<String, Object>> mergedList = Stream.concat(Stream.concat(limitLists.stream(), buMenList.stream()),comList.stream()).collect(Collectors.toList());
         //重新排序,数据量超过一万可能耗时长一点,超过十万或许有性能问题
-        sortData(order,mergedList);
-        Map<String, Object> map = paginate(mergedList, pageNo , limit);
+        //sortData(order,mergedList);
+        List<Map<String, Object>> collect = sortByOrder(mergedList, order);
+        Map<String, Object> map = paginate(collect, pageNo , limit);
         result.setVariables(map);
         return result;
     }
+
+    public static List<Map<String, Object>> sortByOrder(
+            List<Map<String, Object>> mergedList,
+            String order) {
+
+        // 解析排序参数
+        boolean isTimeFirst = order.contains("FA_FANG_SHI_JIAN_ ");
+        boolean isBianhaoFirst = order.contains("WEN_JIAN_BIAN_HAO");
+        boolean isAsc = order.contains("ASC");
+        boolean isDesc = order.contains("DESC");
+
+        // 创建时间比较器
+        Comparator<String> timeComparator = isAsc
+                ? Comparator.nullsLast(Comparator.naturalOrder())
+                : Comparator.nullsLast(Comparator.reverseOrder());
+
+        // 创建文件编号比较器
+        Comparator<String> bianhaoComparator = isAsc
+                ? Comparator.nullsLast(Comparator.naturalOrder())
+                : Comparator.nullsLast(Comparator.reverseOrder());
+
+        // 根据 order 参数构建不同的排序规则
+        if (isTimeFirst) {
+            // 先按时间排序,再按文件编号排序
+            return mergedList.stream()
+                    .sorted(Comparator.comparing(
+                            (Map<String, Object> map) -> (String) map.get("fa_bu_shi_jian_"),
+                            timeComparator
+                    ).thenComparing(
+                            (Map<String, Object> map) -> (String) map.get("wen_jian_bian_hao"),  // 添加类型声明
+                            Comparator.nullsLast(Comparator.naturalOrder())  // 次要字段默认正序
+                    ))
+                    .collect(Collectors.toList());
+        } else if (isBianhaoFirst) {
+            // 先按文件编号排序,再按时间排序
+            return mergedList.stream()
+                    .sorted(Comparator.comparing(
+                            (Map<String, Object> map) -> (String) map.get("wen_jian_bian_hao"),  // 添加类型声明
+                            bianhaoComparator
+                    ).thenComparing(
+                            (Map<String, Object> map) -> (String) map.get("fa_bu_shi_jian_"),  // 添加类型声明
+                            Comparator.nullsLast(Comparator.naturalOrder())  // 次要字段默认正序
+                    ))
+                    .collect(Collectors.toList());
+        } else {
+            // 默认排序:按时间倒序,文件编号正序
+            return mergedList.stream()
+                    .sorted(Comparator.comparing(
+                            (Map<String, Object> map) -> (String) map.get("fa_bu_shi_jian_"),
+                            Comparator.nullsLast(Comparator.reverseOrder())
+                    ).thenComparing(
+                            (Map<String, Object> map) -> (String) map.get("wen_jian_bian_hao"),  // 添加类型声明
+                            Comparator.nullsLast(Comparator.naturalOrder())  // 次要字段默认正序
+                    ))
+                    .collect(Collectors.toList());
+        }
+    }
+
     private void sortData(String order,List<Map<String, Object>> mergedList) {
         if (BeanUtils.isNotEmpty(order)) {
             boolean isDescending = order.contains("DESC");