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