Эх сурвалжийг харах

门卫分页查询排序优化

donglang 4 өдөр өмнө
parent
commit
9260bd5674

+ 71 - 25
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -105,6 +105,45 @@ public class GatekeeperOrderService {
         if (param.getStatus() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "状态不能为空!");
         }
+        // 正常排序
+        if (!Objects.equals(param.getStatus(), 4)) {
+            return pageQueryDbSort(param);
+
+        }
+        // 内存排序: 特殊处理
+        return pageQueryWithMemorySort(param);
+    }
+
+    /**
+     * 数据库层面排序 + 分页
+     */
+    private PageDataResult<GatekeeperOrderResp> pageQueryDbSort(GatekeeperOrderQueryParam param) {
+        // 构建查询条件
+        LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = buildAndExecuteQuery(param);
+        // 数据库层面排序
+        sort(param, wrapper);
+
+        // 数据库分页查询
+        Page<KwtGatekeeperWaybillOrder> pageByStatus = gatekeeperWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
+        List<KwtGatekeeperWaybillOrder> records = pageByStatus.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前无运单订单信息");
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
+
+        // 转换为响应对象
+        List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
+
+        // 处理异常车辆数据(如果需要)
+        gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
+
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), gatekeeperOrderPageResult);
+    }
+
+    /**
+     * 内存排序 + 内存分页
+     */
+    private PageDataResult<GatekeeperOrderResp> pageQueryWithMemorySort(GatekeeperOrderQueryParam param) {
         //构建查询条件
         LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = buildAndExecuteQuery(param);
 
@@ -115,14 +154,17 @@ public class GatekeeperOrderService {
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
         }
         List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
+
         //处理异常车辆数据
         gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
 
         //排序
-        sort(param, gatekeeperOrderPageResult);
+        sort2(param, gatekeeperOrderPageResult);
+
         List<List<GatekeeperOrderResp>> pageList = Lists.partition(gatekeeperOrderPageResult, param.getPageSize());
         List<GatekeeperOrderResp> walletPageList = pageList.size() >= param.getPageNum() ?
                 pageList.get(param.getPageNum() - 1) : Collections.emptyList();
+
         return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) walletPageList.size(), gatekeeperOrderPageResult);
     }
 
@@ -524,45 +566,49 @@ public class GatekeeperOrderService {
     /**
      * 排序
      * @param param
-     * @param gatekeeperOrderPageResult
+     * @param wrapper
      */
-    private void sort(GatekeeperOrderQueryParam param, List<GatekeeperOrderResp> gatekeeperOrderPageResult) {
-        log.info("门卫订单拍寻,param:{}, order:{}", JSON.toJSONString(param), JSON.toJSONString(gatekeeperOrderPageResult));
-        if (CollectionUtils.isEmpty(gatekeeperOrderPageResult)) {
-            return;
-        }
+    private void sort(GatekeeperOrderQueryParam param, LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper) {
+        log.info("门卫订单排序,param:{}", JSON.toJSONString(param), JSON.toJSONString(param));
         // 根据状态进行排序
         switch (param.getStatus()) {
             case 1:
                 // 待进场: 运输司机接单时间升序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getWaybillAcceptTime));
+                wrapper.orderByAsc(KwtGatekeeperWaybillOrder::getWaybillAcceptTime);
                 break;
             case 2:
-                // 待离场:先按照待离场展示,后按照空载待离场和已放行未离场展示,在按照状态变更时间升序
-                gatekeeperOrderPageResult.sort(
-                        Comparator.comparing((GatekeeperOrderResp order) -> {
-                                    // 状态为空时,也排到后面
-                                    return order.getStatus() == null || order.getStatus() != 10;
-                                })
-                                // 时间为空的排最后
-                                .thenComparing(
-                                        GatekeeperOrderResp::getUpdateTime,
-                                        Comparator.nullsLast(Comparator.naturalOrder())
-                                )
-                );
+                //待离场:未放行数据按照司机点击离场数据升序
+                wrapper.orderByAsc(KwtGatekeeperWaybillOrder::getUpdateTime);
                 break;
             case 3:
                 // 场内车辆: 车辆进场时间升序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getIntoTime));
+                wrapper.orderByAsc(KwtGatekeeperWaybillOrder::getIntoTime);
+                break;
+            case 5:
+                // 出入记录: 离场时间倒序
+                wrapper.orderByDesc(KwtGatekeeperWaybillOrder::getLeaveTime);
+                break;
+            default:
                 break;
+        }
+    }
+
+    /**
+     * 内存排序
+     * @param param
+     * @param gatekeeperOrderPageResult
+     */
+    private void sort2(GatekeeperOrderQueryParam param, List<GatekeeperOrderResp> gatekeeperOrderPageResult) {
+        log.info("门卫订单内存排序,param:{}, order:{}", JSON.toJSONString(param), JSON.toJSONString(gatekeeperOrderPageResult));
+        if (CollectionUtils.isEmpty(gatekeeperOrderPageResult)) {
+            return;
+        }
+        // 根据状态进行排序
+        switch (param.getStatus()) {
             case 4:
                 // 异常车辆: 场内耗时倒序
                 gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getDurationTime).reversed());
                 break;
-            case 5:
-                // 出入记录: 离场时间倒序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getLeaveTime).reversed());
-                break;
             default:
                 break;
         }