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<String> getXpuIdByVin(@RequestParam("vin") String vin){
|
String xpuId = xpuUtil.getXpuIdByVinForVehicleControl(vin);
|
return R.ok(xpuId);
|
}
|
|
/**
|
* 判断车辆是否能启动L4自动驾驶能力
|
*/
|
@PostMapping("/xpu/v1/autopilot/L4/checkAvailable")
|
public XpCommonResponse<L4CapabilityVO> 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<String> capabilities = new ArrayList<>();
|
capabilities.add("VPD");
|
|
L4CapabilityVO.Config config = new L4CapabilityVO.Config();
|
config.setOrderArrivalTriggerDistance(autopilotProperties.getOrderArrivalTriggerDistance());
|
|
try {
|
R<XpVehicle> 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<Void> initXpuStatus(@RequestBody @Valid XpuInitStatusRequest request) {
|
log.info("XPU init status report: {}", request);
|
|
// 校验车端地图版本是否最新,版本不一致或未下载均设置运营状态为4(异常),但始终返回成功
|
try {
|
R<String> 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<XpVehicle> 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);
|
}
|
}
|
}
|