From 20fb7c22fd9d4a936a2e9f4b003da51a0c2a0217 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 25 四月 2025 18:11:19 +0800
Subject: [PATCH] 修改bug

---
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java                     |  197 +++++-
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java              |    8 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java        |  639 +++++++++++++++++--
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java                  |    2 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java                             |  231 +++++++
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java    |  126 +--
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java                                 |   35 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java                       |   46 +
 ManagementIGOTravel/guns-admin/pom.xml                                                                                                 |    8 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java |    8 
 ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml                                                              |    5 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java                   |  239 +++++++
 ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml                                                                  |    5 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java                              |   39 +
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java                                     |  105 --
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java                                |    1 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java                           |   45 +
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java  |   21 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java                      |    4 
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java                             |   50 +
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java                              |   60 +
 ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java                  |   14 
 22 files changed, 1,572 insertions(+), 316 deletions(-)

diff --git a/ManagementIGOTravel/guns-admin/pom.xml b/ManagementIGOTravel/guns-admin/pom.xml
index 251aabf..9bb7061 100644
--- a/ManagementIGOTravel/guns-admin/pom.xml
+++ b/ManagementIGOTravel/guns-admin/pom.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
    
@@ -64,11 +64,9 @@
             <artifactId>spring-boot-devtools</artifactId>
             <optional>true</optional>
         </dependency>
-
         <dependency>
-            <groupId>redis.clients</groupId>
-            <artifactId>jedis</artifactId>
-            <version>2.9.0</version>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 
         <!-- 导入Excel数据依赖 start -->
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java
index a2dada8..2352ca2 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java
@@ -1,7 +1,5 @@
 package com.stylefeng.guns.modular.system.controller.general;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.stylefeng.guns.core.shiro.ShiroKit;
@@ -170,16 +168,12 @@
         }
         List<TDriver> tDrivers = tDriverService.selectList(ne1);
         String keys = "";
+        List<String> list = new ArrayList<>();
         for(TDriver driver : tDrivers){
-            keys += "DRIVER" + driver.getId() + ",";
+            String value = redisUtil.getValue("DRIVER" + driver.getId());
+            list.add(value);
         }
-        if(keys.length() > 1){
-            String value = redisUtil.getValues(keys.substring(0, keys.length() - 1));
-            JSONArray jsonArray = JSON.parseArray(value);
-            map1.put("netcardriver", jsonArray.size());  //在线司机
-        }else{
-            map1.put("netcardriver", 0);  //在线司机
-        }
+        map1.put("netcardriver", list.size());  //在线司机
 
         Wrapper<TOrderTaxi> travelTime1 = new EntityWrapper<TOrderTaxi>().between("travelTime", calendar1.getTime(), calendar2.getTime());
         if(companyId != null){
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java
index eeec482..46ca401 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java
@@ -1,36 +1,34 @@
 package com.stylefeng.guns.modular.system.controller.general;
 
-import cn.hutool.system.UserInfo;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.stylefeng.guns.core.base.controller.BaseController;
 import com.stylefeng.guns.core.common.constant.factory.PageFactory;
+import com.stylefeng.guns.core.log.LogObjectHolder;
 import com.stylefeng.guns.core.shiro.ShiroKit;
-import com.stylefeng.guns.core.shiro.ShiroUser;
 import com.stylefeng.guns.core.util.DateUtil;
 import com.stylefeng.guns.core.util.SinataUtil;
-import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
 import com.stylefeng.guns.modular.system.model.TUser;
+import com.stylefeng.guns.modular.system.model.User;
 import com.stylefeng.guns.modular.system.model.UserRedPacketRecord;
-import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
-import com.stylefeng.guns.modular.system.service.ITUserService;
-import com.stylefeng.guns.modular.system.service.IUserRedPacketRecordService;
-import com.stylefeng.guns.modular.system.service.impl.UserServiceImpl;
+import com.stylefeng.guns.modular.system.service.*;
 import com.stylefeng.guns.modular.system.util.ResultUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.beans.factory.annotation.Autowired;
-import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
-import com.stylefeng.guns.modular.system.model.SysRedPacketRecord;
-import com.stylefeng.guns.modular.system.service.ISysRedPacketRecordService;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.math.RoundingMode;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
 
 /**
  * 控制器
@@ -42,13 +40,19 @@
 @RequestMapping("/sysRedPacketRecord")
 public class SysRedPacketRecordController extends BaseController {
 
-    private String PREFIX = "/system/sysRedPacketRecord/";
+    private final String PREFIX = "/system/sysRedPacketRecord/";
 
     @Autowired
     private ISysRedPacketRecordService sysRedPacketRecordService;
     @Autowired
     private IUserRedPacketRecordService userRedPacketRecordService;
-
+    @Autowired
+    private ITSystemNoticeService systemNoticeService;
+    @Autowired
+    private ITUserService userService;
+    
+    @Autowired
+    private IUserService iUserService;
 
     @RequestMapping("/redRecord")
     public String index( Model model,Integer couponActivityId,Integer activityType) {
@@ -56,7 +60,6 @@
         model.addAttribute("couponActivityId",couponActivityId);
         return PREFIX + "userRedRecord.html";
     }
-
 
     /**
      * 跳转到首页
@@ -89,14 +92,6 @@
         LogObjectHolder.me().set(sysRedPacketRecord);
         return PREFIX + "sysRedPacketRecord_edit.html";
     }
-
-
-    @Autowired
-    private ITSystemNoticeService systemNoticeService;
-
-    @Autowired
-    private ITUserService userService;
-
 
     @RequestMapping(value = "/direct")
     @ResponseBody
@@ -138,50 +133,51 @@
 //            }
 
         }
-        String[] split = ids.split(",");
+        User user = iUserService.selectById(ShiroKit.getUser().getId());
+	    String[] split = ids.split(",");
         for (String s : split) {
-        if(money > 0||sysRedPacketRecord.getType()!=1){
-            if (sysRedPacketRecord.getType()!=1){
-                Double startMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getStartMoney()));
-                Double endMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getEndMoney()));
-                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
-                Random random = new Random();
-                int num;
-                if (!startMoney.equals(endMoney)){
-                     num = random.nextInt(i);
-
-                }else {
-                    num = 0;
+            if(money > 0||sysRedPacketRecord.getType()!=1){
+                if (sysRedPacketRecord.getType()!=1){
+                    Double startMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getStartMoney()));
+                    Double endMoney = Double.valueOf(String.valueOf(sysRedPacketRecord.getEndMoney()));
+                    int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
+                    Random random = new Random();
+                    int num;
+                    if (!startMoney.equals(endMoney)){
+                         num = random.nextInt(i);
+    
+                    }else {
+                        num = 0;
+                    }
+                    money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+                    v=v-money;
+                    if (v<0){
+                        return ResultUtil.success("当前红包为随机红包,可能有部分用户无法领取",null,"当前红包为随机红包,可能有部分用户无法领取");
+                    }
                 }
-                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-                v=v-money;
-                if (v<0){
-                    return ResultUtil.success("当前红包为随机红包,可能有部分用户无法领取",null,"当前红包为随机红包,可能有部分用户无法领取");
+                //添加临时红包数据
+                UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
+                userRedPacketRecord.setMoney(money);
+                userRedPacketRecord.setRemainingAmount(money);
+                userRedPacketRecord.setInsertTime(new Date());
+                userRedPacketRecord.setCompanyId(user.getObjectId());
+                userRedPacketRecord.setState(1);
+                userRedPacketRecord.setOrderId(null);
+                // 标记为后台发放的红包
+                userRedPacketRecord.setIsGrant(1);
+                userRedPacketRecord.setRedPacketActivityId(redId);
+    //            userRedPacketRecord.setOrderType(3);
+                userRedPacketRecord.setUserId(Integer.valueOf(s));
+                userRedPacketRecordService.insert(userRedPacketRecord);
+    
+                TUser tUser = userService.selectById(Integer.valueOf(s));
+                Integer language = tUser.getLanguage();
+                try {
+                    systemNoticeService.addSystemNotice(1, language == 1 ? "您收到一个额度为GHS"+money+"的红包,请查收。" : language == 2 ? "You have received a red envelope with a limit of GHS"+money+". Please check it." : "Vous recevez un paquet rouge avec une limite de ghs+"+money+", veuillez vérifier.", tUser.getId());
+                }catch (Exception e){
+                    e.printStackTrace();
                 }
             }
-            //添加临时红包数据
-            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
-            userRedPacketRecord.setMoney(money);
-            userRedPacketRecord.setRemainingAmount(money);
-            userRedPacketRecord.setInsertTime(new Date());
-            userRedPacketRecord.setCompanyId(1);
-            userRedPacketRecord.setState(1);
-            userRedPacketRecord.setOrderId(null);
-            // 标记为后台发放的红包
-            userRedPacketRecord.setIsGrant(1);
-            userRedPacketRecord.setRedPacketActivityId(redId);
-//            userRedPacketRecord.setOrderType(3);
-            userRedPacketRecord.setUserId(Integer.valueOf(s));
-            userRedPacketRecordService.insert(userRedPacketRecord);
-
-            TUser tUser = userService.selectById(Integer.valueOf(s));
-            Integer language = tUser.getLanguage();
-            try {
-                systemNoticeService.addSystemNotice(1, language == 1 ? "您收到一个额度为GHS"+money+"的红包,请查收。" : language == 2 ? "You have received a red envelope with a limit of GHS"+money+". Please check it." : "Vous recevez un paquet rouge avec une limite de ghs+"+money+", veuillez vérifier.", tUser.getId());
-            }catch (Exception e){
-                e.printStackTrace();
-            }
-        }
         }
         return ResultUtil.success("指派成功",null,"当前红包为随机红包,可能有部分用户无法领取");
     }
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java
index d943f34..c87bbdf 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java
@@ -9,19 +9,18 @@
 import com.stylefeng.guns.modular.system.model.*;
 import com.stylefeng.guns.modular.system.service.ITCarService;
 import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService;
 import com.stylefeng.guns.modular.system.service.ITUserService;
 import com.stylefeng.guns.modular.system.util.GoogleMap.FleetEngineUtil;
 import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
 import com.stylefeng.guns.modular.system.util.PushURL;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.beans.factory.annotation.Autowired;
-import com.stylefeng.guns.core.log.LogObjectHolder;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
-import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
 import java.util.Arrays;
@@ -55,9 +54,8 @@
     
     @Resource
     private ITCarService carService;
-    
-    
-    
+    @Autowired
+    private ITDriverService itDriverService;
 
     /**
      * 跳转到小件物流订单首页
@@ -113,9 +111,6 @@
         return super.packForBT(page);
     }
 
-    @Autowired
-    private ITDriverService itDriverService;
-
     /**
      * 取消小件物流订单
      */
@@ -151,10 +146,10 @@
         //修改行程信息
         TCar car = carService.selectById(tOrderLogistics.getCarId());
         //修改行程信息
-        boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null);
+        boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null, tOrderLogistics.getId(), 4);
         if(!updateTrip){
             for (int i = 0; i < 5; i++) {
-                updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null);
+                updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderLogistics.getTripId(), null, null, null, null, tOrderLogistics.getId(), 4);
                 if(updateTrip){
                     tOrderLogistics.setIsover(1);
                     tOrderLogisticsService.updateById(tOrderLogistics);
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java
index 6bc49db..1beddb3 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java
@@ -281,10 +281,10 @@
             tOrderPrivateCarService.updateById(orderPrivateCar);
     
             //修改行程数据
-            boolean updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null);
+            boolean updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1);
             if(!updateTrip){
                 for (int i = 0; i < 5; i++) {
-                    updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null);
+                    updateTrip = fleetEngineUtil.updateTrip("COMPLETE", null, null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1);
                     if(updateTrip){
                         orderPrivateCar.setIsover(1);
                         tOrderPrivateCarService.updateById(orderPrivateCar);
@@ -639,10 +639,10 @@
         //修改行程信息
         TCar car = carService.selectById(tOrderPrivateCar.getCarId());
         //修改行程信息
-        boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null);
+        boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null, tOrderPrivateCar.getId(), 1);
         if(!updateTrip){
             for (int i = 0; i < 5; i++) {
-                updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null);
+                updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, tOrderPrivateCar.getTripId(), null, null, null, null, tOrderPrivateCar.getId(), 1);
                 if(updateTrip){
                     tOrderPrivateCar.setIsover(1);
                     tOrderPrivateCarService.updateById(tOrderPrivateCar);
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java
index 1aaec3e..6e03051 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java
@@ -1,5 +1,7 @@
 package com.stylefeng.guns.modular.system.controller.specialTrain;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.plugins.Page;
 import com.stylefeng.guns.core.base.controller.BaseController;
@@ -8,13 +10,21 @@
 import com.stylefeng.guns.core.shiro.ShiroKit;
 import com.stylefeng.guns.core.shiro.ShiroUser;
 import com.stylefeng.guns.core.util.SinataUtil;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.controller.util.PushUtil;
 import com.stylefeng.guns.modular.system.dao.LineShiftDriverMapper;
 import com.stylefeng.guns.modular.system.dao.OrderCancelMapper;
+import com.stylefeng.guns.modular.system.dao.TCarModelMapper;
 import com.stylefeng.guns.modular.system.model.*;
 import com.stylefeng.guns.modular.system.service.*;
-import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
-import com.stylefeng.guns.modular.system.util.PushURL;
-import com.stylefeng.guns.modular.system.util.ResultUtil;
+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.*;
+import com.stylefeng.guns.modular.system.util.quartz.QuartzUtil;
+import com.stylefeng.guns.modular.system.util.quartz.jobs.OrderTimeOutJob;
+import org.apache.shiro.util.StringUtils;
+import org.quartz.JobDataMap;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -25,11 +35,12 @@
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * 专车改派管理控制器
@@ -45,6 +56,9 @@
 
     @Autowired
     private ITReassignService tReassignService;
+    
+    @Autowired
+    private PushUtil pushUtil;
 
     @Autowired
     private ITOrderPrivateCarService itOrderPrivateCarService;
@@ -83,6 +97,32 @@
     private ITOrderLogisticsService orderLogisticsService;
     @Autowired
     private ITPubTransactionDetailsService itPubTransactionDetailsService;
+    
+    @Resource
+    private QuartzUtil quartzUtil;
+    
+    @Resource
+    private FleetEngineUtil fleetEngineUtil;
+    
+    @Resource
+    private TCarModelMapper carModelMapper;
+    
+    @Resource
+    private ITCarService carService;
+    
+    @Resource
+    private RedisUtil redisUtil;
+    
+    @Resource
+    private ITSysOverTimeService sysOvertimeService;
+    
+    @Resource
+    private ITSysCancleOrderService cancleOrderService;
+    
+    @Resource
+    private ITSystemNoticeService systemNoticeService;
+    
+    
 
     /**
      * 跳转到专车改派管理首页
@@ -585,40 +625,303 @@
     @RequestMapping(value = "/selectDriver")
     @ResponseBody
     public Object selectDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) {
-        //修改订单
-        TReassign tReassign = tReassignService.selectById(orderId);
-        TOrderPrivateCar tOrderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId());
-
-        //修改之前司机状态 -- 空闲
-        TDriver oldDriver = itDriverService.selectById(tReassign.getOriginalDriverId());
-        oldDriver.setState(2);
-        itDriverService.updateById(oldDriver);
-
-        //查找司机对象
-        TDriver nowDriver = itDriverService.selectById(driverId);
-        nowDriver.setState(3);
-        itDriverService.updateById(nowDriver);
-
-        //修改专车订单
-        tOrderPrivateCar.setState(tOrderPrivateCar.getOldState());
-        tOrderPrivateCar.setDriverId(driverId);
-        tOrderPrivateCar.setCarId(nowDriver.getCarId());
-        itOrderPrivateCarService.updateById(tOrderPrivateCar);
-
-        //修改专车改派订单
-        tReassign.setNowDriverId(driverId);
-        tReassign.setNowCarId(nowDriver.getCarId());
-        tReassign.setState(3);
-        tReassign.setCompleteTime(new Date());
-        tReassignService.updateById(tReassign);
-
-        //增加推送
-        Map<String,String> map = new HashMap<>();
-        map.put("orderId", tOrderPrivateCar.getId().toString());
-        map.put("orderType", "1");
-        String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map);
-        System.out.println("专车改派:【orderId="+tOrderPrivateCar.getId().toString()+"】,调用接口:"+result);
-        return SUCCESS_TIP;
+        try {
+            //修改订单
+            TReassign tReassign = tReassignService.selectById(orderId);
+            TOrderPrivateCar orderPrivateCar = itOrderPrivateCarService.selectById(tReassign.getOrderId());
+            String tripId = redisUtil.getValue("trip" + orderPrivateCar.getUserId());
+            TDriver driver = itDriverService.selectById(orderPrivateCar.getDriverId());
+            TDriver driver1 = itDriverService.selectById(driverId);
+            
+            String text = "";
+            tReassign.setState(3);
+            tReassign.setNowDriverId(driver1.getId());
+            tReassign.setNowCarId(driver1.getCarId());
+            tReassign.setCompleteTime(new Date());
+            tReassignService.updateById(tReassign);
+    
+    
+            Integer language1 = driver1.getLanguage();
+            switch (language1){
+                case 1:
+                    text = "收到新的打车订单,从" + orderPrivateCar.getStartAddress() + "出发,全程约" + orderPrivateCar.getEstimatedMileage() + "公里";
+                    break;
+                case 2:
+                    text = "Received a new ride order, starting from " + orderPrivateCar.getStartAddress() + ", the whole journey is about " + orderPrivateCar.getEstimatedMileage() + "kilometre";
+                    break;
+                case 3:
+                    text = "Reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage();
+                    break;
+        
+            }
+            String audioUrl = "";
+            String fileName = "pushOrder" + orderPrivateCar.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
+            try {
+                audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            //定时任务删除语音文件
+            new Timer().schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    try {
+                        // 使用Runtime执行命令
+                        Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
+                        // 读取命令的输出
+                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+                        String line;
+                        while ((line = reader.readLine()) != null) {
+                            System.out.println(line);
+                        }
+                        // 等待命令执行完成
+                        process.waitFor();
+                        // 关闭流
+                        reader.close();
+                    } catch (IOException | InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }, 30000);
+    
+            orderPrivateCar.setDriverId(driver1.getId());
+            orderPrivateCar.setCarId(driver1.getCarId());
+            orderPrivateCar.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
+                    driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
+            orderPrivateCar.setSnatchOrderTime(new Date());
+            orderPrivateCar.setState(orderPrivateCar.getOldState());
+            orderPrivateCar.setOldState(null);
+            if(!StringUtils.hasLength(orderPrivateCar.getTripId())){
+                orderPrivateCar.setTripId(UUIDUtil.getRandomCode());
+            }
+    
+            if(orderPrivateCar.getOrderType() == 1){
+                String value = redisUtil.getValue("DRIVER" + driver1.getId());
+                if(ToolUtil.isNotEmpty(value)) {
+                    String[] split = value.split(",");
+                    DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
+                    //超时时间
+                    long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
+                    orderPrivateCar.setEstimateArriveTime(new Date(timeOut));
+                    orderPrivateCar.setEstimateArriveMileage(distancematrix.getDistance());
+                }
+            }
+            itOrderPrivateCarService.updateAllColumnById(orderPrivateCar);
+            driver1.setState(3);
+            itDriverService.updateById(driver1);
+    
+            driver.setState(2);
+            itDriverService.updateById(driver);
+    
+            //检查google车辆信息或者添加新的车辆信息
+            TCar car = carService.selectById(orderPrivateCar.getCarId());
+            if(ToolUtil.isEmpty(car.getVehicleId())){
+                car.setVehicleId(UUIDUtil.getRandomCode());
+                carService.updateById(car);
+            }
+            String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
+            if(ToolUtil.isEmpty(vehicles)){
+                TCarModel carModel = carModelMapper.selectById(car.getCarModelId());
+                boolean createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+                if(!createVehicles){
+                    for (int i = 0; i < 5; i++) {
+                        createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+                        if(createVehicles){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(3000L);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }
+    
+            //修改google订单信息或者创建新的行程
+            String trip = fleetEngineUtil.getTrip(orderPrivateCar.getTripId());
+            if(ToolUtil.isEmpty(trip)){
+                JSONObject createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(),
+                        orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(),  orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
+                JSONObject error = createTrip.getJSONObject("error");
+                if(null != error){
+                    for (int i = 0; i < 5; i++) {
+                        createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderPrivateCar.getTripId(),
+                                orderPrivateCar.getStartLat().toString(), orderPrivateCar.getStartLon().toString(),  orderPrivateCar.getEndLat().toString(), orderPrivateCar.getEndLon().toString());
+                        error = createTrip.getJSONObject("error");
+                        String tripStatus = createTrip.getString("tripStatus");
+                        if(null == error && "NEW".equals(tripStatus)){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(3000L);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }else{
+                //开始修改行程数据
+                boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1);
+                if(!updateTrip){
+                    for (int i = 0; i < 5; i++) {
+                        updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null, orderPrivateCar.getId(), 1);
+                        if(updateTrip){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(3000L);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }
+    
+    
+    
+            //删除定时任务
+            quartzUtil.deleteQuartzTask("1_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT");
+            quartzUtil.deleteQuartzTask("2_1_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT");
+            quartzUtil.deleteQuartzTask("2_2_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT");
+            quartzUtil.deleteQuartzTask("3_" + orderPrivateCar.getId() + "_1","ORDER_TIME_OUT");
+    
+            /**
+             * 超时用户取消不收费的提醒
+             *   预约单:行程时间 + 配置不收费的时间 > 当前时间 (只弹一次)
+             *   即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
+             *
+             * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
+             *
+             * 定时提醒弹框
+             *   司机只要开始超时且还未到达预约点,则需要定时提醒
+             *
+             * 预约单需要提前xx分钟提醒司机需要接乘客,过后每隔xx分钟提醒一次。超时后停止提醒
+             */
+    
+            //添加定时任务(普通任务)
+            TSysOverTime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<TSysOverTime>().eq("companyId", driver1.getCompanyId()));
+            if(null != reminderRules){
+                TSysCancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", driver1.getCompanyId()));
+                Integer driverTimeout = JSON.parseObject(cancleOrder.getContent()).getInteger("driverTimeout");
+        
+                //即时单
+                if(orderPrivateCar.getOrderType() == 1){
+                    //超时时间
+                    long timeOut = orderPrivateCar.getEstimateArriveTime().getTime() + (driverTimeout * 60 * 1000);
+                    //乘客取消不收费提醒
+                    JobDataMap jobDataMap = new JobDataMap();
+                    jobDataMap.put("driverId", driver1.getId());
+                    jobDataMap.put("timeOutType", 1);
+                    jobDataMap.put("orderId", orderPrivateCar.getId());
+                    jobDataMap.put("orderType", 1);
+                    jobDataMap.put("language", language1);
+                    jobDataMap.put("timeOut", timeOut);
+                    jobDataMap.put("driverTimeout", driverTimeout);
+                    jobDataMap.put("describe", language1 == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language1 == 2 ? "Reminder You are overdue for " + driverTimeout + " minutes The subscriber could cancel the order for free Confirm" : "Rappel Vous êtes en retard de " + driverTimeout + " minutes L’abonné peut annuler la commande gratuitement Confirmer");
+                    quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "1_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+                            , new Date(timeOut), timeOut, 0);
+            
+                    //超时循环提醒
+                    jobDataMap = new JobDataMap();
+                    jobDataMap.put("driverId", driver1.getId());
+                    jobDataMap.put("timeOutType", 3);
+                    jobDataMap.put("orderId", orderPrivateCar.getId());
+                    jobDataMap.put("orderType", 1);
+                    jobDataMap.put("language", language1);
+                    jobDataMap.put("timeOut", orderPrivateCar.getEstimateArriveTime().getTime());
+                    jobDataMap.put("driverTimeout", 0);
+                    jobDataMap.put("describe", "");
+                    quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+                            , orderPrivateCar.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1);
+                }else{
+                    //超时时间
+                    long timeOut = orderPrivateCar.getTravelTime().getTime() + (driverTimeout * 60000);
+                    //乘客取消不收费提醒
+                    JobDataMap jobDataMap = new JobDataMap();
+                    jobDataMap.put("driverId", driver1.getId());
+                    jobDataMap.put("timeOutType", 1);
+                    jobDataMap.put("orderId", orderPrivateCar.getId());
+                    jobDataMap.put("orderType", 1);
+                    jobDataMap.put("language", language1);
+                    jobDataMap.put("timeOut", timeOut);
+                    jobDataMap.put("driverTimeout", driverTimeout);
+                    jobDataMap.put("describe", language1 == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language1 == 2 ? "Reminder You are overdue for " + driverTimeout + " minutes The subscriber could cancel the order for free Confirm" : "Rappel Vous êtes en retard de " + driverTimeout + " minutes L’abonné peut annuler la commande gratuitement Confirmer");
+                    quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "1_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+                            , new Date(timeOut), timeOut, 0);
+            
+            
+                    TUser userInfo = userService.selectById(orderPrivateCar.getUserId());
+            
+                    //预约单出发首次提醒
+                    long travelTime = orderPrivateCar.getTravelTime().getTime() - reminderRules.getReserveTime() * 60000;
+                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+                    jobDataMap = new JobDataMap();
+                    jobDataMap.put("driverId", driver1.getId());
+                    jobDataMap.put("timeOutType", 2);
+                    jobDataMap.put("orderId", orderPrivateCar.getId());
+                    jobDataMap.put("orderType", 1);
+                    jobDataMap.put("language", language1);
+                    jobDataMap.put("timeOut", timeOut);
+                    jobDataMap.put("driverTimeout", 0);
+                    jobDataMap.put("describe", language1 == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName())  + ",请准时!" :
+                            language1 == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
+                                    "Vous allez chercher " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " à " + sdf.format(orderPrivateCar.getTravelTime()) + ", s’il vous plaît soyez à l’heure.");
+                    quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "2_1_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+                            , new Date(travelTime), travelTime, 0);
+            
+                    //预约单出发循环提醒
+                    jobDataMap = new JobDataMap();
+                    jobDataMap.put("driverId", driver1.getId());
+                    jobDataMap.put("timeOutType", 2);
+                    jobDataMap.put("orderId", orderPrivateCar.getId());
+                    jobDataMap.put("orderType", 1);
+                    jobDataMap.put("language", language1);
+                    jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime());
+                    jobDataMap.put("driverTimeout", 0);
+                    jobDataMap.put("describe", language1 == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName())  + ",请准时!" :
+                            language1 == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
+                                    "Vous allez chercher " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " à " + sdf.format(orderPrivateCar.getTravelTime()) + ", s’il vous plaît soyez à l’heure.");
+                    quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "2_2_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+                            , new Date(travelTime + reminderRules.getReserveNext() * 60000), reminderRules.getReserveNext() * 60000, -1);
+            
+                    //超时循环提醒
+                    jobDataMap = new JobDataMap();
+                    jobDataMap.put("driverId", driver1.getId());
+                    jobDataMap.put("timeOutType", 3);
+                    jobDataMap.put("orderId", orderPrivateCar.getId());
+                    jobDataMap.put("orderType", 1);
+                    jobDataMap.put("language", language1);
+                    jobDataMap.put("timeOut", orderPrivateCar.getTravelTime().getTime());
+                    jobDataMap.put("driverTimeout", 0);
+                    jobDataMap.put("describe", "");
+                    quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderPrivateCar.getId() + "_1", "ORDER_TIME_OUT", jobDataMap
+                            , orderPrivateCar.getTravelTime(), reminderRules.getCar() * 60000, -1);
+                }
+            }
+    
+            //推送相关代码------------------start----------------
+            String finalAudioUrl = audioUrl;
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderReassign(orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, "");
+                    pushUtil.pushOrderReassign(orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, finalAudioUrl);
+                }
+            }).start();
+    
+            Integer language2 = userService.selectById(orderPrivateCar.getUserId()).getLanguage();
+            systemNoticeService.addSystemNotice(2, language1 == 1 ? "您已成功抢得打车订单,请及时联系客户!" :
+                    language1 == 2 ? "You have grabbed the ride order, please contact the client timely."
+                            : "Vous avez saisi la commande de course, veuillez contacter le client en temps opportun.", orderPrivateCar.getDriverId());
+            systemNoticeService.addSystemNotice(1, language2 == 1 ? "您的订单已指派给" + driver1.getFirstName() + "师傅,请保持电话畅通!" :
+                    language2 == 2 ? "Your order has been assigned to the driver- " + driver1.getFirstName() + ", please keep your line on."
+                            : "Votre commande a été attribuée au chauffeur- " + driver1.getFirstName() + ", S'il vous plaît, restez en ligne.", orderPrivateCar.getUserId());
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return ERROR;
     }
 
     /**
@@ -743,28 +1046,236 @@
     @ResponseBody
     public Object selectSmallDriver(@RequestParam Integer orderId,@RequestParam Integer driverId) {
         //修改订单
-        TReassign tReassign = tReassignService.selectById(orderId);
-        TOrderLogistics tOrderLogistics = orderLogisticsService.selectById(tReassign.getOrderId());
-
-        TDriver nowDriver = itDriverService.selectById(driverId);
-        //修改专车订单
-        tOrderLogistics.setState(tOrderLogistics.getOldState());
-        tOrderLogistics.setDriverId(driverId);
-        tOrderLogistics.setCarId(nowDriver.getCarId());
-        orderLogisticsService.updateById(tOrderLogistics);
-
-        tReassign.setNowDriverId(driverId);
-        tReassign.setNowCarId(nowDriver.getCarId());
-        tReassign.setState(3);
-        tReassign.setCompleteTime(new Date());
-        tReassignService.updateById(tReassign);
-
-        //增加推送
-        Map<String,String> map = new HashMap<>();
-        map.put("orderId", tOrderLogistics.getId().toString());
-        map.put("orderType", tOrderLogistics.getType().toString());
-        String result = HttpRequestUtil.postRequest(PushURL.order_push_url, map);
-        System.out.println("小件物流改派:【orderId="+tOrderLogistics.getId().toString()+"】,调用接口:"+result);
-        return SUCCESS_TIP;
+        try {
+            TReassign tReassign = tReassignService.selectById(orderId);
+            TOrderLogistics orderLogistics = orderLogisticsService.selectById(tReassign.getOrderId());
+            String tripId = redisUtil.getValue("trip" + orderLogistics.getUserId());
+            TDriver driver = itDriverService.selectById(orderLogistics.getDriverId());
+    
+            TDriver driver1 = itDriverService.selectById(driverId);
+            tReassign.setState(3);
+            tReassign.setNowDriverId(driver1.getId());
+            tReassign.setNowCarId(driver1.getCarId());
+            tReassign.setCompleteTime(new Date());
+            tReassignService.updateById(tReassign);
+    
+            String text = "";
+            Integer language1 = driver1.getLanguage();
+            switch (language1){
+                case 1:
+                    text = "收到新的包裹订单,从" + orderLogistics.getStartAddress() + "出发,全程约" + orderLogistics.getEstimatedMileage() + "公里";
+                    break;
+                case 2:
+                    text = "Received a new delivery order, starting from " + orderLogistics.getStartAddress() + ", the whole journey is about " + orderLogistics.getEstimatedMileage() + "kilometre";
+                    break;
+                case 3:
+                    text = "Reçu une nouvelle commande de livraison, à partir de " + orderLogistics.getStartAddress() + ", le trajet complet est d’environ " + orderLogistics.getEstimatedMileage();
+                    break;
+        
+            }
+            String audioUrl = "";
+            String fileName = null;
+            try {
+                fileName = "pushOrder" + driver1.getId() + UUIDUtil.getRandomCode(5) + ".mp3";
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            try {
+                audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            //定时任务删除语音文件
+            String finalFileName = fileName;
+            new Timer().schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    try {
+                        // 使用Runtime执行命令
+                        Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + finalFileName);
+                        // 读取命令的输出
+                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+                        String line;
+                        while ((line = reader.readLine()) != null) {
+                            System.out.println(line);
+                        }
+                        // 等待命令执行完成
+                        process.waitFor();
+                        // 关闭流
+                        reader.close();
+                    } catch (IOException | InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }, 30000);
+    
+    
+            orderLogistics.setDriverId(driver1.getId());
+            orderLogistics.setCarId(driver1.getCarId());
+            orderLogistics.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
+                    driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
+            orderLogistics.setState(orderLogistics.getOldState());
+            orderLogistics.setOldState(null);
+            orderLogistics.setSnatchOrderTime(new Date());
+            if(!StringUtils.hasLength(orderLogistics.getTripId())){
+                orderLogistics.setTripId(UUIDUtil.getRandomCode());
+            }
+            String value = redisUtil.getValue("DRIVER" + driver1.getId());
+            if(ToolUtil.isNotEmpty(value)) {
+                String[] split = value.split(",");
+                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
+                //超时时间
+                long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
+                orderLogistics.setEstimateArriveTime(new Date(timeOut));
+                orderLogistics.setEstimateArriveMileage(distancematrix.getDistance());
+            }
+            orderLogisticsService.updateAllColumnById(orderLogistics);
+            //修改司机为服务中
+            driver1.setState(3);
+            itDriverService.updateById(driver1);
+    
+            driver.setState(2);
+            itDriverService.updateById(driver);
+    
+            //检查google车辆信息或者添加新的车辆信息
+            TCar car = carService.selectById(orderLogistics.getCarId());
+            if(ToolUtil.isEmpty(car.getVehicleId())){
+                car.setVehicleId(UUIDUtil.getRandomCode());
+                carService.updateById(car);
+            }
+            String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
+            if(ToolUtil.isEmpty(vehicles)){
+                TCarModel carModel = carModelMapper.selectById(car.getCarModelId());
+                boolean createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+                if(!createVehicles){
+                    for (int i = 0; i < 5; i++) {
+                        createVehicles = fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
+                        if(createVehicles){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(3000L);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }
+    
+            //修改google订单信息或者创建新的行程
+            String trip = fleetEngineUtil.getTrip(orderLogistics.getTripId());
+            if(ToolUtil.isEmpty(trip)){
+                JSONObject createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(),
+                        orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
+                JSONObject error = createTrip.getJSONObject("error");
+                if(null != error){
+                    for (int i = 0; i < 5; i++) {
+                        createTrip = fleetEngineUtil.createTrip(car.getVehicleId(), 1, orderLogistics.getTripId(),
+                                orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
+                        error = createTrip.getJSONObject("error");
+                        String tripStatus = createTrip.getString("tripStatus");
+                        if(null == error && "NEW".equals(tripStatus)){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(3000L);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }else{
+                //开始修改行程数据
+                boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null, orderLogistics.getId(), 4);
+                if(!updateTrip){
+                    for (int i = 0; i < 5; i++) {
+                        updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null, orderLogistics.getId(), 4);
+                        if(updateTrip){
+                            break;
+                        }
+                        try {
+                            Thread.sleep(3000L);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+                }
+            }
+    
+    
+            //删除定时任务
+            quartzUtil.deleteQuartzTask("1_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT");
+            quartzUtil.deleteQuartzTask("2_1_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT");
+            quartzUtil.deleteQuartzTask("2_2_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT");
+            quartzUtil.deleteQuartzTask("3_" + orderLogistics.getId() + "_4","ORDER_TIME_OUT");
+    
+            /**
+             * 超时用户取消不收费的提醒
+             *   即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
+             *
+             * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
+             *
+             * 定时提醒弹框
+             *   司机只要开始超时且还未到达预约点,则需要定时提醒
+             */
+    
+            //添加定时任务(普通任务)
+            TSysOverTime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<TSysOverTime>().eq("companyId", driver1.getCompanyId()));
+            if(null != reminderRules){
+                TSysCancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<TSysCancleOrder>().eq("companyId", driver1.getCompanyId()));
+                Integer driverTimeout = JSON.parseObject(cancleOrder.getContent()).getInteger("driverTimeout");
+                //超时时间
+                long timeOut = orderLogistics.getEstimateArriveTime().getTime() + (driverTimeout * 60 * 1000);
+                //乘客取消不收费提醒
+                JobDataMap jobDataMap = new JobDataMap();
+                jobDataMap.put("driverId", driver1.getId());
+                jobDataMap.put("timeOutType", 1);
+                jobDataMap.put("orderId", orderLogistics.getId());
+                jobDataMap.put("orderType", 4);
+                jobDataMap.put("language", language1);
+                jobDataMap.put("timeOut", timeOut);
+                jobDataMap.put("driverTimeout", driverTimeout);
+                jobDataMap.put("describe", language1 == 1 ? "您已超时" + driverTimeout + "分钟,用户可免费取消订单" : language1 == 2 ? "Reminder You are overdue for " + driverTimeout + " minutes The subscriber could cancel the order for free Confirm" : "Rappel Vous êtes en retard de " + driverTimeout + " minutes L’abonné peut annuler la commande gratuitement Confirmer");
+                quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "1_" + orderLogistics.getId() + "_4", "ORDER_TIME_OUT", jobDataMap
+                        , new Date(timeOut), timeOut, 0);
+        
+                //超时循环提醒
+                jobDataMap = new JobDataMap();
+                jobDataMap.put("driverId", driver1.getId());
+                jobDataMap.put("timeOutType", 3);
+                jobDataMap.put("orderId", orderLogistics.getId());
+                jobDataMap.put("orderType", 4);
+                jobDataMap.put("language", language1);
+                jobDataMap.put("timeOut", orderLogistics.getEstimateArriveTime().getTime());
+                jobDataMap.put("driverTimeout", driverTimeout);
+                jobDataMap.put("describe", "");
+                quartzUtil.addSimpleQuartzTask(OrderTimeOutJob.class, "3_" + orderLogistics.getId() + "_4", "ORDER_TIME_OUT", jobDataMap
+                        , orderLogistics.getEstimateArriveTime(), reminderRules.getCar() * 60000, -1);
+            }
+    
+    
+            //推送相关代码------------------start----------------
+            String finalAudioUrl = audioUrl;
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderReassign(orderLogistics.getUserId(), 1, orderLogistics.getId(), 4, "");
+                    pushUtil.pushOrderReassign(orderLogistics.getDriverId(), 2, orderLogistics.getId(), 4, finalAudioUrl);
+                }
+            }).start();
+            Integer language2 = userService.selectById(orderLogistics.getUserId()).getLanguage();
+            systemNoticeService.addSystemNotice(2, language1 == 1 ? "您已成功抢得包裹订单,请及时联系客户!" :
+                    language1 == 2 ? "You have grabbed the delivery order, please contact the client timely."
+                            : "Vous avez saisi la commande du livraison. Veuillez contacter le client en temps opportun.", orderLogistics.getDriverId());
+            systemNoticeService.addSystemNotice(1, language2 == 1 ? "您的订单已指派给" + driver1.getFirstName() + "师傅,请保持电话畅通!" :
+                    language2 == 2 ? "Your order has been assigned to the driver- " + driver1.getFirstName() + ", please keep your line on."
+                            : "Votre commande a été attribuée au chauffeur- " + driver1.getFirstName() + ", S'il vous plaît, restez en ligne.", orderLogistics.getUserId());
+    
+    
+            return SUCCESS_TIP;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return ERROR;
     }
 }
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java
index 17be056..0bb57ae 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java
@@ -2,12 +2,9 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-
 import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil;
 import com.stylefeng.guns.modular.system.util.PushURL;
 import com.stylefeng.guns.modular.system.util.RedisUtil;
-
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
@@ -17,10 +14,9 @@
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.math.RoundingMode;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Timer;
 
 /**
  * socket推单处理类
@@ -387,4 +383,39 @@
             System.err.println(jsonObject1.getString("msg"));
         }
     }
+    
+    
+    /**
+     * 改派完成后推送用户端提醒
+     * @param uid
+     * @param orderId
+     * @param orderType
+     */
+    public void pushOrderReassign(Integer uid, Integer type, Integer orderId, Integer orderType, String audioUrl){
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("code", 200);
+        jsonObject.put("msg", "SUCCESS");
+        jsonObject.put("method", "REASSIGN");
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderId", orderId);
+        map.put("orderType", orderType);
+        map.put("audioUrl", audioUrl);
+        jsonObject.put("data", map);
+        
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", jsonObject.toJSONString());
+        params.add("id", String.valueOf(uid));
+        params.add("type", type.toString());
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject(PushURL.zull_user_url + "/netty/sendMsgToClient",requestEntity , String.class);
+        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject1.getIntValue("code") != 200){
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
 }
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java
index bb62023..47063d7 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java
@@ -43,6 +43,7 @@
     List<Map<String,Object>> getCanSelectPrivateCarDriverList(@Param("page") Page<Map<String, Object>> page,
                                                               @Param("serverCarModelId") Integer serverCarModelId,
                                                               @Param("driverId") Integer driverId,
+                                                              @Param("type") Integer type,
                                                               @Param("name") String name,
                                                               @Param("phone") String phone);
 
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java
index e0adbea..cc3de3d 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java
@@ -275,6 +275,21 @@
      */
     @TableField("serverCarModelId")
     private Integer serverCarModelId;
+    /**
+     * 预估里程
+     */
+    @TableField("estimatedMileage")
+    private Double estimatedMileage;
+    /**
+     * 司机预估到达预约单时间
+     */
+    @TableField("estimateArriveTime")
+    private Date estimateArriveTime;
+    /**
+     * 司机预估距离预约点距离(米)
+     */
+    @TableField("estimateArriveMileage")
+    private Long estimateArriveMileage;
 
     public Integer getOldState() {
         return oldState;
@@ -773,6 +788,30 @@
         this.serverCarModelId = serverCarModelId;
     }
     
+    public Double getEstimatedMileage() {
+        return estimatedMileage;
+    }
+    
+    public void setEstimatedMileage(Double estimatedMileage) {
+        this.estimatedMileage = estimatedMileage;
+    }
+    
+    public Date getEstimateArriveTime() {
+        return estimateArriveTime;
+    }
+    
+    public void setEstimateArriveTime(Date estimateArriveTime) {
+        this.estimateArriveTime = estimateArriveTime;
+    }
+    
+    public Long getEstimateArriveMileage() {
+        return estimateArriveMileage;
+    }
+    
+    public void setEstimateArriveMileage(Long estimateArriveMileage) {
+        this.estimateArriveMileage = estimateArriveMileage;
+    }
+    
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
index 7ebc08a..d80cd40 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java
@@ -1,15 +1,15 @@
 package com.stylefeng.guns.modular.system.model;
 
-import com.baomidou.mybatisplus.annotations.TableField;
-import com.baomidou.mybatisplus.enums.IdType;
-import java.math.BigDecimal;
-import java.util.Date;
-import com.baomidou.mybatisplus.annotations.TableId;
 import com.baomidou.mybatisplus.activerecord.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 lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * <p>
@@ -336,6 +336,22 @@
      */
     @TableField("isDispute")
     private Integer isDispute;
+    /**
+     * 司机预估到达预约单时间
+     */
+    @TableField("estimateArriveTime")
+    private Date estimateArriveTime;
+    
+    /**
+     * 司机预估距离预约点距离(米)
+     */
+    @TableField("estimateArriveMileage")
+    private Long estimateArriveMileage;
+    /**
+     * 预估里程
+     */
+    @TableField("estimatedMileage")
+    private Double estimatedMileage;
 
     public Integer getIsFrozen() {
         return isFrozen;
@@ -995,6 +1011,30 @@
         this.isover = isover;
     }
     
+    public Long getEstimateArriveMileage() {
+        return estimateArriveMileage;
+    }
+    
+    public void setEstimateArriveMileage(Long estimateArriveMileage) {
+        this.estimateArriveMileage = estimateArriveMileage;
+    }
+    
+    public Double getEstimatedMileage() {
+        return estimatedMileage;
+    }
+    
+    public void setEstimatedMileage(Double estimatedMileage) {
+        this.estimatedMileage = estimatedMileage;
+    }
+    
+    public Date getEstimateArriveTime() {
+        return estimateArriveTime;
+    }
+    
+    public void setEstimateArriveTime(Date estimateArriveTime) {
+        this.estimateArriveTime = estimateArriveTime;
+    }
+    
     @Override
     protected Serializable pkVal() {
         return this.id;
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java
index 8b18d06..36f3ebe 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java
@@ -1,13 +1,10 @@
 package com.stylefeng.guns.modular.system.model;
 
-import com.baomidou.mybatisplus.activerecord.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 lombok.Data;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
 
 /**
  * <p>
@@ -17,41 +14,37 @@
  * @author 吕雪
  * @since 2020-06-09
  */
-@TableName("t_sys_overtime")
 @Data
-public class TSysOverTime extends Model<TSysOverTime> {
-
-    private static final long serialVersionUID = 1L;
-
+@TableName("t_sys_overtime")
+public class TSysOverTime {
     /**
-     * 主键id
+     * 主键
      */
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
     /**
-     * 企业id
-     */
-    private Integer companyId;
-
-    /**
      * 打车订单每隔xx分钟提醒一次
      */
+    @TableField("car")
     private Integer car;
     /**
      * 包裹订单每隔xx分钟提醒一次
      */
+    @TableField("packageTime")
     private Integer packageTime;
     /**
      * 预约订单 在预定时间前x分钟首次提醒
      */
+    @TableField("reserveTime")
     private Integer reserveTime;
     /**
      * 预约订单每隔xx分钟提醒一次
      */
+    @TableField("reserveNext")
     private Integer reserveNext;
-
-    @Override
-    protected Serializable pkVal() {
-        return null;
-    }
-}
+    /**
+     * 公司id
+     */
+    @TableField("companyId")
+    private Integer companyId;
+}
\ No newline at end of file
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java
index 30da49d..512c199 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java
@@ -1,7 +1,7 @@
 package com.stylefeng.guns.modular.system.service;
 
-import com.stylefeng.guns.modular.system.model.TSystemNotice;
 import com.baomidou.mybatisplus.service.IService;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
 
 /**
  * <p>
@@ -12,6 +12,6 @@
  * @since 2020-06-10
  */
 public interface ITSystemNoticeService extends IService<TSystemNotice> {
-    void addSystemNotice(Integer userType, String content, Integer userId) throws Exception;
+    void addSystemNotice(Integer userType, String content, Integer userId) ;
 
 }
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java
index 5d47b94..0240a3b 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java
@@ -29,7 +29,7 @@
 
     @Override
     public List<Map<String, Object>> getCanSelectPrivateCarDriverList(Page<Map<String, Object>> page, Integer serverCarModelId, Integer driverId, String name, String phone) {
-        return this.baseMapper.getCanSelectPrivateCarDriverList(page, serverCarModelId, driverId, name, phone);
+        return this.baseMapper.getCanSelectPrivateCarDriverList(page, serverCarModelId, driverId, 1, name, phone);
     }
 
     @Override
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java
index 73b2594..293e3c9 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java
@@ -1,9 +1,9 @@
 package com.stylefeng.guns.modular.system.service.impl;
 
-import com.stylefeng.guns.modular.system.model.TSystemNotice;
-import com.stylefeng.guns.modular.system.dao.TSystemNoticeMapper;
-import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.stylefeng.guns.modular.system.dao.TSystemNoticeMapper;
+import com.stylefeng.guns.modular.system.model.TSystemNotice;
+import com.stylefeng.guns.modular.system.service.ITSystemNoticeService;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -19,7 +19,7 @@
 @Service
 public class TSystemNoticeServiceImpl extends ServiceImpl<TSystemNoticeMapper, TSystemNotice> implements ITSystemNoticeService {
     @Override
-    public void addSystemNotice(Integer userType, String content, Integer userId) throws Exception {
+    public void addSystemNotice(Integer userType, String content, Integer userId) {
         TSystemNotice systemNotice = new TSystemNotice();
         systemNotice.setContent(content);
         systemNotice.setInsertTime(new Date());
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
index a9c356a..7936750 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
@@ -10,7 +10,7 @@
 import com.google.fleetengine.auth.token.FleetEngineToken;
 import com.google.fleetengine.auth.token.TripClaims;
 import com.google.fleetengine.auth.token.VehicleClaims;
-import com.google.fleetengine.auth.token.factory.signer.*;
+import com.google.fleetengine.auth.token.factory.signer.LocalSigner;
 import com.stylefeng.guns.modular.system.util.RedisUtil;
 import com.stylefeng.guns.modular.system.util.UUIDUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -20,7 +20,10 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -32,29 +35,18 @@
 @Component
 public class FleetEngineUtil {
 	
-	static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class);
-	
-	private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-odrd-testing.iam.gserviceaccount.com";
-	
-	private final String DRIVER_ACCOUNT = "odrd-fleetengine-driversdkuser@i-go-odrd-testing.iam.gserviceaccount.com";
-	
-	private final String CONSUMER_ACCOUNT = "odrd-fleetengine-consumersdkus@i-go-odrd-testing.iam.gserviceaccount.com";
-	
-	private final String serverPrivateKeyId = "254e18eefa9fdcca64d5899cdcd793d466c47c7d";
-	
-	private final String serverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfbNAWnukqLKIxItqmSABxsH5glySEHJ2gfL5KsRF0M02e0Z8/KNKZkoh7I6bOMt1fEtttFaWOeq70IdI2WAd5wVazL3upvl5FW4P08ly33LklfGyLljlJ7ChPny9x6OjAaiS0yD9fh7NWti7rZKU7gzcGL8HddNYXgXV5OajvoG3TGdu52WTxce9AUzU6gLPboz/RbGqrdrmgVJVb0EPlhTJf/NSsaiW4NoL8SEzf/pJGYBmqJs97mXwCHTY4avaC+CP/zz9yS8AQEJlApbVT6lSOhYoR0hNOBj5B886EZOssjubO6hQaiwRnGrV2RdpHynqA1iekfGpUGEtWTsqjAgMBAAECggEALyPbMd0iP8y71sCiG4nty7Au5ju62e+mMkbAc9CAwzXKTVxZdLEK+MsJ3TNxBsami47FYC+G6SbgpaJ8iIImD7v5+XjgXZRDRsnlLmAdx2YWPv3YELxGS1PvpX+B5XJDpGWeXfBaQNKc1lZ/cC4t53eIpSUo82UxSvkGNea1S8lR6vIByhNyCQOvLG4yqaxUy0hZi0kge37XrjYMGS+BivBBnDiVlBPLBVbrNBxOf31Lzz+XX0iwXX7Zl2jN759oe0xQyuIGWUSj8xBDIF8nNaJrla7rWVml3sZJh6/3r1Acj0mhZtE0ZMu5hiPGiIXgb1ng30j3dMP4yVPhXrpAtQKBgQDaU01VnHsnHxc0DQHE2vEOPGmPxVS0/JAssePAEUmKEueUogGef91YY+Vm/ItbhLwGjbytnXxe88zRAdB1u07efZ83ey93TrGl2CJUzLHIcgb+Q1tT642rqlfl+q8ep86hcZ+63pDiIPt2Z+HkbKIR0SWf5LIH4flquQOTQufXXQKBgQC674qDsjOJepZjMMN6PkVMcWBYDNmXHnqa5Oto0rZM745UulbXqEFGuBOsXPU7O33Kfz1vbtoluubKZi5B6cFNnPypE2SCfvdObHq4FuTuKPV6lN93SyhZchmSEXEs0PU4cGDRt+RRqQcjft1Wigiy4Y1y1SInCtcaP1hLejEJ/wKBgFAhvwKrGnBzctrB42JTUaJ9/eis7rg28tvUttjp/2nUIndlNt7r41vr3mj8TFHc1/43y4aVhO584THdTpvHkd0LkoKUjglmMsHCIGercZ02bOap5j1Y+XiGXxij995yjN6oi43U3qyAmosM+dYTITEU6JBVKhrGj/rhyTQlnF5pAoGBAKFGmo0mR/pbDbYD0xH6+VSLGCC+7VbIT+SkjUjBSdA0eOo2XUfvfGmj1C1HgbcZi1wRzJH/5CrbBdQmtc/d+QyZ3Q2NkpBXM8uwIWwDLH0gTzDzkZvc9rG8k70GWUrd+EI6Cf3FFjExj9wazqCjs/+IQr2Ijc97NbsKXYW4pOhHAoGAKf5wYk+cn0cVTsyAom0UbGD5Uijqh5732MeqFYs2Rcwx0OErJZo68COSFFF40hJmmIKn7p3qycIyd1FcYlXN1l4s8mEWTGTInRE0OlBU0+jLtIV9pwNgffpbPYcrWZU6s6YVeJ2nDwl+aD+4QvN0rkPTfho9kjgeyF3PW0I2u4E=";
-	
-	private final String driverPrivateKeyId = "859e85fb3aa4d18b4afaac3e24e8f65700da5cc9";
-	
-	private final String driverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmzL1BqSH+Zh9Fct5mXqe5sYOMTnJtOJhwKXnjjo2tNPXv4alzUHz8Vbj6nMar5u5IuKRZMeRBlhoRSFrLm+J1+sfvpH8N4wsnG7hDANknqWzdsk9a68qMHxNQF3hFzs9+KKrR1LAG8e9ytMfliN0kX+xls4uPZDPu1Q39K6V9KXrH/GrMA56i3TtWi7Hmakt5YTELeGjhx4nGrfuQLFFovs1Z9uJtf7E8R95+65StrOAmbJNf7VciEqwBpWYlU5VeyLXMg/oHwnTv2cjdcFozyDrlUHbDmtTiVeBBsYFVLyAsDGfl1p6eiVTiBBuo56YSYLWfaLgYvTyEcZ9jBQsfAgMBAAECggEAQzbTuObX3PT3+vtb5XKVMf33XY2rDJo2y1PbWzhxnO9vf3e22dIAW4qLnOmaIWFQeht1lr/FFCzRWk+Gzu+FJTemY8osrMLmFp9T9CQeXZ4nUXruAVxs5WQMW0Tp4W+CK3tlwmJrgJDzhYyV1Mf/HQ5Oa3kbbu/ZAY/3MCLrb/ClJQvD2rZSDdzAkNMQm8P2hsE71+rH7mI2hHrSCHl2OIp2A64QT8HjtyRc5yHZtTp6ZST1ge9SSIsT0ZfmXKtKF7yGEIPtKNU+oLrGyK5P30xBWJ/bwb3PEz2MZcPvz31+B2+UvZMm7OTkqfcRwEztAf8Ckiuo4im2BRYbVmd9OQKBgQDd0MeLxR+Qtv12bVA0bHtagFEq36THgWG7IM1/1vS4Cl9sveKSOS8A6oKLy624fGE7PKcuTTIzkVA81GXtWBQ9Coq/4TmllQkFTH7pz9C2PNHSCychPwNNV8qUx3lE3d4DOjGKgoVFD4l90AO7lOvmLTSc3pDpr+jSjUH4lqGrbQKBgQDAgXBmpXfCTxwqkBzGwxX+hwJen9qSkCM47qnQ1L4NnXPL6s0EN6rQ3FnFemGIzBUGJ2tajntkKlUu5DzsQeoBGu/SaSwgqD+1UQDcUyo+retmqZ+QYbpeyd3l53bLJJuJNsfak0X76Ft6hrm4julx6RGlmboQyx4kZWbhx4YNOwKBgEG9/2aNpi1eDwFqpLrk7CqGnYf3gP8gebbcoguhyiZB7MZuARkVmbjLyKVmWLa1JpxH/cTbXGWsS/u7d/pAgL8WwMjeGBfbdDD92x+xWEqq/AUlCRPxeSkTPBech3TBzWtndAd5Z8ZwNG/1lyWhnck63L0huhGI8Zh2BXeILaKBAoGAKK3xq69BvGztPc1QV2w4RJ4RER/kl14gI1LDzd52/veL1cabZk3BKfu2eLWg0MCXnMJNvEgpqQQNFiii+yX+phckIKma6pfDRrSEYwqr/azQ9tPXZTJRqOAtpPyhrNHikD9kQjsm6dGzKxQ3QNnqWOjwkrcGi6/wga5v7Dw2hqsCgYEA2T/kSNQ9dqpVBAkfi2J50hqnfFESPjKeirJJZllqhVqsiV0ly8a8Fz8SjGqTzrq+UErko+QmtSlo5h3Uq9Ln+0CwYfrUL+74q2zLHdS0DpY3QsGTEDJXTxCyy9kO26X2UsM3Ez3YUAkdMwdpVz0uVZtinv2735QZOBxoVQV2kQ8=";
-	
-	private final String consumerPrivateKeyId = "40acf82cbd5250de2f5123caff40738bdd403b08";
-	
-	private final String consumerPrivateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDSwtbSBFgIXna6mWeKFWCK31NXUJH6uGduR1XrODGRedrqrTgr0BdNg8PDo6/zh/T+K0Svor6kgqpwnl9soOdn73oC4Nu+Ad7EiKa38j650jlZdLAr4hR0Ou9Kcnv45x/94auUO8jBz844cu24swLKiPsK9OnX65wVlKRfhhkGFuS/4OI76CmE7NqZDqPOW16o8tBO5TsgPVNkglFAU73fTp0kcHoLauT9QOB0+yZi39mnNXyU+2cL3Ylp5oaQCJpyssDRUqz/EiHa7FxUUgzCadG00+ePf5iYSnZKQRKWoOIawFvcCfcHx8GAl8Nn+79HtVQHB9hLsQ5+jqcdfKPfAgMBAAECggEAE9Ufz912xzrUY1TCKH1Ae3Dub732Lqihmv/9dsfv6ieUURcBvSW0u6eViVhi20DE7hH2QazH0cU18qkEg71UaTRgv9qW8vdMFiRhw9d4zZWZrfBMD6UTlahiEhhZ0B83pHVS5v0FNC+w0SEHe6Tks1hWfz5yrs3N/z3ghdihjC/5i1jeBoHXs1262SMazuwNGHblLApGPG+86taeFtbDI+31TKvZ8nomZHkEVFnARRUoBBcIwowRMqNfwlpcJhlz6kDWnoD08kHJ2zzJokozu7Lim+Ugt/MWwUOcA0hgq2QdymZFpkRkDl7tZmJtwTfTirjbGlpnPHVXEc1bWM7ocQKBgQD0LJ8e7JXf6bVFngq0jSJNKK7XDHYg0KhHXMApF59xxi29hdHXWPzgRJ45KkoUJc7MITpIJLXfCmi1XyDMf9m8lIf/oaqhJ7idYi7iAAPOJkdnHbSt0lebyjBWzCQ6OgS4NfF1+LEibTzRqiFs5K8EAyPYAVSTrpWoguoWtTzIGQKBgQDc9/I2PS+91Eb5RvuidTNsDqZJliTJQFlBjlDViFo3+l1N7jDFYwPBR/Tv4TVM5p9Zb+/Lo9X1pjDbm8QriTR4V+4HaLXkcCnmOsdSRInFUW4UIafwLX5ifjgfyaWgdKdn2UP1Lu/1qBN6GU1xjSfBQ6N3UqQiKkNPb7tuPJGqtwKBgQCQ4hU8vTclGMC14VQK1B/BVt1/vuYtDIJ9bZycBWdXlDc52LitpiDOVgjodJ5mHBT77M9vVVERWlTNIfgNP+OL0TptRZlAbJhP0p1s/oNDhFUj6211InVXfH54UkNAxYJdZ6yxynIYsma/JcsVmQ/8Ony/Q/LSempVBfEurjW1qQKBgQCQWPjFLdtOKqnildg0HFPnNvqx/38waPTluk5b76LgBpGFIyCBEVmWnacIPRpQjidyiYkggnp26oXoMC1KM2svYmGAPYr1G8CDQcqLl3JYkAVU6VeHsnBpbwLC4TttQkdJs8iNFohy9cUjcfwBPbDGs6TJghbuqqUl81uBe9e8qQKBgQDZm8T2KB34J7HAc5A+vqkmAo7mQLZg51OrzB1KnDU86pSAf0o3eSvfDUT6dpU9fRuZ1XYnbPnpoJwjFH3m4u9gqKF3PtVYfZyJrEqYwmhB9z6vd+dcsUlXM0fi37bGZkKBD0JGGt5OljM1qJG15x/LYfC/nwOmqWoOhNPCst2Z7w==";
-	
-	private final String provider = "i-go-odrd-testing";
-	
 	private final static String key = "AIzaSyCG6PsfkaCEc94VK2vIAZk1YYKvOS_Ewts";
+	static Logger logger = LoggerFactory.getLogger(FleetEngineUtil.class);
+	private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-odrd-testing.iam.gserviceaccount.com";
+	private final String DRIVER_ACCOUNT = "odrd-fleetengine-driversdkuser@i-go-odrd-testing.iam.gserviceaccount.com";
+	private final String CONSUMER_ACCOUNT = "odrd-fleetengine-consumersdkus@i-go-odrd-testing.iam.gserviceaccount.com";
+	private final String serverPrivateKeyId = "254e18eefa9fdcca64d5899cdcd793d466c47c7d";
+	private final String serverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCfbNAWnukqLKIxItqmSABxsH5glySEHJ2gfL5KsRF0M02e0Z8/KNKZkoh7I6bOMt1fEtttFaWOeq70IdI2WAd5wVazL3upvl5FW4P08ly33LklfGyLljlJ7ChPny9x6OjAaiS0yD9fh7NWti7rZKU7gzcGL8HddNYXgXV5OajvoG3TGdu52WTxce9AUzU6gLPboz/RbGqrdrmgVJVb0EPlhTJf/NSsaiW4NoL8SEzf/pJGYBmqJs97mXwCHTY4avaC+CP/zz9yS8AQEJlApbVT6lSOhYoR0hNOBj5B886EZOssjubO6hQaiwRnGrV2RdpHynqA1iekfGpUGEtWTsqjAgMBAAECggEALyPbMd0iP8y71sCiG4nty7Au5ju62e+mMkbAc9CAwzXKTVxZdLEK+MsJ3TNxBsami47FYC+G6SbgpaJ8iIImD7v5+XjgXZRDRsnlLmAdx2YWPv3YELxGS1PvpX+B5XJDpGWeXfBaQNKc1lZ/cC4t53eIpSUo82UxSvkGNea1S8lR6vIByhNyCQOvLG4yqaxUy0hZi0kge37XrjYMGS+BivBBnDiVlBPLBVbrNBxOf31Lzz+XX0iwXX7Zl2jN759oe0xQyuIGWUSj8xBDIF8nNaJrla7rWVml3sZJh6/3r1Acj0mhZtE0ZMu5hiPGiIXgb1ng30j3dMP4yVPhXrpAtQKBgQDaU01VnHsnHxc0DQHE2vEOPGmPxVS0/JAssePAEUmKEueUogGef91YY+Vm/ItbhLwGjbytnXxe88zRAdB1u07efZ83ey93TrGl2CJUzLHIcgb+Q1tT642rqlfl+q8ep86hcZ+63pDiIPt2Z+HkbKIR0SWf5LIH4flquQOTQufXXQKBgQC674qDsjOJepZjMMN6PkVMcWBYDNmXHnqa5Oto0rZM745UulbXqEFGuBOsXPU7O33Kfz1vbtoluubKZi5B6cFNnPypE2SCfvdObHq4FuTuKPV6lN93SyhZchmSEXEs0PU4cGDRt+RRqQcjft1Wigiy4Y1y1SInCtcaP1hLejEJ/wKBgFAhvwKrGnBzctrB42JTUaJ9/eis7rg28tvUttjp/2nUIndlNt7r41vr3mj8TFHc1/43y4aVhO584THdTpvHkd0LkoKUjglmMsHCIGercZ02bOap5j1Y+XiGXxij995yjN6oi43U3qyAmosM+dYTITEU6JBVKhrGj/rhyTQlnF5pAoGBAKFGmo0mR/pbDbYD0xH6+VSLGCC+7VbIT+SkjUjBSdA0eOo2XUfvfGmj1C1HgbcZi1wRzJH/5CrbBdQmtc/d+QyZ3Q2NkpBXM8uwIWwDLH0gTzDzkZvc9rG8k70GWUrd+EI6Cf3FFjExj9wazqCjs/+IQr2Ijc97NbsKXYW4pOhHAoGAKf5wYk+cn0cVTsyAom0UbGD5Uijqh5732MeqFYs2Rcwx0OErJZo68COSFFF40hJmmIKn7p3qycIyd1FcYlXN1l4s8mEWTGTInRE0OlBU0+jLtIV9pwNgffpbPYcrWZU6s6YVeJ2nDwl+aD+4QvN0rkPTfho9kjgeyF3PW0I2u4E=";
+	private final String driverPrivateKeyId = "859e85fb3aa4d18b4afaac3e24e8f65700da5cc9";
+	private final String driverPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmzL1BqSH+Zh9Fct5mXqe5sYOMTnJtOJhwKXnjjo2tNPXv4alzUHz8Vbj6nMar5u5IuKRZMeRBlhoRSFrLm+J1+sfvpH8N4wsnG7hDANknqWzdsk9a68qMHxNQF3hFzs9+KKrR1LAG8e9ytMfliN0kX+xls4uPZDPu1Q39K6V9KXrH/GrMA56i3TtWi7Hmakt5YTELeGjhx4nGrfuQLFFovs1Z9uJtf7E8R95+65StrOAmbJNf7VciEqwBpWYlU5VeyLXMg/oHwnTv2cjdcFozyDrlUHbDmtTiVeBBsYFVLyAsDGfl1p6eiVTiBBuo56YSYLWfaLgYvTyEcZ9jBQsfAgMBAAECggEAQzbTuObX3PT3+vtb5XKVMf33XY2rDJo2y1PbWzhxnO9vf3e22dIAW4qLnOmaIWFQeht1lr/FFCzRWk+Gzu+FJTemY8osrMLmFp9T9CQeXZ4nUXruAVxs5WQMW0Tp4W+CK3tlwmJrgJDzhYyV1Mf/HQ5Oa3kbbu/ZAY/3MCLrb/ClJQvD2rZSDdzAkNMQm8P2hsE71+rH7mI2hHrSCHl2OIp2A64QT8HjtyRc5yHZtTp6ZST1ge9SSIsT0ZfmXKtKF7yGEIPtKNU+oLrGyK5P30xBWJ/bwb3PEz2MZcPvz31+B2+UvZMm7OTkqfcRwEztAf8Ckiuo4im2BRYbVmd9OQKBgQDd0MeLxR+Qtv12bVA0bHtagFEq36THgWG7IM1/1vS4Cl9sveKSOS8A6oKLy624fGE7PKcuTTIzkVA81GXtWBQ9Coq/4TmllQkFTH7pz9C2PNHSCychPwNNV8qUx3lE3d4DOjGKgoVFD4l90AO7lOvmLTSc3pDpr+jSjUH4lqGrbQKBgQDAgXBmpXfCTxwqkBzGwxX+hwJen9qSkCM47qnQ1L4NnXPL6s0EN6rQ3FnFemGIzBUGJ2tajntkKlUu5DzsQeoBGu/SaSwgqD+1UQDcUyo+retmqZ+QYbpeyd3l53bLJJuJNsfak0X76Ft6hrm4julx6RGlmboQyx4kZWbhx4YNOwKBgEG9/2aNpi1eDwFqpLrk7CqGnYf3gP8gebbcoguhyiZB7MZuARkVmbjLyKVmWLa1JpxH/cTbXGWsS/u7d/pAgL8WwMjeGBfbdDD92x+xWEqq/AUlCRPxeSkTPBech3TBzWtndAd5Z8ZwNG/1lyWhnck63L0huhGI8Zh2BXeILaKBAoGAKK3xq69BvGztPc1QV2w4RJ4RER/kl14gI1LDzd52/veL1cabZk3BKfu2eLWg0MCXnMJNvEgpqQQNFiii+yX+phckIKma6pfDRrSEYwqr/azQ9tPXZTJRqOAtpPyhrNHikD9kQjsm6dGzKxQ3QNnqWOjwkrcGi6/wga5v7Dw2hqsCgYEA2T/kSNQ9dqpVBAkfi2J50hqnfFESPjKeirJJZllqhVqsiV0ly8a8Fz8SjGqTzrq+UErko+QmtSlo5h3Uq9Ln+0CwYfrUL+74q2zLHdS0DpY3QsGTEDJXTxCyy9kO26X2UsM3Ez3YUAkdMwdpVz0uVZtinv2735QZOBxoVQV2kQ8=";
+	private final String consumerPrivateKeyId = "40acf82cbd5250de2f5123caff40738bdd403b08";
+	private final String consumerPrivateKey = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDSwtbSBFgIXna6mWeKFWCK31NXUJH6uGduR1XrODGRedrqrTgr0BdNg8PDo6/zh/T+K0Svor6kgqpwnl9soOdn73oC4Nu+Ad7EiKa38j650jlZdLAr4hR0Ou9Kcnv45x/94auUO8jBz844cu24swLKiPsK9OnX65wVlKRfhhkGFuS/4OI76CmE7NqZDqPOW16o8tBO5TsgPVNkglFAU73fTp0kcHoLauT9QOB0+yZi39mnNXyU+2cL3Ylp5oaQCJpyssDRUqz/EiHa7FxUUgzCadG00+ePf5iYSnZKQRKWoOIawFvcCfcHx8GAl8Nn+79HtVQHB9hLsQ5+jqcdfKPfAgMBAAECggEAE9Ufz912xzrUY1TCKH1Ae3Dub732Lqihmv/9dsfv6ieUURcBvSW0u6eViVhi20DE7hH2QazH0cU18qkEg71UaTRgv9qW8vdMFiRhw9d4zZWZrfBMD6UTlahiEhhZ0B83pHVS5v0FNC+w0SEHe6Tks1hWfz5yrs3N/z3ghdihjC/5i1jeBoHXs1262SMazuwNGHblLApGPG+86taeFtbDI+31TKvZ8nomZHkEVFnARRUoBBcIwowRMqNfwlpcJhlz6kDWnoD08kHJ2zzJokozu7Lim+Ugt/MWwUOcA0hgq2QdymZFpkRkDl7tZmJtwTfTirjbGlpnPHVXEc1bWM7ocQKBgQD0LJ8e7JXf6bVFngq0jSJNKK7XDHYg0KhHXMApF59xxi29hdHXWPzgRJ45KkoUJc7MITpIJLXfCmi1XyDMf9m8lIf/oaqhJ7idYi7iAAPOJkdnHbSt0lebyjBWzCQ6OgS4NfF1+LEibTzRqiFs5K8EAyPYAVSTrpWoguoWtTzIGQKBgQDc9/I2PS+91Eb5RvuidTNsDqZJliTJQFlBjlDViFo3+l1N7jDFYwPBR/Tv4TVM5p9Zb+/Lo9X1pjDbm8QriTR4V+4HaLXkcCnmOsdSRInFUW4UIafwLX5ifjgfyaWgdKdn2UP1Lu/1qBN6GU1xjSfBQ6N3UqQiKkNPb7tuPJGqtwKBgQCQ4hU8vTclGMC14VQK1B/BVt1/vuYtDIJ9bZycBWdXlDc52LitpiDOVgjodJ5mHBT77M9vVVERWlTNIfgNP+OL0TptRZlAbJhP0p1s/oNDhFUj6211InVXfH54UkNAxYJdZ6yxynIYsma/JcsVmQ/8Ony/Q/LSempVBfEurjW1qQKBgQCQWPjFLdtOKqnildg0HFPnNvqx/38waPTluk5b76LgBpGFIyCBEVmWnacIPRpQjidyiYkggnp26oXoMC1KM2svYmGAPYr1G8CDQcqLl3JYkAVU6VeHsnBpbwLC4TttQkdJs8iNFohy9cUjcfwBPbDGs6TJghbuqqUl81uBe9e8qQKBgQDZm8T2KB34J7HAc5A+vqkmAo7mQLZg51OrzB1KnDU86pSAf0o3eSvfDUT6dpU9fRuZ1XYnbPnpoJwjFH3m4u9gqKF3PtVYfZyJrEqYwmhB9z6vd+dcsUlXM0fi37bGZkKBD0JGGt5OljM1qJG15x/LYfC/nwOmqWoOhNPCst2Z7w==";
+	private final String provider = "i-go-odrd-testing";
 
 //	private final String SERVICE_ACCOUNT = "odrd-fleetengine-ondemandadmin@i-go-gcp.iam.gserviceaccount.com";
 //
@@ -75,7 +67,6 @@
 //	private final String consumerPrivateKey = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCeBruAMii4e7LrGNwSWMbeztzjJV9lUS9CIhWi142G/Ed9b58oa1CAM3ym794PRqtHRvdzLSWRKf3SFJjzYl7CMmkpTgsQoV8tCp/G/vITZcrD9BxYfocysnSDy9d/nleomC1PeUV6coZpGPIjwuxkXyQbH1CnTyGK5RAU2siCw4plLMz6WQyXXyCZOdCijsvSPgytDWveO8DGPIBO1VlHHIJIfrfgVCYgpaXd63GSPQEJ81GYfy5VtnuLHpc3kowq5blLqMFUU6eAzA20Jg3mCovv2idSNN6R5K1kNT3Eu5fsQWuthDqK0H2IeNulb8cCPnri62AH03kxl6xFwC6pAgMBAAECggEAETkH88TZDfeNXHTCfM1oKfMUZ+fe1HAGB93Ryy8ATGyabgqy/KNq4U4QkTEmBowxMVIuuJgnDAHY7q3dWElUV93z+tMiqZas2iqE7MSZ0DtmifdvpMVwKWUBsIuQL7yA2UMcom4ZKxXoSElhD+diqYh6VZUSzpP1QpS3LU6wTm/4IzN+kjfn7sAENk9+ff04VZjBC4yPANWO6gXmNZlGvFvbp6ChBb9PnPlB6dUUiLCGkb/B0jagfqP7ARrDArMcRpJZyYbPDEfxEqqADV28N4k2qOYUZYVmXBXf+Zip7G+rikXmgxn/G1nHLJgUAmc42TUos8P0YsZiVyboQYtU8QKBgQDRcLK70zIZOhMRmr9gTC2khSBA37ZVVtCiJb6G4TtFfH7KLdn8r8aNLauH90WCzQvk2m/KKFlt/q2UJyFatJx5LB4mYKAS7BPfoHYqsoqDMuMXtNpe6PO5/rx8h90pl60gouG2iw1QcOq5NKNVr2INYkItJhc8u99Lhw675hVVOwKBgQDBKA2e1KERO3cOn7muaJjWubMJ6mK0XtOLmTL8maILwJVO2H6rMOxoYum3txZjc+oTdFcyfv5TJZrihm3F2XoZ6Xe1F0OhiX97OgA/uDygQSDsiFdhJ90svbpGxDxtQtamhuu+8Wp1TpNu8ORdG+3gmsCkxivrPTs/MnJnfiu9awKBgGJ1QYDsyvtzAq3e+qKxjS9vafc1dAjwVAo2BjhwP6Xt3cj7/yM8GvIZiy7S/rl73WCLk8wMZeZAuKcSMirrBzgrlkziVb4vfzQ8wfBWmKkOzhVB7vp5NsK0TzWXxU+dP0U9bTCcc/jh7GZ+qV5JoaW7EHMbGgdyJoniBvosMtErAoGAKVRvraejmzNVI0zsBzScV32+oIWFf0C3FSy/qysYcFlR2WAbonfCbgeUKNpFMRyRXn5LViO0OYhXXtcSz/3b0YWSNq52qy7nly9u9DNwzX2CFPqLb99+xN8H57J/l4VwtosyEFZJyDX6+AcVZhLe0GtsgxVgOmKMtdYOgrSNmWcCgYBu3KiRwYPfQgyEYOwfQBOjoMmPUB8H/vtvFLRlHXxZF7hPAyKs4e9dQRW7vb61epVgMVz5t4E4pKHqxpZu+j7Tby+Z5fAgSPiniZUyVH9AYGCTyAYZogr5r21vhpcAZJ0P8hoE5R2jhnzu/mhr6CkWz8nCHsZ7+KBjcVILUYIS9g==";
 //
 //	private final String provider = "i-go-gcp";
-	
 	@Autowired
 	private RedisUtil redisUtil;
 	
@@ -449,7 +440,7 @@
 	 * @param end_lng 终点经度
 	 * @return
 	 */
-	public boolean createTrip(String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) {
+	public JSONObject createTrip(String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) {
 		String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips?tripId=" + tripId;
 		HttpRequest post = HttpUtil.createPost(url);
 		Map<String, String> headers = new HashMap<>();
@@ -478,7 +469,7 @@
 		end_point.put("longitude", end_lng);
 		dropoffPoint.put("point", end_point);
 		body.put("dropoffPoint", dropoffPoint);
-		logger.info("创建行程请求:{}   {}", tripId, body.toJSONString());
+		logger.info("创建行程请求:{}  {}", tripId, body.toJSONString());
 		HttpRequest request = post.body(body.toJSONString());
 		HttpResponse response = request.execute();
 		logger.info("创建行程结果:{}", response.body());
@@ -499,7 +490,6 @@
 				}
 			}
 			logger.error("创建行程异常:  tripId={}  body={}", tripId, response.body());
-			return false;
 		}
 		/**
 		 * 返回结果
@@ -616,7 +606,7 @@
 		 * 	"currentRouteSegmentTrafficVersion": "2024-05-27T02:05:37.941167Z"
 		 * }
 		 */
-		return true;
+		return jsonObject;
 	}
 	
 	
@@ -632,7 +622,7 @@
 	 * @param end_lng 终点经度
 	 * @return
 	 */
-	public boolean updateTrip(String tripStatus, String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng) {
+	public boolean updateTrip(String tripStatus, String vehicleId, Integer numberOfPassengers, String tripId, String start_lat, String start_lng, String end_lat, String end_lng, Integer orderId, Integer orderType) {
 		String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips/" + tripId + "?updateMask=";
 		List<String> sb = new ArrayList<>();
 		if(StringUtils.hasLength(vehicleId)){
@@ -698,7 +688,7 @@
 			dropoffPoint.put("point", end_point);
 			body.put("dropoffPoint", dropoffPoint);
 		}
-		logger.info("修改行程请求:{}   {}", tripId, body.toJSONString());
+		logger.info("修改行程请求:{}  {}", tripId, body.toJSONString());
 		HttpRequest request = put.body(body.toJSONString());
 		HttpResponse response = request.execute();
 		logger.info("修改行程结果:{}", response.body());
@@ -710,13 +700,16 @@
 				String status = error.getString("status");
 				if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){
 					redisUtil.remove("google_token");
-					return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng);
+					return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng, orderId, orderType);
 				}
 				String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
 				if(reason.equals("ACCESS_TOKEN_EXPIRED")){
 					redisUtil.remove("google_token");
-					return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng);
+					return updateTrip(tripStatus, vehicleId, numberOfPassengers, tripId, start_lat, start_lng, end_lat, end_lng, orderId, orderType);
 				}
+			}
+			if(code == 404){
+				return true;
 			}
 			logger.error("修改行程异常:  tripId={}  body={}", tripId, response.body());
 			return false;
@@ -857,6 +850,7 @@
 		headers.put("Content-Type", "application/json");
 		get.addHeaders(headers);
 		
+		logger.info("查询行程请求:{}  {}", tripId, url);
 		HttpResponse response = get.execute();
 		logger.info("查询行程结果:{}", response.body());
 		JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
@@ -965,12 +959,147 @@
 	
 	
 	/**
+	 * 批量获取行程
+	 * @param vehicleId
+	 * @param pageSize
+	 * @param pageToken
+	 * @return
+	 */
+	public String getTrips(String vehicleId, Integer pageSize, String pageToken) {
+		String url = "https://fleetengine.googleapis.com/v1/providers/" + provider + "/trips:search";
+		HttpRequest post = HttpUtil.createPost(url);
+		Map<String, String> headers = new HashMap<>();
+		headers.put("Authorization", "Bearer " + getToken());
+		headers.put("Content-Type", "application/json");
+		post.addHeaders(headers);
+		JSONObject body = new JSONObject();
+		if(StringUtils.hasLength(vehicleId)){
+			body.put("vehicleId", vehicleId);
+		}
+		body.put("activeTripsOnly", false);
+		if(null != pageSize){
+			body.put("pageSize", pageSize);
+		}
+		if(null != pageToken){
+			body.put("pageToken", pageToken);
+		}
+		logger.info("查询行程请求:{}", body);
+		post.body(body.toJSONString());
+		HttpResponse response = post.execute();
+		logger.info("查询行程结果:{}", response.body());
+		JSONObject jsonObject = JSON.parseObject(response.body().replaceAll("@type", "type"));
+		JSONObject error = jsonObject.getJSONObject("error");
+		if(null != error){
+			Integer code = error.getInteger("code");
+			if(code == 404){
+				return null;
+			}
+			if(code == 401){
+				String status = error.getString("status");
+				if(StringUtils.hasLength(status) && status.equals("UNAUTHENTICATED")){
+					redisUtil.remove("google_token");
+					return getTrips(vehicleId, pageSize, pageToken);
+				}
+				String reason = error.getJSONArray("details").getJSONObject(0).getString("reason");
+				if(reason.equals("ACCESS_TOKEN_EXPIRED")){
+					redisUtil.remove("google_token");
+					return getTrips(vehicleId, pageSize, pageToken);
+				}
+			}
+			logger.error("获取行程异常:body={}", response.body());
+			return null;
+		}
+		/**
+		 * 返回结果
+		 * {
+		 * 	"name": "providers/i-go-odrd-testing/trips/I-GO-RIDE1",
+		 * 	"vehicleId": "I-GO-CAR1",
+		 * 	"tripStatus": "ENROUTE_TO_PICKUP",
+		 * 	"tripType": "SHARED",
+		 * 	"pickupPoint": {
+		 * 		"point": {
+		 * 			"latitude": 30.604131,
+		 * 			"longitude": 104.151957
+		 *                }* 	},
+		 * 	"pickupTime": "2024-05-27T02:10:39.763347Z",
+		 * 	"dropoffPoint": {
+		 * 		"point": {
+		 * 			"latitude": 30.636319,
+		 * 			"longitude": 104.129219
+		 *        }
+		 *    },
+		 * 	"dropoffTime": "2024-05-27T02:23:37.762549Z",
+		 * 	"numberOfPassengers": 1,
+		 * 	"remainingDistanceMeters": 0,
+		 * 	"etaToFirstWaypoint": "2024-05-27T02:10:39.763347Z",
+		 * 	"remainingWaypoints": [
+		 *        {
+		 * 			"location": {
+		 * 				"point": {
+		 * 					"latitude": 30.604131,
+		 * 					"longitude": 104.151957
+		 *                }
+		 *            },
+		 * 			"tripId": "I-GO-RIDE1",
+		 * 			"waypointType": "PICKUP_WAYPOINT_TYPE",
+		 * 			"distanceMeters": 0,
+		 * 			"eta": "2024-05-27T02:10:39.763347Z",
+		 * 			"duration": "0s"
+		 *        },
+		 *        {
+		 * 			"location": {
+		 * 				"point": {
+		 * 					"latitude": 30.636319,
+		 * 					"longitude": 104.129219
+		 *                }
+		 *            },
+		 * 			"tripId": "I-GO-RIDE1",
+		 * 			"waypointType": "DROP_OFF_WAYPOINT_TYPE",
+		 * 			"encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA==",
+		 * 			"distanceMeters": 8260,
+		 * 			"eta": "2024-05-27T02:23:37.762549Z",
+		 * 			"duration": "777.999202s",
+		 * 			"trafficToWaypoint": {
+		 * 				"speedReadingInterval": [
+		 *                    {
+		 * 						"endPolylinePointIndex": 284,
+		 * 						"speed": "NORMAL"
+		 *                    }
+		 * 				],
+		 * 				"encodedPathToWaypoint": "AhqdAq8NM2ZcYrZmDgDo4Z0B7887ka5C0v0Y8aUejs8f7gL98gGstAWPpQLU5gvsfcf3JPiXJ8vEDosr0coVsuEEwtYElQ2h6QGXHron0ALV4gTRlQHdiqEC5rWzAq6zBVPRrAX0rQS9mAGazgTx5ASmZ7EknJ4B2ALyGPAC8QO9DKY58RGtGoYGtASJEYAGxkzyFulZ0BbAEpOQAuQR2FfPlgKolAveP7u0CdC_JIy7Aojb6QHL2_EElKUCpgGgsiTbqQHHlgKPqAjHR8SIgQHnhinsjwqhFfZGk-cKlLUIy8cC498CxF28pwLcrginpiGQm5sB36aFAcuTJPCWCdiUCeh1w94JR7PiAsCKC-cTo-MLrLAm3JQJp7ML07sh4KEC0xLMhZAB65U6oO4m_7gh6IkLz-oh2-MCwLAC5OwC-wGbsQuouwiD9gKQsQLPQ_BN0-ICxwWo2QS3zwG_DewHyiTaBbcdzwimVL0jnYMC-5IC8VH3BcBDr2mVFLMKqQX0kQG54QH-Pqm3AdIHirsB8YEBooEBvSDF7QWK4wWhkUbymkPLCNEG_gi1nwTqnATlvgSupwEo5pwExgONJhj9CKEspblC2sVHwaYX8qYXheQF3rsBkrIBgcYRqoMBlpQBx4IB6owBhiq3jgGYpwGfuQHwuQWfKfUBmw70I5-5BeiREFPAC-cI8AgACFvHAgGIAq-HBcyYBefJFMjkFK-fFMyyBbOhAYCREIe_EbeFAcSSAY-wAegI_LwQ6I4BjW3r-hL8gRb_5gXkuAH7AcwMq8IE1C2ckgGHJ_wv--oEkLkBjC3ng17sxooCw5gBwAvz5hCM9BHzsxHomAHcqwW1jQX6gQWpvwGOuwGl-wWSgBPVxATZAa31BP7KEqnFE8LBBL0aiqsOnHBf-pIF6Q6ABNIHxTzezhLl3gSMDcXUBQzCiQG5pAHKiQTdsgGStAGQigGhkgXAuwWXhBD4lhSXlxScMtjEBfubAb-fBOAOgOsEiLETAA=="
+		 *            }
+		 *        }
+		 * 	],
+		 * 	"currentRouteSegmentVersion": "2024-05-27T02:10:39.773373Z",
+		 * 	"remainingWaypointsVersion": "2024-05-27T02:05:37.941167Z",
+		 * 	"currentRouteSegmentEndPoint": {
+		 * 		"location": {
+		 * 			"point": {
+		 * 				"latitude": 30.604131,
+		 * 				"longitude": 104.151957
+		 *            }
+		 *        },
+		 * 		"tripId": "I-GO-RIDE1",
+		 * 		"waypointType": "PICKUP_WAYPOINT_TYPE"
+		 *    },
+		 * 	"remainingWaypointsRouteVersion": "2024-05-27T02:10:39.773373Z",
+		 * 	"currentRouteSegmentTrafficVersion": "2024-05-27T02:10:39.773373Z",
+		 * 	"view": "SDK"
+		 * }
+		 */
+		
+		return response.body();
+	}
+	
+	
+	
+	/**
 	 * 上报google可结算订单
 	 * @param tripId 行程id
 	 * @return
 	 */
 	public boolean reportBillableEvent(String tripId) {
-		log.info("上报行程:{}", tripId);
+		log.info("行程上报:{}", tripId);
 		String billableEventId = UUIDUtil.getRandomCode();
 		String url = "https://mobilitybilling.googleapis.com/v1:reportBillableEvent?regionCode=GH&key=" + key + "&billableEventId=" + billableEventId;
 		HttpRequest post = HttpUtil.createPost(url);
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
index 08a3b43..3760f4e 100644
--- a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -1,21 +1,11 @@
 package com.stylefeng.guns.modular.system.util;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.stylefeng.guns.core.util.ToolUtil;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestTemplate;
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPool;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 
 /**
@@ -23,30 +13,24 @@
  */
 @Component
 public class RedisUtil {
-
-
-
+    
+    @Autowired
+    private RedisTemplate redisTemplate;
+    
+    
+    
     /**
      * 向redis中存储字符串没有过期时间
      * @param key
      * @param value
      */
     public void setStrValue(String key, String value){
-        if(ToolUtil.isNotEmpty(key)){
-            //将请求头部和参数合成一个请求
-            Map<String,String> map = new HashMap<>();
-            map.put("key", key);
-            map.put("value", value);
-            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/setValue_", map);
-            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
-            if(jsonObject.getIntValue("code") != 200){
-                System.err.println("调用redis出错了");
-            }
+        if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){
+            redisTemplate.opsForValue().set(key, value);
         }
-
     }
-
-
+    
+    
     /**
      * 以分钟为单位设置存储值(设置过期时间)
      * @param key
@@ -54,20 +38,12 @@
      * @param time 秒
      */
     public void setStrValue(String key, String value, int time){
-        if(ToolUtil.isNotEmpty(key)){
-            Map<String,String> map = new HashMap<>();
-            map.put("key", key);
-            map.put("value", value);
-            map.put("time", String.valueOf(time));
-            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/setValue", map);
-            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
-            if(jsonObject.getIntValue("code") != 200){
-                System.err.println("调用redis出错了");
-            }
+        if(ToolUtil.isNotEmpty(key) && ToolUtil.isNotEmpty(value)){
+            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
         }
     }
-
-
+    
+    
     /**
      * 从redis中获取值
      * @param key
@@ -75,55 +51,22 @@
      */
     public String getValue(String key){
         if(ToolUtil.isNotEmpty(key)){
-            Map<String,String> map = new HashMap<>();
-            map.put("key", key);
-            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValue", map);
-            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
-            if(jsonObject.getIntValue("code") != 200){
-                System.err.println("调用redis出错了");
-            }
-            return jsonObject.getString("data");
+            String data = (String) redisTemplate.opsForValue().get(key);
+            return data;
         }
         return null;
     }
-
-
-
-    /**
-     * 从redis中获取值
-     * @param key
-     * @return
-     */
-    public String getValues(String key){
-        if(ToolUtil.isNotEmpty(key)){
-            Map<String,String> map = new HashMap<>();
-            map.put("keys", key);
-            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/getValues", map);
-            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
-            if(jsonObject.getIntValue("code") != 200){
-                System.err.println("调用redis出错了");
-            }
-            return jsonObject.getString("data");
-        }
-        return null;
-    }
-
-
+    
+    
+    
+    
     /**
      * 删除key
      * @param key
      */
-    public String remove(String key){
+    public void remove(String key){
         if(ToolUtil.isNotEmpty(key)){
-            Map<String,String> map = new HashMap<>();
-            map.put("key", key);
-            String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/redis/remove", map);
-            JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
-            if(jsonObject.getIntValue("code") != 200){
-                System.err.println("调用redis出错了");
-            }
-            return jsonObject.getString("data");
+            redisTemplate.delete(key);
         }
-        return null;
     }
 }
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java
new file mode 100644
index 0000000..97857c2
--- /dev/null
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java
@@ -0,0 +1,60 @@
+package com.stylefeng.guns.modular.system.util;
+
+import com.google.cloud.texttospeech.v1.*;
+import com.google.protobuf.ByteString;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+
+/**
+ * Google语音合成工具
+ * @author zhibing.pu
+ * @Date 2024/7/11 9:09
+ */
+public class TextToSpeechUtil {
+	
+	
+	/**
+	 * 合成音频文件
+	 * @param languageCode  语言编号
+	 * @param text  合成文本
+	 * @param fileName  音频文件名称
+	 * @throws Exception
+	 */
+	public static String create(String languageCode, String text, String fileName) throws Exception {
+		// Instantiates a client
+		try (TextToSpeechClient textToSpeechClient = TextToSpeechClient.create()) {
+			// Set the text input to be synthesized
+			SynthesisInput input = SynthesisInput.newBuilder().setText(text).build();
+			
+			// Build the voice request, select the language code ("en-US") and the ssml voice gender
+			// ("neutral")
+			VoiceSelectionParams voice =
+					VoiceSelectionParams.newBuilder()
+							.setLanguageCode(languageCode)
+							.setSsmlGender(SsmlVoiceGender.MALE)
+							.build();
+			
+			// Select the type of audio file you want returned
+			AudioConfig audioConfig =
+					AudioConfig.newBuilder().setAudioEncoding(AudioEncoding.MP3).build();
+			
+			// Perform the text-to-speech request on the text input with the selected voice parameters and
+			// audio file type
+			SynthesizeSpeechResponse response =
+					textToSpeechClient.synthesizeSpeech(input, voice, audioConfig);
+			
+			// Get the audio contents from the response
+			ByteString audioContents = response.getAudioContent();
+			
+			// Write the response to the output file.
+			try (OutputStream out = new FileOutputStream("/home/igotechgh/nginx/html/files/audio/" + fileName)) {
+				out.write(audioContents.toByteArray());
+				return "https://igo.i-go.group/files/audio/" + fileName;
+			}catch (Exception e){
+				e.printStackTrace();
+			}
+			return null;
+		}
+	}
+}
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java
new file mode 100644
index 0000000..258b883
--- /dev/null
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java
@@ -0,0 +1,231 @@
+package com.stylefeng.guns.modular.system.util.quartz;
+
+import com.stylefeng.guns.modular.system.util.quartz.model.QuartzEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+import org.quartz.impl.matchers.GroupMatcher;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * quartz任务调度工具类
+ * @author zhibing.pu
+ * @Date 2024/3/20 11:12
+ */
+@Slf4j
+@Component
+public class QuartzUtil {
+	
+	@Autowired
+	private Scheduler scheduler;
+	
+	/**
+	 * 构建Trigger执行器
+	 * @param startTime 任务开始执行时间,为空则立即执行
+	 * @param intervalInMilliseconds 执行间隔毫秒数
+	 * @param repeatCount 重读执行次数,-1表示永远执行
+	 * @return
+	 */
+	private static Trigger getSimpleTrigger(String job_name, String group_name, Date startTime, long intervalInMilliseconds, int repeatCount){
+		if(null == job_name || "".equals(job_name)){
+			job_name = QuartzEnum.JOB_NAME.getValue();
+		}
+		if(null == group_name || "".equals(group_name)){
+			group_name = QuartzEnum.DEFAULT_GROUP.getValue();
+		}
+		TriggerBuilder<Trigger> triggerTriggerBuilder = TriggerBuilder.newTrigger();
+		if(null == startTime){
+			triggerTriggerBuilder.startNow();
+		}else{
+			triggerTriggerBuilder.startAt(startTime);
+		}
+		
+		SimpleTrigger trigger = triggerTriggerBuilder
+				.withIdentity(job_name, group_name)
+				.withSchedule(
+						SimpleScheduleBuilder
+								.simpleSchedule()
+								.withIntervalInMilliseconds(intervalInMilliseconds)
+								.withRepeatCount(repeatCount)
+				).build();
+		return trigger;
+	}
+	
+	/**
+	 * 构建cronExpression表达式执行器
+	 * @param cron cron表达式
+	 * @return
+	 */
+	private static Trigger getCronTrigger(String job_name, String group_name, String cron) {
+		if(null == job_name || "".equals(job_name)){
+			job_name = QuartzEnum.JOB_NAME.getValue();
+		}
+		if(null == group_name || "".equals(group_name)){
+			group_name = QuartzEnum.DEFAULT_GROUP.getValue();
+		}
+		CronTrigger trigger = TriggerBuilder.newTrigger()
+				.startNow()
+				.withIdentity(job_name, group_name)
+				.withSchedule(
+						CronScheduleBuilder.cronSchedule(cron)
+				).build();
+		return trigger;
+	}
+	
+	/**
+	 * 添加普通定时任务
+	 * @param startTime 任务开始执行时间,为空则立即执行
+	 * @param intervalInMilliseconds 执行间隔毫秒数
+	 * @param repeatCount 重复执行次数,-1表示永远执行
+	 * @throws SchedulerException
+	 */
+	public void addSimpleQuartzTask(Class<? extends Job> clazz, String job_name, String group_name, JobDataMap jobDataMap, Date startTime, long intervalInMilliseconds, int repeatCount) throws SchedulerException {
+		JobKey jobKey = JobKey.jobKey(job_name, group_name);
+		if(scheduler.checkExists(jobKey)){
+			log.error("[添加定时任务]已存在该作业,jobkey为:{}", jobKey);
+			return;
+		}
+		// 构建 Job
+		JobDetail job = JobBuilder.newJob(clazz)
+				.setJobData(jobDataMap)
+				.withIdentity(jobKey).build();
+		// 构建 Trigger
+		Trigger trigger = getSimpleTrigger(job_name, group_name, startTime, intervalInMilliseconds, repeatCount);
+		// 启动调度器
+		scheduler.scheduleJob(job, trigger);
+		scheduler.start();
+	}
+	
+	/**
+	 * 添加Cron表达式的定时任务
+	 * @param cron cron表达式
+	 * @throws SchedulerException
+	 */
+	public void addCronQuartzTask(Class<? extends Job> clazz, String job_name, String group_name, JobDataMap jobDataMap, String cron) throws SchedulerException {
+		JobKey jobKey = JobKey.jobKey(job_name, group_name);
+		if(scheduler.checkExists(jobKey)){
+			log.error("[添加定时任务]已存在该作业,jobkey为:{}", jobKey);
+			return;
+		}
+		// 构建 Job
+		JobDetail job = JobBuilder.newJob(clazz)
+				.setJobData(jobDataMap)
+				.withIdentity(jobKey).build();
+		// 构建 Trigger
+		Trigger trigger = getCronTrigger(job_name, group_name, cron);
+		// 启动调度器
+		scheduler.scheduleJob(job, trigger);
+		scheduler.start();
+	}
+	
+	/**
+	 * 删除任务
+	 * @param name 任务名称
+	 * @param group 任务分组
+	 * @return
+	 */
+	public boolean deleteQuartzTask(String name, String group){
+		JobKey jobKey = new JobKey(name, group);
+		boolean b = false;
+		try {
+			b = scheduler.deleteJob(jobKey);
+		} catch (SchedulerException e) {
+			throw new RuntimeException(e);
+		}
+		return b;
+	}
+	
+	/**
+	 * 删除任务
+	 * @param jobKey
+	 * @return
+	 */
+	public boolean deleteQuartzTask(JobKey jobKey){
+		boolean b = false;
+		try {
+			b = scheduler.deleteJob(jobKey);
+		} catch (SchedulerException e) {
+			throw new RuntimeException(e);
+		}
+		return b;
+	}
+	
+	/**
+	 * 删除分组下的所有定时任务
+	 * @param group 分组名称
+	 * @return
+	 */
+	public boolean deleteGroupQuartzTask(String group){
+		try {
+			GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(group);
+			Set<JobKey> jobKeys = scheduler.getJobKeys(groupMatcher);
+			boolean b = scheduler.deleteJobs(jobKeys.stream().collect(Collectors.toList()));
+			if(!b){
+				return false;
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * 清空所有定时任务
+	 * @return
+	 */
+	public boolean deleteAllQuartzTask(){
+		try {
+			List<String> jobGroupNames = scheduler.getJobGroupNames();
+			for (String jobGroupName : jobGroupNames) {
+				GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals(jobGroupName);
+				Set<JobKey> jobKeys = scheduler.getJobKeys(groupMatcher);
+				boolean b = scheduler.deleteJobs(jobKeys.stream().collect(Collectors.toList()));
+				if(!b){
+					return false;
+				}
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+			return false;
+		}
+		return true;
+	}
+	
+	/**
+	 * 构建任务描述JobDetail对象
+	 * @return
+	 */
+	private JobDetail getJobDetail(Job job, String job_name, String group_name){
+		if(null == job_name || "".equals(job_name)){
+			job_name = QuartzEnum.JOB_NAME.getValue();
+		}
+		if(null == group_name || "".equals(group_name)){
+			group_name = QuartzEnum.DEFAULT_GROUP.getValue();
+		}
+		return getJobDetail(job, job_name, group_name, null);
+	}
+	
+	/**
+	 * 构建任务描述JobDetail对象
+	 * @param job 任务类
+	 * @param job_name 任务名称
+	 * @param group_name 任务分组名称
+	 * @param jobDataMap 自定义参数
+	 * @return
+	 */
+	private JobDetail getJobDetail(Job job, String job_name, String group_name, JobDataMap jobDataMap){
+		JobDetail jobDetail = JobBuilder.newJob(job.getClass())
+				.withIdentity(job_name, group_name)
+				.setJobData(jobDataMap)
+				.build();
+		return jobDetail;
+	}
+	
+	
+}
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java
new file mode 100644
index 0000000..1905e9d
--- /dev/null
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java
@@ -0,0 +1,239 @@
+package com.stylefeng.guns.modular.system.util.quartz.jobs;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.stylefeng.guns.core.util.ToolUtil;
+import com.stylefeng.guns.modular.system.controller.util.PushUtil;
+import com.stylefeng.guns.modular.system.dao.TUserMapper;
+import com.stylefeng.guns.modular.system.model.TDriver;
+import com.stylefeng.guns.modular.system.model.TOrderLogistics;
+import com.stylefeng.guns.modular.system.model.TOrderPrivateCar;
+import com.stylefeng.guns.modular.system.model.TUser;
+import com.stylefeng.guns.modular.system.service.ITDriverService;
+import com.stylefeng.guns.modular.system.service.ITOrderLogisticsService;
+import com.stylefeng.guns.modular.system.service.ITOrderPrivateCarService;
+import com.stylefeng.guns.modular.system.util.HttpRequestUtil;
+import com.stylefeng.guns.modular.system.util.PushURL;
+import com.stylefeng.guns.modular.system.util.TextToSpeechUtil;
+import com.stylefeng.guns.modular.system.util.quartz.QuartzUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+
+/**
+ * 订单司机超时提醒任务
+ * @author zhibing.pu
+ * @Date 2024/4/18 15:19
+ */
+@Slf4j
+@Component
+public class OrderTimeOutJob implements Job {
+	
+	@Resource
+	private PushUtil pushUtil;
+	@Resource
+	private ITOrderPrivateCarService orderPrivateCarService;
+	@Resource
+	private ITOrderLogisticsService orderLogisticsService;
+	@Resource
+	private ITDriverService driverService;
+	@Resource
+	private TUserMapper userInfoMapper;
+	
+	@Resource
+	private QuartzUtil quartzUtil;
+
+	
+	/**
+	 * 执行的业务逻辑
+	 * @param jobExecutionContext 定时任务上下文对象
+	 */
+	public void run(JobExecutionContext jobExecutionContext) {
+		JobDetail jobDetail = jobExecutionContext.getJobDetail();
+		JobDataMap jobDataMap = jobDetail.getJobDataMap();
+		String name = jobDetail.getKey().getName();
+		log.info("执行{}定时任务逻辑 JobDataMap:{}", name, JSON.toJSONString(jobDataMap));
+		Integer timeOutType = jobDataMap.getIntValue("timeOutType");
+		Integer driverId = jobDataMap.getIntValue("driverId");
+		Integer orderId = jobDataMap.getIntValue("orderId");
+		Integer orderType = jobDataMap.getIntValue("orderType");
+		Integer driverTimeout = jobDataMap.getIntValue("driverTimeout");
+		long timeOut = jobDataMap.getLongValue("timeOut");
+		String describe = jobDataMap.getString("describe");
+		TDriver driver = driverService.selectById(driverId);
+		Integer language = driver.getLanguage();
+		if(1 == timeOutType){
+			if(orderType == 1){
+				describe = language == 1 ? "您已超时" + driverTimeout + "分钟,\n用户可免费取消订单" : language == 2 ? "You are overdue for " + driverTimeout + " minutes,\nThe subscriber could cancel the order for free" : "Vous êtes en retard de " + driverTimeout + " minutes,\nL'abonné peut annuler la commande gratuitement";
+			}
+			if(orderType == 4){
+				describe = language == 1 ? "您已超时" + driverTimeout + "分钟,\n用户可免费取消订单" : language == 2 ? "You are overdue for " + driverTimeout + " minutes,\nThe subscriber could cancel the order for free" : "Vous êtes en retard de " + driverTimeout + " minutes,\nL'abonné peut annuler la commande gratuitement";
+			}
+		}
+		if(2 == timeOutType){
+			if(orderType == 1){
+				TOrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+				TUser userInfo = userInfoMapper.selectById(orderPrivateCar.getUserId());
+				SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+				describe = language == 1 ? "您将于" + sdf.format(orderPrivateCar.getTravelTime()) + "去接" + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName())  + ",请准时!" :
+						language == 2 ? "You are going to pick up " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " at " + sdf.format(orderPrivateCar.getTravelTime()) + ", please be on time. " :
+								"Vous allez chercher " + (ToolUtil.isEmpty(userInfo.getFirstName()) ? userInfo.getNickName() : userInfo.getFirstName() + " " + userInfo.getLastName()) + " à " + sdf.format(orderPrivateCar.getTravelTime()) + ", s’il vous plaît soyez à l’heure.";
+			}
+			if(orderType == 4){
+			}
+		}
+		if(3 == timeOutType){
+			Integer m = Double.valueOf((System.currentTimeMillis() - timeOut) / 60000).intValue();
+			if(orderType == 1){
+				if(0 == m){
+					describe = language == 1 ? "您的打车订单已超时,请抓紧!" : language == 2 ? "Your ride order is overdue, please go faster." : "Votre commande de course est en retard, veuillez aller plus vite.";
+				}else{
+					describe = language == 1 ? "您的打车订单已超时" + m + "分钟,请抓紧!" : language == 2 ? "Your ride order is overdue for " + m + " minute(s), please go faster." : "Votre commande de course est en retard depuis " + m + " minute(s), veuillez aller plus vite.";
+				}
+			}
+			if(orderType == 4){
+				if(0 == m){
+					describe = language == 1 ? "您的包裹订单已超时,请抓紧!" : language == 2 ? "Your delivery order is overdue, please go faster." : "Votre commande de Delivery est en retard, veuillez aller plus vite.";
+				}else{
+					describe = language == 1 ? "您的包裹订单已超时" + m + "分钟,请抓紧!" : language == 2 ? "Your delivery order is overdue for " + m + " minute(s), please go faster." : "Votre commande de livraison est en retard depuis " + m + " minute(s), veuillez aller plus vite.";
+				}
+			}
+		}
+		
+		
+		if(1 == orderType){
+			//结束预约单出发循环提醒定时
+			TOrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
+			List<Integer> list = Arrays.asList(4, 5, 6, 7, 8, 9, 10, 11, 12);
+			if(1 == timeOutType && list.contains(orderPrivateCar.getState())){
+				JobKey key = jobExecutionContext.getJobDetail().getKey();
+				boolean b = quartzUtil.deleteQuartzTask(key);
+				if(!b){
+					log.error("定时任务关闭失败:" + key.toString());
+				}
+				return;
+			}
+			if(2 == timeOutType && (System.currentTimeMillis() >= timeOut || list.contains(orderPrivateCar.getState()))){
+				JobKey key = jobExecutionContext.getJobDetail().getKey();
+				boolean b = quartzUtil.deleteQuartzTask(key);
+				if(!b){
+					log.error("定时任务关闭失败:" + key.toString());
+				}
+				return;
+			}
+			
+			//结束超时循环提醒定时
+			if(3 == timeOutType && list.contains(orderPrivateCar.getState())){
+				JobKey key = jobExecutionContext.getJobDetail().getKey();
+				boolean b = quartzUtil.deleteQuartzTask(key);
+				if(!b){
+					log.error("定时任务关闭失败:" + key.toString());
+				}
+				return;
+			}
+			
+			
+		}
+		if(4 == orderType){
+			TOrderLogistics orderLogistics = orderLogisticsService.selectById(orderId);
+			List<Integer> list = Arrays.asList(4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
+			if(1 == timeOutType && list.contains(orderLogistics.getState())){
+				JobKey key = jobExecutionContext.getJobDetail().getKey();
+				boolean b = quartzUtil.deleteQuartzTask(key);
+				if(!b){
+					log.error("定时任务关闭失败:" + key.toString());
+				}
+				return;
+			}
+			//结束超时循环提醒定时
+			if(3 == timeOutType && list.contains(orderLogistics.getState())){
+				JobKey key = jobExecutionContext.getJobDetail().getKey();
+				boolean b = quartzUtil.deleteQuartzTask(key);
+				if(!b){
+					log.error("定时任务关闭失败:" + key.toString());
+				}
+				return;
+			}
+		}
+		
+		String fileName = "orderTimeOut" + driverId + "_" + timeOutType + ".mp3";
+		String audioUrl = null;
+		try {
+			audioUrl = TextToSpeechUtil.create(language == 1 ? "cmn-CN" : language == 2 ? "en-US" : "fr-FR", describe, fileName);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		
+		//定时任务删除语音文件
+		new Timer().schedule(new TimerTask() {
+			@Override
+			public void run() {
+				try {
+					// 使用Runtime执行命令
+					Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
+					// 读取命令的输出
+					BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+					String line;
+					while ((line = reader.readLine()) != null) {
+						System.out.println(line);
+					}
+					// 等待命令执行完成
+					process.waitFor();
+					// 关闭流
+					reader.close();
+				} catch (IOException | InterruptedException e) {
+					e.printStackTrace();
+				}
+			}
+		}, 30000);
+		
+		log.info("开始推送提醒-{}:orderId={};orderType={};timeOutType={};describe={};audioUrl={}", System.currentTimeMillis(), orderId, orderType, timeOutType, describe, audioUrl);
+		JSONObject jsonObject = new JSONObject();
+		jsonObject.put("code", 200);
+		jsonObject.put("msg", "SUCCESS");
+		jsonObject.put("method", "ORDER_TIME_OUT");
+		Map<String, Object> map = new HashMap<>();
+		map.put("timeOutType", timeOutType);
+		map.put("orderId", orderId);
+		map.put("orderType", orderType);
+		map.put("describe", describe);
+		map.put("audioUrl", audioUrl);
+		jsonObject.put("data", map);
+		
+		//调用推送
+		HttpHeaders headers = new HttpHeaders();
+		// 以表单的方式提交
+		headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+		//将请求头部和参数合成一个请求
+		Map<String, String> params = new HashMap<>();
+		params.put("msg", jsonObject.toJSONString());
+		params.put("id", String.valueOf(driverId));
+		params.put("type", String.valueOf(2));
+		String s = HttpRequestUtil.postRequest(PushURL.zull_user_url + "/netty/sendMsgToClient", params);
+		JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+		if(jsonObject1.getIntValue("code") != 200){
+			System.err.println(jsonObject1.getString("msg"));
+		}
+		
+	}
+	
+	
+	@Override
+	public void execute(JobExecutionContext jobExecutionContext){
+		run(jobExecutionContext);
+	}
+	
+	
+	
+	
+}
diff --git a/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java
new file mode 100644
index 0000000..e8d10de
--- /dev/null
+++ b/ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java
@@ -0,0 +1,46 @@
+package com.stylefeng.guns.modular.system.util.quartz.model;
+
+/**
+ *
+ * quartz枚举常量
+ * @author zhibing.pu
+ * @Date 2024/3/20 11:20
+ */
+public enum QuartzEnum {
+	/**
+	 * 任务名称
+	 */
+	JOB_NAME("quartz_job"),
+	/**
+	 * 任务分组
+	 */
+	DEFAULT_GROUP("quartz_group"),
+	/**
+	 * quartz任务调度器启动成功
+	 */
+	SCHEDULER_START_SUCCESS("Quartz Scheduler start success!"),
+	/**
+	 * 任务添加到调度器成功
+	 */
+	ADD_SIMPLE_TRIGGER_SUCCESS("add Quartz SimpleTrigger success!"),
+	/**
+	 * 任务添加到调度器成功
+	 */
+	ADD_CRON_TRIGGER_SUCCESS("add Quartz CronTrigger success!")
+	;
+	
+	
+	QuartzEnum(String value) {
+		this.value = value;
+	}
+	
+	private String value;
+	
+	public String getValue() {
+		return value;
+	}
+	
+	private void setValue(String value) {
+		this.value = value;
+	}
+}
diff --git a/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml b/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml
index 2bc611b..9eff51b 100644
--- a/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml
+++ b/ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml
@@ -27,6 +27,11 @@
     multipart:
       max-request-size: 100MB
       max-file-size: 100MB
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 6379
+    password: 123456
   profiles:
     active: dev
 
diff --git a/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml b/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml
index c2eadaf..369b756 100644
--- a/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml
+++ b/ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml
@@ -29,6 +29,11 @@
     multipart:
       max-request-size: 100MB
       max-file-size: 100MB
+  redis:
+    database: 0
+    host: 127.0.0.1
+    port: 16379
+    password: mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5
 
 mybatis-plus:
   type-aliases-package: com.stylefeng.guns.modular.system.model

--
Gitblit v1.7.1