New file |
| | |
| | | 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(); |
| | | } |
| | | } |