ef3606f6f0d3ab7705eba6d6d0b48b779e8e9c51..b35b859957e3f8aac2f7d70b7a13f5eb16056840
2025-04-25 Pu Zhibing
修改bug
b35b85 对比 | 目录
2025-04-25 Pu Zhibing
修改bug
4bff66 对比 | 目录
2025-04-25 Pu Zhibing
修改文档bug
fc5b7d 对比 | 目录
2025-04-25 Pu Zhibing
修改bug
20fb7c 对比 | 目录
37个文件已修改
4个文件已删除
4个文件已添加
2431 ■■■■ 已修改文件
DriverIGOTravel/guns-admin/pom.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderTracks.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/resources/application-dev.yml 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/resources/application-produce.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/resources/redis.properties 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/HomeController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/SysRedPacketRecordController.java 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderLogisticsController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderPrivateCarController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TReassignController.java 639 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/util/PushUtil.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/TReassignMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderLogistics.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TOrderPrivateCar.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/TSysOverTime.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ITSystemNoticeService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TReassignServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TSystemNoticeServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/resources/application-dev.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/resources/application-produce.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/config/RedisConfig.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ServerCarModelServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/resources/application-dev.yml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/resources/application-produce.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/resources/redis.properties 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulIGOTravel/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ZuulIGOTravel/src/main/resources/application.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/pom.xml
@@ -181,11 +181,11 @@
            <artifactId>jjwt</artifactId>
        </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>
        <dependency>
            <groupId>cn.jpush.api</groupId>
            <artifactId>jpush-client</artifactId>
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/OrderTracks.java
@@ -1,7 +1,9 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
/**
@@ -15,9 +17,14 @@
    /**
     * 订单id
     */
    @TableField("id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 订单id
     */
    @TableField("orderId")
    private Integer orderId;
    /**
     * 订单类型(1=打车,4=包裹)
     */
    @TableField("orderType")
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java
@@ -108,15 +108,15 @@
            String englishName = city1.getEnglishName();
            String frenchName = city1.getFrenchName();
            for (String s : city) {
                if(s.equals(chineseName)){
                if(s.contains(chineseName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(englishName)){
                if(s.contains(englishName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(frenchName)){
                if(s.contains(frenchName)){
                    collect.add(city1.getId());
                    break;
                }
@@ -148,15 +148,15 @@
            String englishName = city1.getEnglishName();
            String frenchName = city1.getFrenchName();
            for (String s : city) {
                if(s.equals(chineseName)){
                if(s.contains(chineseName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(englishName)){
                if(s.contains(englishName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(frenchName)){
                if(s.contains(frenchName)){
                    collect.add(city1.getId());
                    break;
                }
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/GoogleMap/FleetEngineUtil.java
@@ -730,8 +730,9 @@
        }else{
            if("ENROUTE_TO_DROPOFF".equals(tripStatus)){
                OrderTracks orderTracks = new OrderTracks();
                orderTracks.setId(orderId);
                orderTracks.setOrderId(orderId);
                orderTracks.setOrderType(orderType);
                orderTracks.setGoogleTracks(jsonObject.getString("route"));
                orderTracksService.insert(orderTracks);
            }
        }
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.stylefeng.guns.core.util.ToolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
@@ -12,43 +13,32 @@
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.TimeUnit;
/**
 * Redis工具类
 */
@Component
public class RedisUtil {
    @Autowired
    private RestTemplate internalRestTemplate;
    private RedisTemplate redisTemplate;
    /**
     * 向redis中存储字符串没有过期时间
     * @param key
     * @param value
     */
    public void setStrValue(String key, String value){
        if(ToolUtil.isNotEmpty(key)){
            //发送验证码短信
            HttpHeaders headers = new HttpHeaders();
            // 以表单的方式提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            //将请求头部和参数合成一个请求
            MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
            params.add("key", key);
            params.add("value", value);
            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue_", requestEntity, String.class);
            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
@@ -56,26 +46,12 @@
     * @param time 秒
     */
    public void setStrValue(String key, String value, int time){
        if(ToolUtil.isNotEmpty(key)){
            //发送验证码短信
            HttpHeaders headers = new HttpHeaders();
            // 以表单的方式提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            //将请求头部和参数合成一个请求
            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
            params.add("key", key);
            params.add("value", value);
            params.add("time", String.valueOf(time));
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/setValue", requestEntity, String.class);
            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
@@ -83,45 +59,22 @@
     */
    public String getValue(String key){
        if(ToolUtil.isNotEmpty(key)){
            HttpHeaders headers = new HttpHeaders();
            // 以表单的方式提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            //将请求头部和参数合成一个请求
            MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
            params.add("key", key);
            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/getValue",requestEntity , String.class);
            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;
    }
    /**
     * 删除key
     * @param key
     */
    public String remove(String key){
    public void remove(String key){
        if(ToolUtil.isNotEmpty(key)){
            HttpHeaders headers = new HttpHeaders();
            // 以表单的方式提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            //将请求头部和参数合成一个请求
            MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
            params.add("key", key);
            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
            String s = internalRestTemplate.postForObject("http://zuul-gateway/redis/remove",requestEntity , String.class);
            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;
    }
}
DriverIGOTravel/guns-admin/src/main/resources/application-dev.yml
@@ -25,6 +25,11 @@
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
mybatis-plus:
  typeAliasesPackage: com.stylefeng.guns.modular
@@ -42,10 +47,10 @@
---
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/igotravel2.0?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://127.0.0.1:3306/igotravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B0
    username: root
    password: 123456
    db-name: guns #用来搜集数据库的所有表
    db-name: igotravel #用来搜集数据库的所有表
    filters: wall,mergeStat
DriverIGOTravel/guns-admin/src/main/resources/application-produce.yml
@@ -27,6 +27,11 @@
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB
  redis:
    database: 0
    host: 127.0.0.1
    port: 16379
    password: mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5
mybatis-plus:
  typeAliasesPackage: com.stylefeng.guns.modular
DriverIGOTravel/guns-admin/src/main/resources/redis.properties
File was deleted
DriverIGOTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java
@@ -24,7 +24,7 @@
    private Integer minIdle = 100;
    private Integer maxActive = 500;
    private Integer maxActive = 100;
    private Integer maxWait = 60000;
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 -->
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){
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,"当前红包为随机红包,可能有部分用户无法领取");
    }
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);
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);
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;
    }
}
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"));
        }
    }
}
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);
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;
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;
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;
}
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) ;
}
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
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());
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);
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;
    }
}
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TextToSpeechUtil.java
New file
@@ -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;
        }
    }
}
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/QuartzUtil.java
New file
@@ -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;
    }
}
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/jobs/OrderTimeOutJob.java
New file
@@ -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);
    }
}
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/quartz/model/QuartzEnum.java
New file
@@ -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;
    }
}
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
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
UserIGOTravel/guns-admin/pom.xml
@@ -169,11 +169,9 @@
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </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>
        <dependency>
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/config/RedisConfig.java
File was deleted
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -1262,6 +1262,8 @@
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            System.err.println("支付接口请求参数:payType=" + payType + "&bankCardId=" + bankCardId + "&orderId=" + orderId + "&orderType=" + orderType +
                    "&couponId=" + couponId + "&redDeduction=" + redDeduction + "&type=" + type + "&language=" + language);
            String format = String.format("uid=%s&payType=%s&orderId=%s&orderType=%s", uid, payType, orderId, orderType);
            String key = MD5Util.encrypt(format);
            String value = redisUtil.getValue(key);
@@ -1778,9 +1780,11 @@
                return ResultUtil.tokenErr();
            }
            Double payMoney = 0D;
            Integer companyId = 1;
            switch (orderType){
                case 1:
                    OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
                    companyId = orderPrivateCar.getCompanyId();
                    Double orderMoney = orderPrivateCar.getOrderMoney();
                    if(null == orderMoney){
                        orderMoney = 0D;
@@ -1799,6 +1803,7 @@
                    break;
                case 4:
                    OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId);
                    companyId = orderLogistics.getCompanyId();
                    Double orderMoney1 = orderLogistics.getOrderMoney();
                    if(null == orderMoney1){
                        orderMoney1 = 0D;
@@ -1816,9 +1821,10 @@
                    }
                    break;
            }
            Double aDouble = userRedPacketRecordService.queryRemainingAmount(uid);
            List<UserRedPacketRecord> userRedPacketRecords = userRedPacketRecordService.selectList(new EntityWrapper<UserRedPacketRecord>().eq("userId", uid)
                    .eq("state", 1).eq("companyId", companyId).gt("remainingAmount", 0).orderBy("insertTime", false));
            Map<String, Object> map = new HashMap<>();
            map.put("redTotal", aDouble);
            map.put("redTotal", userRedPacketRecords.stream().mapToDouble(UserRedPacketRecord::getRemainingAmount).sum());
            RedEnvelopePaymentSettings redEnvelopePaymentSettings = redEnvelopePaymentSettingsService.getRedEnvelopePaymentSettings();
            if(null == redEnvelopePaymentSettings){
                map.put("deductionAmount", 0D);
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -1038,6 +1038,7 @@
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                System.err.println("直推司机后推送司机订单状态");
                                pushUtil.pushOrderState(1, uid, orderLogistics.getId(), 4, 2, 0, "");
                                pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, 2, 0, finalAudioUrl);
                            }
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -1,5 +1,6 @@
package com.stylefeng.guns.modular.specialTrain.server.impl;
import cn.hutool.db.nosql.redis.RedisDS;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -59,6 +60,7 @@
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -147,7 +149,7 @@
    @Resource
    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
    @Resource
    private RedisUtil redisUtil;
@@ -1301,7 +1303,7 @@
        ResultUtil resultUtil = ResultUtil.success("");
        orderPrivateCar.setCouponMoney(0D);//初始化历史数据
        orderPrivateCar.setCouponId(null);
        //计算折扣
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderPrivateCar.getCompanyId());
        if(null != query2){
@@ -1320,7 +1322,7 @@
                }
            }
        }
        //计算优惠券
        UserCouponRecord userCouponRecord = null;
        if(null != couponId){
@@ -1347,7 +1349,7 @@
            orderPrivateCar.setCouponMoney(userCouponRecord.getMoney());
            orderPrivateCar.setCouponId(couponId);
        }
        //计算红包
        if(null != redDeduction && 1 == redDeduction && null == orderPrivateCar.getRedPacketId()){
            RedEnvelopePaymentSettings redEnvelopePaymentSettings = redEnvelopePaymentSettingsService.getRedEnvelopePaymentSettings();
@@ -1360,14 +1362,14 @@
                if(total > 0 && multiply1.doubleValue() > 0 && total.compareTo(multiply1.doubleValue()) >= 0){
                    orderPrivateCar.setRedPacketMoney(multiply1.doubleValue());
                    orderMoney = orderMoney.subtract(multiply1).setScale(2, RoundingMode.HALF_EVEN);
                    //获取红包id
                    JSONArray jsonArray = new JSONArray();
                    for (UserRedPacketRecord userRedPacketRecord : userRedPacketRecords) {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("id", userRedPacketRecord.getId());
                        BigDecimal remainingAmount = new BigDecimal(userRedPacketRecord.getRemainingAmount());
                        if(multiply1.compareTo(remainingAmount) >= 0){
                            userRedPacketRecord.setRemainingAmount(0D);
                            userRedPacketRecord.setEndTime(new Date());
@@ -1397,7 +1399,7 @@
                        jsonObject.put("id", userRedPacketRecord.getId());
                        jsonObject.put("money", userRedPacketRecord.getRemainingAmount());
                        jsonArray.add(jsonObject);
                        userRedPacketRecord.setRemainingAmount(0D);
                        userRedPacketRecord.setEndTime(new Date());
                        userRedPacketRecord.setState(2);
@@ -1409,8 +1411,8 @@
                }
            }
        }
        if(payType == 1){//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "1" + language + orderId;
@@ -1428,14 +1430,14 @@
            checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 1, 1,
                        orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), null, 1);//添加预支付数据
            }else{
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
        }
        if(payType == 2){//银行卡支付
            BankCard bankCard = bankCardService.selectById(bankCardId);
@@ -1455,7 +1457,7 @@
            checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 1, 2,
                        orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), null, 1);//添加预支付数据
@@ -1467,28 +1469,28 @@
            if(userInfo.getBalance() == null || new BigDecimal(userInfo.getBalance()).compareTo(orderMoney) < 0){
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant", "");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(orderMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "完成订单", orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(),
                    2, 1, 1, 1, orderId);
            userInfoService.updateById(userInfo);
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(3);
            orderPrivateCar.setPayMoney(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            //添加已收入明细
            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
            Double speMoney = company.getSpeMoney();
@@ -1510,7 +1512,7 @@
            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driverService.updateById(driver);
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                new Thread(new Runnable() {
                    @Override
@@ -1850,7 +1852,7 @@
                                server_tel_french.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                            }
                            EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course",  document.html());
                            //开始生成pdf收据和html收据
                            File file = new File("/home/igotechgh/nginx/html/files/html/");
                            if(!file.exists()){
@@ -1864,7 +1866,7 @@
                            fileWriter.write(document.html());
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
@@ -1880,7 +1882,7 @@
                                e.printStackTrace();
                                System.out.println("html转pdf异常");
                            }
                            String link ="https://igo.i-go.group/files/html/ride_receipt_" + orderId + ".html";
                            TEmail tEmail = new TEmail();
                            tEmail.setLink(link);
@@ -1898,18 +1900,18 @@
                                tEmail.setAmOrPm(language==1?"下午":language==2?"afternoon":"après-midi");
                            }
                            emailService.insert(tEmail);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
@@ -1918,7 +1920,7 @@
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成出行订单支付,谢谢使用!" : language == 2
                    ? "You've paid for the ride order successfully, thank you for using I-GO"
                    : "Vous avez payé la commande de course avec succès, merci d’utiliser I-GO", orderPrivateCar.getUserId(), 1);
@@ -1926,19 +1928,19 @@
        if(payType == 4){//现金支付
            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "完成订单", orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(),
                    2, 1, 1, 1, orderId);
            userInfoService.updateById(userInfo);
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(4);
            orderPrivateCar.setDriverPay(2);
            orderPrivateCar.setPayMoney(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
@@ -1952,7 +1954,7 @@
                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driverService.updateById(driver);
            }
            if(null != orderPrivateCar.getRedPacketId()){
                Double money = orderPrivateCar.getRedPacketMoney();
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 7, orderPrivateCar.getId(), 1, money);
@@ -1961,7 +1963,7 @@
                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driverService.updateById(driver);
            }
            if(null != orderPrivateCar.getDiscountMoney() && 0 < orderPrivateCar.getDiscountMoney()){
                Double money = orderPrivateCar.getDiscountMoney();
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 6, orderPrivateCar.getId(), 1, money);
@@ -1970,8 +1972,8 @@
                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driverService.updateById(driver);
            }
            //添加已收入明细
            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
            Double speMoney = company.getSpeMoney();
@@ -1993,8 +1995,8 @@
//                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
//                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
//                driverService.updateById(driver);
            //记录司机待结算金额
            if(d.compareTo(new BigDecimal(0)) > 0){
                SettlementDetail settlementDetail = new SettlementDetail();
@@ -2005,7 +2007,7 @@
                settlementDetail.setPrice(d.doubleValue());
                settlementDetail.setCreateTime(new Date());
                settlementDetailService.insert(settlementDetail);
                SettlementAllocation settlementAllocation = settlementAllocationService.selectOne(null);
                if(null != settlementAllocation){
                    JSONObject jsonObject = JSON.parseObject(settlementAllocation.getContent());
@@ -2053,7 +2055,7 @@
                                    car.setVehicleId(UUIDUtil.getRandomCode());
                                    carService.updateById(car);
                                }
                                //司机下班,修改谷歌上的车辆信息
                                new Thread(()->{
                                    try {
@@ -2101,7 +2103,7 @@
                    }
                }
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                new Thread(new Runnable() {
                    @Override
@@ -2440,9 +2442,9 @@
                                Element server_tel_french = document.getElementById("server_tel_french");
                                server_tel_french.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                            }
                            EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course",  document.html());
                            //开始生成pdf收据和html收据
                            File file = new File("/home/igotechgh/nginx/html/files/html/");
                            if(!file.exists()){
@@ -2456,7 +2458,7 @@
                            fileWriter.write(document.html());
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
@@ -2489,17 +2491,17 @@
                                tEmail.setAmOrPm(language==1?"下午":language==2?"afternoon":"après-midi");
                            }
                            emailService.insert(tEmail);
                        }catch (Exception e){
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
@@ -2518,7 +2520,7 @@
                        case 3:
                            text = "Le client a choisi de payer en espèces, vous devez donc encaisser le paiement.Confirmez si vous avez reçu les frais pour cette commande : Espèces GHS " + orderPrivateCar.getPayMoney();
                            break;
                    }
                    String audioUrl = "";
                    String fileName = "offlinePayment" + orderPrivateCar.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
@@ -2552,12 +2554,12 @@
                    pushUtil.pushOfflinePayment(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getPayMoney(), audioUrl);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成出行订单支付,谢谢使用!" : language == 2
                    ? "You've paid for the ride order successfully, thank you for using I-GO"
                    : "Vous avez payé la commande de course avec succès, merci d’utiliser I-GO", orderPrivateCar.getUserId(), 1);
        }
        this.updateAllColumnById(orderPrivateCar);
        return resultUtil;
    }
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/CompanyCityServiceImpl.java
@@ -68,15 +68,15 @@
            String englishName = city1.getEnglishName();
            String frenchName = city1.getFrenchName();
            for (String s : city) {
                if(s.equals(chineseName)){
                if(s.contains(chineseName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(englishName)){
                if(s.contains(englishName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(frenchName)){
                if(s.contains(frenchName)){
                    collect.add(city1.getId());
                    break;
                }
@@ -99,15 +99,15 @@
            String englishName = city1.getEnglishName();
            String frenchName = city1.getFrenchName();
            for (String s : city) {
                if(s.equals(chineseName)){
                if(s.contains(chineseName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(englishName)){
                if(s.contains(englishName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(frenchName)){
                if(s.contains(frenchName)){
                    collect.add(city1.getId());
                    break;
                }
@@ -137,15 +137,15 @@
            String englishName = city1.getEnglishName();
            String frenchName = city1.getFrenchName();
            for (String s : city) {
                if(s.equals(chineseName)){
                if(s.contains(chineseName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(englishName)){
                if(s.contains(englishName)){
                    collect.add(city1.getId());
                    break;
                }
                if(s.equals(frenchName)){
                if(s.contains(frenchName)){
                    collect.add(city1.getId());
                    break;
                }
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ServerCarModelServiceImpl.java
@@ -81,6 +81,7 @@
        
        String tripId = redisUtil.getValue("trip" + uid);
        //查找与起点匹配的企业(经营范围)
        System.err.println("经纬度:" + startLonLat);
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(startLonLat.split(",")[1]), Double.valueOf(startLonLat.split(",")[0]), tripId);
        if(null == language){
            language = 2;
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/RedisUtil.java
File was deleted
UserIGOTravel/guns-admin/src/main/resources/application-dev.yml
@@ -25,6 +25,11 @@
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
mybatis-plus:
  typeAliasesPackage: com.stylefeng.guns.modular
@@ -47,20 +52,12 @@
  base-package: com.stylefeng.guns.modular
#spring:
#  datasource:
#    url: jdbc:mysql://127.0.0.1:3306/igotravel2.0?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B0
#    username: root
#    password: 123456
#    db-name: guns #用来搜集数据库的所有表
#    filters: wall,mergeStat
spring:
  datasource:
    url: jdbc:mysql://182.160.16.251:3306/igotravel2.0?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B0
    url: jdbc:mysql://127.0.0.1:3306/igotravel?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=GMT%2B0
    username: root
    password: HjKbXilb9zajmXbl
    db-name: guns #用来搜集数据库的所有表
    password: 123456
    db-name: igotravel #用来搜集数据库的所有表
    filters: wall,mergeStat
UserIGOTravel/guns-admin/src/main/resources/application-produce.yml
@@ -23,11 +23,14 @@
      enabled: false
      additional-paths: src/main/java
      exclude: static/**,WEB-INF/view/**
  servlet:
    multipart:
      max-request-size: 100MB
      max-file-size: 100MB
  redis:
    database: 0
    host: 127.0.0.1
    port: 16379
    password: mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5
mybatis-plus:
  typeAliasesPackage: com.stylefeng.guns.modular
UserIGOTravel/guns-admin/src/main/resources/redis.properties
File was deleted
UserIGOTravel/guns-core/src/main/java/com/stylefeng/guns/core/config/properties/DruidProperties.java
@@ -24,7 +24,7 @@
    private Integer minIdle = 100;
    private Integer maxActive = 500;
    private Integer maxActive = 100;
    private Integer maxWait = 60000;
ZuulIGOTravel/src/main/java/com/sinata/zuul/util/echo/NettyServerController.java
@@ -315,6 +315,8 @@
                    if(b){
                        NettyChannelMap.remove(ctx);
                    }
                }else{
                    System.err.println("推送成功"+msg);
                }
            } catch (Exception e) {
                System.err.println("推送发生异常,记录:"+msg);
ZuulIGOTravel/src/main/resources/application.yml
@@ -14,6 +14,8 @@
    host: 127.0.0.1
    port: 16379
    password: mPMHThYzlT8DWgl8HLqwPEyPOiHDPPB5
#    port: 6379
#    password: 123456
eureka:
  client: