From aa0ed00c220688e740540107f5d55f1e20fc7f90 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期二, 24 三月 2026 15:55:45 +0800
Subject: [PATCH] 埋点数据推送

---
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java                             |    4 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java |   38 +++++++++++-
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java                      |   56 ++++++++++++++++++
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java      |   73 ++++++++++++++++++++++++
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java |    4 +
 5 files changed, 169 insertions(+), 6 deletions(-)

diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
index 175b4d5..b5215a6 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/automaticPilot/VehiclePosition.java
@@ -63,4 +63,8 @@
      * 订单id
      */
     private Long orderId;
+    /**
+     * 总里程
+     */
+    private Float totalOdometer;
 }
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
index 00bbb67..b5ef64e 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/controller/OrderMissionController.java
@@ -6,12 +6,14 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
 import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
+import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
 import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.dto.order.PopOrderDto;
 import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
 import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
+import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.order.XpOrderClient;
 import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
@@ -59,6 +61,8 @@
     private RedisService redisService;
     @Resource
     private XpVehicleClient xpVehicleClient;
+    @Resource
+    private VehicleBuriedPointClient vehicleBuriedPointClient;
     @Resource(name = "hutoolSnowflake")
     private Snowflake snowflake;
 
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index 84206e9..80e2520 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -6,6 +6,7 @@
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.util.JsonFormat;
 import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
+import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
 import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
 import com.xiaopeng.api.dto.operation.CruisePointDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
@@ -15,6 +16,7 @@
 import com.xiaopeng.api.dto.pushMessage.PushOrderRouteDTO;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
 import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
+import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
 import com.xiaopeng.api.feignClient.maintenance.XpTaskClient;
 import com.xiaopeng.api.feignClient.map.XpMapClient;
 import com.xiaopeng.api.feignClient.operation.ReassignOrderClient;
@@ -111,6 +113,8 @@
 
     @Resource
     private XpTaskClient xpTaskClient;
+    @Resource
+    private VehicleBuriedPointClient vehicleBuriedPointClient;
 
     private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer()
             .printingEnumsAsInts()
@@ -340,6 +344,7 @@
                 vehiclePosition.setCurrentElectricity(dynamicStatus.getBmsSocDisp());
                 vehiclePosition.setMileageRange(dynamicStatus.getDstBatDisp());
                 vehiclePosition.setOrderId(orderId);
+                vehiclePosition.setTotalOdometer(dynamicStatus.getTotalOdometer());
                 mongoTemplate.save(vehiclePosition);
             }else{
                 vehiclePosition.setOrderId(orderId);
@@ -351,7 +356,8 @@
                         .set("currentElectricity", dynamicStatus.getBmsSocDisp())
                         .set("mileageRange", dynamicStatus.getDstBatDisp())
                         .set("hasOrder", hasOrder)
-                        .set("orderId", orderId);
+                        .set("orderId", orderId)
+                        .set("totalOdometer", dynamicStatus.getTotalOdometer());
                 mongoTemplate.updateFirst(new Query(Criteria.where("vin").is(vin)), update, VehiclePosition.class);
             }
             //调用推送服务接口
@@ -874,6 +880,39 @@
                 case ORDER_COMPLETED:
                     //已完成
                     log.info("已完成,不做任何处理:{}", orderId);
+                    if(!orderId.contains("XU")){
+                        XpOrder xpOrder = xpOrderClient.queryOrderById(Long.valueOf(orderId)).getData();
+                        if (Objects.nonNull(xpOrder)){
+                            // 查询车辆
+                            XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
+                            if (Objects.nonNull(xpVehicle)){
+                                String vin = xpVehicle.getVehicleVin();
+                                // 封装埋点消息实体
+                                VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+                                vehicleEventDTO.setVin(vin);
+                                vehicleEventDTO.setXpuId("");
+                                vehicleEventDTO.setOrderId(orderId);
+                                vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
+                                vehicleEventDTO.setEventTime(System.currentTimeMillis());
+                                Map<String,Object> attributes = new HashMap<>();
+                                attributes.put("vin",vin);
+                                attributes.put("order_id",vehicleEventDTO.getOrderId());
+                                attributes.put("order_type","user_order");
+                                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                                attributes.put("current_main_status",OrderStatus.ORDER_COMPLETED);
+                                attributes.put("current_sub_status","");
+                                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+                                if(Objects.nonNull(vehiclePosition)){
+                                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
+                                }else {
+                                    attributes.put("odometer_km","");
+                                }
+                                vehicleEventDTO.setAttributes(attributes);
+                                vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+                                log.info("已完成,推送埋点:{}", orderId);
+                            }
+                        }
+                    }
                     break;
                 case ORDER_CANCELLED:
                     //已取消
@@ -895,6 +934,38 @@
                     //到达巡游终点
                     if(orderId.contains("XU")){
                         buildPushOrderStatus(orderId, OrderStatusEnum.COMPLETED, sequence);
+                        String cruiseOrderId = orderId.substring(2);
+                        XpCruiseOrder xpCruiseOrder = xpCruiseOrderClient.getCruiseOrder(Long.parseLong(cruiseOrderId)).getData();
+                        if (Objects.nonNull(xpCruiseOrder)){
+                            // 查询车辆
+                            XpVehicle xpVehicle = xpVehicleClient.queryById(xpCruiseOrder.getVehicleId()).getData();
+                            if (Objects.nonNull(xpVehicle)){
+                                String vin = xpVehicle.getVehicleVin();
+                                // 封装埋点消息实体
+                                VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+                                vehicleEventDTO.setVin(vin);
+                                vehicleEventDTO.setXpuId("");
+                                vehicleEventDTO.setOrderId(cruiseOrderId);
+                                vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
+                                vehicleEventDTO.setEventTime(System.currentTimeMillis());
+                                Map<String,Object> attributes = new HashMap<>();
+                                attributes.put("vin",vin);
+                                attributes.put("order_id",vehicleEventDTO.getOrderId());
+                                attributes.put("order_type","cruise_order");
+                                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                                attributes.put("current_main_status",OrderStatus.ORDER_ARRIVED_AT_CRUISE_DESTINATION);
+                                attributes.put("current_sub_status","");
+                                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vin)), VehiclePosition.class);
+                                if(Objects.nonNull(vehiclePosition)){
+                                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
+                                }else {
+                                    attributes.put("odometer_km","");
+                                }
+                                vehicleEventDTO.setAttributes(attributes);
+                                vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+                                log.info("到达巡游终点,推送埋点:{}", orderId);
+                            }
+                        }
                     }
                     break;
                 case ORDER_PAUSED:
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
index c0d51bd..4cc90af 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java
@@ -1,7 +1,9 @@
 package com.xiaopeng.maintenance.controller;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
 import com.xiaopeng.api.dto.operation.NewCruiseOrderDto;
+import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
 import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
 import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
@@ -32,6 +34,8 @@
 
 import javax.annotation.Resource;
 import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * <p>
@@ -58,6 +62,8 @@
     private AliOssService aliOssService;
     @Autowired
     private XpCruisePlanClient xpCruisePlanClient;
+    @Autowired
+    private VehicleBuriedPointClient vehicleBuriedPointClient;
 
     /**
      * 车辆详情-车辆调度-发车 收车
@@ -77,11 +83,38 @@
         if(vehiclePosition==null || vehiclePosition.getPoint()==null){
             return R.fail("车辆位置信息不存在");
         }
-
+        Integer departureStatus = dto.getDepartureStatus();
         XpVehicle vehicle1 = new XpVehicle();
-        vehicle1.setOperatingStatus(dto.getDepartureStatus());
+        vehicle1.setOperatingStatus(departureStatus);
         vehicle1.setId(xpVehicle.getId());
         xpVehicleClient.updateVehicleById(vehicle1);
+
+        // 封装埋点消息实体
+        VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+        vehicleEventDTO.setVin(xpVehicle.getVehicleVin());
+        vehicleEventDTO.setXpuId("");
+        vehicleEventDTO.setOrderId("");
+        vehicleEventDTO.setEventKey("RT_web_vehicle_status_changed");
+        vehicleEventDTO.setEventTime(System.currentTimeMillis());
+        Map<String,Object> attributes = new HashMap<>();
+        attributes.put("vin",xpVehicle.getVehicleVin());
+        attributes.put("order_id","");
+        attributes.put("timestamp",vehicleEventDTO.getEventTime());
+        if(departureStatus == 1){
+            attributes.put("main_status","ONLINE");
+            // TODO 预留位置 目前无状态
+            attributes.put("sub_status","");
+            attributes.put("prev_sub_status","");
+
+        }else {
+            attributes.put("main_status","OFFLINE");
+            // TODO 预留位置 目前无状态
+            attributes.put("sub_status","");
+            attributes.put("prev_sub_status","");
+        }
+        vehicleEventDTO.setAttributes(attributes);
+        vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+
         // 发车
         if(dto.getDepartureStatus()==1){
             // 找车辆的任务  生成巡游单子 下发命令
@@ -123,7 +156,6 @@
             if(returnCruisePoint!=null){
                 xpCruiseOrderClient.addCruiseOrder(returnCruisePoint);
             }
-
         }
         return R.ok();
     }
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index 1d792a8..9a311bb 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -15,6 +15,7 @@
 import com.xiaopeng.api.dto.account.UcUserInfo;
 import com.xiaopeng.api.dto.account.UseUserCouponDto;
 import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
+import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
 import com.xiaopeng.api.dto.operation.CruisePointDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
 import com.xiaopeng.api.dto.order.GetOrderNumDto;
@@ -31,6 +32,7 @@
 import com.xiaopeng.api.feignClient.account.UserResourcesClient;
 import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
 import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
+import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
 import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
 import com.xiaopeng.api.feignClient.operation.XpCruisePlanClient;
 import com.xiaopeng.api.feignClient.operation.XpPointClient;
@@ -156,6 +158,7 @@
     private final XpCruisePlanClient xpCruisePlanClient;
     private final XpPricingUtil xpPricingUtil;
     private final GDMapGeocodingUtil gdMapGeocodingUtil;
+    private final VehicleBuriedPointClient vehicleBuriedPointClient;
 
 
     @Autowired
@@ -995,7 +998,6 @@
                     log.info("已将原车辆状态设为空闲,车辆ID: {}", oldVehicleId);
 
                     // 6.1.4 为原车辆创建返程巡游订单
-                    --------------
                     createReturnCruiseOrder(oldVehicle.getId(), order);
                 } else {
                     log.warn("查询原车辆信息失败,车辆ID: {}", oldVehicleId);
@@ -2221,7 +2223,7 @@
 
     /**
      * 取消订单后的继续巡游任务
-     * @param vehicle
+     * @param vehicleId
      */
     public void addCruiseMission(Long vehicleId) {
         XpVehicle vehicle = xpVehicleClient.queryById(vehicleId).getData();
@@ -2840,6 +2842,29 @@
                 xpCruiseOrder.setVehicleId(null);
                 xpCruiseOrderMapper.updateById(xpCruiseOrder);
                 log.info("修改巡游单状态,开始执行巡游单 {}", dto.getOrderId());
+                // 封装埋点消息实体
+                VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+                vehicleEventDTO.setVin(dto.getXpVehicleVin());
+                vehicleEventDTO.setXpuId("");
+                vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId()));
+                vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
+                vehicleEventDTO.setEventTime(System.currentTimeMillis());
+                Map<String,Object> attributes = new HashMap<>();
+                attributes.put("vin",vehicleEventDTO.getVin());
+                attributes.put("order_id",vehicleEventDTO.getOrderId());
+                attributes.put("order_type","cruise_order");
+                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                attributes.put("current_main_status",OrderStatus.ORDER_STARTED);
+                attributes.put("current_sub_status","");
+                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
+                if(Objects.nonNull(vehiclePosition)){
+                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
+                }else {
+                    attributes.put("odometer_km","");
+                }
+                vehicleEventDTO.setAttributes(attributes);
+                vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+                log.info("巡游单埋点消息,开始执行推送: {}", dto.getOrderId());
             }
         }
         //乘客单处理逻辑
@@ -2921,6 +2946,33 @@
                 //推送乘客车辆到达预约点的导航数据
                 sendRoute(addTaxiPassengerVo.getUid(), orderId, "ORDER_NAVIGATION_START_DATA", dto.getXpVehicleVin());
             }
+
+            if(order.getStatus() == 2){
+                // 封装埋点消息实体
+                VehicleEventDTO vehicleEventDTO = new VehicleEventDTO();
+                vehicleEventDTO.setVin(dto.getXpVehicleVin());
+                vehicleEventDTO.setXpuId("");
+                vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId()));
+                vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload");
+                vehicleEventDTO.setEventTime(System.currentTimeMillis());
+                Map<String,Object> attributes = new HashMap<>();
+                attributes.put("vin",vehicleEventDTO.getVin());
+                attributes.put("order_id",vehicleEventDTO.getOrderId());
+                attributes.put("order_type","user_order");
+                attributes.put("timestamp",vehicleEventDTO.getEventTime());
+                attributes.put("current_main_status",OrderStatus.ORDER_EN_ROUTE_TO_PICKUP);
+                attributes.put("current_sub_status","");
+                VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class);
+                if(Objects.nonNull(vehiclePosition)){
+                    attributes.put("odometer_km",vehiclePosition.getTotalOdometer());
+                }else {
+                    attributes.put("odometer_km","");
+                }
+                vehicleEventDTO.setAttributes(attributes);
+                vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO);
+                log.info("用户单埋点消息,开始执行推送: {}", dto.getOrderId());
+            }
+
         }
     }
 

--
Gitblit v1.7.1