puzhibing
2026-04-21 28ac22a4dd20a5abfa5fae11ce081d8120f1f476
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/CarControlCallbackController.java
@@ -6,6 +6,7 @@
import com.xiaopeng.api.vo.vehicleConvoy.VehicleStateVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.redis.service.RedisService;
import com.xiaopeng.vehicleConvoy.model.dto.CarControlCallbackDTO;
import com.xiaopeng.vehicleConvoy.service.AsyncVehicleStateService;
import lombok.extern.slf4j.Slf4j;
@@ -17,6 +18,7 @@
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
 * 控车回调接口
@@ -28,6 +30,7 @@
    @Resource
    private AsyncVehicleStateService asyncVehicleStateService;
    private RedisService redisService;
    /**
     * 车控指令执行的回调接口
@@ -51,6 +54,8 @@
                    // 通知异步服务处理回调
                    asyncVehicleStateService.handleStateCallback(request.getMsgRef(), stateData);
                }
                // 尝试解析车辆空调数据
                parseAirConditioningSwitchFromCallback(request);
            }
        } catch (Exception e) {
            log.error("处理车辆状态回调异常: msgId={}", request.getMsgRef(), e);
@@ -94,6 +99,8 @@
            // 解析door信息
            Map<String, Object> door = (Map<String, Object>) instant.get("door");
            if (door != null) {
                //存入缓存用于后续使用
                redisService.setCacheObject("DOOR:" + callback.getMsgId(), JSON.toJSONString(door), 30L, TimeUnit.SECONDS);
                // 获取trunk_ajar_st_new值
                Object trunkAjarStNewObj = door.get("trunk_ajar_st_new");
                if (trunkAjarStNewObj != null) {
@@ -115,4 +122,52 @@
            return null;
        }
    }
    /**
     * 从回调消息中解析车辆空调状态数据
     */
    private VehicleTemperatureDto parseAirConditioningSwitchFromCallback(CarControlCallbackDTO callback) {
        try {
            if (callback.getMsgContent() == null) {
                return null;
            }
            log.debug("解析空调状态数据: msgId={}, content={}", callback.getMsgRef(), JSON.toJSONString(callback.getMsgContent()));
            // 解析msgContent为Map结构
            Map<String, Object> msgContent = (Map<String, Object>) callback.getMsgContent();
            // 检查返回码
            Integer code = (Integer) msgContent.get("code");
            if (code == null || code != 200) {
                log.warn("空调状态回调返回错误码: msgId={}, code={}", callback.getMsgRef(), code);
                return null;
            }
            // 获取instant数据
            Map<String, Object> instant = (Map<String, Object>) msgContent.get("instant");
            if (instant == null) {
                log.warn("回调数据中缺少instant字段: msgId={}", callback.getMsgRef());
                return null;
            }
            // 创建VehicleTemperatureDto对象
            VehicleTemperatureDto stateData = new VehicleTemperatureDto();
            Map<String, VehicleStateVo> stateMap = new HashMap<>();
            // 解析hvac信息
            Map<String, Object> hvac = (Map<String, Object>) instant.get("hvac");
            if (hvac != null) {
                log.info("解析到空调: msgId={}, hvac_on={}", callback.getMsgRef(), JSON.toJSONString(hvac));
                //存入缓存用于后续使用
                redisService.setCacheObject("HVAC:" + callback.getMsgId(), JSON.toJSONString(hvac), 30L, TimeUnit.SECONDS);
            }
            stateData.setStateMap(stateMap);
            return stateData;
        } catch (Exception e) {
            log.warn("解析空调状态数据失败: msgId={}", callback.getMsgRef(), e);
            return null;
        }
    }
}