| | |
| | | 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.google.fleetengine.auth.token.factory.signer.LocalSigner; |
| | | import com.stylefeng.guns.modular.system.util.RedisUtil; |
| | | import com.stylefeng.guns.modular.system.util.UUIDUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.util.*; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * Fleet Engine API 工具类 |
| | | * |
| | | * @author zhibing.pu |
| | | * @Date 2024/5/17 9:59 |
| | | */ |
| | |
| | | @Component |
| | | public class FleetEngineUtil { |
| | | |
| | | static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class); |
| | | |
| | | private final static String key = "AIzaSyCG6PsfkaCEc94VK2vIAZk1YYKvOS_Ewts"; |
| | | |
| | | static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class); |
| | | private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-odrd-testing.iam.gserviceaccount.com"; |
| | | |
| | | private final String DRIVER_ACCOUNT = "odrd-fleetengine-driversdkuser@i-go-odrd-testing.iam.gserviceaccount.com"; |
| | | |
| | | private final String CONSUMER_ACCOUNT = "odrd-fleetengine-consumersdkus@i-go-odrd-testing.iam.gserviceaccount.com"; |
| | | |
| | | private final String serverPrivateKeyId = "254e18eefa9fdcca64d5899cdcd793d466c47c7d"; |
| | | |
| | | private final String serverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfbNAWnukqLKIxItqmSABxsH5glySEHJ2gfL5KsRF0M02e0Z8/KNKZkoh7I6bOMt1fEtttFaWOeq70IdI2WAd5wVazL3upvl5FW4P08ly33LklfGyLljlJ7ChPny9x6OjAaiS0yD9fh7NWti7rZKU7gzcGL8HddNYXgXV5OajvoG3TGdu52WTxce9AUzU6gLPboz/RbGqrdrmgVJVb0EPlhTJf/NSsaiW4NoL8SEzf/pJGYBmqJs97mXwCHTY4avaC+CP/zz9yS8AQEJlApbVT6lSOhYoR0hNOBj5B886EZOssjubO6hQaiwRnGrV2RdpHynqA1iekfGpUGEtWTsqjAgMBAAECggEALyPbMd0iP8y71sCiG4nty7Au5ju62e+mMkbAc9CAwzXKTVxZdLEK+MsJ3TNxBsami47FYC+G6SbgpaJ8iIImD7v5+XjgXZRDRsnlLmAdx2YWPv3YELxGS1PvpX+B5XJDpGWeXfBaQNKc1lZ/cC4t53eIpSUo82UxSvkGNea1S8lR6vIByhNyCQOvLG4yqaxUy0hZi0kge37XrjYMGS+BivBBnDiVlBPLBVbrNBxOf31Lzz+XX0iwXX7Zl2jN759oe0xQyuIGWUSj8xBDIF8nNaJrla7rWVml3sZJh6/3r1Acj0mhZtE0ZMu5hiPGiIXgb1ng30j3dMP4yVPhXrpAtQKBgQDaU01VnHsnHxc0DQHE2vEOPGmPxVS0/JAssePAEUmKEueUogGef91YY+Vm/ItbhLwGjbytnXxe88zRAdB1u07efZ83ey93TrGl2CJUzLHIcgb+Q1tT642rqlfl+q8ep86hcZ+63pDiIPt2Z+HkbKIR0SWf5LIH4flquQOTQufXXQKBgQC674qDsjOJepZjMMN6PkVMcWBYDNmXHnqa5Oto0rZM745UulbXqEFGuBOsXPU7O33Kfz1vbtoluubKZi5B6cFNnPypE2SCfvdObHq4FuTuKPV6lN93SyhZchmSEXEs0PU4cGDRt+RRqQcjft1Wigiy4Y1y1SInCtcaP1hLejEJ/wKBgFAhvwKrGnBzctrB42JTUaJ9/eis7rg28tvUttjp/2nUIndlNt7r41vr3mj8TFHc1/43y4aVhO584THdTpvHkd0LkoKUjglmMsHCIGercZ02bOap5j1Y+XiGXxij995yjN6oi43U3qyAmosM+dYTITEU6JBVKhrGj/rhyTQlnF5pAoGBAKFGmo0mR/pbDbYD0xH6+VSLGCC+7VbIT+SkjUjBSdA0eOo2XUfvfGmj1C1HgbcZi1wRzJH/5CrbBdQmtc/d+QyZ3Q2NkpBXM8uwIWwDLH0gTzDzkZvc9rG8k70GWUrd+EI6Cf3FFjExj9wazqCjs/+IQr2Ijc97NbsKXYW4pOhHAoGAKf5wYk+cn0cVTsyAom0UbGD5Uijqh5732MeqFYs2Rcwx0OErJZo68COSFFF40hJmmIKn7p3qycIyd1FcYlXN1l4s8mEWTGTInRE0OlBU0+jLtIV9pwNgffpbPYcrWZU6s6YVeJ2nDwl+aD+4QvN0rkPTfho9kjgeyF3PW0I2u4E="; |
| | | |
| | | private final String driverPrivateKeyId = "859e85fb3aa4d18b4afaac3e24e8f65700da5cc9"; |
| | | |
| | | private final String driverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmzL1BqSH+Zh9Fct5mXqe5sYOMTnJtOJhwKXnjjo2tNPXv4alzUHz8Vbj6nMar5u5IuKRZMeRBlhoRSFrLm+J1+sfvpH8N4wsnG7hDANknqWzdsk9a68qMHxNQF3hFzs9+KKrR1LAG8e9ytMfliN0kX+xls4uPZDPu1Q39K6V9KXrH/GrMA56i3TtWi7Hmakt5YTELeGjhx4nGrfuQLFFovs1Z9uJtf7E8R95+65StrOAmbJNf7VciEqwBpWYlU5VeyLXMg/oHwnTv2cjdcFozyDrlUHbDmtTiVeBBsYFVLyAsDGfl1p6eiVTiBBuo56YSYLWfaLgYvTyEcZ9jBQsfAgMBAAECggEAQzbTuObX3PT3+vtb5XKVMf33XY2rDJo2y1PbWzhxnO9vf3e22dIAW4qLnOmaIWFQeht1lr/FFCzRWk+Gzu+FJTemY8osrMLmFp9T9CQeXZ4nUXruAVxs5WQMW0Tp4W+CK3tlwmJrgJDzhYyV1Mf/HQ5Oa3kbbu/ZAY/3MCLrb/ClJQvD2rZSDdzAkNMQm8P2hsE71+rH7mI2hHrSCHl2OIp2A64QT8HjtyRc5yHZtTp6ZST1ge9SSIsT0ZfmXKtKF7yGEIPtKNU+oLrGyK5P30xBWJ/bwb3PEz2MZcPvz31+B2+UvZMm7OTkqfcRwEztAf8Ckiuo4im2BRYbVmd9OQKBgQDd0MeLxR+Qtv12bVA0bHtagFEq36THgWG7IM1/1vS4Cl9sveKSOS8A6oKLy624fGE7PKcuTTIzkVA81GXtWBQ9Coq/4TmllQkFTH7pz9C2PNHSCychPwNNV8qUx3lE3d4DOjGKgoVFD4l90AO7lOvmLTSc3pDpr+jSjUH4lqGrbQKBgQDAgXBmpXfCTxwqkBzGwxX+hwJen9qSkCM47qnQ1L4NnXPL6s0EN6rQ3FnFemGIzBUGJ2tajntkKlUu5DzsQeoBGu/SaSwgqD+1UQDcUyo+retmqZ+QYbpeyd3l53bLJJuJNsfak0X76Ft6hrm4julx6RGlmboQyx4kZWbhx4YNOwKBgEG9/2aNpi1eDwFqpLrk7CqGnYf3gP8gebbcoguhyiZB7MZuARkVmbjLyKVmWLa1JpxH/cTbXGWsS/u7d/pAgL8WwMjeGBfbdDD92x+xWEqq/AUlCRPxeSkTPBech3TBzWtndAd5Z8ZwNG/1lyWhnck63L0huhGI8Zh2BXeILaKBAoGAKK3xq69BvGztPc1QV2w4RJ4RER/kl14gI1LDzd52/veL1cabZk3BKfu2eLWg0MCXnMJNvEgpqQQNFiii+yX+phckIKma6pfDRrSEYwqr/azQ9tPXZTJRqOAtpPyhrNHikD9kQjsm6dGzKxQ3QNnqWOjwkrcGi6/wga5v7Dw2hqsCgYEA2T/kSNQ9dqpVBAkfi2J50hqnfFESPjKeirJJZllqhVqsiV0ly8a8Fz8SjGqTzrq+UErko+QmtSlo5h3Uq9Ln+0CwYfrUL+74q2zLHdS0DpY3QsGTEDJXTxCyy9kO26X2UsM3Ez3YUAkdMwdpVz0uVZtinv2735QZOBxoVQV2kQ8="; |
| | | |
| | | private final String consumerPrivateKeyId = "40acf82cbd5250de2f5123caff40738bdd403b08"; |
| | | |
| | | private final String consumerPrivateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDSwtbSBFgIXna6mWeKFWCK31NXUJH6uGduR1XrODGRedrqrTgr0BdNg8PDo6/zh/T+K0Svor6kgqpwnl9soOdn73oC4Nu+Ad7EiKa38j650jlZdLAr4hR0Ou9Kcnv45x/94auUO8jBz844cu24swLKiPsK9OnX65wVlKRfhhkGFuS/4OI76CmE7NqZDqPOW16o8tBO5TsgPVNkglFAU73fTp0kcHoLauT9QOB0+yZi39mnNXyU+2cL3Ylp5oaQCJpyssDRUqz/EiHa7FxUUgzCadG00+ePf5iYSnZKQRKWoOIawFvcCfcHx8GAl8Nn+79HtVQHB9hLsQ5+jqcdfKPfAgMBAAECggEAE9Ufz912xzrUY1TCKH1Ae3Dub732Lqihmv/9dsfv6ieUURcBvSW0u6eViVhi20DE7hH2QazH0cU18qkEg71UaTRgv9qW8vdMFiRhw9d4zZWZrfBMD6UTlahiEhhZ0B83pHVS5v0FNC+w0SEHe6Tks1hWfz5yrs3N/z3ghdihjC/5i1jeBoHXs1262SMazuwNGHblLApGPG+86taeFtbDI+31TKvZ8nomZHkEVFnARRUoBBcIwowRMqNfwlpcJhlz6kDWnoD08kHJ2zzJokozu7Lim+Ugt/MWwUOcA0hgq2QdymZFpkRkDl7tZmJtwTfTirjbGlpnPHVXEc1bWM7ocQKBgQD0LJ8e7JXf6bVFngq0jSJNKK7XDHYg0KhHXMApF59xxi29hdHXWPzgRJ45KkoUJc7MITpIJLXfCmi1XyDMf9m8lIf/oaqhJ7idYi7iAAPOJkdnHbSt0lebyjBWzCQ6OgS4NfF1+LEibTzRqiFs5K8EAyPYAVSTrpWoguoWtTzIGQKBgQDc9/I2PS+91Eb5RvuidTNsDqZJliTJQFlBjlDViFo3+l1N7jDFYwPBR/Tv4TVM5p9Zb+/Lo9X1pjDbm8QriTR4V+4HaLXkcCnmOsdSRInFUW4UIafwLX5ifjgfyaWgdKdn2UP1Lu/1qBN6GU1xjSfBQ6N3UqQiKkNPb7tuPJGqtwKBgQCQ4hU8vTclGMC14VQK1B/BVt1/vuYtDIJ9bZycBWdXlDc52LitpiDOVgjodJ5mHBT77M9vVVERWlTNIfgNP+OL0TptRZlAbJhP0p1s/oNDhFUj6211InVXfH54UkNAxYJdZ6yxynIYsma/JcsVmQ/8Ony/Q/LSempVBfEurjW1qQKBgQCQWPjFLdtOKqnildg0HFPnNvqx/38waPTluk5b76LgBpGFIyCBEVmWnacIPRpQjidyiYkggnp26oXoMC1KM2svYmGAPYr1G8CDQcqLl3JYkAVU6VeHsnBpbwLC4TttQkdJs8iNFohy9cUjcfwBPbDGs6TJghbuqqUl81uBe9e8qQKBgQDZm8T2KB34J7HAc5A+vqkmAo7mQLZg51OrzB1KnDU86pSAf0o3eSvfDUT6dpU9fRuZ1XYnbPnpoJwjFH3m4u9gqKF3PtVYfZyJrEqYwmhB9z6vd+dcsUlXM0fi37bGZkKBD0JGGt5OljM1qJG15x/LYfC/nwOmqWoOhNPCst2Z7w=="; |
| | | private final String provider = "i-go-odrd-testing"; |
| | | |
| | | |
| | | // private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-gcp.iam.gserviceaccount.com"; |
| | | // |
| | | // private final String DRIVER_ACCOUNT = "odrd-fleetengine-driversdkuser@i-go-gcp.iam.gserviceaccount.com"; |
| | |
| | | // private final String consumerPrivateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCeBruAMii4e7LrGNwSWMbeztzjJV9lUS9CIhWi142G/Ed9b58oa1CAM3ym794PRqtHRvdzLSWRKf3SFJjzYl7CMmkpTgsQoV8tCp/G/vITZcrD9BxYfocysnSDy9d/nleomC1PeUV6coZpGPIjwuxkXyQbH1CnTyGK5RAU2siCw4plLMz6WQyXXyCZOdCijsvSPgytDWveO8DGPIBO1VlHHIJIfrfgVCYgpaXd63GSPQEJ81GYfy5VtnuLHpc3kowq5blLqMFUU6eAzA20Jg3mCovv2idSNN6R5K1kNT3Eu5fsQWuthDqK0H2IeNulb8cCPnri62AH03kxl6xFwC6pAgMBAAECggEAETkH88TZDfeNXHTCfM1oKfMUZ+fe1HAGB93Ryy8ATGyabgqy/KNq4U4QkTEmBowxMVIuuJgnDAHY7q3dWElUV93z+tMiqZas2iqE7MSZ0DtmifdvpMVwKWUBsIuQL7yA2UMcom4ZKxXoSElhD+diqYh6VZUSzpP1QpS3LU6wTm/4IzN+kjfn7sAENk9+ff04VZjBC4yPANWO6gXmNZlGvFvbp6ChBb9PnPlB6dUUiLCGkb/B0jagfqP7ARrDArMcRpJZyYbPDEfxEqqADV28N4k2qOYUZYVmXBXf+Zip7G+rikXmgxn/G1nHLJgUAmc42TUos8P0YsZiVyboQYtU8QKBgQDRcLK70zIZOhMRmr9gTC2khSBA37ZVVtCiJb6G4TtFfH7KLdn8r8aNLauH90WCzQvk2m/KKFlt/q2UJyFatJx5LB4mYKAS7BPfoHYqsoqDMuMXtNpe6PO5/rx8h90pl60gouG2iw1QcOq5NKNVr2INYkItJhc8u99Lhw675hVVOwKBgQDBKA2e1KERO3cOn7muaJjWubMJ6mK0XtOLmTL8maILwJVO2H6rMOxoYum3txZjc+oTdFcyfv5TJZrihm3F2XoZ6Xe1F0OhiX97OgA/uDygQSDsiFdhJ90svbpGxDxtQtamhuu+8Wp1TpNu8ORdG+3gmsCkxivrPTs/MnJnfiu9awKBgGJ1QYDsyvtzAq3e+qKxjS9vafc1dAjwVAo2BjhwP6Xt3cj7/yM8GvIZiy7S/rl73WCLk8wMZeZAuKcSMirrBzgrlkziVb4vfzQ8wfBWmKkOzhVB7vp5NsK0TzWXxU+dP0U9bTCcc/jh7GZ+qV5JoaW7EHMbGgdyJoniBvosMtErAoGAKVRvraejmzNVI0zsBzScV32+oIWFf0C3FSy/qysYcFlR2WAbonfCbgeUKNpFMRyRXn5LViO0OYhXXtcSz/3b0YWSNq52qy7nly9u9DNwzX2CFPqLb99+xN8H57J/l4VwtosyEFZJyDX6+AcVZhLe0GtsgxVgOmKMtdYOgrSNmWcCgYBu3KiRwYPfQgyEYOwfQBOjoMmPUB8H/vtvFLRlHXxZF7hPAyKs4e9dQRW7vb61epVgMVz5t4E4pKHqxpZu+j7Tby+Z5fAgSPiniZUyVH9AYGCTyAYZogr5r21vhpcAZJ0P8hoE5R2jhnzu/mhr6CkWz8nCHsZ7+KBjcVILUYIS9g=="; |
| | | // |
| | | // private final String provider = "i-go-gcp"; |
| | | |
| | | @Autowired |
| | | private RedisUtil redisUtil; |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取jwt token |
| | | * |
| | | * @param type 0=服务端,1=乘客,2=司机 |
| | | * @return |
| | | */ |
| | | public Map<String, Object> fleetEngineAuth(int type, String id) { |
| | | public Map<String, Object> fleetEngineAuth(int type, String id){ |
| | | try { |
| | | //谷歌云服务器使用这部分代码 |
| | | // AuthTokenMinter minter = AuthTokenMinter.builder() |
| | |
| | | |
| | | String jwt = ""; |
| | | Long expirationTimestamp = 0L; |
| | | if (0 == type) { |
| | | if(0 == type){ |
| | | FleetEngineToken serverToken = minter.getServerToken(); |
| | | jwt = serverToken.jwt(); |
| | | expirationTimestamp = serverToken.expirationTimestamp().getTime(); |
| | | } |
| | | if (1 == type) { |
| | | if(1 == type){ |
| | | FleetEngineToken consumerToken = minter.getConsumerToken(TripClaims.create(id)); |
| | | jwt = consumerToken.jwt(); |
| | | expirationTimestamp = consumerToken.expirationTimestamp().getTime(); |
| | | } |
| | | if (2 == type) { |
| | | if(2 == type){ |
| | | FleetEngineToken driverToken = minter.getDriverToken(VehicleClaims.create(id)); |
| | | jwt = driverToken.jwt(); |
| | | expirationTimestamp = driverToken.expirationTimestamp().getTime(); |
| | |
| | | } |
| | | |
| | | |
| | | public String getToken() { |
| | | |
| | | public String getToken(){ |
| | | String token_json = redisUtil.getValue("google_token"); |
| | | String google_token = ""; |
| | | if (!StringUtils.hasLength(token_json)) { |
| | | 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 { |
| | | }else{ |
| | | JSONObject jsonObject1 = JSON.parseObject(token_json); |
| | | Long expirationTimestamp = jsonObject1.getLong("expirationTimestamp"); |
| | | google_token = jsonObject1.getString("token"); |
| | | if ((expirationTimestamp - 10000L) <= System.currentTimeMillis()) { |
| | | 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(); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /** |
| | | * 添加车辆 |
| | | * |
| | | * @param maximumCapacity 这辆车可以搭载的乘客总数 |
| | | * @param licensePlate 车牌号 |
| | | * @param id 车辆id |
| | | * @param licensePlate 车牌号 |
| | | * @param id 车辆id |
| | | */ |
| | | public String createVehicles(int maximumCapacity, String licensePlate, String id) throws Exception { |
| | | public boolean createVehicles(int maximumCapacity, String licensePlate, String id) { |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles?vehicleId=" + id; |
| | | HttpRequest post = HttpUtil.createPost(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | |
| | | logger.info("创建车辆结果:{}", response.body()); |
| | | JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type")); |
| | | JSONObject error = jsonObject.getJSONObject("error"); |
| | | if (null != error) { |
| | | if(null != error){ |
| | | Integer code = error.getInteger("code"); |
| | | if (code == 401) { |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if (StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")) { |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return createVehicles(maximumCapacity, licensePlate, id); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if (reason.equals("ACCESS_TOKEN_EXPIRED")) { |
| | | if(reason.equals("ACCESS_TOKEN_EXPIRED")){ |
| | | redisUtil.remove("google_token"); |
| | | return createVehicles(maximumCapacity, licensePlate, id); |
| | | } |
| | | } |
| | | throw new Exception(response.body()); |
| | | log.error("添加车辆信息异常: licensePlate={}, body={}", licensePlate, response.body()); |
| | | return false; |
| | | } |
| | | /** |
| | | * 返回结果 |
| | |
| | | * "waypointsVersion": "2024-05-23T03:05:23.293329Z" |
| | | * } |
| | | */ |
| | | return response.body(); |
| | | } |
| | | |
| | | /** |
| | | * 上报google可结算订单 |
| | | * |
| | | * @param tripId 行程id |
| | | * @return |
| | | */ |
| | | public boolean reportBillableEvent(String tripId) throws Exception { |
| | | String billableEventId = UUIDUtil.getRandomCode(); |
| | | String url = "https://mobilitybilling.googleapis.com/v1:reportBillableEvent?regionCode=GH&key=" + key + "&billableEventId=" + billableEventId; |
| | | 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("related_ids", "[\"" + tripId + "\"]"); |
| | | post.body(body.toJSONString()); |
| | | |
| | | |
| | | //上线客户测试和上线运营开放 |
| | | // HttpResponse response = post.execute(); |
| | | // if(200 != response.getStatus()){ |
| | | // logger.error(response.body()); |
| | | // throw new Exception(response.body()); |
| | | // } |
| | | return true; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 修改车辆信息 |
| | | * |
| | | * @param maximumCapacity |
| | | * @param licensePlate |
| | | * @param id |
| | | * @return |
| | | */ |
| | | public String updateVehicles(String vehicleState, Integer maximumCapacity, String licensePlate, String id) throws Exception { |
| | | public boolean updateVehicles(String vehicleState, Integer maximumCapacity, String licensePlate, String id) { |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles/" + id + "?updateMask="; |
| | | List<String> sb = new ArrayList<>(); |
| | | if (StringUtils.hasLength(vehicleState)) { |
| | | if(StringUtils.hasLength(vehicleState)){ |
| | | sb.add("vehicleState"); |
| | | } |
| | | if (null != maximumCapacity) { |
| | | if(null != maximumCapacity){ |
| | | sb.add("maximumCapacity"); |
| | | } |
| | | if (StringUtils.hasLength(licensePlate)) { |
| | | if(StringUtils.hasLength(licensePlate)){ |
| | | sb.add("licensePlate"); |
| | | } |
| | | String collect = sb.stream().collect(Collectors.joining(",")); |
| | |
| | | * OFFLINE 车辆不接受新行程。注意:在完成分配给车辆的行程时,车辆仍可继续在此状态下运行。 |
| | | * ONLINE 车辆正在接受新行程。 |
| | | */ |
| | | if (StringUtils.hasLength(vehicleState)) { |
| | | if(StringUtils.hasLength(vehicleState)){ |
| | | body.put("vehicleState", vehicleState); |
| | | } |
| | | if (null != maximumCapacity) { |
| | | if(null != maximumCapacity){ |
| | | body.put("maximumCapacity", maximumCapacity); |
| | | } |
| | | if (StringUtils.hasLength(licensePlate)) { |
| | | if(StringUtils.hasLength(licensePlate)){ |
| | | JSONObject licensePlate1 = new JSONObject(); |
| | | licensePlate1.put("countryCode", "GH"); |
| | | licensePlate1.put("lastCharacter", getLastNumber(licensePlate)); |
| | |
| | | logger.info("修改车辆信息结果:{}", response.body()); |
| | | JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type")); |
| | | JSONObject error = jsonObject.getJSONObject("error"); |
| | | if (null != error) { |
| | | if(null != error){ |
| | | Integer code = error.getInteger("code"); |
| | | if (code == 401) { |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if (StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")) { |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return updateVehicles(vehicleState, maximumCapacity, licensePlate, id); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if (reason.equals("ACCESS_TOKEN_EXPIRED")) { |
| | | if(reason.equals("ACCESS_TOKEN_EXPIRED")){ |
| | | redisUtil.remove("google_token"); |
| | | return updateVehicles(vehicleState, maximumCapacity, licensePlate, id); |
| | | } |
| | | } |
| | | throw new Exception(response.body()); |
| | | log.error("修改车辆信息异常: licensePlate={}, body={}", licensePlate, response.body()); |
| | | return false; |
| | | } |
| | | /** |
| | | * 返回结果 |
| | |
| | | * "waypointsVersion": "2024-05-23T03:05:23.293329Z" |
| | | * } |
| | | */ |
| | | return response.body(); |
| | | return true; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 获取车辆信息 |
| | | * |
| | | * @param id 车辆id |
| | | * @return |
| | | */ |
| | | public String getVehicles(String id) throws Exception { |
| | | public String getVehicles(String id){ |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/vehicles/" + (null != id ? id : ""); |
| | | HttpRequest get = HttpUtil.createGet(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | |
| | | logger.info("查询车辆结果:{}", response.body()); |
| | | JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type")); |
| | | JSONObject error = jsonObject.getJSONObject("error"); |
| | | if (null != error) { |
| | | if(null != error){ |
| | | Integer code = error.getInteger("code"); |
| | | if (code == 404) { |
| | | if(code == 404){ |
| | | return ""; |
| | | } |
| | | if (code == 401) { |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if (StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")) { |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return getVehicles(id); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if (reason.equals("ACCESS_TOKEN_EXPIRED")) { |
| | | if(reason.equals("ACCESS_TOKEN_EXPIRED")){ |
| | | redisUtil.remove("google_token"); |
| | | return getVehicles(id); |
| | | } |
| | | } |
| | | throw new Exception(response.body()); |
| | | log.error("查询车辆信息异常: id={}, body={}", id, response.body()); |
| | | return null; |
| | | } |
| | | /** |
| | | * 返回结果 |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取最后一个数字 |
| | | * |
| | | * @param str |
| | | * @return |
| | | */ |
| | | private String getLastNumber(String str) { |
| | | 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")) { |
| | | if(String.valueOf(c).matches("\\d")){ |
| | | return str.substring(i - 1, i); |
| | | } |
| | | } |
| | |
| | | |
| | | /** |
| | | * 创建新的行程 |
| | | * |
| | | * @param vehicleId 车辆id |
| | | * @param vehicleId 车辆id |
| | | * @param numberOfPassengers 人数 |
| | | * @param tripId 订单id |
| | | * @param start_lat 起点纬度 |
| | | * @param start_lng 起点经度 |
| | | * @param end_lat 终点纬度 |
| | | * @param end_lng 终点经度 |
| | | * @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 { |
| | | public JSONObject createTrip(String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) { |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips?tripId=" + tripId; |
| | | HttpRequest post = HttpUtil.createPost(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | |
| | | post.addHeaders(headers); |
| | | |
| | | JSONObject body = new JSONObject(); |
| | | if (StringUtils.hasLength(vehicleId)) { |
| | | if(StringUtils.hasLength(vehicleId)){ |
| | | body.put("vehicleId", vehicleId); |
| | | } |
| | | body.put("tripStatus", "NEW"); |
| | |
| | | end_point.put("longitude", end_lng); |
| | | dropoffPoint.put("point", end_point); |
| | | body.put("dropoffPoint", dropoffPoint); |
| | | logger.info("创建行程请求:{}", body.toJSONString()); |
| | | logger.info("创建行程请求:{} {}", tripId, 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) { |
| | | if(null != error){ |
| | | Integer code = error.getInteger("code"); |
| | | if (code == 401) { |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if (StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")) { |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return createTrip(vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if (reason.equals("ACCESS_TOKEN_EXPIRED")) { |
| | | 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()); |
| | | logger.error("创建行程异常: tripId={} body={}", tripId, response.body()); |
| | | } |
| | | /** |
| | | * 返回结果 |
| | |
| | | * "currentRouteSegmentTrafficVersion": "2024-05-27T02:05:37.941167Z" |
| | | * } |
| | | */ |
| | | return response.body(); |
| | | return jsonObject; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 修改行程 |
| | | * |
| | | * @param tripStatus 行程状态 |
| | | * @param vehicleId 车辆id |
| | | * @param tripStatus 行程状态 |
| | | * @param vehicleId 车辆id |
| | | * @param numberOfPassengers 人数 |
| | | * @param tripId 订单id |
| | | * @param start_lat 起点纬度 |
| | | * @param start_lng 起点经度 |
| | | * @param end_lat 终点纬度 |
| | | * @param end_lng 终点经度 |
| | | * @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 { |
| | | public boolean updateTrip(String tripStatus, String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng, Integer orderId, Integer orderType) { |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + tripId + "?updateMask="; |
| | | List<String> sb = new ArrayList<>(); |
| | | if (StringUtils.hasLength(vehicleId)) { |
| | | if(StringUtils.hasLength(vehicleId)){ |
| | | sb.add("vehicleId"); |
| | | } |
| | | if (StringUtils.hasLength(tripStatus)) { |
| | | if(StringUtils.hasLength(tripStatus)){ |
| | | sb.add("tripStatus"); |
| | | } |
| | | if (null != numberOfPassengers) { |
| | | if(null != numberOfPassengers){ |
| | | sb.add("numberOfPassengers"); |
| | | } |
| | | if (StringUtils.hasLength(start_lat) && StringUtils.hasLength(start_lng)) { |
| | | if(StringUtils.hasLength(start_lat) && StringUtils.hasLength(start_lng)){ |
| | | sb.add("pickupPoint"); |
| | | } |
| | | |
| | | if (StringUtils.hasLength(end_lat) && StringUtils.hasLength(end_lng)) { |
| | | if(StringUtils.hasLength(end_lat) && StringUtils.hasLength(end_lng)){ |
| | | sb.add("dropoffPoint"); |
| | | } |
| | | String collect = sb.stream().collect(Collectors.joining(",")); |
| | |
| | | put.addHeaders(headers); |
| | | |
| | | JSONObject body = new JSONObject(); |
| | | if (StringUtils.hasLength(vehicleId)) { |
| | | if(StringUtils.hasLength(vehicleId)){ |
| | | body.put("vehicleId", vehicleId); |
| | | } |
| | | /** |
| | |
| | | * COMPLETE 乘客已下车,行程已完成。 |
| | | * CANCELED 在司机、乘客或拼车服务提供商取车之前,行程被取消。 |
| | | */ |
| | | if (StringUtils.hasLength(tripStatus)) { |
| | | if(StringUtils.hasLength(tripStatus)){ |
| | | body.put("tripStatus", tripStatus); |
| | | } |
| | | if (null != numberOfPassengers) { |
| | | if(null != numberOfPassengers){ |
| | | body.put("numberOfPassengers", numberOfPassengers); |
| | | } |
| | | if (StringUtils.hasLength(start_lat) && StringUtils.hasLength(start_lng)) { |
| | | if(StringUtils.hasLength(start_lat) && StringUtils.hasLength(start_lng)){ |
| | | JSONObject pickupPoint = new JSONObject(); |
| | | JSONObject point = new JSONObject(); |
| | | point.put("latitude", start_lat); |
| | |
| | | body.put("pickupPoint", pickupPoint); |
| | | } |
| | | |
| | | if (StringUtils.hasLength(end_lat) && StringUtils.hasLength(end_lng)) { |
| | | if(StringUtils.hasLength(end_lat) && StringUtils.hasLength(end_lng)){ |
| | | JSONObject dropoffPoint = new JSONObject(); |
| | | JSONObject end_point = new JSONObject(); |
| | | end_point.put("latitude", end_lat); |
| | |
| | | dropoffPoint.put("point", end_point); |
| | | body.put("dropoffPoint", dropoffPoint); |
| | | } |
| | | logger.info("修改行程请求:{}", body.toJSONString()); |
| | | logger.info("修改行程请求:{} {}", tripId, 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) { |
| | | if(null != error){ |
| | | Integer code = error.getInteger("code"); |
| | | if (code == 401) { |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if (StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")) { |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng); |
| | | return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng, orderId, orderType); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if (reason.equals("ACCESS_TOKEN_EXPIRED")) { |
| | | if(reason.equals("ACCESS_TOKEN_EXPIRED")){ |
| | | redisUtil.remove("google_token"); |
| | | return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng); |
| | | return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng, orderId, orderType); |
| | | } |
| | | } |
| | | throw new Exception(response.body()); |
| | | if(code == 404){ |
| | | return true; |
| | | } |
| | | logger.error("修改行程异常: tripId={} body={}", tripId, response.body()); |
| | | return false; |
| | | } |
| | | /** |
| | | * 返回结果 |
| | |
| | | * "numberOfPassengers": 1 |
| | | * } |
| | | */ |
| | | return response.body(); |
| | | return true; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取行程信息 |
| | | * |
| | | * @param tripId 订单id |
| | | * @return |
| | | */ |
| | | public String getTrip(String tripId) throws Exception { |
| | | public String getTrip(String tripId) { |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + tripId; |
| | | HttpRequest get = HttpUtil.createGet(url); |
| | | Map<String, String> headers = new HashMap<>(); |
| | |
| | | headers.put("Content-Type", "application/json"); |
| | | get.addHeaders(headers); |
| | | |
| | | logger.info("查询行程请求:{} {}", tripId, url); |
| | | 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) { |
| | | if(null != error){ |
| | | Integer code = error.getInteger("code"); |
| | | if (code == 404) { |
| | | if(code == 404){ |
| | | return ""; |
| | | } |
| | | if (code == 401) { |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if (StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")) { |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return getTrip(tripId); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if (reason.equals("ACCESS_TOKEN_EXPIRED")) { |
| | | if(reason.equals("ACCESS_TOKEN_EXPIRED")){ |
| | | redisUtil.remove("google_token"); |
| | | return getTrip(tripId); |
| | | } |
| | | } |
| | | throw new Exception(response.body()); |
| | | logger.error("获取行程异常: tripId={} body={}", tripId, response.body()); |
| | | return null; |
| | | } |
| | | /** |
| | | * 返回结果 |
| | |
| | | |
| | | return response.body(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 批量获取行程 |
| | | * @param vehicleId |
| | | * @param pageSize |
| | | * @param pageToken |
| | | * @return |
| | | */ |
| | | public String getTrips(String vehicleId, Integer pageSize, String pageToken) { |
| | | String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips:search"; |
| | | 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("activeTripsOnly", false); |
| | | if(null != pageSize){ |
| | | body.put("pageSize", pageSize); |
| | | } |
| | | if(null != pageToken){ |
| | | body.put("pageToken", pageToken); |
| | | } |
| | | logger.info("查询行程请求:{}", body); |
| | | post.body(body.toJSONString()); |
| | | HttpResponse response = post.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 null; |
| | | } |
| | | if(code == 401){ |
| | | String status = error.getString("status"); |
| | | if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){ |
| | | redisUtil.remove("google_token"); |
| | | return getTrips(vehicleId, pageSize, pageToken); |
| | | } |
| | | String reason = error.getJSONArray("details").getJSONObject(0).getString("reason"); |
| | | if(reason.equals("ACCESS_TOKEN_EXPIRED")){ |
| | | redisUtil.remove("google_token"); |
| | | return getTrips(vehicleId, pageSize, pageToken); |
| | | } |
| | | } |
| | | logger.error("获取行程异常:body={}", response.body()); |
| | | return null; |
| | | } |
| | | /** |
| | | * 返回结果 |
| | | * { |
| | | * "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(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 上报google可结算订单 |
| | | * @param tripId 行程id |
| | | * @return |
| | | */ |
| | | public boolean reportBillableEvent(String tripId) { |
| | | log.info("行程上报:{}", tripId); |
| | | String billableEventId = UUIDUtil.getRandomCode(); |
| | | String url = "https://mobilitybilling.googleapis.com/v1:reportBillableEvent?regionCode=GH&key=" + key + "&billableEventId=" + billableEventId; |
| | | 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("related_ids", "[\"" + tripId + "\"]"); |
| | | body.put("regionCode", "GH"); |
| | | post.body(body.toJSONString()); |
| | | //上线客户测试和上线运营开放 |
| | | // HttpResponse response = post.execute(); |
| | | // if(200 != response.getStatus()){ |
| | | // logger.error("google地图上报结算 tripId:{} 异常:{}", tripId,response.body()); |
| | | // return false; |
| | | // } |
| | | return true; |
| | | } |
| | | |
| | | } |