package com.xiaopeng.vehicleConvoy.controller; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSON; import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; 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; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 控车回调接口 */ @Slf4j @RestController @RequestMapping("/logan/api/v1") public class CarControlCallbackController { @Resource private AsyncVehicleStateService asyncVehicleStateService; private RedisService redisService; /** * 车控指令执行的回调接口 * * @param request 车控指令请求 * @return 车控指令响应 */ @PostMapping("/vehicles/command/callback") public R callback(@RequestBody CarControlCallbackDTO request) { if (request == null) { throw new ServiceException("请求参数缺失"); } log.info("接收到回调:{}", JSONUtil.toJsonStr(request)); try { // 处理车辆状态回调, 19指令处理回调,其他暂不处理 if (request.getMsgRef() != null && request.getMsgContent() != null && request.getServiceType() != null && request.getServiceType() == 19) { // 尝试解析车辆状态数据 VehicleTemperatureDto stateData = parseVehicleStateFromCallback(request); if (stateData != null) { // 通知异步服务处理回调 asyncVehicleStateService.handleStateCallback(request.getMsgRef(), stateData); } // 尝试解析车辆空调数据 parseAirConditioningSwitchFromCallback(request); } } catch (Exception e) { log.error("处理车辆状态回调异常: msgId={}", request.getMsgRef(), e); } return R.ok(JSONUtil.toJsonStr(request)); } /** * 从回调消息中解析车辆状态数据 */ private VehicleTemperatureDto parseVehicleStateFromCallback(CarControlCallbackDTO callback) { try { if (callback.getMsgContent() == null) { return null; } log.debug("解析车辆状态数据: msgId={}, content={}", callback.getMsgRef(), JSON.toJSONString(callback.getMsgContent())); // 解析msgContent为Map结构 Map msgContent = (Map) callback.getMsgContent(); // 检查返回码 Integer code = (Integer) msgContent.get("code"); if (code == null || code != 200) { log.warn("车辆状态回调返回错误码: msgId={}, code={}", callback.getMsgRef(), code); return null; } // 获取instant数据 Map instant = (Map) msgContent.get("instant"); if (instant == null) { log.warn("回调数据中缺少instant字段: msgId={}", callback.getMsgRef()); return null; } // 创建VehicleTemperatureDto对象 VehicleTemperatureDto stateData = new VehicleTemperatureDto(); Map stateMap = new HashMap<>(); // 解析door信息 Map door = (Map) 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) { VehicleStateVo trunkState = new VehicleStateVo(); trunkState.setValue(trunkAjarStNewObj.toString()); stateMap.put("trunkAjarCloseSt", trunkState); // 保持原有的key名称兼容 // 同时添加新的key名称 stateMap.put("trunk_ajar_st_new", trunkState); log.info("解析到后备箱状态: msgId={}, trunk_ajar_st_new={}", callback.getMsgRef(), trunkAjarStNewObj); } } stateData.setStateMap(stateMap); return stateData; } catch (Exception e) { log.warn("解析车辆状态数据失败: msgId={}", callback.getMsgRef(), e); 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 msgContent = (Map) callback.getMsgContent(); // 检查返回码 Integer code = (Integer) msgContent.get("code"); if (code == null || code != 200) { log.warn("空调状态回调返回错误码: msgId={}, code={}", callback.getMsgRef(), code); return null; } // 获取instant数据 Map instant = (Map) msgContent.get("instant"); if (instant == null) { log.warn("回调数据中缺少instant字段: msgId={}", callback.getMsgRef()); return null; } // 创建VehicleTemperatureDto对象 VehicleTemperatureDto stateData = new VehicleTemperatureDto(); Map stateMap = new HashMap<>(); // 解析hvac信息 Map hvac = (Map) 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; } } }