From c96fbe6b0aeb413a17c429133ee6d81d138144b9 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期二, 09 六月 2026 10:58:52 +0800
Subject: [PATCH] Merge branch '1.0' of http://120.76.84.145:10101/gitblit/r/java/Robotaxi into 1.0

---
 xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java |  154 ++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 109 insertions(+), 45 deletions(-)

diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
index 4eb8d5a..e90488d 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
@@ -6,8 +6,12 @@
 import com.xiaopeng.api.dto.automaticPilot.MqttPublishDto;
 import com.xiaopeng.api.feignClient.automaticPilot.VmpOpenServiceClient;
 import com.xiaopeng.api.feignClient.automaticPilot.XPUClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
+import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.api.vo.automaticPilot.MqttPublishVo;
 import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
+import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.exception.ServiceException;
 import com.xiaopeng.common.core.utils.StringUtils;
 import com.xiaopeng.common.core.utils.uuid.UUID;
 import lombok.extern.slf4j.Slf4j;
@@ -34,6 +38,8 @@
 
     @Resource
     private VmpOpenServiceClient vmpOpenServiceClient;
+    @Resource
+    private XpVehicleClient xpVehicleClient;
 
     // 查询车管绑定类型,1:XPUID,2:待扩展
     public static final String XPU_ID_TYPE = "1";
@@ -50,13 +56,12 @@
      * @param taskList
      * @return
      */
-    //TODO 处理feign调用的异常
     public MqttPublishDto cloudCreateOrder(RtTaskList taskList, String vin, Long sequence) {
         MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
         MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
         headerBuilder.setMsgId(UUID.randomUUID().toString());
         headerBuilder.setTimestamp(System.currentTimeMillis());
-        headerBuilder.setCmd(RTCmdType.CLOUD_CREATE_ORDER.getValue());
+        headerBuilder.setCmd(RTCmdType.CLOUD_SEND_RT_TASK.getValue());
         headerBuilder.setSequence(sequence);
         headerBuilder.setType(MessageType.MESSAGE_TYPE_REQUEST);
         headerBuilder.setSource(SourceType.CLOUD);
@@ -72,17 +77,26 @@
             log.error("Protobuf转JSON失败", e);
             throw new RuntimeException("Protobuf转JSON失败", e);
         }
-        log.info("云端-->XPU 创建订单:{}", vo);
-        return xpuClient.publish(vo);
+        log.info("云端-->XPU 创建订单:{}", JSON.toJSONString(vo));
+        try {
+            MqttPublishDto dto = xpuClient.publish(vo);
+            log.info("XPU返回:{}", JSON.toJSONString(dto));
+            if (200 != dto.getCode()) {
+                dto = againPushMessage(vo);
+            }
+            return dto;
+        } catch (Exception e) {
+            throw new RuntimeException("云端-->XPU 创建订单失败:", e);
+        }
     }
 
 
     /**
      * 取消订单、修改途经点、终点
+     *
      * @param operation
      * @return
      */
-    //TODO 处理feign调用的异常
     public MqttPublishDto cloudOrderOperation(OrderOperation operation, String vin, Long sequence) {
         MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
         MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
@@ -105,10 +119,56 @@
             throw new RuntimeException("Protobuf转JSON失败", e);
         }
         log.info("云端-->XPU 修改订单:{}", vo);
-        return xpuClient.publish(vo);
+        try {
+            MqttPublishDto dto = xpuClient.publish(vo);
+            log.info("XPU返回:{}", JSON.toJSONString(dto));
+            if (200 != dto.getCode()) {
+                dto = againPushMessage(vo);
+            }
+            return dto;
+        } catch (Exception e) {
+            throw new RuntimeException("云端-->XPU 修改订单失败:", e);
+        }
     }
 
 
+    /**
+     * 下发导航地址到车端
+     *
+     * @param navigationData
+     * @return
+     */
+    public MqttPublishDto cloudPushNavigation(RestoreNavigationData navigationData, String xpuId, Long sequence) {
+        MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
+        MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
+        headerBuilder.setMsgId(UUID.randomUUID().toString());
+        headerBuilder.setTimestamp(System.currentTimeMillis());
+        headerBuilder.setCmd(RTCmdType.CLOUD_NAVIGATION_RESPONSE.getValue());
+        headerBuilder.setSequence(sequence);
+        headerBuilder.setType(MessageType.MESSAGE_TYPE_RESPONSE);
+        headerBuilder.setSource(SourceType.CLOUD);
+        msgContentBuilder.setHeader(headerBuilder.build());
+        msgContentBuilder.setRestoreNavigationData(navigationData);
+        MqttPublishVo vo = new MqttPublishVo();
+        vo.setTopic(buildTopicByXpuId(xpuId));
+        try {
+            vo.setPayload(jsonPrinter.print(msgContentBuilder.build()));
+        } catch (Exception e) {
+            log.error("Protobuf转JSON失败", e);
+            throw new RuntimeException("Protobuf转JSON失败", e);
+        }
+        log.info("云端-->XPU 下发导航信息:{}", vo);
+        try {
+            MqttPublishDto dto = xpuClient.publish(vo);
+            log.info("XPU返回:{}", JSON.toJSONString(dto));
+            if (200 != dto.getCode()) {
+                dto = againPushMessage(vo);
+            }
+            return dto;
+        } catch (Exception e) {
+            throw new RuntimeException("云端-->XPU 下发导航信息失败:", e);
+        }
+    }
 
 
     /**
@@ -117,12 +177,12 @@
      * @param responseMessage
      * @return
      */
-    public MqttPublishDto responseMessage(ResponseMessage responseMessage, String vin) {
+    public MqttPublishDto responseMessage(RTCmdType cmd, ResponseMessage responseMessage, String vin) {
         MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
         MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
         headerBuilder.setMsgId(UUID.randomUUID().toString());
         headerBuilder.setTimestamp(System.currentTimeMillis());
-        headerBuilder.setCmd(RTCmdType.CLOUD_TASK_CONTROL.getValue());
+        headerBuilder.setCmd(cmd.getValue());
         Snowflake snowflake = IdUtil.getSnowflake(0, 0);
         headerBuilder.setSequence(snowflake.nextId());
         headerBuilder.setType(MessageType.MESSAGE_TYPE_RESPONSE);
@@ -141,51 +201,32 @@
         return xpuClient.publish(vo);
     }
 
-    /**
-     * 下发导航地址到车端
-     *
-     * @param navigationData
-     * @return
-     */
-    //TODO 处理feign调用的异常
-    public MqttPublishDto cloudPushNavigation(RestoreNavigationData navigationData, String xpuId, Long sequence) {
-        MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
-        MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
-        headerBuilder.setMsgId(UUID.randomUUID().toString());
-        headerBuilder.setTimestamp(System.currentTimeMillis());
-        headerBuilder.setCmd(RTCmdType.CLOUD_NAVIGATION_RESPONSE.getValue());
-        headerBuilder.setSequence(sequence);
-        headerBuilder.setType(MessageType.MESSAGE_TYPE_RESPONSE);
-        headerBuilder.setSource(SourceType.CLOUD);
-        msgContentBuilder.setHeader(headerBuilder.build());
-
-        msgContentBuilder.setRestoreNavigationData(navigationData);
-        MqttPublishVo vo = new MqttPublishVo();
-        vo.setTopic(buildTopicByXpuId(xpuId));
-        try {
-            vo.setPayload(jsonPrinter.print(msgContentBuilder.build()));
-        } catch (Exception e) {
-            log.error("Protobuf转JSON失败", e);
-            throw new RuntimeException("Protobuf转JSON失败", e);
-        }
-
-
-        log.info("云端-->XPU 下发导航信息:{}", vo);
-        return xpuClient.publish(vo);
-    }
-
 
     /**
      * @description: 根据vin查询xpuId
      * @param: vin
      * @return: xpuId
      */
-    public String getXpuIdByVin(String vin)  {
+    public String getXpuIdByVin(String vin) {
+        R<XpVehicle> xpVehicleR = xpVehicleClient.findByVehicleVin(vin);
+        if (xpVehicleR.getCode() != 200 || xpVehicleR.getData() == null) {
+            log.error("根据vin查询车辆信息失败,vin={},msg={}", vin, xpVehicleR.getMsg());
+            return "";
+        }
+        return xpVehicleR.getData().getXpuId();
+    }
+
+    /**
+     * @description: 根据vin查询xpuId
+     * @param: vin
+     * @return: xpuId
+     */
+    public String getXpuIdByVinForVehicleControl(String vin) {
         Map<String, String> xpuIdMapping = vmpOpenServiceClient.getVehicleBindInfoByVin(vin, TYPE_LIST);
-        log.info("getMqttPublishTopic vin,{},xpuIdMapping,{}", vin,  JSON.toJSONString(xpuIdMapping));
-        if (xpuIdMapping == null || StringUtils.isEmpty(xpuIdMapping.get(XPU_ID_TYPE)) ) {
+        log.info("getMqttPublishTopic vin,{},xpuIdMapping,{}", vin, JSON.toJSONString(xpuIdMapping));
+        if (xpuIdMapping == null || StringUtils.isEmpty(xpuIdMapping.get(XPU_ID_TYPE))) {
             log.error("根据vin查询车辆xpuid信息为空,vin={}", vin);
-            throw new RuntimeException("根据vin查询车辆xpuid信息为空");
+            throw new ServiceException("根据vin查询车辆xpuid信息为空");
         }
         return xpuIdMapping.get(XPU_ID_TYPE);
     }
@@ -209,4 +250,27 @@
         return prefix + xpuId;
     }
 
+
+    /**
+     * 消息下发XPU重试机制
+     *
+     * @param message
+     * @return
+     */
+    public MqttPublishDto againPushMessage(MqttPublishVo message) {
+        log.info("云端-->XPU 消息重试:{}", message);
+        MqttPublishDto dto = null;
+        for (int i = 0; i < 3; i++) {
+            try {
+                dto = xpuClient.publish(message);
+                log.info("云端-->XPU 消息重试{}次:{}", (i + 1), message);
+                if (dto.getCode() == 200) {
+                    break;
+                }
+            } catch (Exception e) {
+                log.error("云端-->XPU 推送失败:{}", message);
+            }
+        }
+        return dto;
+    }
 }

--
Gitblit v1.7.1