zhibing.pu
2024-05-27 b79eed290aa7f76545c1ad4b465362cec6b88bc9
修改
5个文件已修改
4个文件已添加
1192 ■■■■■ 已修改文件
UserIGOTravel/guns-admin/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/controller/OrderLogisticsController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.tld 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java 895 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/GoogleMapUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
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()));
            }
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);
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());
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/CarModelMapper.java
New file
@@ -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> {
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/CarModelMapper.tld
New file
@@ -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>
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/CarModel.java
New file
@@ -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 +
                '}';
    }
}
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
New file
@@ -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();
    }
}
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";
    /**