From e4e49b4458120047ed882d8c03ea6bcbb1e94b67 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 27 二月 2026 09:53:56 +0800
Subject: [PATCH] 添加测试代码
---
xp-robotaxi-api/src/main/proto/rt_system_snapshot.proto | 15
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_requset.json | 32
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control.json | 16
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation_state.json | 15
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/system_runtime_status.json | 154 ++++
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation.json | 38 +
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpFleetVehicleService.java | 2
xp-robotaxi-automatic-pilot-boot/pom.xml | 6
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/order_status_info_event.json | 164 ++++
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderDetailServiceImpl.java | 3
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navi_deviation_event.json | 29
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list.json | 57 +
xp-robotaxi-api/src/main/proto/rt_common.proto | 91 ++
xp-robotaxi-api/src/main/proto/rt_trip.proto | 70 ++
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/response.json | 15
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java | 3
xp-robotaxi-api/src/main/proto/rt_xpu_cloud_interaction.proto | 41 +
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_status_update_event.json | 32
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java | 226 ++++++
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list_response.json | 19
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleOperationsController.java | 18
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control_state.json | 16
xp-robotaxi-api/src/main/proto/rt_cloud_event.proto | 37 +
xp-robotaxi-api/src/main/proto/rt_order.proto | 100 ++
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/restore_navigation_data.json | 16
xp-robotaxi-api/src/main/proto/rt_event_type.proto | 22
xp-robotaxi-api/src/main/proto/rt_system.proto | 101 ++
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_info_update_event.json | 44 +
xp-robotaxi-api/src/main/proto/rt_cdu_event.proto | 4
xp-robotaxi-api/src/main/proto/rt_msg_content.proto | 107 +++
xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_state_snapshot_event.json | 215 ++++++
xp-robotaxi-api/src/main/proto/rt_xpu_cdu_interaction.proto | 85 ++
xp-robotaxi-api/src/main/proto/rt_interaction_common.proto | 27
xp-robotaxi-api/src/main/proto/rt_event_common.proto | 43 +
xp-robotaxi-api/src/main/proto/rt_task.proto | 105 +++
xp-robotaxi-api/src/main/proto/rt_navigation.proto | 52 +
xp-robotaxi-api/pom.xml | 32
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java | 6
38 files changed, 2,039 insertions(+), 19 deletions(-)
diff --git a/xp-robotaxi-api/pom.xml b/xp-robotaxi-api/pom.xml
index 0508688..ff1fcda 100644
--- a/xp-robotaxi-api/pom.xml
+++ b/xp-robotaxi-api/pom.xml
@@ -41,6 +41,38 @@
<artifactId>unified-verification</artifactId>
<version>1.5.2-v2</version>
</dependency>
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java</artifactId>
+ <version>3.19.4</version>
+ </dependency>
</dependencies>
+ <build>
+ <extensions>
+ <extension>
+ <groupId>kr.motd.maven</groupId>
+ <artifactId>os-maven-plugin</artifactId>
+ <version>1.6.2</version>
+ </extension>
+ </extensions>
+ <plugins>
+ <plugin>
+ <groupId>org.xolstice.maven.plugins</groupId>
+ <artifactId>protobuf-maven-plugin</artifactId>
+ <version>0.6.1</version>
+ <configuration>
+ <protocArtifact>com.google.protobuf:protoc:3.19.4:exe:${os.detected.classifier}</protocArtifact>
+ </configuration>
+ <executions>
+ <execution>
+ <goals>
+ <goal>compile</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
</project>
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
index 3fb57aa..62eccc7 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/order/XpOrderClient.java
@@ -110,4 +110,7 @@
R<String> updateOrderStatus(@RequestParam Long orderId,
@RequestParam Integer status);
+
+
+
}
diff --git a/xp-robotaxi-api/src/main/proto/rt_cdu_event.proto b/xp-robotaxi-api/src/main/proto/rt_cdu_event.proto
new file mode 100644
index 0000000..f7c0770
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_cdu_event.proto
@@ -0,0 +1,4 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_cloud_event.proto b/xp-robotaxi-api/src/main/proto/rt_cloud_event.proto
new file mode 100644
index 0000000..2b3ee31
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_cloud_event.proto
@@ -0,0 +1,37 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_navigation.proto";
+import "rt_common.proto";
+import "rt_system.proto";
+import "rt_system_snapshot.proto";
+import "rt_event_type.proto";
+import "rt_order.proto";
+
+message SystemStateSnapshotEvent {
+ RtEventType event_type = 1;
+ SystemStateSnapshot system_state_snapshot = 2;
+ int64 timestamp = 3; // 时间戳(毫秒)
+}
+
+message SystemStatusUpdateEvent {
+ RtEventType event_type = 1;
+ SystemStatus system_status = 2;
+ Waypoint point = 3; //事件发生的点位
+ int64 timestamp = 4; // 时间戳(毫秒)
+}
+
+// 导航信息
+message NavigationDeviationEvent {
+ RtEventType event_type = 1;
+ NavigationDeviationMessage navigation_deviation_message = 2;
+ int64 timestamp = 3; // 时间戳(毫秒)
+}
+
+message OrderAcceptanceStatusEvent {
+ RtEventType event_type = 1;
+ OrderAcceptanceStatus order_acceptance_status = 2;
+ int64 timestamp = 3; // 时间戳(毫秒)
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_common.proto b/xp-robotaxi-api/src/main/proto/rt_common.proto
new file mode 100644
index 0000000..2c567f3
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_common.proto
@@ -0,0 +1,91 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+// 车辆驾驶模式枚举
+enum DrivingMode {
+ DRIVING_MODE_UNSPECIFIED = 0; // 未指定
+ AUTONOMOUS = 1; // L4自动驾驶模式
+ REMOTE_DRIVING = 2; // 云代驾远程控车模式
+ MANUAL_DRIVING = 3; // 手动驾驶模式
+}
+
+// 动作类型枚举
+enum ActionType {
+ ACTION_UNSPECIFIED = 0;
+ PICK_UP = 1; // 上车/接客
+ DROP_OFF = 2; // 下车/送客
+ DRIVE_THROUGH = 3; //巡游终点不停车
+}
+
+// 导航点类型
+enum PointType {
+ POINT_TYPE_UNSPECIFIED = 0;
+ START_POINT = 1; // 起点
+ WAY_POINT = 2; // 途经点
+ END_POINT = 3; // 终点(导航终点)
+ PICK_UP_POINT = 4; // 上车点(导航终点)
+ CRUISE_END_POINT = 5; // 巡游终点
+}
+
+enum GearLevel {
+ GEAR_Invalid = 0;
+ GEAR_D = 1;
+ GEAR_N = 2;
+ GEAR_R = 3;
+ GEAR_P = 4;
+}
+
+// 途经点信息
+message Waypoint {
+ string waypoint_id = 1; // 途经点ID
+ PointType point_type = 2;
+ ActionType action_type = 3; // 在该点执行的动作
+ GeoPoint point = 4; // 经纬度
+ uint32 sequence = 5; // 顺序序号(在路线中的位置)
+}
+
+message Wgs{
+ double longitude = 1; //经度
+ double latitude = 2; //纬度
+ double course = 3; //航向,单位:度,北零顺时针。范围:[0-360)。0 => 北, 90 => 东, 180 => 南, 270 => 西
+ double pos_acc = 4; //位置精度
+ float alt = 5; // 海拔 单位米
+}
+
+// 位置信息
+message GeoPoint {
+ double longitude = 1; // 经度
+ double latitude = 2; // 纬度
+}
+
+message RealtimePose{
+ int64 timestamp = 1; // 时间戳(毫秒)
+ Wgs navi_pose = 2; //高德导航pose,WGS加偏之后的GCJ-02
+ // adas_pse //自驾pose, double heading= 3; /车头方向角需要北向顺时针夹角度数
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+// Order Related
+////////////////////////////////////////////////////////////////////////////////////////////////
+
+enum OrderPhase {
+ IDLE = 0; // 订单的任务未开始执行
+ ROUTE_TO_PICKUP = 1; // 驶往上车点的行程
+ ROUTE_TO_DESTINATION = 2; // 驶往下车点的行程
+ ROUTE_TO_CRUISE = 3; // 巡游阶段路线
+}
+
+// 订单类型枚举
+enum OrderType {
+ ORDER_TYPE_UNSPECIFIED = 0; // 未指定
+ ORDER_TYPE_ROBOTAXI = 1; // Robotaxi订单
+ ORDER_TYPE_REMOTE_DRIVING = 2; // 云代驾订单
+ ORDER_TYPE_CRUISE = 3; // 巡游任务
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+// Event Related
+////////////////////////////////////////////////////////////////////////////////////////////////
+
diff --git a/xp-robotaxi-api/src/main/proto/rt_event_common.proto b/xp-robotaxi-api/src/main/proto/rt_event_common.proto
new file mode 100644
index 0000000..61c29de
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_event_common.proto
@@ -0,0 +1,43 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_task.proto";
+import "rt_common.proto";
+import "rt_trip.proto";
+import "rt_order.proto";
+import "rt_navigation.proto";
+import "rt_event_type.proto";
+
+message RtTripInfoEvent {
+ RtEventType event_type = 1;
+ RtTripInfo trip_info = 2;
+ Waypoint point = 3; //事件发生的点位
+ TaskRunningStateEvent task_running_state_event = 4;
+ PointArrivalInfo latest_arrival_info = 5; //若当次event_type是到点状态触发,则此字段有值
+ int64 timestamp = 6;
+}
+
+message TaskRunningStateEvent {
+ RtEventType event_type = 1;
+ TaskRunningState task_running_state = 2;
+ Waypoint point = 3; //事件发生的点位
+ int64 timestamp = 4; // 时间戳(毫秒)
+}
+
+// 更新订单状态信息消息
+message OrderStatusInfoEvent {
+ RtEventType event_type = 1;
+ OrderStatusInfo order_status_info = 2;
+ Waypoint point = 3; //事件发生的点位
+ RtTripInfoEvent trip_info_event = 4;
+ int64 timestamp = 5; // 状态更新时间戳(毫秒)
+}
+
+message NavigationInfoUpdateEvent {
+ RtEventType event_type = 1;
+ NavigationInfo navigation_info = 2;
+ Waypoint point = 3; //事件发生的点位
+ int64 timestamp = 4; // 时间戳(毫秒)
+}
diff --git a/xp-robotaxi-api/src/main/proto/rt_event_type.proto b/xp-robotaxi-api/src/main/proto/rt_event_type.proto
new file mode 100644
index 0000000..1fd902c
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_event_type.proto
@@ -0,0 +1,22 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+enum RtEventType{
+ kEventUnspecified = 0;
+ kEventTripProgress = 1;
+ kEventTripPointArrival = 2;
+ kEventPulloverStatus = 3;
+ kEventDrivingModeUpdate = 4;
+ kEventSystemStatusUpdate = 5;
+ kEventOrderStateUpdate = 6;
+ kEventPickupConfirmation = 7;
+ kEventDropoffInfo = 8;
+ kEventNavigationDeviation = 9;
+ kEventNavigationUpdate = 10;
+ kEventTaskQueueUpdate = 11;
+ kEventSystemInitSync = 12;
+ kEventMqttReconnectSync = 13;
+ kEventOrderAcceptanceStatusUpdate = 14;
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_interaction_common.proto b/xp-robotaxi-api/src/main/proto/rt_interaction_common.proto
new file mode 100644
index 0000000..f9f0338
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_interaction_common.proto
@@ -0,0 +1,27 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_order.proto";
+
+message RestoreNavigationData {
+ string request_id = 1; // 请求ID
+ string route_id = 2; // 导航路线ID
+ string content = 3; // 导航数据内容
+ int64 timestamp = 4; // 时间戳 (毫秒)
+}
+
+// 订单操作信息消息
+message OrderOperation {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ OrderOperationType operation_type = 3; // 订单操作类型
+ OrderType order_type = 4; // 订单类型,新发订单才需要
+ // 途径点列表,仅当operation_type为CLOUD_UPDATE_WAYPOINTS时有效
+ repeated Waypoint waypoints = 5; //每次需要全量更新
+ // 目标点,仅当operation_type为CLOUD_CHANGE_DESTINATION时有效
+ Waypoint target_point = 6;
+ //int64 timestamp = 7; // 毫秒级时间戳
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_msg_content.proto b/xp-robotaxi-api/src/main/proto/rt_msg_content.proto
new file mode 100644
index 0000000..c2fa060
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_msg_content.proto
@@ -0,0 +1,107 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_xpu_cdu_interaction.proto";
+import "rt_xpu_cloud_interaction.proto";
+import "rt_interaction_common.proto";
+import "rt_event_common.proto";
+import "rt_cloud_event.proto";
+import "rt_order.proto";
+import "rt_navigation.proto";
+import "rt_trip.proto";
+import "rt_system.proto";
+import "rt_task.proto";
+
+enum StatusCode {
+ HTTP_STATUS_CODE_UNSPECIFIED = 0;
+ OK = 200; // 成功
+ BAD_REQUEST = 400; //请求参数错误
+ FORBIDDEN = 403;
+ NOT_FOUND = 404;
+ REQUEST_TIMEOUT = 408; //请求超时
+ INTERNAL_SERVER_ERROR = 500; // 失败
+}
+
+// 消息类型枚举
+enum MessageType {
+ MESSAGE_TYPE_UNKNOWN = 0;
+ MESSAGE_TYPE_RESPONSE = 1; // 应答
+ MESSAGE_TYPE_REQUEST = 2; // 请求
+}
+
+// 定义source枚举
+enum SourceType {
+ SOURCE_UNKNOWN = 0;
+ CLOUD = 1;
+ CDU = 2;
+ XPU = 3;
+}
+
+// 心跳消息
+message Heartbeat {
+ string vin = 1; // 设备ID
+ int64 timestamp = 2; // 时间戳
+ string status = 3; // 状态
+}
+
+// 心跳响应
+message HeartbeatAck {
+ string vin = 1; // 设备ID
+ StatusCode code = 2; // 响应状态码
+ int64 timestamp = 3; // 时间戳
+}
+
+// 消息头
+message MsgHeader {
+ int64 timestamp = 1; // 发送时间戳,单位ms
+ uint32 cmd = 2; // 消息头
+ uint64 sequence = 3;
+ MessageType type = 4; // 请求或应答
+ string msg_id = 5; // 消息唯一ID(UUID)
+ SourceType source = 6; // 消息来源:cloud、cdu、xpu
+}
+
+message ResponseMessage {
+ uint64 request_seq = 1; // 对应请求seq
+ StatusCode code = 2; // 响应码
+ int64 timestamp = 3; // 时间戳(毫秒)
+}
+
+message MsgContent {
+ MsgHeader header = 1;
+ oneof content_detail { // 业务负载
+ ////// common /////////
+ ResponseMessage response = 2;
+ OrderOperation order_operation = 3;
+ OrderOperationState order_operation_state = 4;
+ RestoreNavigationData restore_navigation_data = 5;
+ SystemRuntimeStatus system_runtime_status = 6;
+
+ ////// cloud ////////
+ RtTaskList rt_task_list = 201;
+ RtTaskListResponse rt_task_list_response = 202;
+ TaskControl task_control = 203;
+ TaskControlState task_control_state = 204;
+ NavigationRequest navigation_requset = 205;
+ SystemStateSnapshotEvent system_state_snapshot_event = 206;
+ OrderStatusInfoEvent order_status_info_event = 207;
+ NavigationInfoUpdateEvent navigation_info_update_event = 208;
+ SystemStatusUpdateEvent system_status_update_event = 209;
+ NavigationDeviationEvent navi_deviation_event = 210;
+
+ //////// cdu /////////
+ CduSystemStatus cdu_system_status = 400;
+ OrderStatusSummary order_status_summary = 401;
+ PullOverInfo pullover_info = 402;
+ PointArrivalInfoList point_arrival_info_list = 403;
+ PickupConfirmation pickup_confirmation = 404;
+ DropoffInfo dropoff_info = 405;
+ NavigationDeviationMessage navi_deviation_msg = 406;
+ PullOverRequest pullover_request = 407;
+ EmergencyStopMessage emergency_stop_msg = 408;
+ RealtimeNaviPose realtime_navi_pose = 409;
+ OrderAcceptanceStatus order_acceptance_status = 410;
+ }
+}
diff --git a/xp-robotaxi-api/src/main/proto/rt_navigation.proto b/xp-robotaxi-api/src/main/proto/rt_navigation.proto
new file mode 100644
index 0000000..eb120d8
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_navigation.proto
@@ -0,0 +1,52 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+// import "v2_navi.proto";
+// import "SDNavigation.proto";
+
+// 导航类型枚举
+enum NavigationType {
+ NAVIGATION_TYPE_UNSPECIFIED = 0; // 未指定
+ NAVIGATION_TYPE_DEVIATION = 1; // 偏航(车辆偏离原路线)
+ NAVIGATION_TYPE_TO_PICKUP = 2; // 接驾行程(前往上车点)
+ NAVIGATION_TYPE_TO_DESTINATION = 3; // 送驾行程(前往目的地)
+ NAVIGATION_TYPE_CRUISE = 4; // 巡游
+}
+
+message NaviProgressInfo {
+ uint64 navigation_id = 1; // 导航ID
+ double route_remain_dist = 2; // 剩余导航距离,单位米
+ double route_remain_time = 3; // 剩余导航时间
+ // acm.proto.topic.navigation.NaviPosition position = 4; // 当前导航位置
+ string route_id = 5; // 导航路线ID
+}
+
+// 导航信息
+message NavigationInfo {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ OrderPhase order_phase = 3; // 订单阶段
+ uint64 navigation_id = 4; // 导航ID
+ // acm.proto.navi.NaviStatus navigation_status = 5; // 导航状态
+ NaviProgressInfo navi_progress_info = 6; //navi_progress_info中的route_id与外层的route_id相等且navigation_status为NAVI_STATUS_START此字段值有效
+ int64 timestamp = 7; // 时间戳(毫秒)
+ string route_id = 8; // 导航路线ID
+}
+
+message NavigationDeviationMessage {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ uint64 navigation_id = 3; // 偏航前的导航ID
+ uint64 navi_recalc_request_seq = 4; // 导航重算请求序号,可取值毫秒级时间戳
+ Wgs point = 5; // 发生偏航的坐标点,GCJ-02
+ int64 timestamp = 6; // 时间戳(毫秒)
+ string route_id = 7; // 偏航前的高德导航路线ID
+}
+
+message RealtimeNaviPose{
+ int64 timestamp = 1; // 时间戳(毫秒)
+ Wgs navi_pose = 2; //高德导航pose,WGS加偏之后的GCJ-02
+}
diff --git a/xp-robotaxi-api/src/main/proto/rt_order.proto b/xp-robotaxi-api/src/main/proto/rt_order.proto
new file mode 100644
index 0000000..d2736d3
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_order.proto
@@ -0,0 +1,100 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_trip.proto";
+
+// 订单操作类型枚举
+enum OrderOperationType {
+ ORDER_OPERATION_UNSPECIFIED = 0; // 未指定
+ CLOUD_CREATE_ORDER = 1; // 云端新增订单,XPU与座舱交互指令
+ CLOUD_CANCEL_ORDER = 2; // 云端取消订单
+ VEHICLE_CANCEL_ORDER = 3; // 车端取消订单
+ CLOUD_PAUSE_ORDER = 4; // 云端暂停订单
+ VEHICLE_PAUSE_ORDER = 5; // 车端暂停订单
+ CLOUD_UPDATE_WAYPOINTS = 6; // 云端更新途经点
+ CLOUD_CHANGE_DESTINATION = 7; // 云端更改终点
+}
+
+// 接单状态枚举
+enum OrderAcceptanceState {
+ ORDER_ACCEPTANCE_STATE_UNSPECIFIED = 0; // 未知/保留字段
+ ORDER_ACCEPTANCE_STATE_START = 1; // 开始接单 (上线/听单)
+ ORDER_ACCEPTANCE_STATE_STOP = 2; // 停止接单 (下线/收车)
+}
+
+// 订单状态枚举
+enum OrderStatus {
+ ORDER_STATUS_UNSPECIFIED = 0; // 未指定
+ ORDER_RECEIVED = 1; // 收到订单
+ ORDER_STARTED = 2; // 开始执行订单
+ ORDER_EN_ROUTE_TO_PICKUP = 3; // 前往上车点
+ ORDER_ARRIVED_AT_PICKUP = 4; // 到达上车点
+ ORDER_WAITING_FOR_PICKUP = 5; // 等待乘客上车
+ ORDER_PASSENGER_ONBOARD = 6; // 乘客已上车
+ ORDER_EN_ROUTE_TO_DESTINATION = 7; // 前往目的地
+ ORDER_ARRIVED_AT_DESTINATION = 8; // 到达目的地
+ ORDER_WAITING_FOR_DROPOFF = 9; // 等待乘客下车
+ ORDER_DROPOFF_COMPLETED = 10; // 下车完成
+ ORDER_COMPLETED = 11; // 已完成
+ ORDER_CANCELLED = 12; // 已取消
+ ORDER_ARRIVED_AT_CRUISE_DESTINATION = 13; // 到达巡游终点
+ ORDER_PAUSED = 14; // 订单暂停
+}
+
+// 订单状态变化来源
+enum OrderStateChangeSource {
+ ORDER_STATE_CHANGE_SOURCE_UNSPECIFIED = 0; // 未指定
+ ORDER_STATE_CHANGE_SOURCE_CLOUD = 1; // 云端系统
+ ORDER_STATE_CHANGE_SOURCE_VEHICLE = 2; // 车端
+}
+
+// 操作状态
+enum OrderOperationStatus {
+ OPERATION_STATUS_UNSPECIFIED = 0;
+ PROCESSING = 1; // 处理中
+ SUCCESS = 2; // 成功
+ FAILED = 3; // 失败
+}
+
+// 更新订单状态信息消息
+message UpdateOrderStatus {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ OrderPhase order_phase = 3; // 订单阶段
+ int64 timestamp = 4; // 毫秒级时间戳
+}
+
+message OrderOperationState {
+ string order_id = 1; // 订单ID
+ OrderOperationType operation_type = 2; // 订单操作类型
+ OrderOperationStatus status = 3; // 操作状态
+}
+
+// 订单状态信息
+message OrderStatusInfo {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 关联任务ID
+ OrderStatus status = 3; // 订单当前状态
+ OrderPhase order_phase = 4; // 订单阶段
+ OrderStateChangeSource change_source = 5; // 状态变化来源
+ string operator_id = 6; // 车端操作填写车端登录用户ID
+ RtTripInfo rt_trip_info = 7;
+ int64 timestamp = 8; // 状态更新时间戳(毫秒)
+}
+
+// 更新订单状态信息消息
+message OrderStatusSummary {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ OrderStatus status = 3; // 订单当前状态
+ OrderPhase order_phase = 4; // 订单阶段
+}
+
+// 接单状态消息
+message OrderAcceptanceStatus {
+ OrderAcceptanceState state = 1; // 接单状态
+ int64 timestamp = 2; // 状态变更时间戳
+}
diff --git a/xp-robotaxi-api/src/main/proto/rt_system.proto b/xp-robotaxi-api/src/main/proto/rt_system.proto
new file mode 100644
index 0000000..08ef0b0
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_system.proto
@@ -0,0 +1,101 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_order.proto";
+import "rt_trip.proto";
+import "rt_navigation.proto";
+
+// 系统初始化阶段枚举
+enum SystemPhase {
+ SYSTEM_STATUS_UNSPECIFIED = 0; // 未指定状态
+ SYSTEM_INITIALIZING = 1; // 系统初始化中
+ SYSTEM_SELF_CHECKING = 2; // 系统自检中
+ SYSTEM_NORMAL = 3; // 系统处于normal态
+ SYSTEM_ABNORMAL = 4; // 系统处于abnormal态
+}
+
+// L4功能能力枚举
+enum L4CapabilityType {
+ NO_L4_CAPABILITY = 0; // 无功能
+ RT = 1; // RT功能
+ VPD = 2; // VPD功能
+}
+
+// 设备能力信息(用于状态上报)
+message L4CapabilityInfo {
+ string vin = 1; // 车辆ID
+ int64 user_id = 2; // 用户ID
+ repeated L4CapabilityType l4_capabilities = 3; // L4功能能力
+ string mqtt_account= 4;
+ int64 timestamp = 5; // 更新时间
+}
+
+// 服务可用性(Normal状态使用)
+enum ServiceAvailability {
+ SERVICE_AVAILABILITY_UNSPECIFIED = 0;
+ ROBOTAXI_AVAILABLE = 1; // Robotaxi可用
+ VPD_AVAILABLE = 2; // VPD可用
+}
+
+// 异常原因(Abnormal状态使用)
+enum AbnormalReason {
+ ABNORMAL_REASON_UNSPECIFIED = 0;
+ REMOTE_CONTROL_MODE = 1; // 远程控车模式
+ MRM = 2; // MRM(Minimal Risk Maneuver,最小风险机动)
+ E_STOP = 3; // E-Stop(Emergency Stop,紧急停止)
+ FAULT = 4; // 故障
+}
+
+message CduSystemStatus {
+ SystemPhase phase = 1;
+ OrderAcceptanceStatus order_acceptance_status = 2; //接单状态
+}
+
+message SystemStatus {
+ SystemPhase phase = 1; // 系统阶段
+ AbnormalReason abnormal_reason = 2; // Abnormal状态时的原因
+ repeated ServiceAvailability available_services = 3;
+ bool is_emergency = 4; // 是否紧急状态
+}
+
+message SystemRuntimeStatus {
+ int64 timestamp = 1; // 时间戳(毫秒)
+ int64 uid = 2; // 当前登录用户ID
+ VehicleStatus vehicle_status = 3; //车辆状态
+ SystemStatus system_status = 4;
+ DrivingMode driving_mode = 5; // 驾驶模式
+ OrderStatusInfo running_order_status_info = 6; //正在运行订单信息,当running_order和rt_trip_info中id不相同时以running_order为准
+ RtTripInfo rt_trip_info = 7; // rt行程信息
+ RealtimePose pose = 8; //实时位姿
+ NavigationInfo navigation_info = 9; //实时导航信息
+}
+
+// 车辆静态信息(固定或很少变化)
+message VehicleStaticInfo {
+ string xpu_id = 1; // XPU设备ID
+ int64 timestamp = 2; // 时间戳(毫秒)
+}
+
+// 车辆动态状态(实时变化)
+message VehicleDynamicStatus {
+ GearLevel gear_level = 1; // 档位
+ float steering_angle = 2; // 方向盘转向角(度)
+ float speed = 3; // 仪表显示车速(m/s)
+ int64 timestamp = 4; // 时间戳(毫秒)
+ uint32 bms_soc_disp = 5; //剩余电量百分比,I_LDCU_BMS_SOC_Disp
+ float dst_bat_disp = 6; //综合续航,单位km,I_LDCU_dstBatDisp
+
+ //float throttle = 7; // 油门开度(0-100%)
+ //float brake = 8; // 刹车压力(0-100%)
+ //bool parking_brake = 9; // 手刹状态
+ //float battery_level = 10; // 电池电量(0-100%)
+}
+
+// 车辆状态
+message VehicleStatus {
+ VehicleStaticInfo static_info = 1; // 静态信息
+ VehicleDynamicStatus dynamic_status = 2; // 动态状态
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_system_snapshot.proto b/xp-robotaxi-api/src/main/proto/rt_system_snapshot.proto
new file mode 100644
index 0000000..58c533b
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_system_snapshot.proto
@@ -0,0 +1,15 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_event_common.proto";
+import "rt_common.proto";
+
+// 状态快照事件(MQTT重连后全量同步)
+message SystemStateSnapshot {
+ OrderStatusInfoEvent order_status_events = 1; // 正在运行订单状态事件
+ NavigationInfoUpdateEvent navigation_event = 2; // 导航信息更新事件
+ RealtimePose realtime_pose = 3; // 产生Snapshot的实时位姿
+ int64 timestamp = 4; // 快照生成时间戳(毫秒)
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_task.proto b/xp-robotaxi-api/src/main/proto/rt_task.proto
new file mode 100644
index 0000000..c851735
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_task.proto
@@ -0,0 +1,105 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_navigation.proto";
+
+// 任务操作类型枚举
+enum TaskControlType {
+ TASK_OPERATION_UNSPECIFIED = 0; // 未指定
+ CLOUD_PAUSE_TASK = 1; // 云端暂停任务
+ CLOUD_RESUME_TASK = 2; // 云端恢复任务
+ CLOUD_CANCEL_TASK = 3; // 云端取消任务
+ VEHICLE_PAUSE_TASK = 4; // 车端暂停任务
+ VEHICLE_RESUME_TASK = 5; // 车端恢复任务
+ VEHICLE_TERMINATE_TASK = 6; // 车端取消/结束任务
+}
+
+enum TaskRunningStatus {
+ TASK_RUNNING_STATUS_UNSPECIFIED = 0; // 未指定
+ TASK_IDLE = 1; // 空闲(任务已创建,未开始)
+ TASK_INITIALIZING = 2; // 初始化中(准备运行环境)
+ TASK_RUNNING = 3; // 运行中(正常执行)
+ TASK_PAUSED = 4; // 已暂停
+ TASK_STOPPING = 5; // 停止中
+ TASK_COMPLETED = 6; // 已完成
+ TASK_FAILED = 7; // 执行失败
+ TASK_CANCELLED = 8; // 已取消
+}
+
+// 状态变化来源枚举
+enum TaskStateChangeSource {
+ TASK_STATE_CHANGE_SOURCE_UNSPECIFIED = 0; // 未指定
+ TASK_STATE_CHANGE_SOURCE_CLOUD = 1; // 云端指令
+ TASK_STATE_CHANGE_SOURCE_VEHICLE_USER = 2; // 车端用户操作
+}
+
+// 任务处理结果状态
+enum TaskResultStatus {
+ TASK_RESULT_STATUS_UNSPECIFIED = 0; // 未指定
+ ACCEPTED = 1; // 已接受
+ NO_CAPABILITY = 2; // 无执行任务能力
+ PRECONDITION_NOT_MET = 3; // 执行条件不满足
+ DUPLICATE = 4; // 重复任务
+ INVALID = 5; // 无效任务
+}
+
+// 操作执行状态
+enum TaskControlStatus {
+ TASK_CONTROL_STATUS_UNKNOWN = 0; // 未知
+ TASK_CONTROL_STATUS_EXECUTING = 1; // 执行中
+ TASK_CONTROL_STATUS_SUCCESS = 2; // 执行成功
+ TASK_CONTROL_STATUS_FAILED = 3; // 执行失败
+ TASK_CONTROL_STATUS_REJECTED = 4; // 拒绝执行,任务已经结束
+}
+
+// 前置/后置动作类型
+enum TaskActionType {
+ kActionUnknown = 0; // 无效值
+ kWaitPrevTaskFinish = 1; // 等待前一个任务完成
+ kTriggerNextTaskOnFinish = 2; // 完成后触发下一个任务
+ kTerminateTask = 3; // 终止任务
+ kTerminateForNewTask = 4; // 终止并替换为新任务
+ kPauseTask = 5; // 暂停任务
+ kPauseForNewTask = 6; // 暂停并替换为新任务
+}
+
+// 任务动作
+message TaskAction {
+ string order_id = 1;
+ string task_id = 2; // 任务id
+ TaskActionType action_type = 3; // 任务动作类型
+}
+
+// 任务运行状态信息
+message TaskRunningState {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ TaskRunningStatus status = 3; // 任务运行状态
+ TaskStateChangeSource change_source = 4; // 状态变化来源
+ NaviProgressInfo navi_progress_info = 5; //导航运行进度
+ int64 timestamp = 6; // 状态更新时间戳(毫秒)
+}
+
+message RtTaskResult {
+ string order_id = 1;
+ string task_id = 2; // 任务ID
+ TaskResultStatus status = 3; // 任务状态
+}
+
+message RtTask {
+ string task_id = 1; // 任务唯一标识
+ string order_id = 2; //关联的订单id
+ repeated OrderPhase order_phase = 3; // TASK对应的行程阶段,若一个订单被拆分成多个TASK,车端使用order_id关联,使用seq排序
+ repeated Waypoint points = 4; // ROBOTAXI任务必须要有一个可以作为导航终点的点
+ OrderType task_type = 5; // 任务类型
+ repeated TaskAction pre_actions = 6; //
+ repeated TaskAction post_actions = 7; //
+ uint32 sequence = 8; // 任务在订单中的顺序(从1开始)
+}
+
+message RtTaskList {
+ repeated RtTask tasks = 1;
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_trip.proto b/xp-robotaxi-api/src/main/proto/rt_trip.proto
new file mode 100644
index 0000000..3aa16bb
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_trip.proto
@@ -0,0 +1,70 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_task.proto";
+
+// 行程完成状态枚举
+enum TripCompletionStatus {
+ TRIP_COMPLETION_STATUS_UNSPECIFIED = 0; // 未指定
+ COMPLETED_SUCCESSFULLY = 1; // 成功完成
+ CANCELLED_BY_PASSENGER = 2; // 乘客取消
+ CANCELLED_BY_DRIVER = 3; // 司机取消
+ CANCELLED_BY_SYSTEM = 4; // 系统取消
+ TERMINATED_ABNORMALLY = 5; // 异常终止
+}
+
+// 到点状态枚举
+enum ArrivalStatus {
+ ARRIVAL_STATUS_UNSPECIFIED = 0; // 未指定
+ NOT_ARRIVED = 1; // 未到达
+ ARRIVED = 2; // 到达
+}
+
+// 行程状态枚举
+enum TripStatus {
+ TRIP_STATUS_UNSPECIFIED = 0; // 未指定
+ TRIP_INITIALIZING = 1; // 启动行程,对应任务被调度到,开始初始化运行环境
+ TRIP_RUNNING = 2; // 开始行程
+ TRIP_PAUSED = 3; // 暂停中
+ TRIP_COMPLETED = 4; // 行程完成
+}
+//转换过程:INITIALIZING → RUNNING → PAUSED ⇄ RUNNING → COMPLETED
+
+// 行程摘要
+message TripSummary {
+ double distance_km = 1; // 行驶距离(公里)
+ int32 duration_sec = 2; // 行驶时长(秒)
+}
+
+message PointArrivalInfo {
+ string point_id = 1; // 点位ID
+ PointType point_type = 2; // 点位类型
+ ActionType action_type = 3; // 动作类型
+ ArrivalStatus arrival_status = 4; // 到点状态
+ int64 timestamp = 5; // 到点时间戳(毫秒)
+}
+
+//每次更新全量,PointArrivalInfo中时间戳值最大的为最新的到点状态
+message PointArrivalInfoList {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ OrderPhase order_phase = 3; // 订单阶段
+ repeated PointArrivalInfo arrival_infos = 4; // 到点状态列表
+}
+
+// 行程信息消息
+message RtTripInfo {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ TripStatus trip_status = 3; // 行程状态
+ OrderPhase order_phase = 4; // 订单阶段
+ TripCompletionStatus trip_completion_status = 5; // 行程完成状态
+ TripSummary summary = 6; // 行程摘要,仅当trip_status为TRIP_COMPLETED时有效
+ Waypoint point = 7; //trip_status为TRIP_STARTED、TRIP_COMPLETED时赋值
+ TaskRunningState current_task = 8; // 当前正在运行的任务状态
+}
+
+
diff --git a/xp-robotaxi-api/src/main/proto/rt_xpu_cdu_interaction.proto b/xp-robotaxi-api/src/main/proto/rt_xpu_cdu_interaction.proto
new file mode 100644
index 0000000..dee676b
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_xpu_cdu_interaction.proto
@@ -0,0 +1,85 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_order.proto";
+import "rt_event_type.proto";
+
+// 靠边停车状态枚举
+enum PullOverStatus {
+ NOT_PULLING_OVER = 0; // 未在靠边停车态
+ PULLING_OVER = 1; // 靠边停车中
+ PULL_OVER_COMPLETED = 2; // 靠边停车完成
+ PULL_OVER_FAILED = 3; // 靠边停车失败
+}
+
+// 靠边停车操作枚举
+enum PullOverAction {
+ PULL_OVER_ACTION_UNKNOWN = 0; // 未知
+ PULL_OVER_ACTION_START = 1; // 开始靠边停车
+}
+
+// 紧急停车原因枚举
+enum EmergencyStopReason {
+ EMERGENCY_STOP_REASON_UNKNOWN = 0; // 未知
+ EMERGENCY_STOP_REASON_MANUAL = 1; // 人工触发
+}
+
+// 上车状态枚举
+enum PickupStatus {
+ PICKUP_STATUS_UNSPECIFIED = 0;
+ PICKUP_IN_PROGRESS = 1;
+ PICKUP_COMPLETED = 2;
+ PICKUP_FAILED = 3;
+}
+
+// 下车状态枚举
+enum DropoffStatus {
+ DROPOFF_STATUS_UNSPECIFIED = 0; // 未执行下车动作
+ DROPOFF_COMPLETED = 1; // 下车完成
+}
+
+// 座舱发起靠边停车 (座舱 -> XPU)
+message PullOverRequest {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ PullOverAction action = 3; // 靠边停车操作
+ int64 timestamp = 4; // 时间戳(毫秒)
+}
+
+// 座舱发起紧急停车 (座舱 -> XPU)
+message EmergencyStopMessage {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ int64 timestamp = 3; // 时间戳(毫秒)
+ EmergencyStopReason reason = 4; // 紧急停车原因
+}
+
+// 用户确认上车状态信息消息
+message PickupConfirmation {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ PickupStatus pickup_status = 3; // 上车状态
+ GeoPoint point = 4; // 上车位置
+ int64 timestamp = 5; // 时间戳
+}
+
+// 用户下车状态信息消息
+message DropoffInfo {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ DropoffStatus dropoff_status = 3; // 下车状态
+ int64 timestamp = 4; // 时间戳
+ GeoPoint point = 5; // 下车位置
+}
+
+// 靠边停车状态信息消息 (XPU -> 座舱)
+message PullOverInfo {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ OrderPhase order_phase = 3; // 订单阶段
+ PullOverStatus pull_over_status = 4; // 靠边停车状态
+ int64 timestamp = 5; // 时间戳(毫秒)
+}
\ No newline at end of file
diff --git a/xp-robotaxi-api/src/main/proto/rt_xpu_cloud_interaction.proto b/xp-robotaxi-api/src/main/proto/rt_xpu_cloud_interaction.proto
new file mode 100644
index 0000000..4442efe
--- /dev/null
+++ b/xp-robotaxi-api/src/main/proto/rt_xpu_cloud_interaction.proto
@@ -0,0 +1,41 @@
+syntax = "proto3";
+
+package acm.proto.intelliservices.rt;
+option java_package = "com.xiaopeng.api.vo.automaticPilot.protobuf";
+option java_multiple_files = true;
+import "rt_common.proto";
+import "rt_task.proto";
+import "rt_navigation.proto";
+import "rt_order.proto";
+
+// RT任务列表应答
+message RtTaskListResponse {
+ RtTaskResult results = 1; // 每个任务的详细结果
+}
+
+message TaskControl {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ TaskControlType task_control_type = 3; // 任务操作类型
+ int64 timestamp = 4; // 状态更新时间戳(毫秒)
+}
+
+message TaskControlState {
+ string order_id = 1; // 订单ID
+ string task_id = 2; // 任务ID
+ TaskControlType task_control_type = 3; // 任务操作类型
+ TaskControlStatus status = 4; // 操作状态
+}
+
+// 请求导航消息
+message NavigationRequest {
+ string request_id = 1; // 请求唯一ID
+ string order_id = 2; // 订单ID
+ string task_id = 3; // 任务ID
+ OrderPhase order_phase = 4; // 当前订单阶段
+ NavigationType navigation_type = 5; // 请求原因
+ RealtimePose current_pose = 6; // 当前位姿
+ GeoPoint target_point = 7; // 目标点(经纬度)
+ int64 timestamp = 8; // 请求时间戳(毫秒)
+}
+
diff --git a/xp-robotaxi-automatic-pilot-boot/pom.xml b/xp-robotaxi-automatic-pilot-boot/pom.xml
index 95b9958..cea4ccd 100644
--- a/xp-robotaxi-automatic-pilot-boot/pom.xml
+++ b/xp-robotaxi-automatic-pilot-boot/pom.xml
@@ -128,6 +128,12 @@
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
+ <dependency>
+ <groupId>com.google.protobuf</groupId>
+ <artifactId>protobuf-java-util</artifactId>
+ <version>3.19.4</version>
+ </dependency>
+
</dependencies>
<build>
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navi_deviation_event.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navi_deviation_event.json
new file mode 100644
index 0000000..12d385b
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navi_deviation_event.json
@@ -0,0 +1,29 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16010,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "navi_deviation_event": {
+ "event_type": 1,
+ "navigation_deviation_message": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "navigation_id": 123456,
+ "navi_recalc_request_seq": 1772000476240,
+ "point": {
+ "longitude": 0,
+ "latitude": 0,
+ "course": 0,
+ "pos_acc": 0,
+ "alt": 0
+ },
+ "timestamp": 1772000476240,
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_info_update_event.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_info_update_event.json
new file mode 100644
index 0000000..3663921
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_info_update_event.json
@@ -0,0 +1,44 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16012,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "navigation_info_update_event": {
+ "event_type": 1,
+ "navigation_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "order_phase": 1,
+ "navigation_id": 123456,
+ "navigation_status": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240,
+ "route_id": "route-001"
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_requset.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_requset.json
new file mode 100644
index 0000000..5edc7c8
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/navigation_requset.json
@@ -0,0 +1,32 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 14002,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "navigation_requset": {
+ "request_id": "req-001",
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "order_phase": 1,
+ "navigation_type": 2,
+ "current_pose": {
+ "timestamp": 1772000476240,
+ "navi_pose": {
+ "longitude": 113.3245,
+ "latitude": 23.1235,
+ "course": 90,
+ "pos_acc": 0.5,
+ "alt": 10
+ }
+ },
+ "target_point": {
+ "longitude": 113.3288,
+ "latitude": 23.1288
+ },
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/order_status_info_event.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/order_status_info_event.json
new file mode 100644
index 0000000..57c751a
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/order_status_info_event.json
@@ -0,0 +1,164 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16006,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "order_status_info_event": {
+ "event_type": 1,
+ "order_status_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 1,
+ "order_phase": 1,
+ "change_source": 1,
+ "operator_id": "user-001",
+ "rt_trip_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "trip_status": 2,
+ "order_phase": 1,
+ "trip_completion_status": 0,
+ "summary": {
+ "distance_km": 0,
+ "duration_sec": 0
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "current_task": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+ },
+ "timestamp": 1772000476240
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "trip_info_event": {
+ "event_type": 1,
+ "trip_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "trip_status": 2,
+ "order_phase": 1,
+ "trip_completion_status": 0,
+ "summary": {
+ "distance_km": 0,
+ "duration_sec": 0
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "current_task": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "task_running_state_event": {
+ "event_type": 1,
+ "task_running_state": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "timestamp": 1772000476240
+ },
+ "latest_arrival_info": {
+ "point_id": "point-id-001",
+ "point_type": 3,
+ "action_type": 2,
+ "arrival_status": 2,
+ "timestamp": 1772000476240
+ },
+ "timestamp": 1772000476240
+ },
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list.json
new file mode 100644
index 0000000..a02a0cb
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list.json
@@ -0,0 +1,57 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 10005,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "rt_task_list": {
+ "tasks": [
+ {
+ "task_id": "task-002",
+ "order_id": "order-002",
+ "order_phase": [1, 2],
+ "points": [
+ {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 0,
+ "point": {
+ "longitude": 113.3245,
+ "latitude": 23.1235
+ },
+ "sequence": 1
+ },
+ {
+ "waypoint_id": "wp-002",
+ "point_type": 3,
+ "action_type": 2,
+ "point": {
+ "longitude": 113.3288,
+ "latitude": 23.1288
+ },
+ "sequence": 2
+ }
+ ],
+ "task_type": 1,
+ "pre_actions": [
+ {
+ "order_id": "order-001",
+ "task_id": "task-001",
+ "action_type": 0
+ }
+ ],
+ "post_actions": [
+ {
+ "order_id": "",
+ "task_id": "",
+ "action_type": 0
+ }
+ ],
+ "sequence": 1
+ }
+ ]
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list_response.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list_response.json
new file mode 100644
index 0000000..651deba
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/rt_task_list_response.json
@@ -0,0 +1,19 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 10002,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "rt_task_list_response": {
+ "results": [
+ {
+ "order_id": "1881347710714060802",
+ "task_id": "task-002",
+ "status": 1
+ }
+ ]
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_state_snapshot_event.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_state_snapshot_event.json
new file mode 100644
index 0000000..1fc1940
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_state_snapshot_event.json
@@ -0,0 +1,215 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16014,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "system_state_snapshot_event": {
+ "event_type": 1,
+ "system_state_snapshot": {
+ "order_status_events": {
+ "event_type": 1,
+ "order_status_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 2,
+ "order_phase": 1,
+ "change_source": 1,
+ "operator_id": "user-001",
+ "rt_trip_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "trip_status": 2,
+ "order_phase": 1,
+ "trip_completion_status": 0,
+ "summary": {
+ "distance_km": 0,
+ "duration_sec": 0
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "current_task": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+ },
+ "timestamp": 1772000476240
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "trip_info_event": {
+ "event_type": 1,
+ "trip_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "trip_status": 2,
+ "order_phase": 1,
+ "trip_completion_status": 0,
+ "summary": {
+ "distance_km": 0,
+ "duration_sec": 0
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "current_task": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "task_running_state_event": {
+ "event_type": 1,
+ "task_running_state": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "timestamp": 1772000476240
+ },
+ "latest_arrival_info": {
+ "point_id": "point-id-001",
+ "point_type": 3,
+ "action_type": 2,
+ "arrival_status": 2,
+ "timestamp": 1772000476240
+ },
+ "timestamp": 1772000476240
+ },
+ "timestamp": 1772000476240
+ },
+ "navigation_event": {
+ "event_type": 1,
+ "navigation_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "order_phase": 1,
+ "navigation_id": 123456,
+ "navigation_status": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240,
+ "route_id": "route-001"
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "timestamp": 1772000476240
+ },
+ "realtime_pose": {
+ "timestamp": 1772000476240,
+ "navi_pose": {
+ "longitude": 113.3245,
+ "latitude": 23.1235,
+ "course": 90,
+ "pos_acc": 0.5,
+ "alt": 10
+ }
+ },
+ "timestamp": 1772000476240
+ },
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_status_update_event.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_status_update_event.json
new file mode 100644
index 0000000..1d1d748
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/system_status_update_event.json
@@ -0,0 +1,32 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16004,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "system_status_update_event": {
+ "event_type": 1,
+ "system_status": {
+ "phase": 3,
+ "abnormal_reason": 0,
+ "available_services": [
+ 1
+ ],
+ "is_emergency": false
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control.json
new file mode 100644
index 0000000..882fb40
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control.json
@@ -0,0 +1,16 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 10002,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "task_control": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "control_type": 1,
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control_state.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control_state.json
new file mode 100644
index 0000000..4cae59e
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/cloud/task_control_state.json
@@ -0,0 +1,16 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16005,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "task_control_state": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "control_type": 1,
+ "status": 2
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation.json
new file mode 100644
index 0000000..8cd4b22
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation.json
@@ -0,0 +1,38 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 10001,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "order_operation": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "operation_type": 1,
+ "order_type": 1,
+ "waypoints": [
+ {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 0,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 0
+ }
+ ],
+ "target_point": {
+ "waypoint_id": "wp-002",
+ "point_type": 3,
+ "action_type": 0,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 0
+ }
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation_state.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation_state.json
new file mode 100644
index 0000000..39810f3
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/order_operation_state.json
@@ -0,0 +1,15 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 16006,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "order_operation_state": {
+ "order_id": "1881347710714060802",
+ "operation_type": 1,
+ "status": 1
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/response.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/response.json
new file mode 100644
index 0000000..a21d5e5
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/response.json
@@ -0,0 +1,15 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 10005,
+ "sequence": 0,
+ "type": 0,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 0
+ },
+ "response": {
+ "request_seq": 0,
+ "code": 200,
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/restore_navigation_data.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/restore_navigation_data.json
new file mode 100644
index 0000000..bd89401
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/restore_navigation_data.json
@@ -0,0 +1,16 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 10006,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 1
+ },
+ "restore_navigation_data": {
+ "request_id": "req-001",
+ "route_id": "route-001",
+ "content": "navigation_data_content_string",
+ "timestamp": 1772000476240
+ }
+}
diff --git a/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/system_runtime_status.json b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/system_runtime_status.json
new file mode 100644
index 0000000..6be5b71
--- /dev/null
+++ b/xp-robotaxi-automatic-pilot-boot/src/test/resources/jsondemo/common/system_runtime_status.json
@@ -0,0 +1,154 @@
+{
+ "header": {
+ "timestamp": 1772000476240,
+ "cmd": 14001,
+ "sequence": 1,
+ "type": 2,
+ "msg_id": "MSG-UUID-1234-5678",
+ "source": 3
+ },
+ "system_runtime_status": {
+ "timestamp": 1772000476240,
+ "uid": 12345678,
+ "vehicle_status": {
+ "static_info": {
+ "xpu_id": "xpu-001",
+ "timestamp": 1772000476240
+ },
+ "dynamic_status": {
+ "gear_level": 1,
+ "steering_angle": 0.5,
+ "speed": 10.5,
+ "timestamp": 1772000476240,
+ "bms_soc_disp": 80,
+ "dst_bat_disp": 400.5
+ }
+ },
+ "system_status": {
+ "phase": 3,
+ "abnormal_reason": 0,
+ "available_services": [
+ 1
+ ],
+ "is_emergency": false
+ },
+ "driving_mode": 1,
+ "running_order_status_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 2,
+ "order_phase": 1,
+ "change_source": 1,
+ "operator_id": "user-001",
+ "rt_trip_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "trip_status": 2,
+ "order_phase": 1,
+ "trip_completion_status": 0,
+ "summary": {
+ "distance_km": 0,
+ "duration_sec": 0
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "current_task": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+ },
+ "timestamp": 1772000476240
+ },
+ "rt_trip_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "trip_status": 2,
+ "order_phase": 1,
+ "trip_completion_status": 0,
+ "summary": {
+ "distance_km": 0,
+ "duration_sec": 0
+ },
+ "point": {
+ "waypoint_id": "wp-001",
+ "point_type": 1,
+ "action_type": 1,
+ "point": {
+ "longitude": 0,
+ "latitude": 0
+ },
+ "sequence": 1
+ },
+ "current_task": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "status": 3,
+ "change_source": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240
+ }
+ },
+ "pose": {
+ "timestamp": 1772000476240,
+ "navi_pose": {
+ "longitude": 113.3245,
+ "latitude": 23.1235,
+ "course": 90,
+ "pos_acc": 0.5,
+ "alt": 10
+ }
+ },
+ "navigation_info": {
+ "order_id": "1881347710714060802",
+ "task_id": "task-001",
+ "order_phase": 1,
+ "navigation_id": 123456,
+ "navigation_status": 1,
+ "navi_progress_info": {
+ "navigation_id": 123456,
+ "route_remain_dist": 500.5,
+ "route_remain_time": 60,
+ "position": {
+ "longitude": 0,
+ "latitude": 0,
+ "heading": 0
+ },
+ "route_id": "route-001"
+ },
+ "timestamp": 1772000476240,
+ "route_id": "route-001"
+ }
+ }
+}
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
index ddc86fa..eeb3e56 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
+++ b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpPricingServiceImpl.java
@@ -9,13 +9,16 @@
import com.xiaopeng.api.dto.account.GetUserCouponDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
+import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
import com.xiaopeng.api.feignClient.account.XpAppUserClient;
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
+import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.model.account.XpAppUser;
import com.xiaopeng.api.model.operation.*;
import com.xiaopeng.api.model.order.XpOrder;
+import com.xiaopeng.api.model.order.XpOrderDetail;
import com.xiaopeng.api.vo.account.UserCouponVo;
import com.xiaopeng.api.vo.operation.FareVo;
import com.xiaopeng.api.vo.operation.RouteAndFareVo;
@@ -39,6 +42,7 @@
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
+import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
@@ -88,7 +92,6 @@
@Resource
private XpElectronicFenceAreaMapper xpElectronicFenceAreaMapper;
-
@Resource
private XpWhitelistMapper xpWhitelistMapper;
@@ -106,6 +109,9 @@
@Autowired
private XpPointService xpPointService;
+
+ @Resource
+ private XpPushMessageClient xpPushMessageClient;
// 自定义线程池用于并行执行任务
@@ -547,6 +553,8 @@
// 静默处理 不推单
if (isSilent) {
+ // todo 用于测试流程,正式联调需要删除此代码
+ testOrder(orderId);
return orderId;
}
@@ -606,7 +614,6 @@
xpGeoQueryEntity.setStatus(0);
geoQueryEntityService.save(xpGeoQueryEntity);
-
return orderId;
//
@@ -666,4 +673,219 @@
}
+ /**
+ * 测试阶段用于自动完成小程序的整个流程数据状态流转
+ * @param orderId
+ */
+ private void testOrder(Long orderId){
+ ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(10000));
+ poolExecutor.execute(()->{
+ XpOrder xpOrder = xpOrderClient.queryOrderById(orderId).getData();
+ Long appUserId = xpOrder.getAppUserId();
+ xpOrder.setStatus(2);
+ xpOrder.setVehicleId(1L);
+ xpOrder.setFleetId(2L);
+ xpOrderClient.updateOrder(xpOrder);
+ //等待5秒钟
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ //修改状态为接驾中
+ xpOrder.setStatus(3);
+ xpOrder.setAppUserId(null);
+ xpOrderClient.updateOrder(xpOrder);
+ //发送订单状态
+ SendMessageDTO dto = new SendMessageDTO();
+ dto.setAppUserId(appUserId.toString());
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":3}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+ //推送车辆位置
+ dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":113.385848,\\\"lat\\\":23.156841}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendVehicleLocation(dto);
+ //发送车辆到达起点的轨迹
+ RouteAndFareDto routeAndFareDto = new RouteAndFareDto();
+ LonLatDto destination = new LonLatDto();
+ destination.setLongitude(xpOrder.getStartLon());
+ destination.setLatitude(xpOrder.getStartLat());
+ routeAndFareDto.setDestination(destination);
+ LonLatDto origin = new LonLatDto();
+ origin.setLongitude(113.385848);
+ origin.setLatitude(23.156841);
+ routeAndFareDto.setOrigin(origin);
+ routeAndFareDto.setOpenCityId(2L);
+ RouteVo routeVo = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData();
+ com.alibaba.fastjson2.JSONObject jsonObject = new com.alibaba.fastjson2.JSONObject();
+ jsonObject.put("type", "ORDER_ROUTE");
+ jsonObject.put("timestamp", System.currentTimeMillis());
+ com.alibaba.fastjson2.JSONObject content = new com.alibaba.fastjson2.JSONObject();
+ content.put("orderId", orderId);
+ content.put("routeType", 1);
+ com.alibaba.fastjson2.JSONObject route = new com.alibaba.fastjson2.JSONObject();
+ route.put("distance", routeVo.getDistance());
+ route.put("duration", routeVo.getDuration());
+ route.put("routeID", routeVo.getRouteID());
+
+ List<com.alibaba.fastjson2.JSONObject> collect = routeVo.getPolyline().stream().map(item->{
+ com.alibaba.fastjson2.JSONObject point = new com.alibaba.fastjson2.JSONObject();
+ point.put("latitude", item.getLatitude());
+ point.put("longitude", item.getLongitude());
+ return point;
+ }).collect(Collectors.toList());
+
+ route.put("polyline", collect);
+ content.put("route", route.toJSONString());
+ jsonObject.put("content", content.toJSONString());
+ SendMessageDTO messageDTO = new SendMessageDTO();
+ messageDTO.setAppUserId(appUserId.toString());
+ messageDTO.setMessage(jsonObject.toJSONString());
+ xpPushMessageClient.sendRoute(messageDTO);
+
+ //等待10秒钟
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ //司机到达起点
+ xpOrder.setStatus(4);
+ xpOrderClient.updateOrder(xpOrder);
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":4}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+ //推送车辆位置到起点
+ dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getStartLon() + ",\\\"lat\\\":" + xpOrder.getStartLat() + "}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendVehicleLocation(dto);
+ //等待5秒钟
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+
+ //乘客上车
+ xpOrder.setStatus(5);
+ xpOrder.setBoardingTime(LocalDateTime.now());
+ xpOrder.setBoardingLat(xpOrder.getStartLat());
+ xpOrder.setBoardingLon(xpOrder.getStartLon());
+ xpOrder.setBoardingAddress(xpOrder.getStartAddress());
+ xpOrderClient.updateOrder(xpOrder);
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":5}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+ //等待5秒钟
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+
+ //开始服务中
+ xpOrder.setStatus(6);
+ xpOrder.setTripBegin(LocalDateTime.now());
+ xpOrderClient.updateOrder(xpOrder);
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":6}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+ //推送起点到终点的行驶轨迹
+ routeAndFareDto = new RouteAndFareDto();
+ routeAndFareDto.setDestination(new LonLatDto(xpOrder.getEndLon(), xpOrder.getEndLat()));
+ routeAndFareDto.setOrigin(new LonLatDto(xpOrder.getStartLon(), xpOrder.getStartLat()));
+ routeAndFareDto.setOpenCityId(2L);
+ routeVo = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData();
+ jsonObject = new com.alibaba.fastjson2.JSONObject();
+ jsonObject.put("type", "ORDER_ROUTE");
+ jsonObject.put("timestamp", System.currentTimeMillis());
+ content = new com.alibaba.fastjson2.JSONObject();
+ content.put("orderId", orderId);
+ content.put("routeType", 2);
+ route = new com.alibaba.fastjson2.JSONObject();
+ route.put("distance", routeVo.getDistance());
+ route.put("duration", routeVo.getDuration());
+ route.put("routeID", routeVo.getRouteID());
+ collect = routeVo.getPolyline().stream().map(item->{
+ com.alibaba.fastjson2.JSONObject point = new com.alibaba.fastjson2.JSONObject();
+ point.put("latitude", item.getLatitude());
+ point.put("longitude", item.getLongitude());
+ return point;
+ }).collect(Collectors.toList());
+ route.put("polyline", collect);
+ content.put("route", route.toJSONString());
+ jsonObject.put("content", content.toJSONString());
+ messageDTO = new SendMessageDTO();
+ messageDTO.setAppUserId(appUserId.toString());
+ messageDTO.setMessage(jsonObject.toJSONString());
+ xpPushMessageClient.sendRoute(messageDTO);
+
+ //等到10秒钟
+ try {
+ Thread.sleep(10000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ //乘客待下车
+ xpOrder.setStatus(7);
+ xpOrder.setTripEnd(LocalDateTime.now());
+ xpOrder.setGetoffLat(xpOrder.getEndLat());
+ xpOrder.setGetoffLon(xpOrder.getEndLon());
+ xpOrder.setGetoffAddress(xpOrder.getEndAddress());
+ xpOrder.setGetoffTime(LocalDateTime.now());
+ xpOrder.setOrderMoney(new BigDecimal(50));
+ xpOrder.setStartMileage(5D);
+ xpOrder.setStartMoney(new BigDecimal(10));
+ xpOrder.setMileageKilometers(10D);
+ xpOrder.setMileageMoney(new BigDecimal(25));
+ xpOrder.setDuration(20D);
+ xpOrder.setDurationMoney(new BigDecimal(5));
+ xpOrder.setWait(0D);
+ xpOrder.setWaitMoney(new BigDecimal(0));
+ xpOrder.setLongDistance(10D);
+ xpOrder.setLongDistanceType(1);
+ xpOrder.setLongDistancemoney(new BigDecimal(10));
+ xpOrderClient.updateOrder(xpOrder);
+ //添加费用明细
+// XpOrderDetail detail = new XpOrderDetail();
+// detail.setDetailType(1);
+// detail.setOrderId(orderId);
+// detail.setType(1);
+// detail.setTime("");
+// detail.setDuration(20D);
+// detail.setMileage(new BigDecimal(10));
+// detail.setMoney();
+// detail.setIsDeleted(false);
+// detail.setCreateTime(LocalDateTime.now());
+// detail.setUpdateTime(LocalDateTime.now());
+// xpOrder
+
+
+
+ //推送车辆位置到起点
+ dto.setMessage("{\"type\":\"VEHICLE_LOCATION\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"lon\\\":" + xpOrder.getEndLon() + ",\\\"lat\\\":" + xpOrder.getEndLat() + "}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendVehicleLocation(dto);
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":7}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+
+ //等到5秒钟
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ //乘客待支付
+ xpOrder.setStatus(8);
+ xpOrderClient.updateOrder(xpOrder);
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":8}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+
+ //等到5秒钟
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ //乘客支付成功
+ xpOrder.setStatus(9);
+ xpOrderClient.updateOrder(xpOrder);
+ dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":9}\",\"timestamp\":\"176569945845456\"}");
+ xpPushMessageClient.sendStatus(dto);
+ });
+ }
}
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java
index 15f97e3..1f100f5 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpSchedulingDetailController.java
@@ -45,9 +45,9 @@
- public R<PageInfo<SchedulingDetailDto>> pageList(@RequestBody SchedulingDetailVo query){
-
- }
+// public R<PageInfo<SchedulingDetailDto>> pageList(@RequestBody SchedulingDetailVo query){
+//
+// }
}
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 c4918e9..930e3f9 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,6 @@
package com.xiaopeng.maintenance.controller;
import cn.hutool.core.util.IdUtil;
-import com.sun.xml.internal.bind.v2.TODO;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
@@ -11,27 +10,24 @@
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
-import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.maintenance.dto.VehicleDispatchAcceptDTO;
import com.xiaopeng.maintenance.dto.VehicleDispatchDepartureDTO;
import com.xiaopeng.maintenance.model.query.OperationRecordsQuery;
-import com.xiaopeng.maintenance.service.IXpVehiclePreparationService;
import com.xiaopeng.maintenance.model.vo.OperationRecordsVO;
+import com.xiaopeng.maintenance.service.IXpVehiclePreparationService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-import java.util.List;
+import javax.annotation.Resource;
/**
* <p>
@@ -46,15 +42,15 @@
@Api(tags = "车辆运维")
public class XpVehicleOperationsController {
- @Autowired
+ @Resource
private IXpVehiclePreparationService xpVehiclePreparationService;
- @Autowired
+ @Resource
private XpVehicleClient xpVehicleClient;
- @Autowired
+ @Resource
private XpCruiseOrderClient xpCruiseOrderClient;
- @Autowired
+ @Resource
private MongoTemplate mongoTemplate;
- @Autowired
+ @Resource
private OrderMissionClient orderMissionClient;
/**
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderDetailServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderDetailServiceImpl.java
index 449500d..1723caa 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderDetailServiceImpl.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderDetailServiceImpl.java
@@ -1,11 +1,8 @@
package com.xiaopeng.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.xiaopeng.api.model.order.XpOrderCancel;
import com.xiaopeng.api.model.order.XpOrderDetail;
-import com.xiaopeng.order.mapper.XpOrderCancelMapper;
import com.xiaopeng.order.mapper.XpOrderDetailMapper;
-import com.xiaopeng.order.service.IXpOrderCancelService;
import com.xiaopeng.order.service.IXpOrderDetailService;
import org.springframework.stereotype.Service;
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpFleetVehicleService.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpFleetVehicleService.java
index 069ea0b..6ca3ccc 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpFleetVehicleService.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpFleetVehicleService.java
@@ -3,6 +3,8 @@
import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle;
import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.List;
+
/**
* <p>
* 车队车辆中间表 服务类
--
Gitblit v1.7.1