package com.xiaopeng.automaticPilot.controller; import com.xiaopeng.api.feignClient.map.AdcFencePushClient; import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; import com.xiaopeng.automaticPilot.dto.CheckL4AvailableRequest; import com.xiaopeng.automaticPilot.dto.L4CapabilityVO; import com.xiaopeng.automaticPilot.dto.XpCommonResponse; import com.xiaopeng.automaticPilot.dto.XpuInitStatusRequest; import com.xiaopeng.automaticPilot.config.AutopilotProperties; import com.xiaopeng.automaticPilot.util.XPUUtil; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; import java.util.Objects; @Slf4j @RestController @RequestMapping("") public class XpuVinController { @Resource private XPUUtil xpuUtil; @Resource private XpVehicleClient xpVehicleClient; @Resource private AutopilotProperties autopilotProperties; @Autowired private AdcFencePushClient adcFencePushClient; /** * 根据车辆VIN查询XPUID * @param vin * @return */ @GetMapping("/logan/xpu/getXpuIdByVin") public R getXpuIdByVin(@RequestParam("vin") String vin){ String xpuId = xpuUtil.getXpuIdByVinForVehicleControl(vin); return R.ok(xpuId); } /** * 判断车辆是否能启动L4自动驾驶能力 */ @PostMapping("/xpu/v1/autopilot/L4/checkAvailable") public XpCommonResponse checkL4Available(@RequestBody @Valid CheckL4AvailableRequest request) { log.info("Check L4 available request: {}", request); L4CapabilityVO vo = new L4CapabilityVO(); vo.setVin(request.getVin()); vo.setUid(request.getUserId()); List capabilities = new ArrayList<>(); capabilities.add("VPD"); L4CapabilityVO.Config config = new L4CapabilityVO.Config(); config.setOrderArrivalTriggerDistance(autopilotProperties.getOrderArrivalTriggerDistance()); try { R vehicleR = xpVehicleClient.findByVehicleVin(request.getVin()); if (vehicleR != null && vehicleR.getCode() == 200 && vehicleR.getData() != null) { XpVehicle vehicle = vehicleR.getData(); if (Objects.equals(vehicle.getVehicleType(), 2)) { capabilities.add("RT"); } if (Objects.equals(vehicle.getAcceptOrTest(), 2)) { config.setTestMode(1); L4CapabilityVO.TestModeFeatures features = new L4CapabilityVO.TestModeFeatures(); features.setAutoChainNextOrderAtDest(autopilotProperties.getAutoChainNextOrderAtDest()); features.setAutoConfirmDropoff(autopilotProperties.getTestModeAutoConfirmDropoff()); config.setTestModeFeatures(features); } // 测试车辆处理 if (Objects.equals(vehicle.getVehicleAttribute(), 1)) { config.setTestMode(1); L4CapabilityVO.TestModeFeatures features = new L4CapabilityVO.TestModeFeatures(); features.setAutoChainNextOrderAtDest(autopilotProperties.getAutoChainNextOrderAtDest()); features.setAutoConfirmDropoff(autopilotProperties.getTestModeAutoConfirmDropoff()); config.setTestModeFeatures(features); } } else { log.warn("Vehicle not found for vin: {}", request.getVin()); } } catch (Exception e) { log.error("Error querying vehicle info", e); } vo.setL4Capability(capabilities); vo.setConfig(config); return XpCommonResponse.ok(vo); } /** * XPU初始化状态上报 */ @PostMapping("/xpu/v1/autopilot/L4/init") public XpCommonResponse initXpuStatus(@RequestBody @Valid XpuInitStatusRequest request) { log.info("XPU init status report: {}", request); // 校验车端地图版本是否最新,版本不一致或未下载均设置运营状态为4(异常),但始终返回成功 try { R versionR = adcFencePushClient.getMapVersion(request.getVin()); if (versionR != null && versionR.getCode() == 200 && versionR.getData() != null) { String serverVersion = versionR.getData(); String clientVersion = request.getRobotaxiAreaInfo().getMapVersion(); if (!serverVersion.equals(clientVersion)) { log.warn("车端地图版本不一致, vin={}, clientVersion={}, serverVersion={}", request.getVin(), clientVersion, serverVersion); setVehicleAbnormal(request.getVin()); return XpCommonResponse.ok(null); } } } catch (Exception e) { log.error("查询地图版本失败, vin={}", request.getVin(), e); } if (Boolean.FALSE.equals(request.getRobotaxiAreaInfo().getDownloaded())) { setVehicleAbnormal(request.getVin()); } return XpCommonResponse.ok(null); } private void setVehicleAbnormal(String vin) { try { R vehicleR = xpVehicleClient.findByVehicleVin(vin); if (vehicleR != null && vehicleR.getCode() == 200 && vehicleR.getData() != null) { XpVehicle vehicle = vehicleR.getData(); vehicle.setOperatingStatus(4); xpVehicleClient.updateVehicleById(vehicle); log.info("Vehicle operatingStatus set to 4 (abnormal), vin: {}", vin); } else { log.warn("Vehicle not found when updating operatingStatus, vin: {}", vin); } } catch (Exception e) { log.error("Failed to update vehicle operatingStatus, vin: {}", vin, e); } } }