Pu Zhibing
2025-03-21 f88507a761ae5b8f47e52b81627ca485b500431a
修改bug
7个文件已修改
1031 ■■■■ 已修改文件
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java 956 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/DriverMapper.xml
@@ -120,13 +120,13 @@
        (select count(id) from t_order_private_car where driverId = a.id and state in (7, 8, 9) and to_days(insertTime) = to_days(now())) +
        (select count(id) from t_order_taxi where driverId = a.id and state in (7, 8, 9) and to_days(insertTime) = to_days(now())) +
        (select count(id) from t_order_cross_city where driverId = a.id and state in (6, 8, 9) and to_days(insertTime) = to_days(now())) +
        (select count(id) from t_order_logistics where driverId = a.id and state in (6, 9) and to_days(insertTime) = to_days(now()))
        (select count(id) from t_order_logistics where driverId = a.id and state in (7, 8, 9) and to_days(insertTime) = to_days(now()))
        ) as dayNum,
        (
        (select count(id) from t_order_private_car where driverId = a.id and state in (7, 8, 9) and DATE_FORMAT(insertTime, '%Y%m') = DATE_FORMAT(now(), '%Y%m')) +
        (select count(id) from t_order_taxi where driverId = a.id and state in (7, 8, 9) and DATE_FORMAT(insertTime, '%Y%m') = DATE_FORMAT(now(), '%Y%m')) +
        (select count(id) from t_order_cross_city where driverId = a.id and state in (6, 8, 9) and DATE_FORMAT(insertTime, '%Y%m') = DATE_FORMAT(now(), '%Y%m')) +
        (select count(id) from t_order_logistics where driverId = a.id and state in (6, 9) and DATE_FORMAT(insertTime, '%Y%m') = DATE_FORMAT(now(), '%Y%m'))
        (select count(id) from t_order_logistics where driverId = a.id and state in (7, 8, 9) and DATE_FORMAT(insertTime, '%Y%m') = DATE_FORMAT(now(), '%Y%m'))
        ) as mouthNum,
        ((select sum(fraction) from t_order_evaluate where driverId = a.id) / (select count(fraction) from t_order_evaluate where driverId = a.id)) as score,
        if((select count(id) from t_driver_work where driverId = a.id and state = 1) != 0, 1, 2) as `work`
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -1136,25 +1136,6 @@
        Map<String, Object> map = driverMapper.queryHomeData(uid);
        int size = this.queryMyActivity(uid, new Date(), language).size();
        map.put("activity", size);
        //获取司机待支付的现金支付订单推送司机支付
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                List<OrderPrivateCar> orderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<OrderPrivateCar>().eq("driverId", uid).eq("payType", 4)
//                        .eq("driverPay", 1).eq("isDelete", 1));
//                if(orderPrivateCars.size() > 0){
//                    OrderPrivateCar orderPrivateCar = orderPrivateCars.get(0);
//                    pushUtil.pushOfflinePayment(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1);
//                    return;
//                }
//                List<OrderLogistics> orderLogistics = orderLogisticsService.selectList(new EntityWrapper<OrderLogistics>().eq("driverId", uid).eq("payType", 4)
//                        .eq("isDelete", 1).eq("driverPay", 1));
//                if(orderLogistics.size() > 0){
//                    OrderLogistics orderLogistics1 = orderLogistics.get(0);
//                    pushUtil.pushOfflinePayment(2, orderLogistics1.getDriverId(), orderLogistics1.getId(), orderLogistics1.getType());
//                }
//            }
//        }).start();
        return map;
    }
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/ReassignServiceImpl.java
@@ -216,292 +216,294 @@
                List<Driver> list = driverService.queryIdleDriver(orderPrivateCar.getUserId(), 1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                System.err.println("【" + orderPrivateCar.getId() + "】空闲司机:" + JSON.toJSONString(list));
                if(list.size() > 0){
                    String text = "";
                    Driver driver1 = list.get(0);
                    reassign.setState(3);
                    reassign.setNowDriverId(driver1.getId());
                    reassign.setNowCarId(driver1.getCarId());
                    reassign.setCompleteTime(new Date());
                    this.updateById(reassign);
                    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());
                        }
                    }
                    orderPrivateCarService.updateAllColumnById(orderPrivateCar);
                    driver1.setState(3);
                    driverService.updateById(driver1);
                    Optional<Driver> optional = list.stream().filter(d -> !d.getId().equals(reassign.getOrderId())).findFirst();
                    if(optional.isPresent()){
                        Driver driver1 = optional.get();
                        String text = "";
                        reassign.setState(3);
                        reassign.setNowDriverId(driver1.getId());
                        reassign.setNowCarId(driver1.getCarId());
                        reassign.setCompleteTime(new Date());
                        this.updateById(reassign);
    
                    driver.setState(2);
                    driverService.updateById(driver);
    
                    //检查google车辆信息或者添加新的车辆信息
                    Car 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)){
                        CarModel 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;
                                }
                        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 {
                                    Thread.sleep(3000L);
                                } catch (InterruptedException e) {
                                    throw new RuntimeException(e);
                                    // 使用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);
    
                    //修改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);
                                }
                            }
                        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());
                        }
                    }else{
                        //开始修改行程数据
                        boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null);
                        if(!updateTrip){
                            for (int i = 0; i < 5; i++) {
                                updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null);
                                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分钟提醒一次。超时后停止提醒
                     */
                    //添加定时任务(普通任务)
                    SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver1.getCompanyId()));
                    if(null != reminderRules){
                        CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().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);
                            UserInfo userInfo = userInfoMapper.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);
                            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());
                            }
                        }
                    }
                    //推送相关代码------------------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();
                        orderPrivateCarService.updateAllColumnById(orderPrivateCar);
                        driver1.setState(3);
                        driverService.updateById(driver1);
    
                    Integer language2 = userInfoMapper.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());
                        driver.setState(2);
                        driverService.updateById(driver);
                        //检查google车辆信息或者添加新的车辆信息
                        Car 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)){
                            CarModel 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);
                            if(!updateTrip){
                                for (int i = 0; i < 5; i++) {
                                    updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderPrivateCar.getTripId(), null, null, null, null);
                                    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分钟提醒一次。超时后停止提醒
                         */
                        //添加定时任务(普通任务)
                        SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver1.getCompanyId()));
                        if(null != reminderRules){
                            CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().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);
                                UserInfo userInfo = userInfoMapper.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 = userInfoMapper.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());
                    }
                }
                break;
            case 4:
@@ -512,219 +514,221 @@
                List<Driver> list1 = driverService.queryIdleDriver(orderLogistics.getUserId(), orderLogistics.getType(), orderLogistics.getServerCarModelId(), orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder1.getPushDistance(), null);//所有附近空闲司机
                System.err.println("【" + orderLogistics.getId() + "】空闲司机:" + JSON.toJSONString(list1));
                if(list1.size() > 0){
                    Driver driver1 = list1.get(0);
                    reassign.setState(3);
                    reassign.setNowDriverId(driver1.getId());
                    reassign.setNowCarId(driver1.getCarId());
                    reassign.setCompleteTime(new Date());
                    this.updateById(reassign);
                    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 = "pushOrder" + driver1.getId() + 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);
                    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);
                    driverService.updateById(driver1);
                    Optional<Driver> optional = list1.stream().filter(d -> !d.getId().equals(reassign.getOrderId())).findFirst();
                    if(optional.isPresent()){
                        Driver driver1 = optional.get();
                        reassign.setState(3);
                        reassign.setNowDriverId(driver1.getId());
                        reassign.setNowCarId(driver1.getCarId());
                        reassign.setCompleteTime(new Date());
                        this.updateById(reassign);
    
                    driver.setState(2);
                    driverService.updateById(driver);
                        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 = "pushOrder" + driver1.getId() + 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);
    
                    //检查google车辆信息或者添加新的车辆信息
                    Car 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)){
                        CarModel 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);
                        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);
                        driverService.updateById(driver1);
                        driver.setState(2);
                        driverService.updateById(driver);
                        //检查google车辆信息或者添加新的车辆信息
                        Car 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)){
                            CarModel 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);
                                    }
                                }
                            }
                        }
                    }else{
                        //开始修改行程数据
                        boolean updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null);
                        if(!updateTrip){
                            for (int i = 0; i < 5; i++) {
                                updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null);
                                if(updateTrip){
                                    break;
                        //修改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);
                                    }
                                }
                                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);
                            if(!updateTrip){
                                for (int i = 0; i < 5; i++) {
                                    updateTrip = fleetEngineUtil.updateTrip(null, car.getVehicleId(), null, orderLogistics.getTripId(), null, null, null, null);
                                    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");
                        /**
                         * 超时用户取消不收费的提醒
                         *   即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
                         *
                         * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
                         *
                         * 定时提醒弹框
                         *   司机只要开始超时且还未到达预约点,则需要定时提醒
                         */
                        //添加定时任务(普通任务)
                        SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver1.getCompanyId()));
                        if(null != reminderRules){
                            CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().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);
        
                    //删除定时任务
                    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");
                    /**
                     * 超时用户取消不收费的提醒
                     *   即时单:预估到达预约点时间 + 配置不收费的时间 > 当前时间 (只弹一次)
                     *
                     * 超时用户取消订单后需要弹给司机提醒弹框,超时时间 = 当前时间 - 行程时间 - 配置不收费的时间
                     *
                     * 定时提醒弹框
                     *   司机只要开始超时且还未到达预约点,则需要定时提醒
                     */
                    //添加定时任务(普通任务)
                    SysOvertime reminderRules = sysOvertimeService.selectOne(new EntityWrapper<SysOvertime>().eq("companyId", driver1.getCompanyId()));
                    if(null != reminderRules){
                        CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().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);
                            //超时循环提醒
                            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();
                    Integer language2 = userInfoMapper.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());
                        //推送相关代码------------------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 = userInfoMapper.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());
                    }
                }
                break;
        }
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/TOrderPrivateCarMapper.xml
@@ -78,7 +78,8 @@
    <!--根据条件查询专车订单列表-->
    <select id="getPrivateCarOrderList" resultType="map" parameterType="com.baomidou.mybatisplus.plugins.Page">
        SELECT * FROM (SELECT ui.nickName as userName,ui.phone as userPhone,CONCAT(di.firstName, " ", di.lastName,'-',di.phone) as driver,CONCAT(cb.`name`,'-',ci.carLicensePlate) as car,
        sc.chineseName as serverCarModel,ifnull(oc.money, 0) as cancel_money,ot.* FROM t_order_private_car as ot
        sc.chineseName as serverCarModel,ifnull(oc.money, 0) as cancel_money,ot.*
        FROM t_order_private_car as ot
        LEFT JOIN t_user as ui on ui.id = ot.userId
        LEFT JOIN t_driver as di on di.id = ot.driverId
        LEFT JOIN t_car as ci on ci.id= ot.carId
@@ -165,7 +166,8 @@
        oc.money as cancelMoney,
        case when oc.payType = 1 then '手机支付'
             when oc.payType = 2 then '银行卡支付'
             when oc.payType = 3 then '余额支付' else '现金支付' end as cancelPayTypeStr
             when oc.payType = 3 then '余额支付'
             when oc.payType = 4 then '现金支付'else '' end as cancelPayTypeStr
        FROM t_order_private_car as ot
        LEFT JOIN t_user as ui on ui.id = ot.userId
        LEFT JOIN t_driver as di on di.id = ot.driverId
@@ -173,7 +175,7 @@
        LEFT JOIN t_car_brand as cb on cb.id = ci.carBrandId
        LEFT JOIN t_company as cc on cc.id = ot.companyId
        LEFT JOIN t_server_carmodel as sc on sc.id = ot.serverCarModelId
        LEFT JOIN t_order_cancel as oc on ot.id = oc.orderId and oc.orderType = 1
        LEFT JOIN t_order_cancel as oc on ot.id = oc.orderId and oc.orderType = 1 and oc.state = 2
        LEFT JOIN (
            SELECT sum(ii.money) as money,ii.incomeId,cc.type FROM t_income as ii
            LEFT JOIN t_company as cc on ii.objectId = cc.id
ManagementIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderPrivateCarServiceImpl.java
@@ -24,7 +24,8 @@
    @Override
    public List<Map<String, Object>> getPrivateCarOrderList(Page<Map<String, Object>> page, String beginTime, String endTime, Integer roleType, Integer nowUserId, String orderNum, Integer orderSource, String userName, String userPhone, String passengers, String passengersPhone, Integer serverCarModelId, String driver, Integer state,
                                                            Integer smsNumber) {
        return this.baseMapper.getPrivateCarOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, state,smsNumber);
        List<Map<String, Object>> list = this.baseMapper.getPrivateCarOrderList(page, beginTime, endTime, roleType, nowUserId, orderNum, orderSource, userName, userPhone, passengers, passengersPhone, serverCarModelId, driver, state, smsNumber);
        return list;
    }
    @Override
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -665,6 +665,17 @@
    public ResultUtil placeOrderPackage(String remark, String placementLon, String placementLat, String startLon, String startLat, String startAddress,
                                        String recipient, String recipientPhone, String endLon, String endLat, String endAddress,
                                        Integer serverCarModelId, Integer driverId, Integer orderSource, Integer uid, Integer language) throws Exception {
        UserInfo userInfo = userInfoService.selectById(uid);
        if(ToolUtil.isEmpty(userInfo.getPhone())){
            return ResultUtil.error(language == 1 ? "请先绑定手机号码" : language == 2 ? "Please bind your mobile phone number first." : "Veuillez d’abord vous inscrire en liant votre numéro de téléphone portable.");
        }
        String[] split1 = placementLon.split(",");
        Company company = companyCityService.query1(uid, split1[0], split1[1]);
        if(null != userInfo && null != company){
            userInfo.setCompanyId(company.getId());
            userInfoService.updateById(userInfo);
        }
        /**
         * 1.下了即时单就不能下预约单和即时单
         * 2.下了预约单和再下一张即时单不能再下预约单
@@ -686,6 +697,8 @@
            return ResultUtil.error(language == 1 ? "请选择服务车型" : language == 2 ? "Please select vehicle-type" : "Veuillez sélectionner le type de véhicule");
        }
    
        userInfo.setLanguage(language);
        userInfoService.updateById(userInfo);
        OrderLogistics orderLogistics = new OrderLogistics();
        orderLogistics.setType(4);
        orderLogistics.setUserId(uid);
@@ -770,10 +783,6 @@
        Long distance1 = distancematrix1.getDistance();
        orderLogistics.setEstimatedMileage(new BigDecimal(distance1).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
        this.insert(orderLogistics);
        UserInfo userInfo = userInfoService.selectById(uid);
        userInfo.setLanguage(language);
        userInfoService.updateById(userInfo);
    
        //google创建车辆信息
        String vehicleId = null;
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -239,7 +239,18 @@
    @Override
    public synchronized ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
                                          String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid, Integer language) throws Exception {
        UserInfo userInfo = userInfoService.selectById(uid);
        if(ToolUtil.isEmpty(userInfo.getPhone())){
            return ResultUtil.error(language == 1 ? "请先绑定手机号码" : language == 2 ? "Please bind your mobile phone number first." : "Veuillez d’abord vous inscrire en liant votre numéro de téléphone portable.");
        }
        String[] split1 = placementLon.split(",");
        Company company = companyCityService.query1(uid, split1[0], split1[1]);
        if(null != userInfo && null != company){
            userInfo.setCompanyId(company.getId());
            userInfoService.updateById(userInfo);
        }
        //如果出行时间大于当前10分钟则默认为预约单
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
            reservation = 2;
@@ -279,7 +290,8 @@
        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
            return ResultUtil.error(language == 1 ? "请选择服务车型" : language == 2 ? "Please select vehicle-type" : "Veuillez sélectionner le type de véhicule");
        }
        userInfo.setLanguage(language);
        userInfoService.updateById(userInfo);
        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
        orderPrivateCar.setType(type);
        orderPrivateCar.setUserId(uid);
@@ -300,10 +312,6 @@
        orderPrivateCar.setPassengers(name);
        orderPrivateCar.setPassengersPhone(phone);
        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
            UserInfo userInfo = userInfoService.selectById(uid);
            if(ToolUtil.isEmpty(userInfo.getPhone())){
                return ResultUtil.error(language == 1 ? "请先绑定手机号码" : language == 2 ? "Please bind your mobile phone number first." : "Veuillez d’abord vous inscrire en liant votre numéro de téléphone portable.");
            }
            orderPrivateCar.setPassengers(userInfo.getFirstName() + "." + userInfo.getLastName());
            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
        }
@@ -372,9 +380,7 @@
        orderPrivateCar.setEstimatedMileage(new BigDecimal(distance1).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
        this.insert(orderPrivateCar);
    
        UserInfo userInfo = userInfoService.selectById(uid);
        userInfo.setLanguage(language);
        userInfoService.updateById(userInfo);
    
        //google创建车辆信息
        String vehicleId = null;