liujie
2026-06-09 c96fbe6b0aeb413a17c429133ee6d81d138144b9
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/util/XPUUtil.java
@@ -6,8 +6,11 @@
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;
@@ -35,6 +38,8 @@
    @Resource
    private VmpOpenServiceClient vmpOpenServiceClient;
    @Resource
    private XpVehicleClient xpVehicleClient;
    // 查询车管绑定类型,1:XPUID,2:待扩展
    public static final String XPU_ID_TYPE = "1";
@@ -76,11 +81,11 @@
        try {
            MqttPublishDto dto = xpuClient.publish(vo);
            log.info("XPU返回:{}", JSON.toJSONString(dto));
            if(200 != dto.getCode()){
            if (200 != dto.getCode()) {
                dto = againPushMessage(vo);
            }
            return dto;
        }catch (Exception e){
        } catch (Exception e) {
            throw new RuntimeException("云端-->XPU 创建订单失败:", e);
        }
    }
@@ -88,6 +93,7 @@
    /**
     * 取消订单、修改途经点、终点
     *
     * @param operation
     * @return
     */
@@ -116,16 +122,14 @@
        try {
            MqttPublishDto dto = xpuClient.publish(vo);
            log.info("XPU返回:{}", JSON.toJSONString(dto));
            if(200 != dto.getCode()){
            if (200 != dto.getCode()) {
                dto = againPushMessage(vo);
            }
            return dto;
        }catch (Exception e){
        } catch (Exception e) {
            throw new RuntimeException("云端-->XPU 修改订单失败:", e);
        }
    }
    /**
@@ -157,15 +161,14 @@
        try {
            MqttPublishDto dto = xpuClient.publish(vo);
            log.info("XPU返回:{}", JSON.toJSONString(dto));
            if(200 != dto.getCode()){
            if (200 != dto.getCode()) {
                dto = againPushMessage(vo);
            }
            return dto;
        }catch (Exception e){
        } catch (Exception e) {
            throw new RuntimeException("云端-->XPU 下发导航信息失败:", e);
        }
    }
    /**
@@ -174,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);
@@ -199,17 +202,29 @@
    }
    /**
     * @description: 根据vin查询xpuId
     * @param: vin
     * @return: xpuId
     */
    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 getXpuIdByVin(String vin)  {
    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 ServiceException("根据vin查询车辆xpuid信息为空");
        }
@@ -238,6 +253,7 @@
    /**
     * 消息下发XPU重试机制
     *
     * @param message
     * @return
     */
@@ -247,11 +263,11 @@
        for (int i = 0; i < 3; i++) {
            try {
                dto = xpuClient.publish(message);
                log.info("云端-->XPU 消息重试{}次:{}", (i+1), message);
                log.info("云端-->XPU 消息重试{}次:{}", (i + 1), message);
                if (dto.getCode() == 200) {
                    break;
                }
            }catch (Exception e){
            } catch (Exception e) {
                log.error("云端-->XPU 推送失败:{}", message);
            }
        }