From 736ab0090700c75af37b8a3456b01609e4e2d329 Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期三, 17 七月 2024 11:09:40 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/2.0' into 2.0 --- UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java | 894 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 894 insertions(+), 0 deletions(-) diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java new file mode 100644 index 0000000..4be7b9f --- /dev/null +++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java @@ -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(); + } +} -- Gitblit v1.7.1