puzhibing
2026-03-21 7bea01d99461a015b2c17e62bfbbe5db1f7ccf82
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -757,32 +757,50 @@
     * 关闭订单
     */
    private void closeOrder(XpOrder order) {
        // 更新订单状态为已完成(8)
        this.lambdaUpdate().set(XpOrder::getStatus, 7)
                .eq(XpOrder::getId, order.getId()).update();
        XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
        order.setStatus(7);
        order.setGetoffTime(LocalDateTime.now());
        // 解析下车地点
        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class);
        if(Objects.nonNull(vehiclePosition)){
            GeoJsonPoint point = vehiclePosition.getPoint();
            if(Objects.nonNull(point)){
                double x = point.getX();
                double y = point.getY();
                Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y));
                order.setGetoffAddress(geocode.get("address"));
            }
        }
        //计算行驶总距离和时长
        List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(new Query().addCriteria(Criteria.where("orderId").is(order.getId())), OrderTrajectory.class);
        Double reduce = orderTrajectoryList.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum);
        order.setMileageKilometers(new BigDecimal(reduce).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN).doubleValue());
        long duration = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - order.getTripBegin().toEpochSecond(ZoneOffset.of("+8"));
        order.setDuration(new BigDecimal(duration).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue());
        Long appUserId = order.getAppUserId();
        order.setAppUserId(null);
        this.updateById(order);
        //结束行程
        endTrip(order.getId(), order.getAppUserId().toString());
        // 消息推送
        Map<String, Object> params = new HashMap<>();
        Map<String, Object> content = new HashMap<>();
        content.put("orderId", order.getId().toString());
        content.put("status", OrderStatusEnum.APPROVAL_REJECTION.getCode());
        params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
        params.put("content", com.alibaba.fastjson2.JSONObject.toJSONString(content));
        params.put("timestamp", new Date().getTime() + "");
        String message = JSONObject.toJSONString(params);
        SendMessageDTO sendMessageDTO = new SendMessageDTO();
        sendMessageDTO.setMessage(message);
        sendMessageDTO.setAppUserId(String.valueOf(order.getAppUserId()));
        R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
        Map<String, Object> params1 = new HashMap<>();
        Map<String, Object> content1 = new HashMap<>();
        content1.put("orderId", order.getId().toString());
        content1.put("status", OrderStatusEnum.SEE_OFF_GUESTS.getCode());
        params1.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
        params1.put("content", JSON.toJSONString(content1));
        params1.put("timestamp", new Date().getTime() + "");
        String message1 = JSON.toJSONString(params1);
        SendMessageDTO sendMessageDTO1 = new SendMessageDTO();
        sendMessageDTO1.setMessage(message1);
        sendMessageDTO1.setAppUserId(appUserId.toString());
        R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO1);
        //推送失败,重试3次
        if(stringR.getCode() != Constants.SUCCESS){
        if(stringR1.getCode() != Constants.SUCCESS){
            ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
            executor.execute(() -> {
                for (int i = 0; i < 3; i++) {
                    R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO);
                    if(stringR1.getCode() == Constants.SUCCESS){
                    R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO1);
                    if(stringR2.getCode() == Constants.SUCCESS){
                        break;
                    }
                    try {
@@ -790,11 +808,99 @@
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    log.info("运维人员关闭订单推送订单状态消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(sendMessageDTO), order.getOrderNumber());
                    log.info("运维人员关闭订单推送订单状态消息失败:{} {} {}", stringR2.getMsg(), JSON.toJSONString(sendMessageDTO1), order.getOrderNumber());
                }
            });
        }
        log.info("订单关闭成功,订单ID: {}, 操作人: {}", order.getId(), SecurityUtils.getUsername());
        // 推送倒计时消息
        Map<String, Object> params = new HashMap<>();
        Map<String, Object> content = new HashMap<>();
        content.put("orderId", order.getId().toString());
        content.put("isOpen", 1);
        params.put("type", PushMessageTypeEnum.OPEN_TRUNK.getDesc());
        params.put("content", JSON.toJSONString(content));
        params.put("timestamp", new Date().getTime() + "");
        String message = JSON.toJSONString(params);
        SendMessageDTO sendMessageDTO = new SendMessageDTO();
        sendMessageDTO.setMessage(message);
        sendMessageDTO.setAppUserId(appUserId.toString());
        R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO);
        //推送失败,重试3次
        if(stringR.getCode() != Constants.SUCCESS){
            ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
            executor.execute(() -> {
                for (int i = 0; i < 3; i++) {
                    R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO);
                    if(stringR2.getCode() == Constants.SUCCESS){
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    log.info("推送倒计时消息失败:{} {} {}", stringR2.getMsg(), JSON.toJSONString(sendMessageDTO), order.getOrderNumber());
                }
            });
        }
        //给XPU推送订单取消的报文
        PushOrderDto pushOrderDto = new PushOrderDto();
        pushOrderDto.setOrderId(order.getId().toString());
        pushOrderDto.setVin(xpVehicle.getVehicleVin());
        pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER);
        orderMissionClient.cancelOrder(pushOrderDto);
        //结束行程,修改状态和计算费用
        endTrip(order.getId(), appUserId.toString());
        // 消息推送
        Map<String, Object> params2 = new HashMap<>();
        Map<String, Object> content2 = new HashMap<>();
        content2.put("orderId", order.getId().toString());
        content2.put("status", OrderStatusEnum.APPROVAL_REJECTION.getCode());
        params2.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
        params2.put("content", JSON.toJSONString(content2));
        params2.put("timestamp", new Date().getTime() + "");
        String message2 = JSON.toJSONString(params2);
        SendMessageDTO sendMessageDTO2 = new SendMessageDTO();
        sendMessageDTO2.setMessage(message2);
        sendMessageDTO2.setAppUserId(appUserId.toString());
        R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO2);
        //推送失败,重试3次
        if(stringR2.getCode() != Constants.SUCCESS){
            ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
            executor.execute(() -> {
                for (int i = 0; i < 3; i++) {
                    R<String> stringR3 = xpPushMessageClient.sendStatus(sendMessageDTO2);
                    if(stringR3.getCode() == Constants.SUCCESS){
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    log.info("运维人员关闭订单推送订单状态消息失败:{} {} {}", stringR3.getMsg(), JSON.toJSONString(sendMessageDTO1), order.getOrderNumber());
                }
            });
        }
        //创建定时任务执行延迟驶离终点和下发巡游单
        XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData();
        Map<String, ? extends Object> jobMaps =
                new ImmutableMap.Builder<String, String>()
                        .put("id", order.getId().toString())
                        .put("appid", appid)
                        .build();
        QuartzManager.addJob(
                AddCruiseMissionJob.class,
                (AddCruiseMissionJob.name + order.getId()).toUpperCase(),
                TimeJobType.ADD_CRUISE_MISSION,
                DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())),
                jobMaps
        );
    }
    /**