From b79eed290aa7f76545c1ad4b465362cec6b88bc9 Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期一, 27 五月 2024 17:24:27 +0800
Subject: [PATCH] 修改
---
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java | 99 ++++
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.tld | 6
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java | 120 ++++++
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java | 895 ++++++++++++++++++++++++++++++++++++++++++++
UserIGOTravel/guns-admin/pom.xml | 7
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java | 40 +
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java | 12
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java | 11
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/GoogleMapUtil.java | 2
9 files changed, 1,183 insertions(+), 9 deletions(-)
diff --git a/UserIGOTravel/guns-admin/pom.xml b/UserIGOTravel/guns-admin/pom.xml
index 09ff01d..3ca1bae 100644
--- a/UserIGOTravel/guns-admin/pom.xml
+++ b/UserIGOTravel/guns-admin/pom.xml
@@ -259,6 +259,13 @@
<artifactId>font-asian</artifactId>
<version>7.1.13</version>
</dependency>
+
+ <!--Google ODRD-->
+ <dependency>
+ <groupId>com.google.maps</groupId>
+ <artifactId>fleetengine-auth</artifactId>
+ <version>1.11.0</version>
+ </dependency>
</dependencies>
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java
index 214e75f..c1ed62c 100644
--- a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java
@@ -316,8 +316,16 @@
orderTimeInfo.setStartServiceTime(sdf.format(orderLogistics.getStartServiceTime()));
}
long time = System.currentTimeMillis() - orderLogistics.getSnatchOrderTime().getTime() / 60000;
- //TODO 待翻译
- orderTimeInfo.setUsedTime(Double.valueOf(time / 60).intValue() + "小时" + time % 60 + "分钟");
+
+ int h = Double.valueOf(time / 60).intValue();
+ long m = time % 60;
+ String usedTime = "";
+ if(0 == h){
+ usedTime = language == 1 ? m + "分钟" : language == 2 ? m + "-minute" : m + "-minute";
+ }else{
+ usedTime = language == 1 ? h + "小时" + m + "分钟" : language == 2 ? h + "-hour" + m + "-minute" : h + "-hour" + m + "-minute";
+ }
+ orderTimeInfo.setUsedTime(usedTime);
if(null != orderLogistics.getEndServiceTime()){
orderTimeInfo.setEndServiceTime(sdf.format(orderLogistics.getEndServiceTime()));
}
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
index 20b67fb..b51a178 100644
--- a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -198,6 +198,15 @@
@Autowired
private IUserActivityRedenvelopeService userActivityRedenvelopeService;
+
+ @Autowired
+ private FleetEngineUtil fleetEngineUtil;
+
+ @Resource
+ private CarModelMapper carModelMapper;
+
+ @Autowired
+ private ICarService carService;
@@ -683,6 +692,26 @@
orderLogistics.setIsDelete(1);
this.insert(orderLogistics);
+
+ Integer vehicleId = null;
+ if(null != orderLogistics.getDriverId()){
+ Driver driver = driverService.selectById(orderLogistics.getDriverId());
+ vehicleId = driver.getCarId();
+ //查询车辆信息,没有则创建信息
+ String vehicles = fleetEngineUtil.getVehicles(vehicleId);
+ if(ToolUtil.isEmpty(vehicles)){
+ Car car = carService.selectById(vehicleId);
+ CarModel carModel = carModelMapper.selectById(car.getCarModelId());
+ fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), driver.getCarId());
+ fleetEngineUtil.updateVehicles("ONLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), driver.getCarId());
+ }
+
+ }
+ //创建行程数据
+ fleetEngineUtil.createTrip(vehicleId, 1, 4, orderLogistics.getId(),
+ orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
+
+
if(orderSource == 2){//扫码下单
new Thread(new Runnable() {
@Override
@@ -836,7 +865,7 @@
if(null != couponId){
//TODO 待翻译
if(null != redDeduction && 1 == redDeduction){
- return ResultUtil.error(language == 1 ? "优惠券和红包不能同时使用" : language == 2 ? "" : "", "");
+ return ResultUtil.error(language == 1 ? "优惠券和红包不能同时使用" : language == 2 ? "Coupons and lucky-promo cannot be used at the same time." : "Les coupons et les bonus ne peuvent pas être utilisés en même temps", "");
}
userCouponRecord = userCouponRecordService.selectById(couponId);
if(userCouponRecord.getCompanyId() != orderLogistics.getCompanyId()){
@@ -1100,6 +1129,13 @@
title_chinese.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderLogistics.getPayMoney());
Element xcf_chinese = document.getElementById("xcf_chinese");
xcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_chinese = document.getElementById("bcj_chinese");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_chinese_div = document.getElementById("bcj_chinese_div");
+ bcj_chinese_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_chinese = document.getElementById("yhq_chinese");
yhq_chinese.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -1160,6 +1196,13 @@
title_english.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
Element xcf_english = document.getElementById("xcf_english");
xcf_english.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_english = document.getElementById("bcj_english");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_english.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_english_div = document.getElementById("bcj_english_div");
+ bcj_english_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_english = document.getElementById("yhq_english");
yhq_english.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -1220,6 +1263,13 @@
title_french.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
Element xcf_french = document.getElementById("xcf_french");
xcf_french.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_french = document.getElementById("bcj_french");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_french.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_french_div = document.getElementById("bcj_french_div");
+ bcj_french_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_french = document.getElementById("yhq_french");
yhq_french.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -1503,6 +1553,13 @@
title_chinese.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderLogistics.getPayMoney());
Element xcf_chinese = document.getElementById("xcf_chinese");
xcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_chinese = document.getElementById("bcj_chinese");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_chinese_div = document.getElementById("bcj_chinese_div");
+ bcj_chinese_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_chinese = document.getElementById("yhq_chinese");
yhq_chinese.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -1563,6 +1620,13 @@
title_english.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
Element xcf_english = document.getElementById("xcf_english");
xcf_english.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_english = document.getElementById("bcj_english");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_english.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_english_div = document.getElementById("bcj_english_div");
+ bcj_english_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_english = document.getElementById("yhq_english");
yhq_english.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -1623,6 +1687,13 @@
title_french.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
Element xcf_french = document.getElementById("xcf_french");
xcf_french.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_french = document.getElementById("bcj_french");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_french.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_french_div = document.getElementById("bcj_french_div");
+ bcj_french_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_french = document.getElementById("yhq_french");
yhq_french.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -2008,6 +2079,13 @@
title_chinese.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderLogistics.getPayMoney());
Element xcf_chinese = document.getElementById("xcf_chinese");
xcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_chinese = document.getElementById("bcj_chinese");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_chinese_div = document.getElementById("bcj_chinese_div");
+ bcj_chinese_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_chinese = document.getElementById("yhq_chinese");
yhq_chinese.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -2068,6 +2146,13 @@
title_english.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
Element xcf_english = document.getElementById("xcf_english");
xcf_english.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_english = document.getElementById("bcj_english");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_english.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_english_div = document.getElementById("bcj_english_div");
+ bcj_english_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_english = document.getElementById("yhq_english");
yhq_english.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -2128,6 +2213,13 @@
title_french.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
Element xcf_french = document.getElementById("xcf_french");
xcf_french.text("GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN));
+ Element bcj_french = document.getElementById("bcj_french");
+ if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
+ bcj_french.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
+ }else{
+ Element bcj_french_div = document.getElementById("bcj_french_div");
+ bcj_french_div.remove();
+ }
if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
Element yhq_french = document.getElementById("yhq_french");
yhq_french.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
@@ -2469,7 +2561,10 @@
driver.setState(2);
driverService.updateById(driver);
}
-
+
+ //修改行程信息
+ fleetEngineUtil.updateTrip("CANCELED", null, null, 4, orderLogistics.getId(), null, null, null, null);
+
//添加消息
systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功取消包裹订单,谢谢使用!" : language == 2 ? "You've cancelled the delivery order successfully, thank you for using I-GO "
: "Vous avez annulé la commande de livraison avec succès, merci d’utiliser I-GO", orderLogistics.getUserId(), 1);
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 673d31a..bbcb17b 100644
--- a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -20,6 +20,7 @@
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.GoogleMap.DistancematrixVo;
+import com.stylefeng.guns.modular.system.util.GoogleMap.FleetEngineUtil;
import com.stylefeng.guns.modular.system.util.GoogleMap.GoogleMapUtil;
import com.stylefeng.guns.modular.system.util.GoogleMap.ReverseGeocodeVo;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayUtil;
@@ -199,6 +200,15 @@
@Autowired
private IRedEnvelopePaymentSettingsService redEnvelopePaymentSettingsService;
+
+ @Autowired
+ private FleetEngineUtil fleetEngineUtil;
+
+ @Resource
+ private CarModelMapper carModelMapper;
+
+ @Autowired
+ private ICarService carService;
@@ -345,6 +355,26 @@
orderPrivateCar.setIsReassign(1);
orderPrivateCar.setIsDelete(1);
this.insert(orderPrivateCar);
+
+
+ Integer vehicleId = null;
+ if(null != orderPrivateCar.getDriverId()){
+ Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+ vehicleId = driver.getCarId();
+ //查询车辆信息,没有则创建信息
+ String vehicles = fleetEngineUtil.getVehicles(vehicleId);
+ if(ToolUtil.isEmpty(vehicles)){
+ Car car = carService.selectById(vehicleId);
+ CarModel carModel = carModelMapper.selectById(car.getCarModelId());
+ fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), driver.getCarId());
+ fleetEngineUtil.updateVehicles("ONLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), driver.getCarId());
+ }
+
+ }
+ //创建行程数据
+ fleetEngineUtil.createTrip(vehicleId, 1, 1, orderPrivateCar.getId(),
+ orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(), orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
+
if(orderSource == 2){//扫码下单
new Thread(new Runnable() {
@@ -686,6 +716,10 @@
driver.setState(2);
driverService.updateById(driver);
}
+
+ //修改行程信息
+ fleetEngineUtil.updateTrip("CANCELED", null, null, 1, orderPrivateCar.getId(), null, null, null, null);
+
//添加消息
systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功取消出行订单,谢谢使用!" : language == 2 ? "You've cancelled the ride order successfully, thank you for using I-GO " : "Vous avez annulé la commande de course avec succès, merci d’utiliser I-GO", orderPrivateCar.getUserId(), 1);
@@ -994,9 +1028,8 @@
//计算优惠券
UserCouponRecord userCouponRecord = null;
if(null != couponId){
- //TODO 待翻译
if(null != redDeduction && 1 == redDeduction){
- return ResultUtil.error(language == 1 ? "优惠券和红包不能同时使用" : language == 2 ? "" : "", "");
+ return ResultUtil.error(language == 1 ? "优惠券和红包不能同时使用" : language == 2 ? "Coupons and lucky-promo cannot be used at the same time." : "Les coupons et les bonus ne peuvent pas être utilisés en même temps", "");
}
userCouponRecord = userCouponRecordService.selectById(couponId);
if(!userCouponRecord.getCompanyId().equals(orderPrivateCar.getCompanyId())){
@@ -1985,8 +2018,7 @@
query.setRedPacketActivityId(id.getId());
userRedPacketRecordService.updateById(query);
- // todo 待翻译
- String content = 1 == language ? ("您收到一个额度为GHS " + money + " 的红包,请查收") : 2 == language ? "" : "";
+ String content = 1 == language ? ("您收到一个额度为GHS " + money + " 的红包,请查收") : 2 == language ? "You have received a lucky promo of GHS " + money + ", please check" : "Vous avez reçu un bonus de GHS " + money + ", veuillez vérifier";
systemNoticeService.addSystemNotice(1, content, query.getUserId(), 1);
UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java
new file mode 100644
index 0000000..ab316a7
--- /dev/null
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java
@@ -0,0 +1,11 @@
+package com.stylefeng.guns.modular.system.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.system.model.CarModel;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/5/27 14:03
+ */
+public interface CarModelMapper extends BaseMapper<CarModel> {
+}
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.tld b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.tld
new file mode 100644
index 0000000..5961af1
--- /dev/null
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.tld
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.system.dao.CarModelMapper">
+
+
+</mapper>
\ No newline at end of file
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java
new file mode 100644
index 0000000..b923ded
--- /dev/null
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java
@@ -0,0 +1,120 @@
+package com.stylefeng.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+/**
+ * 车辆型号
+ */
+@TableName("t_car_model")
+public class CarModel {
+ /**
+ * 主键
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ @TableField("id")
+ private Integer id;
+ /**
+ * 名称
+ */
+ @TableField("name")
+ private String name;
+ /**
+ * 备注
+ */
+ @TableField("remark")
+ private String remark;
+ /**
+ * 添加时间
+ */
+ @TableField("insertTime")
+ private Date insertTime;
+ /**
+ * 状态(1=正常,2=删除)
+ */
+ @TableField("state")
+ private Integer state;
+ /**
+ * 座位数
+ */
+ @TableField("seat")
+ private Integer seat;
+ /**
+ * 车辆品牌id
+ */
+ @TableField("brandId")
+ private Integer brandId;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getRemark() {
+ return remark;
+ }
+
+ public void setRemark(String remark) {
+ this.remark = remark;
+ }
+
+ public Date getInsertTime() {
+ return insertTime;
+ }
+
+ public void setInsertTime(Date insertTime) {
+ this.insertTime = insertTime;
+ }
+
+ public Integer getState() {
+ return state;
+ }
+
+ public void setState(Integer state) {
+ this.state = state;
+ }
+
+ public Integer getSeat() {
+ return seat;
+ }
+
+ public void setSeat(Integer seat) {
+ this.seat = seat;
+ }
+
+ public Integer getBrandId() {
+ return brandId;
+ }
+
+ public void setBrandId(Integer brandId) {
+ this.brandId = brandId;
+ }
+
+ @Override
+ public String toString() {
+ return "CarModel{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", remark='" + remark + '\'' +
+ ", insertTime=" + insertTime +
+ ", state=" + state +
+ ", seat=" + seat +
+ ", brandId=" + brandId +
+ '}';
+ }
+}
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
new file mode 100644
index 0000000..cb511e9
--- /dev/null
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
@@ -0,0 +1,895 @@
+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();
+ }
+}
diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/GoogleMapUtil.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/GoogleMapUtil.java
index f15c5f7..74dce96 100644
--- a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/GoogleMapUtil.java
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/GoogleMapUtil.java
@@ -11,7 +11,7 @@
*/
public class GoogleMapUtil {
- private final static String key = "AIzaSyA_FEliOkbkL1IAHQsnBpbpo9MlIp729H0";
+ private final static String key = "AIzaSyCG6PsfkaCEc94VK2vIAZk1YYKvOS_Ewts";
/**
--
Gitblit v1.7.1