liujie
2026-06-09 c96fbe6b0aeb413a17c429133ee6d81d138144b9
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -174,7 +174,9 @@
                    String orderId = split[0];
                    XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
                    if(xpOrder.getStatus() != OrderStatusEnum.PENDING_ORDER.getCode()){
                        redisService.popFirstElement(xpOrder.getQueueName());
                        if(StringUtils.isNotEmpty((xpOrder.getQueueName()))){
                            redisService.removeByPattern(xpOrder.getQueueName(), xpOrder.getOrderNumber());
                        }
                    }
                }
@@ -195,7 +197,7 @@
                String[] split = firstElement.toString().split("_");
                // 如果未处理 创建新任务
                if (split[2].equals("0")) {
                    String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7];
                    String value = split[0] + "_" + split[1] + "_1" + "_" + split[3] + "_" + split[4] + "_" + split[5] + "_" + split[6] + "_" + split[7] + "_" + split[8];
                    // 状态改为处理中
                    redisService.updateFirst(name, value);
                    threadPoolTaskExecutor.submit(() -> {
@@ -207,7 +209,9 @@
                    String orderId = split[0];
                    XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
                    if(xpOrder.getStatus() != OrderStatusEnum.PENDING_ORDER.getCode()){
                        redisService.popFirstElement(xpOrder.getQueueName());
                        if(StringUtils.isNotEmpty(xpOrder.getQueueName())){
                            redisService.removeByPattern(xpOrder.getQueueName(), xpOrder.getOrderNumber());
                        }
                    }
                }
@@ -311,9 +315,6 @@
            if (xpOrder.getStatus() == 1) {
                xpOrderClient.cancelOrder(orderId);
                log.info("五轮推单结束,无车辆接单,执行取消订单 {}", orderNo);
                //将订单从队列中移除
                redisService.popFirstElement(quoteName);
                log.info("五轮推单结束,无车辆接单,执行队列移除订单 {}", orderNo);
                //推送订单状态给乘客
                SendMessageDTO dto = new SendMessageDTO();
                dto.setAppUserId(xpOrder.getAppUserId().toString());
@@ -368,7 +369,11 @@
        }
        XpOrder xpOrder = xpOrderR.getData();
        if (xpOrder.getStatus() == 0) {
            log.info("订单已取消,退出退单逻辑 {}", orderNo);
            if(StringUtils.isNotEmpty(quoteName)){
            redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
            }
            return true;
        }
        // 找出围栏id
@@ -428,6 +433,8 @@
                                        PushOrderDto pushOrderDto = new PushOrderDto();
                                        pushOrderDto.setVin(priorityVin);
                                        pushOrderDto.setOrderId(orderCheck.getData().getId().toString());
                                        pushOrderDto.setStartTaskId(orderCheck.getData().getXpuStartTaskId());
                                        pushOrderDto.setEndTaskId(orderCheck.getData().getXpuEndTaskId());
                                        pushOrderDto.setStartWaypointId(orderCheck.getData().getStartPointId());
                                        pushOrderDto.setEndWaypointId(orderCheck.getData().getEndPointId());
                                        pushOrderDto.setStartLatitude(orderCheck.getData().getStartLat());
@@ -442,7 +449,10 @@
                                                orderCheck.getData().getEndLat(), orderCheck.getData().getEndLon(), orderNo);
                                        orderMissionClient.pushOrder(pushOrderDto);
                                        log.info("[人车订单绑定测试] ====== 派单成功! uid={}, vin={}, orderNo={}, 从队列移除订单 ======", uid, priorityVin, orderNo);
                                        if(StringUtils.isNotEmpty(quoteName)){
                                        redisService.removeByPattern(quoteName, orderNo);
                                        }
                                        return true;
                                    } else {
                                        log.info("[人车订单绑定测试] 关闭巡游单失败, 回退常规流程, vin={}, orderNo={}", priorityVin, orderNo);
@@ -1068,52 +1078,35 @@
                    }
                    VehiclePositionVo vehiclePositionVo = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getTotal).reversed()).collect(Collectors.toList()).get(0);
//
//                    VehiclePositionVo vehiclePositionVo1 = vehiclePositionVo;
                    RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin());
                    lock.lock(10, TimeUnit.SECONDS);
                    log.info("队列 {} 车辆 {} 单号 {}", quoteName, vehiclePositionVo.getVin(), orderNo);
                    try {
//                        VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id());
                        R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin());
                        if (vehiclePositionR.getCode() != 200) {
                            continue;
                        }
                        if (vehiclePositionR.getCode() == 200) {
                        XpVehicle vehiclePosition = vehiclePositionR.getData();
                        log.info("符合条件的车辆 {} ,直接推单XPU。单号 {}", vehiclePosition.getPlateNumber(), orderNo);
                        log.info("当前车辆状态 {} 单号 {}", vehiclePosition.getState(), orderNo);
                        String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehiclePosition.getVehicleVin());
                        // 再次查询一下订单 看是否取消
                        xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
                        if (xpOrderR.getCode() != 200) {
                            continue;
                        }
                        xpOrder = xpOrderR.getData();
                        if (xpOrder.getStatus() != 1) {
                            continue;
                        }
                            xpOrder = xpOrderClient.queryOrderByOrderNo(orderNo).getData();
                            if (xpOrder.getStatus() == 1) {
                        //所有条件满足,走正常派单,不满足走后面的连环派单
                        if (vehiclePosition.getOperatingStatus() == 1 && vehiclePosition.getState() == 0 && vehiclePosition.getVehicleType() == 2) {
                            //非合作商的车辆需要处理巡游单
                            if(null == vehiclePosition.getOfficialPartnerId()){
                                //  关闭巡游单子
                                R<XpCruiseOrder> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vin);
                                if (stringR == null || stringR.getCode() != 200) {
                                    log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber());
                                    continue;
                                }
                                        if (stringR != null && stringR.getCode() == 200) {
                                log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo);
                                XpCruiseOrder cruiseOrder = stringR.getData();
                                // 下发命令
                                PushOrderDto pushOrderDto = new PushOrderDto();
                                pushOrderDto.setVin(vin);
                                pushOrderDto.setOrderId(xpOrder.getId().toString());
                                            pushOrderDto.setStartTaskId(xpOrder.getXpuStartTaskId());
                                            pushOrderDto.setEndTaskId(xpOrder.getXpuEndTaskId());
                                pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
                                pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
                                pushOrderDto.setStartLatitude(xpOrder.getStartLat());
@@ -1131,14 +1124,22 @@
                                // 调用推送服务  orderId + carVin
                                orderMissionClient.pushOrder(pushOrderDto);
                                log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
                                        }
                            }else {
                                //流量接入-接单推送 合作商的车辆需要调用合作商的订单通知接口
                                officialPartnerUtil.pushNewOrder(vehiclePosition.getOfficialPartnerId(), xpOrder);
                            }
                                    if(StringUtils.isNotEmpty(quoteName)){
                            redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
                                    }
                            log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                            return true;
                        }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
@@ -1155,38 +1156,28 @@
                    try {
                        // 查询车辆状态
                        R<XpVehicle> vehicleR = xpVehicleClient.findByVehicleVin(vehicleVin);
                        if (vehicleR.getCode() != 200) {
                            continue;
                        }
                        if (vehicleR.getCode() == 200) {
                        XpVehicle vehicleId1 = vehicleR.getData();
                        log.info("附近只有一个车辆 {} ,直接推单XPU。单号 {}", vehicleId1.getPlateNumber(), orderNo);
                        log.info("当前车辆状态 运营状态 {} 单号 {}", vehicleId1.getState(), orderNo);
                        // 再次查询一下订单 看是否取消
                        xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo);
                        if (xpOrderR.getCode() != 200) {
                            continue;
                        }
                        xpOrder = xpOrderR.getData();
                        if (xpOrder.getStatus() != 1) {
                            continue;
                        }
                            xpOrder = xpOrderClient.queryOrderByOrderNo(orderNo).getData();
                            if (xpOrder.getStatus() == 1) {
                        // 所有条件满足走正常派单,不满足走循环派单
                        if (vehicleId1.getOperatingStatus() == 1 && vehicleId1.getState() == 0 && vehicleId1.getVehicleType() == 2) {
                            if(null == vehicleId1.getOfficialPartnerId()){
                                //  关闭巡游单子
                                String vin = SensitiveDataCryptoUtil.decryptIfPossible(vehicleId1.getVehicleVin());
                                R<XpCruiseOrder> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vin);
                                if (stringR == null || stringR.getCode() != 200) {
                                    log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber());
                                    continue;
                                }
                                        if (stringR != null && stringR.getCode() == 200) {
                                log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo);
                                XpCruiseOrder cruiseOrder = stringR.getData();
                                PushOrderDto pushOrderDto = new PushOrderDto();
                                pushOrderDto.setVin(vehiclePosition.getVin());
                                pushOrderDto.setOrderId(xpOrder.getId().toString());
                                            pushOrderDto.setStartTaskId(xpOrder.getXpuStartTaskId());
                                            pushOrderDto.setEndTaskId(xpOrder.getXpuEndTaskId());
                                pushOrderDto.setStartWaypointId(xpOrder.getStartPointId());
                                pushOrderDto.setEndWaypointId(xpOrder.getEndPointId());
                                pushOrderDto.setStartLatitude(xpOrder.getStartLat());
@@ -1203,14 +1194,21 @@
                                pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
                                // 调用推送服务  orderId + carVin
                                orderMissionClient.pushOrder(pushOrderDto);
                                        }
                            }else {
                                //流量接入-接单推送 合作商的车辆需要调用合作商的订单通知接口
                                officialPartnerUtil.pushNewOrder(vehicleId1.getOfficialPartnerId(), xpOrder);
                            }
                            log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
                            redisService.popFirstElement(quoteName);
                                    if(StringUtils.isNotEmpty(quoteName)){
                                        redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
                                    }
                            log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                            return true;
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
@@ -1303,11 +1301,14 @@
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("orderId", xpOrder.getId());
                    jsonObject.put("endLongitude", xpOrder.getEndLat());
                    jsonObject.put("endLongitude", xpOrder.getEndLon());
                    jsonObject.put("endLatitude", xpOrder.getEndLat());
                    redisService.setCacheObject(CacheConstants.nextOrder(xpOrder1.getId().toString()), jsonObject.toJSONString());
                    redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), JSON.toJSONString(route));
                    if(StringUtils.isNotEmpty(quoteName)){
                    redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
                    }
                    log.info("连环派单 {} 设置下一单接驾导航数据 {}", orderNo, JSON.toJSONString(route));
                    //构建推送消息
@@ -1376,7 +1377,10 @@
        }
        XpOrder xpOrder = xpOrderR.getData();
        if (xpOrder.getStatus() == 0) {
            if(StringUtils.isNotEmpty(quoteName)){
            redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
            }
        }
        // 找出围栏id
@@ -1452,7 +1456,11 @@
                                                orderCheck.getData().getEndLat(), orderCheck.getData().getEndLon(), orderNo);
                                        orderMissionClient.pushOrder(pushOrderDto);
                                        log.info("[人车订单绑定测试] ====== 派单成功! uid={}, vin={}, orderNo={}, 从队列移除订单 ======", uid, priorityVin, orderNo);
                                        if(StringUtils.isNotEmpty(quoteName)){
                                        redisService.removeByPattern(quoteName, orderNo);
                                        }
                                        return true;
                                    } else {
                                        log.info("[人车订单绑定测试] 关闭巡游单失败, 回退常规流程, vin={}, orderNo={}", priorityVin, orderNo);
@@ -2132,8 +2140,9 @@
                        // 调用推送服务  orderId + carVin
                        orderMissionClient.pushOrder(pushOrderDto);
                        log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo);
                        if(StringUtils.isNotEmpty(quoteName)){
                        redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
                        }
                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                        return true;
                    } catch (Exception e) {
@@ -2205,7 +2214,10 @@
                        // 调用推送服务  orderId + carVin
                        orderMissionClient.pushOrder(pushOrderDto);
                        log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber());
                        redisService.popFirstElement(quoteName);
                        if(StringUtils.isNotEmpty(quoteName)){
                            redisService.removeByPattern(quoteName, xpOrder.getOrderNumber());
                        }
                        log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                        return true;
                    } catch (Exception e) {
@@ -2298,11 +2310,14 @@
//                orderMissionClient.pushOrder(pushOrderDto);
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("orderId", xpOrder.getId());
                jsonObject.put("endLongitude", xpOrder.getEndLat());
                jsonObject.put("endLongitude", xpOrder.getEndLon());
                jsonObject.put("endLatitude", xpOrder.getEndLat());
                redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), jsonObject.toJSONString());
                redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), routeToOrigin);
                if(StringUtils.isNotEmpty(quoteName)){
                redisService.removeByPattern(quoteName,xpOrder.getOrderNumber());
                }
                log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName);
                break;
            }
@@ -2452,7 +2467,7 @@
                    routeToOrigin.setDistance(routeToOrigin.getDistance() + routeRemain.getDistance());
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("orderId", data.getId());
                    jsonObject.put("endLongitude", data.getEndLat());
                    jsonObject.put("endLongitude", data.getEndLon());
                    jsonObject.put("endLatitude", data.getEndLat());
                    redisService.setCacheObject(CacheConstants.nextOrder(luckyOder.getId().toString()), jsonObject.toJSONString());
                    redisService.setCacheObject(CacheConstants.navigationStart(data.getAppUserId().toString()), routeToOrigin);