package com.xiaopeng.maintenance.service; import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; import com.xiaopeng.maintenance.utils.GDMapGeocodingUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service public class VehicleLocationFillService { private static final String DEFAULT_VEHICLE_LOCATION = "四川省成都市双流区西航港街道机场路近都段辅路空港16区"; private static final BigDecimal DEFAULT_VEHICLE_LON = new BigDecimal("104.001118"); private static final BigDecimal DEFAULT_VEHICLE_LAT = new BigDecimal("30.575685"); @Autowired private MongoTemplate mongoTemplate; @Autowired private GDMapGeocodingUtil gdMapGeocodingUtil; public Map loadPositionByVin(Collection vins) { if (CollectionUtils.isEmpty(vins)) { return Collections.emptyMap(); } List distinctVins = vins.stream() .filter(StringUtils::hasLength) .distinct() .collect(java.util.stream.Collectors.toList()); if (CollectionUtils.isEmpty(distinctVins)) { return Collections.emptyMap(); } try { Query query = new Query(Criteria.where("vin").in(distinctVins)); List positions = mongoTemplate.find(query, VehiclePosition.class); if (CollectionUtils.isEmpty(positions)) { return Collections.emptyMap(); } Map map = new HashMap<>(); for (VehiclePosition position : positions) { if (position == null || !StringUtils.hasLength(position.getVin())) { continue; } map.putIfAbsent(position.getVin(), position); } return map; } catch (Exception e) { log.error("查询车辆实时定位失败 vins={}", vins, e); return Collections.emptyMap(); } } public void fillFromVin(com.xiaopeng.api.model.maintenance.XpTask task, String vin, Map positionByVin) { if (task == null) { return; } if (!StringUtils.hasLength(vin)) { applyDefault(task); return; } VehiclePosition vehiclePosition = positionByVin == null ? null : positionByVin.get(vin); fillFromPosition(task, vin, vehiclePosition); } public void fillFromPosition(com.xiaopeng.api.model.maintenance.XpTask task, String vin, VehiclePosition vehiclePosition) { if (task == null) { return; } if (vehiclePosition == null || vehiclePosition.getPoint() == null) { applyDefault(task); return; } double lon = vehiclePosition.getPoint().getX(); double lat = vehiclePosition.getPoint().getY(); task.setVehicleLon(BigDecimal.valueOf(lon)); task.setVehicleLat(BigDecimal.valueOf(lat)); try { Map geocode = gdMapGeocodingUtil.geocode(String.valueOf(lon), String.valueOf(lat)); String address = geocode == null ? null : geocode.get("address"); if (StringUtils.hasLength(address)) { task.setVehicleLocation(address); return; } log.warn("解析车辆地址为空 vin={}, lon={}, lat={}", vin, lon, lat); task.setVehicleLocation(DEFAULT_VEHICLE_LOCATION); } catch (Exception e) { log.error("解析车辆地址失败 vin={}, lon={}, lat={}", vin, lon, lat, e); task.setVehicleLocation(DEFAULT_VEHICLE_LOCATION); } } private void applyDefault(com.xiaopeng.api.model.maintenance.XpTask task) { task.setVehicleLocation(DEFAULT_VEHICLE_LOCATION); task.setVehicleLon(DEFAULT_VEHICLE_LON); task.setVehicleLat(DEFAULT_VEHICLE_LAT); } }