Pu Zhibing
7 天以前 4c99ee7028c3fe58a2cd4b8273b22c75c45574fc
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;
@@ -244,8 +246,7 @@
        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]);
        Company company = companyCityService.query1(uid, placementLon, placementLat);
        if(null != userInfo && null != company){
            userInfo.setCompanyId(company.getId());
            userInfoService.updateById(userInfo);
@@ -312,7 +313,7 @@
        orderPrivateCar.setPassengers(name);
        orderPrivateCar.setPassengersPhone(phone);
        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
            orderPrivateCar.setPassengers(userInfo.getFirstName() + "." + userInfo.getLastName());
            orderPrivateCar.setPassengers(ToolUtil.isNotEmpty(userInfo.getFirstName()) ? userInfo.getFirstName() + "." + userInfo.getLastName() : "");
            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
        }
        orderPrivateCar.setState(1);
@@ -375,6 +376,7 @@
        orderPrivateCar.setIsReassign(1);
        orderPrivateCar.setIsDelete(1);
        orderPrivateCar.setTripId(tripId);
        orderPrivateCar.setIsover(0);
        DistancematrixVo distancematrix1 = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), orderPrivateCar.getEndLat(), orderPrivateCar.getEndLon(), tripId);
        Long distance1 = distancematrix1.getDistance();
        orderPrivateCar.setEstimatedMileage(new BigDecimal(distance1).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
@@ -501,8 +503,8 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0, "");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0, finalAudioUrl);
                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0, "", "user");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0, finalAudioUrl, "user");
                }
            }).start();
        }
@@ -573,6 +575,16 @@
                        CarService query1 = carServiceMapper.query(1, dr.getCarId());
                        orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
                        orderPrivateCar.setSnatchOrderTime(new Date());
                        String value = redisUtil.getValue("DRIVER" + driver.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());
                        }
    
                        dr.setState(3);
                        driverService.updateById(dr);
@@ -626,8 +638,8 @@
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0, "");
                                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0, finalAudioUrl);
                                pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0, "", "user");
                                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0, finalAudioUrl, "user");
                            }
                        }).start();
                    }
@@ -720,7 +732,10 @@
        BaseWarpper baseWarpper = new BaseWarpper();
        double amount = 0;
        CancleOrder query = cancleOrderService.query(orderPrivateCar.getCompanyId());
        if(null == query || null == orderPrivateCar.getDriverId() || orderPrivateCar.getState() == 11){
        if(null == query){
            return ResultUtil.error("请先添加取消规则");
        }
        if(null == orderPrivateCar.getDriverId() || orderPrivateCar.getState() == 11){
            baseWarpper.setAmount(amount);
            return ResultUtil.success(baseWarpper);
        }
@@ -728,6 +743,10 @@
        long t = object.getInteger("driverTimeout") * 60000L;
        //司机超时未到达起点,免费取消
        if(orderPrivateCar.getOrderType() == 1){
            if(orderPrivateCar.getState() == 1 || orderPrivateCar.getState() == 11){
                baseWarpper.setAmount(0D);
                return ResultUtil.success(baseWarpper);
            }
            if(orderPrivateCar.getState() <= 3 && orderPrivateCar.getEstimateArriveTime().getTime() + t <= System.currentTimeMillis()){
                baseWarpper.setAmount(amount);
                return ResultUtil.success(baseWarpper);
@@ -812,6 +831,8 @@
        if(orderPrivateCar.getState() > 5 && orderPrivateCar.getState() != 11 && orderPrivateCar.getState() != 12){
            return ResultUtil.error(language == 1 ? "取消订单失败,不合法的操作" : language == 2 ? "Failed to cancel order, illegal operation." : "Échec de l’annulation de la commande, opération illégale.");
        }
        orderCancelService.delete(new EntityWrapper<OrderCancel>().eq("orderId", orderPrivateCar.getId()).eq("orderType", 1));
        
        //服务中也可以取消订单,所以取消订单时需要计算订单费用
        if(null == orderPrivateCar.getDriverId()){//没有接单的情况
@@ -830,7 +851,7 @@
                    orderTaxiService.updateById(orderTaxi);
                }
            }else{
                integer = orderCancelService.saveData(id, 1, language == 1 ? "无司机接单" : language == 2 ? "No driver to take orders" : "Pas de chauffeur pour prendre les commandes", language == 1 ? "无司机接单" : language == 2 ? "No driver to take orders" : "Pas de chauffeur pour prendre les commandes", null, null, 2, 1, uid);
                integer = orderCancelService.saveData(id, 1, language == 1 ? "无司机接单" : language == 2 ? "No driver to take orders" : "Pas de chauffeur pour prendre les commandes", language == 1 ? "无司机接单" : language == 2 ? "No driver to take orders" : "Pas de chauffeur pour prendre les commandes", null, 0D, 2, 1, uid);
                orderPrivateCar.setState(10);
                this.updateById(orderPrivateCar);
            }
@@ -838,7 +859,7 @@
            BaseWarpper data = queryCancleAmount(id, language).getData();
            Double amount = data.getAmount();
            if(0 == amount){
                integer = orderCancelService.saveData(id, 1, reason, remark, null, null, 2, 1, uid);
                integer = orderCancelService.saveData(id, 1, reason, remark, null, 0D, 2, 1, uid);
                if(5 == orderPrivateCar.getState()){
                    orderPrivateCar.setState(6);
                    orderPrivateCar.setGetoffLon(lon);
@@ -896,8 +917,8 @@
                            }
                            break;
                    }
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState() == 12 ? orderPrivateCar.getState() : 10, 0, audioUrl);
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState() == 12 ? orderPrivateCar.getState() : 10, 0, audioUrl, "user");
                    System.err.println("推送取消操作---------------------");
                }
            }).start();
@@ -1063,11 +1084,11 @@
                    }
    
                    this.deleteTask(id);//删除定时任务
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                }else{
                    incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, amount.doubleValue());
                }
                pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                //添加消息
                systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
@@ -1169,7 +1190,7 @@
                                    }
                                }, 30000);
                                
                                pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime(), audioUrl);
                                pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime(), audioUrl, "user");
                            }
                        }
                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
@@ -1282,11 +1303,12 @@
        ResultUtil resultUtil = ResultUtil.success("");
        orderPrivateCar.setCouponMoney(0D);//初始化历史数据
        orderPrivateCar.setCouponId(null);
        //计算折扣
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderPrivateCar.getCompanyId());
        if(null != query2){
            Integer orderNum=this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("userId",orderPrivateCar.getUserId()).eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
            Integer orderNum=this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("userId",orderPrivateCar.getUserId())
                    .eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
            if(query2.getDistance()*1000>orderPrivateCar.getMileage() && query2.getOrderNum()>orderNum){
                Double special = query2.getSpecial();
                if(null != special){
@@ -1300,7 +1322,7 @@
                }
            }
        }
        //计算优惠券
        UserCouponRecord userCouponRecord = null;
        if(null != couponId){
@@ -1327,7 +1349,7 @@
            orderPrivateCar.setCouponMoney(userCouponRecord.getMoney());
            orderPrivateCar.setCouponId(couponId);
        }
        //计算红包
        if(null != redDeduction && 1 == redDeduction && null == orderPrivateCar.getRedPacketId()){
            RedEnvelopePaymentSettings redEnvelopePaymentSettings = redEnvelopePaymentSettingsService.getRedEnvelopePaymentSettings();
@@ -1340,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());
@@ -1377,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);
@@ -1389,8 +1411,8 @@
                }
            }
        }
        if(payType == 1){//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "1" + language + orderId;
@@ -1408,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);
@@ -1435,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);//添加预支付数据
@@ -1447,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();
@@ -1490,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
@@ -1508,6 +1530,7 @@
                                aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                            }
                            Double aDouble1 = new BigDecimal(orderPrivateCar.getMileage()).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                            Long serviceTime = new BigDecimal(orderPrivateCar.getEndServiceTime().getTime() - orderPrivateCar.getStartServiceTime().getTime()).divide(new BigDecimal(60000)).setScale(0, RoundingMode.HALF_EVEN).longValue();
                            if(1 == language){
                                document.getElementById("english").remove();
                                document.getElementById("french").remove();
@@ -1589,7 +1612,7 @@
                                Element lost_item_chinese = document.getElementById("lost_item_chinese");
                                lost_item_chinese.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                Element track_chinese = document.getElementById("track_chinese");
                                track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId);
                                track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId + "&language=" + language);
                                Element pay_time_chinese = document.getElementById("pay_time_chinese");
                                pay_time_chinese.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_chinese = document.getElementsByClass("driver_chinese");
@@ -1602,7 +1625,7 @@
                                Element pf_chinese = document.getElementById("pf_chinese");
                                pf_chinese.text("司机评分:" + aDouble);
                                Element lc_chinese = document.getElementById("lc_chinese");
                                lc_chinese.text("里程:" + aDouble1 + "公里 /" + orderPrivateCar.getDuration() + "分钟");
                                lc_chinese.text("里程:" + aDouble1 + "公里 /" + serviceTime + "分钟");
                                Element start_time_chinese = document.getElementById("start_time_chinese");
                                start_time_chinese.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_chinese = document.getElementById("start_address_chinese");
@@ -1696,7 +1719,7 @@
                                Element lost_item_english = document.getElementById("lost_item_english");
                                lost_item_english.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                Element track_english = document.getElementById("track_english");
                                track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId);
                                track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId + "&language=" + language);
                                Element pay_time_english = document.getElementById("pay_time_english");
                                pay_time_english.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_english = document.getElementsByClass("driver_english");
@@ -1709,7 +1732,7 @@
                                Element pf_english = document.getElementById("pf_english");
                                pf_english.text("Driver Rating:" + aDouble);
                                Element lc_english = document.getElementById("lc_english");
                                lc_english.text("Mileage:" + aDouble1 + "KM / " + orderPrivateCar.getDuration() + "Minutes");
                                lc_english.text("Mileage:" + aDouble1 + "KM / " + serviceTime + "Minutes");
                                Element start_time_english = document.getElementById("start_time_english");
                                start_time_english.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_english = document.getElementById("start_address_english");
@@ -1803,7 +1826,7 @@
                                Element lost_item_french = document.getElementById("lost_item_french");
                                lost_item_french.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                Element track_french = document.getElementById("track_french");
                                track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId);
                                track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId + "&language=" + language);
                                Element pay_time_french = document.getElementById("pay_time_french");
                                pay_time_french.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_french = document.getElementsByClass("driver_french");
@@ -1816,7 +1839,7 @@
                                Element pf_french = document.getElementById("pf_french");
                                pf_french.text("Note du chauffeur: " + aDouble);
                                Element lc_french = document.getElementById("lc_french");
                                lc_french.text("Distance: " + aDouble1 + "km / " + orderPrivateCar.getDuration() + "minutes");
                                lc_french.text("Distance: " + aDouble1 + "km / " + serviceTime + "minutes");
                                Element start_time_french = document.getElementById("start_time_french");
                                start_time_french.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_french = document.getElementById("start_address_french");
@@ -1830,7 +1853,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()){
@@ -1844,7 +1867,7 @@
                            fileWriter.write(document.html());
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
@@ -1860,7 +1883,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);
@@ -1878,27 +1901,27 @@
                                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
                public void run() {
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                }
            }).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);
@@ -1906,19 +1929,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);
@@ -1932,7 +1955,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);
@@ -1941,7 +1964,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);
@@ -1950,8 +1973,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();
@@ -1973,8 +1996,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();
@@ -1985,7 +2008,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());
@@ -2033,7 +2056,7 @@
                                    car.setVehicleId(UUIDUtil.getRandomCode());
                                    carService.updateById(car);
                                }
                                //司机下班,修改谷歌上的车辆信息
                                new Thread(()->{
                                    try {
@@ -2081,7 +2104,7 @@
                    }
                }
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                new Thread(new Runnable() {
                    @Override
@@ -2098,6 +2121,7 @@
                                aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                            }
                            Double aDouble1 = new BigDecimal(orderPrivateCar.getMileage()).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                            Long serviceTime = new BigDecimal(orderPrivateCar.getEndServiceTime().getTime() - orderPrivateCar.getStartServiceTime().getTime()).divide(new BigDecimal(60000)).setScale(0, RoundingMode.HALF_EVEN).longValue();
                            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                            if(1 == language){
                                document.getElementById("english").remove();
@@ -2180,7 +2204,7 @@
                                Element lost_item_chinese = document.getElementById("lost_item_chinese");
                                lost_item_chinese.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                Element track_chinese = document.getElementById("track_chinese");
                                track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId);
                                track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId + "&language=" + language);
                                Element pay_time_chinese = document.getElementById("pay_time_chinese");
                                pay_time_chinese.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_chinese = document.getElementsByClass("driver_chinese");
@@ -2193,7 +2217,7 @@
                                Element pf_chinese = document.getElementById("pf_chinese");
                                pf_chinese.text("司机评分:" + aDouble);
                                Element lc_chinese = document.getElementById("lc_chinese");
                                lc_chinese.text("里程:" + aDouble1 + "公里 /" + orderPrivateCar.getDuration() + "分钟");
                                lc_chinese.text("里程:" + aDouble1 + "公里 /" + serviceTime + "分钟");
                                Element start_time_chinese = document.getElementById("start_time_chinese");
                                start_time_chinese.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_chinese = document.getElementById("start_address_chinese");
@@ -2287,7 +2311,7 @@
                                Element lost_item_english = document.getElementById("lost_item_english");
                                lost_item_english.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                Element track_english = document.getElementById("track_english");
                                track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId);
                                track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId + "&language=" + language);
                                Element pay_time_english = document.getElementById("pay_time_english");
                                pay_time_english.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_english = document.getElementsByClass("driver_english");
@@ -2300,7 +2324,7 @@
                                Element pf_english = document.getElementById("pf_english");
                                pf_english.text("Driver Rating:" + aDouble);
                                Element lc_english = document.getElementById("lc_english");
                                lc_english.text("Mileage:" + aDouble1 + "KM / " + orderPrivateCar.getDuration() + "Minutes");
                                lc_english.text("Mileage:" + aDouble1 + "KM / " + serviceTime + "Minutes");
                                Element start_time_english = document.getElementById("start_time_english");
                                start_time_english.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_english = document.getElementById("start_address_english");
@@ -2394,7 +2418,7 @@
                                Element lost_item_french = document.getElementById("lost_item_french");
                                lost_item_french.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                Element track_french = document.getElementById("track_french");
                                track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId);
                                track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + orderId + "&language=" + language);
                                Element pay_time_french = document.getElementById("pay_time_french");
                                pay_time_french.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_french = document.getElementsByClass("driver_french");
@@ -2407,7 +2431,7 @@
                                Element pf_french = document.getElementById("pf_french");
                                pf_french.text("Note du chauffeur: " + aDouble);
                                Element lc_french = document.getElementById("lc_french");
                                lc_french.text("Distance: " + aDouble1 + "km / " + orderPrivateCar.getDuration() + "minutes");
                                lc_french.text("Distance: " + aDouble1 + "km / " + serviceTime + "minutes");
                                Element start_time_french = document.getElementById("start_time_french");
                                start_time_french.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_french = document.getElementById("start_address_french");
@@ -2420,9 +2444,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()){
@@ -2436,7 +2460,7 @@
                            fileWriter.write(document.html());
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
@@ -2469,23 +2493,23 @@
                                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
                public void run() {
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                    Integer language1 = driver.getLanguage();
                    String text = "";
                    switch (language1){
@@ -2498,7 +2522,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";
@@ -2532,12 +2556,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;
    }
@@ -2746,11 +2770,11 @@
                }
                this.deleteTask(orderPrivateCar.getId());//删除定时任务
    
                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
            }else{
                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, amount.doubleValue());
            }
            pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
            pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
            //添加消息
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
@@ -2830,6 +2854,7 @@
                                aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                            }
                            Double aDouble1 = new BigDecimal(orderPrivateCar.getMileage()).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                            Long serviceTime = new BigDecimal(orderPrivateCar.getEndServiceTime().getTime() - orderPrivateCar.getStartServiceTime().getTime()).divide(new BigDecimal(60000)).setScale(0, RoundingMode.HALF_EVEN).longValue();
                            if(1 == language){
                                document.getElementById("english").remove();
                                document.getElementById("french").remove();
@@ -2911,7 +2936,7 @@
                                Element lost_item_chinese = document.getElementById("lost_item_chinese");
                                lost_item_chinese.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=1");
                                Element track_chinese = document.getElementById("track_chinese");
                                track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + id);
                                track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + id + "&language=" + language);
                                Element pay_time_chinese = document.getElementById("pay_time_chinese");
                                pay_time_chinese.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_chinese = document.getElementsByClass("driver_chinese");
@@ -2924,7 +2949,7 @@
                                Element pf_chinese = document.getElementById("pf_chinese");
                                pf_chinese.text("司机评分:" + aDouble);
                                Element lc_chinese = document.getElementById("lc_chinese");
                                lc_chinese.text("里程:" + aDouble1 + "公里 /" + orderPrivateCar.getDuration() + "分钟");
                                lc_chinese.text("里程:" + aDouble1 + "公里 /" + serviceTime + "分钟");
                                Element start_time_chinese = document.getElementById("start_time_chinese");
                                start_time_chinese.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_chinese = document.getElementById("start_address_chinese");
@@ -3018,7 +3043,7 @@
                                Element lost_item_english = document.getElementById("lost_item_english");
                                lost_item_english.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=1");
                                Element track_english = document.getElementById("track_english");
                                track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + id);
                                track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + id + "&language=" + language);
                                Element pay_time_english = document.getElementById("pay_time_english");
                                pay_time_english.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_english = document.getElementsByClass("driver_english");
@@ -3031,7 +3056,7 @@
                                Element pf_english = document.getElementById("pf_english");
                                pf_english.text("Driver Rating:" + aDouble);
                                Element lc_english = document.getElementById("lc_english");
                                lc_english.text("Mileage:" + aDouble1 + "KM / " + orderPrivateCar.getDuration() + "Minutes");
                                lc_english.text("Mileage:" + aDouble1 + "KM / " + serviceTime + "Minutes");
                                Element start_time_english = document.getElementById("start_time_english");
                                start_time_english.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_english = document.getElementById("start_address_english");
@@ -3125,7 +3150,7 @@
                                Element lost_item_french = document.getElementById("lost_item_french");
                                lost_item_french.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=1");
                                Element track_french = document.getElementById("track_french");
                                track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + id);
                                track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html?orderId=" + id + "&language=" + language);
                                Element pay_time_french = document.getElementById("pay_time_french");
                                pay_time_french.text(DateUtil.conversionFormat(language, sdf1.format(orderPrivateCar.getEndServiceTime())));
                                Elements driver_french = document.getElementsByClass("driver_french");
@@ -3138,7 +3163,7 @@
                                Element pf_french = document.getElementById("pf_french");
                                pf_french.text("Note du chauffeur: " + aDouble);
                                Element lc_french = document.getElementById("lc_french");
                                lc_french.text("Distance: " + aDouble1 + "km / " + orderPrivateCar.getDuration() + "minutes");
                                lc_french.text("Distance: " + aDouble1 + "km / " + serviceTime + "minutes");
                                Element start_time_french = document.getElementById("start_time_french");
                                start_time_french.text(sdf2.format(orderPrivateCar.getTravelTime()));
                                Element start_address_french = document.getElementById("start_address_french");
@@ -3215,8 +3240,8 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "");
                    pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0, "", "user");
                }
            }).start();
@@ -3359,21 +3384,23 @@
        Integer driverTimeOutTime = 0;
        Integer driverTimeOut = 0;
        CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", companyId));
        JSONObject jsonObject = JSON.parseObject(cancleOrder.getContent());
        int driverTimeout1 = jsonObject.getIntValue("driverTimeout");
        if(orderPrivateCar.getOrderType() == 1 && null != orderPrivateCar.getEstimateArriveTime()){
            long time = orderPrivateCar.getEstimateArriveTime().getTime() + driverTimeout1 * 60000L;
            if(System.currentTimeMillis() > time){
                driverTimeOutTime = Double.valueOf((System.currentTimeMillis() - time) / 60000).intValue();
                driverTimeOutTime = driverTimeOutTime == 0 ? 1 : driverTimeOutTime;
                driverTimeOut = 1;
            }
        }else{
            long time = orderPrivateCar.getTravelTime().getTime() + driverTimeout1 * 60000L;
            if(System.currentTimeMillis() >= time){
                driverTimeOutTime = Double.valueOf((System.currentTimeMillis() - time) / 60000).intValue();
                driverTimeOutTime = driverTimeOutTime == 0 ? 1 : driverTimeOutTime;
                driverTimeOut = 1;
        if(null != cancleOrder){
            JSONObject jsonObject = JSON.parseObject(cancleOrder.getContent());
            int driverTimeout1 = jsonObject.getIntValue("driverTimeout");
            if(orderPrivateCar.getOrderType() == 1 && null != orderPrivateCar.getEstimateArriveTime()){
                long time = orderPrivateCar.getEstimateArriveTime().getTime() + driverTimeout1 * 60000L;
                if(System.currentTimeMillis() > time){
                    driverTimeOutTime = Double.valueOf((System.currentTimeMillis() - time) / 60000).intValue();
                    driverTimeOutTime = driverTimeOutTime == 0 ? 1 : driverTimeOutTime;
                    driverTimeOut = 1;
                }
            }else{
                long time = orderPrivateCar.getTravelTime().getTime() + driverTimeout1 * 60000L;
                if(System.currentTimeMillis() >= time){
                    driverTimeOutTime = Double.valueOf((System.currentTimeMillis() - time) / 60000).intValue();
                    driverTimeOutTime = driverTimeOutTime == 0 ? 1 : driverTimeOutTime;
                    driverTimeOut = 1;
                }
            }
        }