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 String 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 = "";
|
if(0 == type){
|
FleetEngineToken serverToken = minter.getServerToken();
|
jwt = serverToken.jwt();
|
}
|
if(1 == type){
|
FleetEngineToken consumerToken = minter.getConsumerToken(TripClaims.create("I-GO-USER" + id));
|
jwt = consumerToken.jwt();
|
}
|
if(2 == type){
|
FleetEngineToken driverToken = minter.getDriverToken(VehicleClaims.create("I-GO-CAR" + id));
|
jwt = driverToken.jwt();
|
}
|
return jwt;
|
} catch (SigningTokenException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
|
|
|
|
/**
|
* 添加车辆
|
* @param maximumCapacity 这辆车可以搭载的乘客总数
|
* @param licensePlate 车牌号
|
* @param id 车辆id
|
*/
|
public String createVehicles(int maximumCapacity, String licensePlate, Integer id) throws Exception{
|
String google_token = redisUtil.getValue("google_token");
|
if(!StringUtils.hasLength(google_token)){
|
google_token = fleetEngineAuth(0, null);
|
redisUtil.setStrValue("google_token", google_token);
|
}
|
String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles?vehicleId=" + "I-GO-CAR" + id;
|
HttpRequest post = HttpUtil.createPost(url);
|
Map<String, String> headers = new HashMap<>();
|
headers.put("Authorization", "Bearer " + google_token);
|
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());
|
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(body.toJSONString());
|
}
|
/**
|
* 返回结果
|
* {
|
* "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, Integer id) throws Exception{
|
String google_token = redisUtil.getValue("google_token");
|
if(!StringUtils.hasLength(google_token)){
|
google_token = fleetEngineAuth(0, null);
|
redisUtil.setStrValue("google_token", google_token);
|
}
|
String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles/" + "I-GO-CAR" + 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 " + google_token);
|
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());
|
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(body.toJSONString());
|
}
|
/**
|
* 返回结果
|
* {
|
* "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(Integer id) throws Exception{
|
String google_token = redisUtil.getValue("google_token");
|
if(!StringUtils.hasLength(google_token)){
|
google_token = fleetEngineAuth(0, null);
|
redisUtil.setStrValue("google_token", google_token);
|
}
|
String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles" + (null != id ? "/I-GO-CAR" + id : "");
|
HttpRequest get = HttpUtil.createGet(url);
|
Map<String, String> headers = new HashMap<>();
|
headers.put("Authorization", "Bearer " + google_token);
|
headers.put("Content-Type", "application/json");
|
get.addHeaders(headers);
|
|
HttpResponse response = get.execute();
|
logger.info("查询车辆结果:{}", response.body());
|
JSONObject jsonObject = JSON.parseObject(response.body());
|
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 orderType 订单类型(1/4)
|
* @param orderId 订单id
|
* @param start_lat 起点纬度
|
* @param start_lng 起点经度
|
* @param end_lat 终点纬度
|
* @param end_lng 终点经度
|
* @return
|
*/
|
public String createTrip(Integer vehicleId, Integer numberOfPassengers, Integer orderType, Integer orderId, String start_lat, String start_lng, String end_lat, String end_lng) throws Exception{
|
String google_token = redisUtil.getValue("google_token");
|
if(!StringUtils.hasLength(google_token)){
|
google_token = fleetEngineAuth(0, null);
|
redisUtil.setStrValue("google_token", google_token);
|
}
|
String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips?tripId=" + "I-GO-" + (orderType == 1 ? "RIDE" : "DELIVERY") + orderId;
|
HttpRequest post = HttpUtil.createPost(url);
|
Map<String, String> headers = new HashMap<>();
|
headers.put("Authorization", "Bearer " + google_token);
|
headers.put("Content-Type", "application/json");
|
post.addHeaders(headers);
|
|
JSONObject body = new JSONObject();
|
body.put("vehicleId", "I-GO-CAR" + 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());
|
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, orderType, orderId, start_lat, start_lng, end_lat, end_lng);
|
}
|
}
|
throw new Exception(body.toJSONString());
|
}
|
/**
|
* 返回结果
|
* {
|
* "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 orderType 订单类型(1/4)
|
* @param orderId 订单id
|
* @param start_lat 起点纬度
|
* @param start_lng 起点经度
|
* @param end_lat 终点纬度
|
* @param end_lng 终点经度
|
* @return
|
*/
|
public String updateTrip(String tripStatus, Integer vehicleId, Integer numberOfPassengers, Integer orderType, Integer orderId, String start_lat, String start_lng, String end_lat, String end_lng) throws Exception {
|
String google_token = redisUtil.getValue("google_token");
|
if(!StringUtils.hasLength(google_token)){
|
google_token = fleetEngineAuth(0, null);
|
redisUtil.setStrValue("google_token", google_token);
|
}
|
String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + "I-GO-" + (orderType == 1 ? "RIDE" : "DELIVERY") + orderId + "?updateMask=";
|
List<String> sb = new ArrayList<>();
|
if(null != 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 " + google_token);
|
headers.put("Content-Type", "application/json");
|
put.addHeaders(headers);
|
|
JSONObject body = new JSONObject();
|
if(null != vehicleId){
|
body.put("vehicleId", "I-GO-CAR" + 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());
|
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, orderType, orderId, 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 orderType 订单类型(1/4)
|
* @param orderId 订单id
|
* @return
|
*/
|
public String getTrip(Integer orderType, Integer orderId) throws Exception {
|
String google_token = redisUtil.getValue("google_token");
|
if(!StringUtils.hasLength(google_token)){
|
google_token = fleetEngineAuth(0, null);
|
redisUtil.setStrValue("google_token", google_token);
|
}
|
String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/I-GO-" + (orderType == 1 ? "RIDE" : "DELIVERY") + orderId;
|
HttpRequest get = HttpUtil.createGet(url);
|
Map<String, String> headers = new HashMap<>();
|
headers.put("Authorization", "Bearer " + google_token);
|
headers.put("Content-Type", "application/json");
|
get.addHeaders(headers);
|
|
HttpResponse response = get.execute();
|
logger.info("查询行程结果:{}", response.body());
|
JSONObject jsonObject = JSON.parseObject(response.body());
|
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(orderType, orderId);
|
}
|
}
|
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();
|
}
|
}
|