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

门卫分页查询排序优化

donglang 4 дней назад
Родитель
Сommit
9f4f9d982d

+ 82 - 31
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -32,7 +32,10 @@ import com.sckw.system.api.model.dto.res.KwsUserResDto;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.enuma.WeighbridgeTypeEnum;
 import com.sckw.transport.model.enuma.WeighbridgeTypeEnum;
 import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
 import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
-import com.sckw.transport.model.param.forklift.request.*;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderIsPassParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassReasonParam;
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
 import com.sckw.transport.repository.*;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
@@ -45,7 +48,6 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -105,30 +107,77 @@ public class GatekeeperOrderService {
         if (param.getStatus() == null) {
         if (param.getStatus() == null) {
             throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "状态不能为空!");
             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);
         LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = buildAndExecuteQuery(param);
 
 
-        //查询门卫订单
+        // 数据库层面排序
+        sort(param, wrapper);
+
+        // 数据库分页查询
         Page<KwtGatekeeperWaybillOrder> pageByStatus = gatekeeperWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
         Page<KwtGatekeeperWaybillOrder> pageByStatus = gatekeeperWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
         List<KwtGatekeeperWaybillOrder> records = pageByStatus.getRecords();
         List<KwtGatekeeperWaybillOrder> records = pageByStatus.getRecords();
         if (CollectionUtils.isEmpty(records)) {
         if (CollectionUtils.isEmpty(records)) {
             log.info("当前无运单订单信息");
             log.info("当前无运单订单信息");
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
             return PageDataResult.empty(param.getPageNum(), param.getPageSize());
         }
         }
+
+        // 转换为响应对象
+        List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
+
+        // 处理异常车辆数据(如果需要)
+        gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
+
+        // 过滤山上/山下门卫数据
+        List<GatekeeperOrderResp> filterResult = filter(gatekeeperOrderPageResult);
+
+        return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), filterResult);
+    }
+
+    /**
+     * 内存排序 + 内存分页
+     */
+    private PageDataResult<GatekeeperOrderResp> pageQueryWithMemorySort(GatekeeperOrderQueryParam param) {
+        //构建查询条件
+        LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = buildAndExecuteQuery(param);
+
+        //查询门卫订单
+        List<KwtGatekeeperWaybillOrder> records = gatekeeperWaybillOrderRepository.list(wrapper);
+        if (CollectionUtils.isEmpty(records)) {
+            log.info("当前无运单订单信息");
+            return PageDataResult.empty(param.getPageNum(), param.getPageSize());
+        }
         List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
         List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
+
         //处理异常车辆数据
         //处理异常车辆数据
         gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
         gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
+
         //过滤山上/山下门卫数据
         //过滤山上/山下门卫数据
         List<GatekeeperOrderResp> filterResult = filter(gatekeeperOrderPageResult);
         List<GatekeeperOrderResp> filterResult = filter(gatekeeperOrderPageResult);
+
         //排序
         //排序
-        sort(param, filterResult);
+        sort2(param, filterResult);
+
         List<List<GatekeeperOrderResp>> pageList = Lists.partition(gatekeeperOrderPageResult, param.getPageSize());
         List<List<GatekeeperOrderResp>> pageList = Lists.partition(gatekeeperOrderPageResult, param.getPageSize());
         List<GatekeeperOrderResp> walletPageList = pageList.size() >= param.getPageNum() ?
         List<GatekeeperOrderResp> walletPageList = pageList.size() >= param.getPageNum() ?
                 pageList.get(param.getPageNum() - 1) : Collections.emptyList();
                 pageList.get(param.getPageNum() - 1) : Collections.emptyList();
+
         return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) walletPageList.size(), gatekeeperOrderPageResult);
         return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) walletPageList.size(), gatekeeperOrderPageResult);
     }
     }
 
 
+
     /**
     /**
      * 构建查询条件并执行分页查询
      * 构建查询条件并执行分页查询
      */
      */
@@ -560,54 +609,56 @@ public class GatekeeperOrderService {
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
     }
     }
 
 
-
     /**
     /**
      * 排序
      * 排序
      * @param param
      * @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()) {
         switch (param.getStatus()) {
             case 1:
             case 1:
                 // 待进场: 运输司机接单时间升序
                 // 待进场: 运输司机接单时间升序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getWaybillAcceptTime));
+                wrapper.orderByAsc(KwtGatekeeperWaybillOrder::getWaybillAcceptTime);
                 break;
                 break;
             case 2:
             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;
                 break;
             case 3:
             case 3:
                 // 场内车辆: 车辆进场时间升序
                 // 场内车辆: 车辆进场时间升序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getIntoTime));
-                break;
-            case 4:
-                // 异常车辆: 场内耗时倒序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getDurationTime).reversed());
+                wrapper.orderByAsc(KwtGatekeeperWaybillOrder::getIntoTime);
                 break;
                 break;
             case 5:
             case 5:
                 // 出入记录: 离场时间倒序
                 // 出入记录: 离场时间倒序
-                gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getLeaveTime).reversed());
+                wrapper.orderByDesc(KwtGatekeeperWaybillOrder::getLeaveTime);
                 break;
                 break;
             default:
             default:
                 break;
                 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;
+            default:
+                break;
+        }
+    }
 
 
     /**
     /**
      * 铲车订单状态统计
      * 铲车订单状态统计