luodangjia
2024-07-17 736ab0090700c75af37b8a3456b01609e4e2d329
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
New file
@@ -0,0 +1,894 @@
package com.stylefeng.guns.modular.system.util.GoogleMap;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.fleetengine.auth.AuthTokenMinter;
import com.google.fleetengine.auth.token.FleetEngineToken;
import com.google.fleetengine.auth.token.TripClaims;
import com.google.fleetengine.auth.token.VehicleClaims;
import com.google.fleetengine.auth.token.factory.signer.*;
import com.stylefeng.guns.modular.system.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
 * Fleet Engine API 工具类
 * @author zhibing.pu
 * @Date 2024/5/17 9:59
 */
@Slf4j
@Component
public class FleetEngineUtil {
   static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class);
   private final String SERVICE_ACCOUNT = "odrd2024@i-go-odrd-testing.iam.gserviceaccount.com";
   private final String privateKeyId = "0a9a480fafb6469c0c1b2fa6dbdf6d4bebe1ebed";
   private final String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDXZoPEFZeZb0C7DXzpPsloB+rQVQAJuR+z4T9uRCz33gBsIqrz1s5Iwd8vXYKKWzukMdXkwqR4WapI/4GtcpbJkRK93mKXvEE3sDz27BnRrZL4gHeECVpFy0egw29sqFM/x/cpst0goqq4/f3ZFGtQGIhSEEHMySQgTbZDIhXMIls1etRsM4K2bTXeMPn89ablPBdbKtTAJy1EI+ZLKbxnl9StyqBam+d+UsfVmNG19MsNbSzCKc+QPnPXb7dj9KxJ/2whog8w15qXQdJHAMeHZyNlqE0zVP7G1VdWo6Q4QtzmENANxBpJIEbAqY2sq3BZSqDd5XS9Dr9BR4XzQqQnAgMBAAECggEABFABAj4eph1vxVYRBH2TpvDGFU3uW7VBPjwp7JzntLAN8eNoPlqmEDP16y6D/HMmfftpAI3TvWA3+ZEPkiX6nVDyW6sGCodyP0QuJEob1HKHFYntzGtHhGg1KCOacLey6TYbJJmUtcsduQXGkocOPaLXNvjzr2mY2zthTDzJ6HzjDo3d2x/O+lUVlNjubTFydgU9bQP8zS389GgZkO/YebK9+qPRBXv1R2fmj0rhpLqC03jL/mUMKi5tW628OiJGdvzLXlAGyJ9CtVDjfrwUgLf8ML+3yfdmv7yFeWuJ2NEgQxKACixHM05qkCW2bOkPIi9+wb1BbVvMdYL+GCPvmQKBgQD/DZ8zpWfNAkl8h8NI0E7sPdN6wgGfPpaC8VpOE3EM2eEijkZZT6XjfxXjMv1vXg1UoeYVscPb99Ux6u2gq+ZJj6+IstNIObXgvrqNxKPw6OO2xCb6UmA4rQ74xe4d1KLN+C1zepgFYgU4ejungWzuPVL7x8xjdyBAvqgPqP1IbQKBgQDYMzXs2QcWr9tVwq1O3D/H6qX2DvelAj7j0vuXGtop1/aJW7bPlGJd9NGim8dnXLVSFyRteuVl4epa/C9h50g3FM/lFMl9lmp1HwpDeiSJYAGRH8cnPJjN/IV3cRl5qN8KUQE2a3BRP+6IPHJiF1Bc1vj08nTMsWmN+K6VcAzqYwKBgGGJ7RNMM0kkkcPtC5LCDxyrfD/bB9HFlrvW3ykyqC44+K9FZ8PqAM/inxU3P9KiTkjKbXpodDWgLskbResHMld5erC1arWZVGPxrNhgli2gcs1HcHyUmjWygSJEV47S7bwFKCScgpy0Yri5jiy+A1GM5Dpjq1dyjEQWZaEviEV1AoGBALoKn023l/T60QgkZNQmjS/wCG4LhSjWHN4ZMOxfa/pz369lX5OSwW7OfBKscFPOoC0Kwwr+pSYd2HgA6Jkb17WmUBt13skWRXeRhVh5Y7VfCxohuVNXPrqKoSMeDOj22y9ac2ur2lPgateLBHbKTxoE1uiZNs7pn8ZOh5UKfeK3AoGBAKjklIbZ05nvM/mzdPk9JfCFJ6SaQqeaQcU9AoLEQdOzIrrI660Ignn4hOzLSYac0GxytYTQzDt5xDHKBYqJfem7IqxkIj9hSnIZFnUxp6+VfBhXdWHGn+GDTQa1iDvfpy/h6Gr4NL+p/EoA17qtUqOlYxJ1Dkbaw3SqUtkbuv2G";
   private final String provider = "i-go-odrd-testing";
   @Autowired
   private RedisUtil redisUtil;
   /**
    * 获取jwt token
    * @param type 0=服务端,1=乘客,2=司机
    * @return
    */
   public Map<String, Object> fleetEngineAuth(int type, Integer id){
      try {
         //谷歌云服务器使用这部分代码
//         AuthTokenMinter minter = AuthTokenMinter.builder()
//               //服务端签名
//               .setServerSigner(DefaultServiceAccountSigner.create())
//               //司机端签名
//               .setDriverSigner(ImpersonatedSigner.create(SERVICE_ACCOUNT))
//               //乘客端签名
//               .setConsumerSigner(ImpersonatedSigner.create(SERVICE_ACCOUNT))
//               .build();
         AuthTokenMinter minter = AuthTokenMinter.builder()
               //服务端签名
               .setServerSigner(LocalSigner.create(SERVICE_ACCOUNT, privateKeyId, privateKey))
               //司机端签名
               .setDriverSigner(LocalSigner.create(SERVICE_ACCOUNT, privateKeyId, privateKey))
               //乘客端签名
               .setConsumerSigner(LocalSigner.create(SERVICE_ACCOUNT, privateKeyId, privateKey))
               .build();
         String jwt = "";
         Long expirationTimestamp = 0L;
         if(0 == type){
            FleetEngineToken serverToken = minter.getServerToken();
            jwt = serverToken.jwt();
            expirationTimestamp = serverToken.expirationTimestamp().getTime();
         }
         if(1 == type){
            FleetEngineToken consumerToken = minter.getConsumerToken(TripClaims.create("I-GO-USER" + id));
            jwt = consumerToken.jwt();
            expirationTimestamp = consumerToken.expirationTimestamp().getTime();
         }
         if(2 == type){
            FleetEngineToken driverToken = minter.getDriverToken(VehicleClaims.create("I-GO-CAR" + id));
            jwt = driverToken.jwt();
            expirationTimestamp = driverToken.expirationTimestamp().getTime();
         }
         Map<String, Object> map = new HashMap<>();
         map.put("token", jwt);
         map.put("expirationTimestamp", expirationTimestamp);
         return map;
      } catch (SigningTokenException e) {
         throw new RuntimeException(e);
      }
   }
   public String getToken(){
      String token_json = redisUtil.getValue("google_token");
      String google_token = "";
      if(!StringUtils.hasLength(token_json)){
         Map<String, Object> map = fleetEngineAuth(0, null);
         redisUtil.setStrValue("google_token", JSON.toJSONString(map));
         google_token = map.get("token").toString();
      }else{
         JSONObject jsonObject1 = JSON.parseObject(token_json);
         Long expirationTimestamp = jsonObject1.getLong("expirationTimestamp");
         google_token = jsonObject1.getString("token");
         if((expirationTimestamp - 10000L) <= System.currentTimeMillis()){
            Map<String, Object> map = fleetEngineAuth(0, null);
            redisUtil.setStrValue("google_token", JSON.toJSONString(map));
            google_token = map.get("token").toString();
         }
      }
      return google_token;
   }
   /**
    * 添加车辆
    * @param maximumCapacity 这辆车可以搭载的乘客总数
    * @param licensePlate 车牌号
    * @param id 车辆id
    */
   public String createVehicles(int maximumCapacity, String licensePlate, String id) throws Exception{
      String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles?vehicleId=" + id;
      HttpRequest post = HttpUtil.createPost(url);
      Map<String, String> headers = new HashMap<>();
      headers.put("Authorization", "Bearer " + getToken());
      headers.put("Content-Type", "application/json");
      post.addHeaders(headers);
      JSONObject body = new JSONObject();
      body.put("vehicleState", "OFFLINE");
      body.put("supportedTripTypes", Arrays.asList("SHARED", "EXCLUSIVE"));
      body.put("maximumCapacity", maximumCapacity);
      JSONObject category = new JSONObject();
      category.put("category", "TAXI");
      body.put("vehicleType", category);
      JSONObject licensePlate1 = new JSONObject();
      licensePlate1.put("countryCode", "GH");
      licensePlate1.put("lastCharacter", getLastNumber(licensePlate));
      body.put("licensePlate", licensePlate1);
      logger.info("创建车辆请求:{}", body.toJSONString());
      HttpRequest request = post.body(body.toJSONString());
      HttpResponse response = request.execute();
      logger.info("创建车辆结果:{}", response.body());
      JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
      JSONObject error = jsonObject.getJSONObject("error");
      if(null != error){
         Integer code = error.getInteger("code");
         if(code == 401){
            String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
            if(reason.equals("ACCESS_TOKEN_EXPIRED")){
               redisUtil.remove("google_token");
               return createVehicles(maximumCapacity, licensePlate, id);
            }
         }
         throw new Exception(response.body());
      }
      /**
       * 返回结果
       * {
       *    "name": "providers/i-go-odrd-testing/vehicles/I-GO-CAR1",
       *    "vehicleState": "OFFLINE",
       *    "supportedTripTypes": [
       *       "EXCLUSIVE",
       *       "SHARED"
       *    ],
       *    "maximumCapacity": 4,
       *    "vehicleType": {
       *       "category": "AUTO"
       *        },
       *    "licensePlate": {
       *       "countryCode": "GH",
       *       "lastCharacter": "3"
       *    },
       *    "currentRouteSegmentVersion": "2024-05-23T03:05:23.293329Z",
       *    "waypointsVersion": "2024-05-23T03:05:23.293329Z"
       * }
       */
      return response.body();
   }
   /**
    * 修改车辆信息
    * @param maximumCapacity
    * @param licensePlate
    * @param id
    * @return
    */
   public String updateVehicles(String vehicleState, Integer maximumCapacity, String licensePlate, String id) throws Exception{
      String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles/" + id + "?updateMask=";
      List<String> sb = new ArrayList<>();
      if(StringUtils.hasLength(vehicleState)){
         sb.add("vehicleState");
      }
      if(null != maximumCapacity){
         sb.add("maximumCapacity");
      }
      if(StringUtils.hasLength(licensePlate)){
         sb.add("licensePlate");
      }
      String collect = sb.stream().collect(Collectors.joining(","));
      url += collect;
      HttpRequest put = HttpUtil.createRequest(Method.PUT, url);
      Map<String, String> headers = new HashMap<>();
      headers.put("Authorization", "Bearer " + getToken());
      headers.put("Content-Type", "application/json");
      put.addHeaders(headers);
      JSONObject body = new JSONObject();
      /**
       * UNKNOWN_VEHICLE_STATE   默认,用于未指定或无法识别的车辆状态。
       * OFFLINE   车辆不接受新行程。注意:在完成分配给车辆的行程时,车辆仍可继续在此状态下运行。
       * ONLINE   车辆正在接受新行程。
       */
      if(StringUtils.hasLength(vehicleState)){
         body.put("vehicleState", vehicleState);
      }
      if(null != maximumCapacity){
         body.put("maximumCapacity", maximumCapacity);
      }
      if(StringUtils.hasLength(licensePlate)){
         JSONObject licensePlate1 = new JSONObject();
         licensePlate1.put("countryCode", "GH");
         licensePlate1.put("lastCharacter", getLastNumber(licensePlate));
         body.put("licensePlate", licensePlate1);
      }
      body.put("supportedTripTypes", Arrays.asList("SHARED", "EXCLUSIVE"));
      JSONObject category = new JSONObject();
      category.put("category", "TAXI");
      body.put("vehicleType", category);
      put.body(body.toJSONString());
      logger.info("修改车辆信息请求:{}", body.toJSONString());
      HttpResponse response = put.execute();
      logger.info("修改车辆信息结果:{}", response.body());
      JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
      JSONObject error = jsonObject.getJSONObject("error");
      if(null != error){
         Integer code = error.getInteger("code");
         if(code == 401){
            String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
            if(reason.equals("ACCESS_TOKEN_EXPIRED")){
               redisUtil.remove("google_token");
               return updateVehicles(vehicleState, maximumCapacity, licensePlate, id);
            }
         }
         throw new Exception(response.body());
      }
      /**
       * 返回结果
       * {
       *   "name": "providers/i-go-odrd-testing/vehicles/I-GO-CAR1",
       *   "vehicleState": "OFFLINE",
       *   "supportedTripTypes": [
       *     "EXCLUSIVE",
       *     "SHARED"
       *   ],
       *   "maximumCapacity": 4,
       *   "vehicleType": {
       *     "category": "TAXI"
       *   },
       *   "licensePlate": {
       *     "countryCode": "GH",
       *     "lastCharacter": "5"
       *   },
       *   "currentRouteSegmentVersion": "2024-05-23T06:08:14.968942Z",
       *   "waypointsVersion": "2024-05-23T03:05:23.293329Z"
       * }
       */
      return response.body();
   }
   /**
    * 获取车辆信息
    * @param id 车辆id
    * @return
    */
   public String getVehicles(String id) throws Exception{
      String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles/" + (null != id ? id : "");
      HttpRequest get = HttpUtil.createGet(url);
      Map<String, String> headers = new HashMap<>();
      headers.put("Authorization", "Bearer " + getToken());
      headers.put("Content-Type", "application/json");
      get.addHeaders(headers);
      HttpResponse response = get.execute();
      logger.info("查询车辆结果:{}", response.body());
      JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
      JSONObject error = jsonObject.getJSONObject("error");
      if(null != error){
         Integer code = error.getInteger("code");
         if(code == 404){
            return "";
         }
         if(code == 401){
            String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
            if(reason.equals("ACCESS_TOKEN_EXPIRED")){
               redisUtil.remove("google_token");
               return getVehicles(id);
            }
         }
         throw new Exception(response.body());
      }
      /**
       * 返回结果
       * {
       *    "vehicles": [
       *                {
       *          "name": "providers/i-go-odrd-testing/vehicles/I-GO-CAR1",
       *          "vehicleState": "OFFLINE",
       *          "supportedTripTypes": [
       *             "EXCLUSIVE",
       *             "SHARED"
       *          ],
       *          "maximumCapacity": 4,
       *          "vehicleType": {
       *             "category": "AUTO"
       *            },
       *          "licensePlate": {
       *             "countryCode": "GH",
       *             "lastCharacter": "3"
       *            },
       *          "currentRouteSegmentVersion": "2024-05-23T03:05:23.293329Z",
       *          "waypointsVersion": "2024-05-23T03:05:23.293329Z"
       *        }
       *    ],
       *    "totalSize": "1"
       * }
       *
       * {
       *    "name": "providers/i-go-odrd-testing/vehicles/I-GO-CAR1",
       *    "vehicleState": "OFFLINE",
       *    "supportedTripTypes": [
       *       "EXCLUSIVE",
       *       "SHARED"
       *    ],
       *    "maximumCapacity": 4,
       *    "vehicleType": {
       *       "category": "TAXI"
       *        },
       *    "licensePlate": {
       *       "countryCode": "GH",
       *       "lastCharacter": "5"
       *    },
       *    "currentRouteSegmentVersion": "2024-05-23T06:08:14.968942Z",
       *    "waypointsVersion": "2024-05-23T03:05:23.293329Z"
       * }
       */
      return response.body();
   }
   /**
    * 获取最后一个数字
    * @param str
    * @return
    */
   private String getLastNumber(String str){
      for (int i = str.length(); i > 0; i--) {
         char c = str.charAt(i - 1);
         if(String.valueOf(c).matches("\\d")){
            return str.substring(i - 1, i);
         }
      }
      return "-1";
   }
   /**
    * 创建新的行程
    * @param vehicleId 车辆id
    * @param numberOfPassengers 人数
    * @param tripId 订单id
    * @param start_lat 起点纬度
    * @param start_lng 起点经度
    * @param end_lat 终点纬度
    * @param end_lng 终点经度
    * @return
    */
   public String createTrip(String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) throws Exception{
      String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips?tripId=" + tripId;
      HttpRequest post = HttpUtil.createPost(url);
      Map<String, String> headers = new HashMap<>();
      headers.put("Authorization", "Bearer " + getToken());
      headers.put("Content-Type", "application/json");
      post.addHeaders(headers);
      JSONObject body = new JSONObject();
      if(StringUtils.hasLength(vehicleId)){
         body.put("vehicleId", vehicleId);
      }
      body.put("tripStatus", "NEW");
      body.put("tripType", "SHARED");
      body.put("numberOfPassengers", numberOfPassengers);
      JSONObject pickupPoint = new JSONObject();
      JSONObject point = new JSONObject();
      point.put("latitude", start_lat);
      point.put("longitude", start_lng);
      pickupPoint.put("point", point);
      body.put("pickupPoint", pickupPoint);
      JSONObject dropoffPoint = new JSONObject();
      JSONObject end_point = new JSONObject();
      end_point.put("latitude", end_lat);
      end_point.put("longitude", end_lng);
      dropoffPoint.put("point", end_point);
      body.put("dropoffPoint", dropoffPoint);
      logger.info("创建行程请求:{}", body.toJSONString());
      HttpRequest request = post.body(body.toJSONString());
      HttpResponse response = request.execute();
      logger.info("创建行程结果:{}", response.body());
      JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
      JSONObject error = jsonObject.getJSONObject("error");
      if(null != error){
         Integer code = error.getInteger("code");
         if(code == 401){
            String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
            if(reason.equals("ACCESS_TOKEN_EXPIRED")){
               redisUtil.remove("google_token");
               return createTrip(vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng);
            }
         }
         throw new Exception(response.body());
      }
      /**
       * 返回结果
       * {
       *    "name": "providers/i-go-odrd-testing/trips/I-GO-RIDE1",
       *    "vehicleId": "I-GO-CAR1",
       *    "tripStatus": "NEW",
       *    "tripType": "SHARED",
       *    "pickupPoint": {
       *       "point": {
       *          "latitude": 30.604131,
       *          "longitude": 104.151957
       *                }*    },
       *    "pickupTime": "2024-05-27T02:05:37.935052Z",
       *    "dropoffPoint": {
       *       "point": {
       *          "latitude": 30.636319,
       *          "longitude": 104.129219
       *        }
       *    },
       *    "dropoffTime": "2024-05-27T02:18:35.934167Z",
       *    "numberOfPassengers": 1,
       *    "remainingDistanceMeters": 0,
       *    "etaToFirstWaypoint": "2024-05-27T02:05:37.935052Z",
       *    "remainingWaypoints": [
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.604131,
       *                "longitude": 104.151957
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "PICKUP_WAYPOINT_TYPE",
       *          "distanceMeters": 0,
       *          "eta": "2024-05-27T02:05:37.935052Z",
       *          "duration": "0s"
       *        },
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.636319,
       *                "longitude": 104.129219
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "DROP_OFF_WAYPOINT_TYPE",
       *          "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==",
       *          "distanceMeters": 8260,
       *          "eta": "2024-05-27T02:18:35.934167Z",
       *          "duration": "777.999115s",
       *          "trafficToWaypoint": {
       *             "speedReadingInterval": [
       *                    {
       *                   "endPolylinePointIndex": 284,
       *                   "speed": "NORMAL"
       *                    }
       *             ],
       *             "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA=="
       *            }
       *        }
       *    ],
       *    "currentRouteSegmentVersion": "2024-05-27T02:05:37.941167Z",
       *    "remainingWaypointsVersion": "2024-05-27T02:05:37.941167Z",
       *    "vehicleWaypoints": [
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.604131,
       *                "longitude": 104.151957
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "PICKUP_WAYPOINT_TYPE",
       *          "distanceMeters": 0,
       *          "eta": "2024-05-27T02:05:37.935052Z",
       *          "duration": "0s"
       *        },
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.636319,
       *                "longitude": 104.129219
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "DROP_OFF_WAYPOINT_TYPE",
       *          "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==",
       *          "distanceMeters": 8260,
       *          "eta": "2024-05-27T02:18:35.934167Z",
       *          "duration": "777.999115s",
       *          "trafficToWaypoint": {
       *             "speedReadingInterval": [
       *                    {
       *                   "endPolylinePointIndex": 284,
       *                   "speed": "NORMAL"
       *                    }
       *             ],
       *             "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA=="
       *            }
       *        }
       *    ],
       *    "currentRouteSegmentEndPoint": {
       *       "location": {
       *          "point": {
       *             "latitude": 30.604131,
       *             "longitude": 104.151957
       *            }
       *        },
       *       "tripId": "I-GO-RIDE1",
       *       "waypointType": "PICKUP_WAYPOINT_TYPE"
       *    },
       *    "remainingWaypointsRouteVersion": "2024-05-27T02:05:37.941167Z",
       *    "currentRouteSegmentTrafficVersion": "2024-05-27T02:05:37.941167Z"
       * }
       */
      return response.body();
   }
   /**
    * 修改行程
    * @param tripStatus 行程状态
    * @param vehicleId 车辆id
    * @param numberOfPassengers 人数
    * @param tripId 订单id
    * @param start_lat 起点纬度
    * @param start_lng 起点经度
    * @param end_lat 终点纬度
    * @param end_lng 终点经度
    * @return
    */
   public String updateTrip(String tripStatus, String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) throws Exception {
      String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + tripId + "?updateMask=";
      List<String> sb = new ArrayList<>();
      if(StringUtils.hasLength(vehicleId)){
         sb.add("vehicleId");
      }
      if(StringUtils.hasLength(tripStatus)){
         sb.add("tripStatus");
      }
      if(null != numberOfPassengers){
         sb.add("numberOfPassengers");
      }
      if(StringUtils.hasLength(start_lat) && StringUtils.hasLength(start_lng)){
         sb.add("pickupPoint");
      }
      if(StringUtils.hasLength(end_lat) && StringUtils.hasLength(end_lng)){
         sb.add("dropoffPoint");
      }
      String collect = sb.stream().collect(Collectors.joining(","));
      url += collect;
      HttpRequest put = HttpUtil.createRequest(Method.PUT, url);
      Map<String, String> headers = new HashMap<>();
      headers.put("Authorization", "Bearer " + getToken());
      headers.put("Content-Type", "application/json");
      put.addHeaders(headers);
      JSONObject body = new JSONObject();
      if(StringUtils.hasLength(vehicleId)){
         body.put("vehicleId", vehicleId);
      }
      /**
       * UNKNOWN_TRIP_STATUS   默认,用于未指定或无法识别的行程状态。
       * NEW   新建行程。
       * ENROUTE_TO_PICKUP   司机正在前往上车点。
       * ARRIVED_AT_PICKUP   司机已到达上车点。
       * ARRIVED_AT_INTERMEDIATE_DESTINATION   司机已到达中转目的地,正在等待乘客。
       * ENROUTE_TO_INTERMEDIATE_DESTINATION   司机正在前往中间目的地(而非下车点)。
       * ENROUTE_TO_DROPOFF   司机已接起乘客,正在前往下一个目的地。
       * COMPLETE   乘客已下车,行程已完成。
       * CANCELED   在司机、乘客或拼车服务提供商取车之前,行程被取消。
       */
      if(StringUtils.hasLength(tripStatus)){
         body.put("tripStatus", tripStatus);
      }
      if(null != numberOfPassengers){
         body.put("numberOfPassengers", numberOfPassengers);
      }
      if(StringUtils.hasLength(start_lat) && StringUtils.hasLength(start_lng)){
         JSONObject pickupPoint = new JSONObject();
         JSONObject point = new JSONObject();
         point.put("latitude", start_lat);
         point.put("longitude", start_lng);
         pickupPoint.put("point", point);
         body.put("pickupPoint", pickupPoint);
      }
      if(StringUtils.hasLength(end_lat) && StringUtils.hasLength(end_lng)){
         JSONObject dropoffPoint = new JSONObject();
         JSONObject end_point = new JSONObject();
         end_point.put("latitude", end_lat);
         end_point.put("longitude", end_lng);
         dropoffPoint.put("point", end_point);
         body.put("dropoffPoint", dropoffPoint);
      }
      logger.info("修改行程请求:{}", body.toJSONString());
      HttpRequest request = put.body(body.toJSONString());
      HttpResponse response = request.execute();
      logger.info("修改行程结果:{}", response.body());
      JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
      JSONObject error = jsonObject.getJSONObject("error");
      if(null != error){
         Integer code = error.getInteger("code");
         if(code == 401){
            String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
            if(reason.equals("ACCESS_TOKEN_EXPIRED")){
               redisUtil.remove("google_token");
               return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng);
            }
         }
         throw new Exception(response.body());
      }
      /**
       * 返回结果
       * {
       *    "name": "providers/i-go-odrd-testing/trips/I-GO-RIDE1",
       *    "vehicleId": "I-GO-CAR1",
       *    "tripStatus": "ENROUTE_TO_PICKUP",
       *    "tripType": "SHARED",
       *    "pickupPoint": {
       *       "point": {
       *          "latitude": 30.604131,
       *          "longitude": 104.151957
       *                }*    },
       *    "pickupTime": "2024-05-27T02:07:38.562717Z",
       *    "dropoffPoint": {
       *       "point": {
       *          "latitude": 30.636319,
       *          "longitude": 104.129219
       *        }
       *    },
       *    "dropoffTime": "2024-05-27T02:20:36.562375Z",
       *    "numberOfPassengers": 1,
       *    "remainingWaypoints": [
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.604131,
       *                "longitude": 104.151957
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "PICKUP_WAYPOINT_TYPE",
       *          "eta": "2024-05-27T02:07:38.562717Z",
       *          "duration": "0s"
       *        },
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.636319,
       *                "longitude": 104.129219
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "DROP_OFF_WAYPOINT_TYPE",
       *          "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==",
       *          "distanceMeters": 8260,
       *          "eta": "2024-05-27T02:20:36.562375Z",
       *          "duration": "777.999658s",
       *          "trafficToWaypoint": {
       *             "speedReadingInterval": [
       *                    {
       *                   "endPolylinePointIndex": 284,
       *                   "speed": "NORMAL"
       *                    }
       *             ],
       *             "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA=="
       *            }
       *        }
       *    ],
       *    "remainingWaypointsVersion": "2024-05-27T02:05:37.941167Z",
       *    "vehicleWaypoints": [
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.604131,
       *                "longitude": 104.151957
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "PICKUP_WAYPOINT_TYPE",
       *          "eta": "2024-05-27T02:07:38.562717Z",
       *          "duration": "0s"
       *        },
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.636319,
       *                "longitude": 104.129219
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "DROP_OFF_WAYPOINT_TYPE",
       *          "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==",
       *          "distanceMeters": 8260,
       *          "eta": "2024-05-27T02:20:36.562375Z",
       *          "duration": "777.999658s",
       *          "trafficToWaypoint": {
       *             "speedReadingInterval": [
       *                    {
       *                   "endPolylinePointIndex": 284,
       *                   "speed": "NORMAL"
       *                    }
       *             ],
       *             "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA=="
       *            }
       *        }
       *    ],
       *    "remainingWaypointsRouteVersion": "2024-05-27T02:07:38.570569Z"
       * }
       *
       * 取消订单后返回的结果
       * {
       *    "name": "providers/i-go-odrd-testing/trips/I-GO-RIDE1",
       *    "tripStatus": "CANCELED",
       *    "tripType": "SHARED",
       *    "pickupPoint": {
       *       "point": {
       *          "latitude": 30.604131,
       *          "longitude": 104.151957
       *                }*    },
       *    "dropoffPoint": {
       *       "point": {
       *          "latitude": 30.636319,
       *          "longitude": 104.129219
       *        }
       *    },
       *    "numberOfPassengers": 1
       * }
       */
      return response.body();
   }
   /**
    * 获取行程信息
    * @param tripId 订单id
    * @return
    */
   public String getTrip(String tripId) throws Exception {
      String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + tripId;
      HttpRequest get = HttpUtil.createGet(url);
      Map<String, String> headers = new HashMap<>();
      headers.put("Authorization", "Bearer " + getToken());
      headers.put("Content-Type", "application/json");
      get.addHeaders(headers);
      HttpResponse response = get.execute();
      logger.info("查询行程结果:{}", response.body());
      JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
      JSONObject error = jsonObject.getJSONObject("error");
      if(null != error){
         Integer code = error.getInteger("code");
         if(code == 404){
            return "";
         }
         if(code == 401){
            String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
            if(reason.equals("ACCESS_TOKEN_EXPIRED")){
               redisUtil.remove("google_token");
               return getTrip(tripId);
            }
         }
         throw new Exception(response.body());
      }
      /**
       * 返回结果
       * {
       *    "name": "providers/i-go-odrd-testing/trips/I-GO-RIDE1",
       *    "vehicleId": "I-GO-CAR1",
       *    "tripStatus": "ENROUTE_TO_PICKUP",
       *    "tripType": "SHARED",
       *    "pickupPoint": {
       *       "point": {
       *          "latitude": 30.604131,
       *          "longitude": 104.151957
       *                }*    },
       *    "pickupTime": "2024-05-27T02:10:39.763347Z",
       *    "dropoffPoint": {
       *       "point": {
       *          "latitude": 30.636319,
       *          "longitude": 104.129219
       *        }
       *    },
       *    "dropoffTime": "2024-05-27T02:23:37.762549Z",
       *    "numberOfPassengers": 1,
       *    "remainingDistanceMeters": 0,
       *    "etaToFirstWaypoint": "2024-05-27T02:10:39.763347Z",
       *    "remainingWaypoints": [
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.604131,
       *                "longitude": 104.151957
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "PICKUP_WAYPOINT_TYPE",
       *          "distanceMeters": 0,
       *          "eta": "2024-05-27T02:10:39.763347Z",
       *          "duration": "0s"
       *        },
       *        {
       *          "location": {
       *             "point": {
       *                "latitude": 30.636319,
       *                "longitude": 104.129219
       *                }
       *            },
       *          "tripId": "I-GO-RIDE1",
       *          "waypointType": "DROP_OFF_WAYPOINT_TYPE",
       *          "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==",
       *          "distanceMeters": 8260,
       *          "eta": "2024-05-27T02:23:37.762549Z",
       *          "duration": "777.999202s",
       *          "trafficToWaypoint": {
       *             "speedReadingInterval": [
       *                    {
       *                   "endPolylinePointIndex": 284,
       *                   "speed": "NORMAL"
       *                    }
       *             ],
       *             "encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA=="
       *            }
       *        }
       *    ],
       *    "currentRouteSegmentVersion": "2024-05-27T02:10:39.773373Z",
       *    "remainingWaypointsVersion": "2024-05-27T02:05:37.941167Z",
       *    "currentRouteSegmentEndPoint": {
       *       "location": {
       *          "point": {
       *             "latitude": 30.604131,
       *             "longitude": 104.151957
       *            }
       *        },
       *       "tripId": "I-GO-RIDE1",
       *       "waypointType": "PICKUP_WAYPOINT_TYPE"
       *    },
       *    "remainingWaypointsRouteVersion": "2024-05-27T02:10:39.773373Z",
       *    "currentRouteSegmentTrafficVersion": "2024-05-27T02:10:39.773373Z",
       *    "view": "SDK"
       * }
       */
      return response.body();
   }
}