Pu Zhibing
6 天以前 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;
@@ -7,7 +8,6 @@
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
import com.stylefeng.guns.modular.crossCity.server.impl.OrderCrossCityServiceImpl;
import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
@@ -20,6 +20,7 @@
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.GoogleMap.DistancematrixVo;
import com.stylefeng.guns.modular.system.util.GoogleMap.FleetEngineUtil;
import com.stylefeng.guns.modular.system.util.GoogleMap.GoogleMapUtil;
import com.stylefeng.guns.modular.system.util.GoogleMap.ReverseGeocodeVo;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayUtil;
@@ -27,7 +28,6 @@
import com.stylefeng.guns.modular.system.util.itextpdf.HtmlToPdfUtils;
import com.stylefeng.guns.modular.system.warpper.BaseWarpper;
import com.stylefeng.guns.modular.system.warpper.EndPushWarpper;
import com.stylefeng.guns.modular.system.warpper.OrderInfoWarpper;
import com.stylefeng.guns.modular.system.warpper.OrderServerWarpper;
import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
@@ -38,16 +38,19 @@
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.FormElement;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@@ -57,10 +60,14 @@
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
    private Logger log = LoggerFactory.getLogger(OrderPrivateCarServiceImpl.class);
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -86,92 +93,92 @@
    @Resource
    private RegionMapper regionMapper;
    @Autowired
    @Resource
    private DateUtil dateUtil;
    @Autowired
    @Resource
    private IUserInfoService userInfoService;
    @Autowired
    @Resource
    private IDriverService driverService;
    @Autowired
    @Resource
    private IDriverServiceService driverServiceService;
    @Autowired
    @Resource
    private PushUtil pushUtil;
    @Autowired
    @Resource
    private ICompanyCityService companyCityService;
    @Autowired
    @Resource
    private IPushOrderService pushOrderService;
    @Autowired
    @Resource
    private ISystemNoticeService systemNoticeService;
    @Autowired
    @Resource
    private ICancleOrderService cancleOrderService;
    @Autowired
    @Resource
    private IOrderCancelService orderCancelService;
    @Autowired
    @Resource
    private RestTemplate internalRestTemplate;
    @Autowired
    @Resource
    private IPaymentRecordService paymentRecordService;
    @Autowired
    @Resource
    private ITransactionDetailsService transactionDetailsService;
    @Autowired
    @Resource
    private ChinaMobileUtil chinaMobileUtil;
    @Autowired
    @Resource
    private IIncomeService incomeService;
    @Autowired
    @Resource
    private IUserCouponRecordService userCouponRecordService;
    @Autowired
    @Resource
    private IUserRedPacketRecordService userRedPacketRecordService;
    @Autowired
    @Resource
    private ICompanyService companyService;
    @Autowired
    @Resource
    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
    @Autowired
    @Resource
    private RedisUtil redisUtil;
    @Autowired
    @Resource
    private IOrderPositionService orderPositionService;
    @Autowired
    @Resource
    private IOrderCrossCityService orderCrossCityService;
    @Autowired
    @Resource
    private IAssignOrderService assignOrderService;
    @Resource
    private CarMapper carMapper;
    @Autowired
    @Resource
    private IOrderEvaluateService orderEvaluateService;
    @Autowired
    @Resource
    private IOrderLogisticsService orderLogisticsService;
    @Autowired
    @Resource
    private IBankCardService bankCardService;
    @Value("${filePath}")
    private String filePath;
    @Autowired
    @Resource
    private IOrderTaxiService orderTaxiService;
    public static List<Integer> orderIds = new ArrayList<>();
@@ -182,20 +189,35 @@
    @Value("${spring.mail.template-path}")
    private String templatePath;
    @Autowired
    @Resource
    private ISettlementDetailService settlementDetailService;
    @Autowired
    @Resource
    private ISettlementRecordService settlementRecordService;
    @Autowired
    @Resource
    private ISettlementAllocationService settlementAllocationService;
    @Autowired
    @Resource
    private TEmailService emailService;
    @Autowired
    @Resource
    private IPhoneService phoneService;
    @Resource
    private IRedEnvelopePaymentSettingsService redEnvelopePaymentSettingsService;
    @Resource
    private FleetEngineUtil fleetEngineUtil;
    @Resource
    private CarModelMapper carModelMapper;
    @Resource
    private ICarService carService;
    @Resource
    private IDriverWorkService driverWorkService;
@@ -219,7 +241,17 @@
    @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.");
        }
        Company company = companyCityService.query1(uid, placementLon, placementLat);
        if(null != userInfo && null != company){
            userInfo.setCompanyId(company.getId());
            userInfoService.updateById(userInfo);
        }
        //如果出行时间大于当前10分钟则默认为预约单
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
            reservation = 2;
@@ -233,30 +265,25 @@
        if(orderPrivateCars.size() > 0){
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "Uncompleted order(s)" : "Commande(s) non complétée(s)");
        }
        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
        if(list.size() > 0){
        int i1 = orderLogisticsService.selectCount(new EntityWrapper<OrderLogistics>().eq("userId", uid).in("state", Arrays.asList(1, 2, 3, 4, 5, 6, 7, 11, 12)).eq("isDelete", 1));
        if(i1 > 0){
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "Uncompleted order(s)" : "Commande(s) non complétée(s)");
        }
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6,  11);
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
        if(orderPrivateCars.size() > 0 && reservation == 2){
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "Uncompleted order(s)" : "Commande(s) non complétée(s)");
        }
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 7,12);
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 7, 12);
        if(orderPrivateCars.size() > 0){
            BaseWarpper baseWarpper = new BaseWarpper();
            baseWarpper.setState(7);
            baseWarpper.setId(orderPrivateCars.get(0).getId());
            return ResultUtil.success(baseWarpper);
        }
        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
        if(list.size() > 0 && reservation == 2){
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "Uncompleted order(s)" : "Commande(s) non complétée(s)");
        }
        String tripId = redisUtil.getValue("trip" + uid);
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        endAddress = endAddress.replaceAll("& #40;", "(");
@@ -264,7 +291,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);
@@ -273,7 +301,7 @@
        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(placementLat), Double.valueOf(placementLon));
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(placementLat), Double.valueOf(placementLon), tripId);
        orderPrivateCar.setPlacementAddress(reverseGeocode.getAddress());
        orderPrivateCar.setStartLon(Double.valueOf(startLon));
        orderPrivateCar.setStartLat(Double.valueOf(startLat));
@@ -285,11 +313,7 @@
        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.setPassengers(ToolUtil.isNotEmpty(userInfo.getFirstName()) ? userInfo.getFirstName() + "." + userInfo.getLastName() : "");
            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
        }
        orderPrivateCar.setState(1);
@@ -321,13 +345,8 @@
            if(query.size() == 0){
                return ResultUtil.error(language == 1 ? "该司机不能服务此业务" : language == 2 ? "Driver has outstanding fees to pay, unable to receive orders." : "Le chauffeur a des frais impayés à payer, incapable de recevoir des commandes.");
            }
            int count = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("driverId", driverId).eq("driverPay", 1).in("state", Arrays.asList(7, 8, 9)).eq("isDelete", 1));
            int count = settlementRecordService.selectCount(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
            if(count > 0){
                return ResultUtil.error(language == 1 ? "司机未支付订单费用,无法进行接单" : language == 2 ? "Driver has outstanding fees to pay, unable to receive orders." : "Le chauffeur a des frais impayés à payer, incapable de recevoir des commandes.");
            }
            int count1 = orderLogisticsService.selectCount(new EntityWrapper<OrderLogistics>().eq("driverId", driverId).eq("driverPay", 1).ne("state", 10).eq("isDelete", 1));
            if(count1 > 0){
                return ResultUtil.error(language == 1 ? "司机未支付订单费用,无法进行接单" : language == 2 ? "Driver has outstanding fees to pay, unable to receive orders." : "Le chauffeur a des frais impayés à payer, incapable de recevoir des commandes.");
            }
@@ -339,22 +358,153 @@
            CarService query1 = carServiceMapper.query(1, driver.getCarId());
            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
            orderPrivateCar.setSnatchOrderTime(new Date());
            if(orderPrivateCar.getOrderType() == 1){
                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());
                }
            }
            driver.setState(3);
            driverService.updateById(driver);
        }
        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());
        this.insert(orderPrivateCar);
        //google创建车辆信息
        String vehicleId = null;
        if(null != orderPrivateCar.getDriverId()) {
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            Car car = carMapper.selectById(driver.getCarId());
            if (!StringUtils.hasLength(car.getVehicleId())) {
                car.setVehicleId(UUIDUtil.getRandomCode());
                carMapper.updateById(car);
            }
            vehicleId = car.getVehicleId();
            //查询车辆信息,没有则创建信息
            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;
                        }
                        Thread.sleep(5000L);
                    }
                }
                boolean updateVehicles = fleetEngineUtil.updateVehicles("ONLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                if (!updateVehicles) {
                    for (int i = 0; i < 5; i++) {
                        updateVehicles = fleetEngineUtil.updateVehicles("ONLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                        if (updateVehicles) {
                            break;
                        }
                        Thread.sleep(5000L);
                    }
                }
            }
        }
        //创建行程数据
        String trip = fleetEngineUtil.getTrip(orderPrivateCar.getTripId());
        int count = orderLogisticsService.selectCount(new EntityWrapper<OrderLogistics>().eq("tripId", orderPrivateCar.getTripId()));
        int count1 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("tripId", orderPrivateCar.getTripId()));
        if(ToolUtil.isNotEmpty(trip) || (count + count1) > 0){
            String randomCode = UUIDUtil.getRandomCode();
            redisUtil.setStrValue("trip" + orderPrivateCar.getUserId(), randomCode);
            OrderPrivateCar orderPrivateCar1 = new OrderPrivateCar();
            orderPrivateCar1.setId(orderPrivateCar.getId());
            orderPrivateCar1.setTripId(randomCode);
            this.updateById(orderPrivateCar1);
            orderPrivateCar.setTripId(randomCode);
        }
        JSONObject createTrip = fleetEngineUtil.createTrip(vehicleId, 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(vehicleId, 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);
                }
            }
        }
        if(orderSource == 2){//扫码下单
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            Integer language1 = driver.getLanguage();
           String text = "";
            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 = "J'ai reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage() + "kilométrage";
                    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);
            String finalAudioUrl = audioUrl;
            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);
                    pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
                    pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0, "", "user");
                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0, finalAudioUrl, "user");
                }
            }).start();
        }
@@ -362,14 +512,14 @@
        // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
        if(orderPrivateCar.getState() == 1){
            Company query = companyCityService.query1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            Company query = companyCityService.query1(uid, orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            if(null == query){
                return ResultUtil.error(language == 1 ? "起点暂未企业提供服务" : language == 2 ? "Starting point no enterprise to provide services" : "Point de départ pas encore disponible pour les entreprises");
            }
            AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1));
            if(null != assignOrder && assignOrder.getPeople() > 0){//配置了指派规则才处理
                //获取空闲司机
                List<Driver> drivers = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), assignOrder.getDistance(), null);//获取范围内空闲司机
                List<Driver> drivers = driverService.queryIdleDriver(orderPrivateCar.getUserId(), 1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), assignOrder.getDistance(), null);//获取范围内空闲司机
                if(drivers.size() > 0){//有司机,直接指派给司机
                    Driver dr = null;
                    if(drivers.size() > 1){
@@ -382,7 +532,7 @@
                                String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                if(null != value){
                                    String[] split = value.split(",");
                                    DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]));
                                    DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                    Long distance = distancematrix.getDistance();
                                    if((0 == m && null == driver) || (distance < m)){
                                        driver = drivers.get(j);
@@ -401,7 +551,7 @@
                            String value = redisUtil.getValue("DRIVER" + driver.getId());
                            if(null != value){
                                String[] split = value.split(",");
                                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]));
                                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                Long d = distancematrix.getDistance();
                                if((0 == m && null == dr) || (d.intValue() < m.intValue())){
                                    dr = driver;
@@ -412,28 +562,87 @@
                    }else{
                        dr = drivers.get(0);
                    }
                    orderPrivateCar.setDriverId(dr.getId());
                    orderPrivateCar.setCompanyId(dr.getFranchiseeId() != null && dr.getFranchiseeId() != 0 ? dr.getFranchiseeId() : (
                            dr.getCompanyId() != null && dr.getCompanyId() != 0 ? dr.getCompanyId() : 1));
                    orderPrivateCar.setState(2);
                    orderPrivateCar.setCarId(dr.getCarId());
                    CarService query1 = carServiceMapper.query(1, dr.getCarId());
                    orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
                    orderPrivateCar.setSnatchOrderTime(new Date());
                    dr.setState(3);
                    driverService.updateById(dr);
                    this.updateById(orderPrivateCar);
                    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);
                            pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
                    Driver driver = driverService.selectById(dr.getId());
                    DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", dr.getId())
                            .eq("state", 1).like("type", "1"));
                    if(driver.getState() == 2 && null != driverWork){
                        orderPrivateCar.setDriverId(dr.getId());
                        orderPrivateCar.setCompanyId(dr.getFranchiseeId() != null && dr.getFranchiseeId() != 0 ? dr.getFranchiseeId() : (
                                dr.getCompanyId() != null && dr.getCompanyId() != 0 ? dr.getCompanyId() : 1));
                        orderPrivateCar.setState(2);
                        orderPrivateCar.setCarId(dr.getCarId());
                        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());
                        }
                    }).start();
                        dr.setState(3);
                        driverService.updateById(dr);
                        this.updateById(orderPrivateCar);
                        Integer language1 = dr.getLanguage();
                        String text = "";
                        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 = "J'ai reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage() + "kilométrage";
                                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);
                        String finalAudioUrl = audioUrl;
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0, "", "user");
                                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 2, 0, finalAudioUrl, "user");
                            }
                        }).start();
                    }
                }
            }
        }
@@ -453,6 +662,7 @@
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setState(orderPrivateCar.getState());
        baseWarpper.setId(orderPrivateCar.getId());
        baseWarpper.setContent(orderPrivateCar.getTripId());
        return ResultUtil.success(baseWarpper);
    }
@@ -505,33 +715,109 @@
        }
        return ResultUtil.success();
    }
    /**
     * 获取取消需要支付的金额
     * @param id
     * @param language
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(id);
        if(null == orderPrivateCar){
            return ResultUtil.error(language == 1 ? "获取数据失败,订单信息有误" : language == 2 ? "Failed to obtain data, order-information error." : "Impossible d’obtenir les données, erreur d’information de commande. ");
        }
        BaseWarpper baseWarpper = new BaseWarpper();
        double amount = 0;
        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
        if(null != orderPrivateCar.getDriverId() && orderPrivateCar.getSnatchOrderTime()!=null &&
                (orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
            if(null != query){
                amount += query.getMoney();
        CancleOrder query = cancleOrderService.query(orderPrivateCar.getCompanyId());
        if(null == query){
            return ResultUtil.error("请先添加取消规则");
        }
        if(null == orderPrivateCar.getDriverId() || orderPrivateCar.getState() == 11){
            baseWarpper.setAmount(amount);
            return ResultUtil.success(baseWarpper);
        }
        JSONObject object = JSON.parseObject(query.getContent());
        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);
            }
        }else{
            if(orderPrivateCar.getState() <= 3 && orderPrivateCar.getTravelTime().getTime() + t <= System.currentTimeMillis()){
                baseWarpper.setAmount(amount);
                return ResultUtil.success(baseWarpper);
            }
        }
        BaseWarpper baseWarpper = new BaseWarpper();
        //非服务中且未超时
        if(orderPrivateCar.getState() != 5){
            //普通单
            if(1 == orderPrivateCar.getOrderType()){
                JSONObject order = object.getJSONObject("order");
                long m = order.getInteger("orderAcceptanceTime") * 60000L;
                //超过免费时间,且没有超时,计算费用
                if(orderPrivateCar.getSnatchOrderTime().getTime() + m < System.currentTimeMillis() && orderPrivateCar.getEstimateArriveTime().getTime() + t > System.currentTimeMillis()){
                    BigDecimal money = order.getBigDecimal("money");
                    //里程费
                    BigDecimal mileageFee = order.getBigDecimal("mileageFee").multiply(new BigDecimal(orderPrivateCar.getToStartPointMileage() / 1000));
                    //时长费
                    int s = Double.valueOf((System.currentTimeMillis() - orderPrivateCar.getSnatchOrderTime().getTime()) / 60000).intValue();
                    BigDecimal durationFee = order.getBigDecimal("durationFee").multiply(new BigDecimal(s));
                    money = money.add(durationFee).add(mileageFee);
                    amount = money.setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                }
            }
            //预约单
            if(2 == orderPrivateCar.getOrderType()){
                JSONObject order = object.getJSONObject("reservationOrder");
                long m = order.getInteger("orderAcceptanceTime") * 60000L;
                //超过免费时间,且没有超时,计算费用
                if(System.currentTimeMillis() + m > orderPrivateCar.getTravelTime().getTime() && orderPrivateCar.getTravelTime().getTime() + t > System.currentTimeMillis()){
                    BigDecimal money = order.getBigDecimal("money");
                    //里程费
                    BigDecimal mileageFee = order.getBigDecimal("mileageFee").multiply(new BigDecimal(orderPrivateCar.getToStartPointMileage() / 1000));
                    //时长费
                    int s = Double.valueOf((System.currentTimeMillis() - orderPrivateCar.getSnatchOrderTime().getTime()) / 60000).intValue();
                    BigDecimal durationFee = order.getBigDecimal("durationFee").multiply(new BigDecimal(s));
                    //预定费用
                    BigDecimal reservationFee = order.getBigDecimal("reservationFee");
                    money = money.add(durationFee).add(mileageFee).add(reservationFee);
                    amount = money.setScale(2, RoundingMode.HALF_EVEN).doubleValue();
                }
            }
        }
        baseWarpper.setAmount(amount);
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 添加取消操作
     * @param id
     * @param reason
     * @param remark
     * @param uid
     * @param language
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid, Integer language) throws Exception {
    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid, Double lon, Double lat, String address, Integer language) throws Exception {
        if(ToolUtil.isNotEmpty(remark)){
            if(ToolUtil.isNotEmpty(remark)){
                remark = remark.toLowerCase();
                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
                for(SensitiveWords s : sensitiveWords){
                    remark = remark.replaceAll(s.getContent(), "***");
                for(SensitiveWords s : sensitiveWords) {
                    remark = remark.replaceAll(s.getContent().toLowerCase(), "***");
                }
            }
        }
@@ -542,9 +828,13 @@
        if(null == orderPrivateCar){
            return ResultUtil.error(language == 1 ? "取消订单失败,订单信息有误" : language == 2 ? "Failed to cancel order, order-information error." : "Échec de l’annulation de la commande, erreur d’information de commande.");
        }
        if(orderPrivateCar.getState() > 5 && orderPrivateCar.getState() != 11){
        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()){//没有接单的情况
            if(orderPrivateCar.getType() == 2){//摆渡车
                OrderCrossCityServiceImpl.pushEndMap.remove(orderPrivateCar.getCrossCityOrderId());//删除标识数据
@@ -561,43 +851,102 @@
                    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);
            }
        }else {
            CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
            if (null != query) {
                if ((orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < System.currentTimeMillis() && query.getMoney().compareTo(0D) > 0) {//收费的情况
                    orderPrivateCar.setState(12);
                    this.updateById(orderPrivateCar);
                    integer = orderCancelService.saveData(id, 1, reason, remark, null, query.getMoney(), 1, 1, uid);
                } else {
                    integer = orderCancelService.saveData(id, 1, reason, remark, null, null, 2, 1, uid);
            BaseWarpper data = queryCancleAmount(id, language).getData();
            Double amount = data.getAmount();
            if(0 == amount){
                integer = orderCancelService.saveData(id, 1, reason, remark, null, 0D, 2, 1, uid);
                if(5 == orderPrivateCar.getState()){
                    orderPrivateCar.setState(6);
                    orderPrivateCar.setGetoffLon(lon);
                    orderPrivateCar.setGetoffLat(lat);
                    orderPrivateCar.setGetoffAddress(address);
                    orderPrivateCar.setGetoffTime(new Date());
                    orderPrivateCar.setEndServiceTime(new Date());
                    orderPrivateCar.setCancelMidway(1);
                }else{
                    orderPrivateCar.setState(10);
                    this.updateById(orderPrivateCar);
                }
                this.deleteTask(id);//删除定时任务
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
                        System.err.println("推送取消操作---------------------");
                    }
                }).start();
                //修改司机为空闲
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                driver.setState(2);
                driverService.updateById(driver);
                this.updateById(orderPrivateCar);
            }else{
                return ResultUtil.error(language == 1 ? "请完善后台取消规则设置" : language == 2 ? "Please complete the setting of cancellation rules from the background." : "Veuillez compléter le réglage des règles d’annulation à partir de l’arrière-plan.");
                if(5 == orderPrivateCar.getState()){
                    orderPrivateCar.setGetoffLon(lon);
                    orderPrivateCar.setGetoffLat(lat);
                    orderPrivateCar.setGetoffAddress(address);
                    orderPrivateCar.setGetoffTime(new Date());
                    orderPrivateCar.setEndServiceTime(new Date());
                    orderPrivateCar.setCancelMidway(1);
                }
                orderPrivateCar.setOldState(6);
                orderPrivateCar.setState(12);
                this.updateById(orderPrivateCar);
                integer = orderCancelService.saveData(id, 1, reason, remark, null, amount, 1, 1, uid);
            }
            this.deleteTask(id);//删除定时任务
            //修改司机为空闲
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Integer language1 = driver.getLanguage();
                    String audioUrl = "";
                    switch (language1){
                        case 1:
                            if(orderPrivateCar.getState() == 6){
                                audioUrl = "https://igo.i-go.group/files/audio/system/MidwayCancellation-CN.mp3";
                            }else{
                                audioUrl = "https://igo.i-go.group/files/audio/system/UserCancelledOrder-CN.mp3";
                            }
                            break;
                        case 2:
                            if(orderPrivateCar.getState() == 6){
                                audioUrl = "https://igo.i-go.group/files/audio/system/MidwayCancellation-EN.mp3";
                            }else{
                                audioUrl = "https://igo.i-go.group/files/audio/system/UserCancelledOrder-EN.mp3";
                            }
                            break;
                        case 3:
                            if(orderPrivateCar.getState() == 6){
                                audioUrl = "https://igo.i-go.group/files/audio/system/MidwayCancellation-FR.mp3";
                            }else{
                                audioUrl = "https://igo.i-go.group/files/audio/system/UserCancelledOrder-FR.mp3";
                            }
                            break;
                    }
                    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();
            driver.setState(2);
            driverService.updateById(driver);
        }
        //修改行程信息
        if(orderPrivateCar.getState() == 10 || orderPrivateCar.getState() == 12){
            Car car = carService.selectById(orderPrivateCar.getCarId());
            boolean updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, orderPrivateCar.getTripId(), null, null, null, null);
            if(!updateTrip){
                for (int i = 0; i < 5; i++) {
                    updateTrip = fleetEngineUtil.updateTrip("CANCELED", (null != car ? car.getVehicleId() : null), null, orderPrivateCar.getTripId(), null, null, null, null);
                    if(updateTrip){
                        orderPrivateCar.setIsover(1);
                        this.updateById(orderPrivateCar);
                        break;
                    }
                    Thread.sleep(3000L);
                }
            }else{
                orderPrivateCar.setIsover(1);
                this.updateById(orderPrivateCar);
            }
        }
        //添加消息
        systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功取消出行订单,谢谢使用!" : language == 2 ? "You've cancelled the ride order successfully, thank you for using I-GO " : "Vous avez annulé la commande de course avec succès, merci d’utiliser I-GO", orderPrivateCar.getUserId(), 1);
        Map<String, Object> map = new HashMap<>();
@@ -631,9 +980,12 @@
        }else{
            orderCancel = orderCancelService.selectById(cancleId);
        }
        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
        if(null != query){
        Double amount = queryCancleAmount(id, language).getData().getAmount();
        if(orderPrivateCar.getState() == 12){
            amount = orderCancel.getMoney();
        }
        if(0 < amount){
            if(payType == 1){//手机支付
                orderCancel.setPayType(1);
                orderCancelService.updateById(orderCancel);
@@ -645,16 +997,16 @@
                checkoutRequest.setAccountNumber(userInfo.getPhone());
                checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
                checkoutRequest.setCustomerLastName(userInfo.getLastName());
                checkoutRequest.setRequestAmount(query.getMoney());
                checkoutRequest.setRequestAmount(amount);
                checkoutRequest.setMerchantTransactionId(merchantTransactionId);
                checkoutRequest.setRequestDescription("Cancel a trip");
                checkoutRequest.setCallbackUrl(callbackPath + "/base/wxCancelOrderTaxi");
                checkoutRequest.setPendingRedirectUrl("");
                checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
                checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
                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, id, 1, 1, query.getMoney(), null, 1);//添加预支付数据
                    paymentRecordService.saveData(1, null, null, id, 1, 1, amount, null, 1);//添加预支付数据
                }
            }
@@ -670,34 +1022,34 @@
                checkoutRequest.setAccountNumber(bankCard.getCode());
                checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
                checkoutRequest.setCustomerLastName(bankCard.getLastName());
                checkoutRequest.setRequestAmount(query.getMoney());
                checkoutRequest.setRequestAmount(amount);
                checkoutRequest.setMerchantTransactionId(merchantTransactionId);
                checkoutRequest.setRequestDescription("Cancel a trip");
                checkoutRequest.setCallbackUrl(callbackPath + "/base/wxCancelOrderTaxi");
                checkoutRequest.setPendingRedirectUrl("");
                checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
                checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
                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, id, 1, 2, query.getMoney(), null, 1);//添加预支付数据
                    paymentRecordService.saveData(1, null, null, id, 1, 2, amount, null, 1);//添加预支付数据
                }
            }
            if(payType == 3){//余额支付
                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
                if(userInfo.getBalance() != null && userInfo.getBalance() < amount){
                    return ResultUtil.error((language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant"), "");
                }
                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(amount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                //添加交易明细
                transactionDetailsService.saveData(uid, "取消订单", query.getMoney(), 2, 1, 1, 1, id);
                transactionDetailsService.saveData(uid, "取消订单", amount, 2, 1, 1, 1, id);
                userInfoService.updateById(userInfo);
                //解除小号绑定
                if(orderPrivateCar.getBindId() != null){
                    chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
                    ChinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
                }
                orderPrivateCar.setState(10);
                orderPrivateCar.setTelX("");
                orderPrivateCar.setBindId("");
@@ -707,20 +1059,36 @@
                orderCancel.setPayType(3);
                orderCancelService.updateById(orderCancel);
//                //添加已收入明细
//                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, query.getMoney());
//                //添加已收入明细
//                Company company = companyService.selectById(orderPrivateCar.getCompanyId());
//                Double taxi = company.getSpeMoney();
                BigDecimal c =new BigDecimal(query.getMoney());//司机收入
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                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);
                this.deleteTask(id);//删除定时任务
                if(null != orderPrivateCar.getDriverId()){
                    //添加已收入明细
                    Company company = companyService.selectById(orderPrivateCar.getCompanyId());
                    Double speMoney = company.getSpeMoney();
                    BigDecimal d = null;//企业收入
                    BigDecimal c = null;//司机收入
                    if(company.getIsSpeFixedOrProportional() == 2){//固定
                        d = new BigDecimal(speMoney);
                        c = new BigDecimal(amount).subtract(d);//只有出行金额参与抽成,其余归属司机
                    }
                    if(company.getIsSpeFixedOrProportional() == 1){//比例
                        d = new BigDecimal(amount).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                        c = new BigDecimal(amount).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                    }
                    incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, d.doubleValue());
                    if(c.doubleValue() > 0){
                        incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
                        Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                        driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                        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);
                    }
                    this.deleteTask(id);//删除定时任务
                    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, "", "user");
                //添加消息
                systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
@@ -748,12 +1116,12 @@
                    if(ToolUtil.isNotEmpty(vehicle)){
                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
                    }
                    Company query = companyCityService.query1(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
                    Company query = companyCityService.query1(orderPrivateCar.getUserId(), String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
                    List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//获取需要推送的次数
                    for(int i = 1; i <= querys.size(); i++){
                        PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0);
                        //获取空闲司机
                        List<Driver> list = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        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){
                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
@@ -770,7 +1138,59 @@
                                if(bo){
                                    continue;
                                }
                                pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
                                Driver driver1 = driverService.selectById(driver.getId());
                                DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId())
                                        .eq("state", 1).like("type", "1"));
                                if(driver1.getState() != 2 || null == driverWork){
                                    continue;
                                }
                                String text = "";
                                Integer language = driver.getLanguage();
                                switch (language){
                                    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 = "J'ai reçu une nouvelle commande de course, à partir de " + orderPrivateCar.getStartAddress() + ", le trajet complet est d’environ " + orderPrivateCar.getEstimatedMileage() + "kilométrage";
                                        break;
                                }
                                String audioUrl = "";
                                String fileName = "pushOrder" + orderPrivateCar.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
                                try {
                                    audioUrl = TextToSpeechUtil.create(language == 1 ? "cmn-CN" : language == 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);
                                pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime(), audioUrl, "user");
                            }
                        }
                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
@@ -796,7 +1216,7 @@
    @Override
    public synchronized String getOrderNum() throws Exception{
        int size = this.selectCount(null);
        return "PRIVATE" + String.valueOf(1000000 + size + 1).substring(1);
        return "RIDE" + String.valueOf(1000000 + size + 1).substring(1);
    }
    /**
@@ -868,7 +1288,8 @@
    @Override
    public ResultUtil payPrivateCarOrder(Integer payType, Integer bankCardId, Integer orderId, Integer couponId, Integer type, Integer language) throws Exception {
    @Transactional(rollbackFor = Exception.class)
    public ResultUtil payPrivateCarOrder(Integer payType, Integer bankCardId, Integer orderId, Integer couponId, Integer redDeduction, Integer type, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
            return ResultUtil.error(language == 1 ? "订单已完成支付,不允许重复支付" : language == 2 ? "The order has been paid, recurring payments is not allowed." : "La commande a été payée, les paiements récurrents ne sont pas autorisés.", "");
@@ -877,33 +1298,39 @@
            return ResultUtil.error(language == 1 ? "订单不在待支付状态,不允许支付" : language == 2 ? "The order is no longer with Pending Payment, making payments is not allowed." : "La commande n’est plus en attente de paiement, il n’est pas permis d’effectuer des paiements.", "");
        }
        Integer uid = orderPrivateCar.getUserId();
        Double orderMoney = orderPrivateCar.getOrderMoney();
        BigDecimal orderMoney = new BigDecimal(orderPrivateCar.getOrderMoney());
        UserInfo userInfo = userInfoService.selectById(uid);
        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();
                orderPrivateCar.setDiscount(special);
                double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                if(orderMoney.compareTo(v) > 0){
                    orderPrivateCar.setDiscountMoney(orderMoney - v);
                    orderPrivateCar.setActivityId(query2.getId());
                    orderMoney = v;
                if(null != special){
                    orderPrivateCar.setDiscount(special);
                    BigDecimal v = orderMoney.multiply(new BigDecimal(special / 10)).setScale(2, RoundingMode.HALF_EVEN);
                    if(orderMoney.compareTo(v) > 0){
                        orderPrivateCar.setDiscountMoney(orderMoney.subtract(v).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                        orderPrivateCar.setActivityId(query2.getId());
                        orderMoney = v;
                    }
                }
            }
        }
        //计算优惠券
        UserCouponRecord userCouponRecord = null;
        if(null != couponId){
            if(null != redDeduction && 1 == redDeduction){
                return ResultUtil.error(language == 1 ? "优惠券和红包不能同时使用" : language == 2 ? "Coupons and lucky-promo cannot be used at the same time." : "Les coupons et les bonus ne peuvent pas être utilisés en même temps", "");
            }
            userCouponRecord = userCouponRecordService.selectById(couponId);
            if(userCouponRecord.getCompanyId() != orderPrivateCar.getCompanyId()){
            if(!userCouponRecord.getCompanyId().equals(orderPrivateCar.getCompanyId())){
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupon cannot be used for this order." : "Le coupon ne peut pas être utilisé pour cette commande.", "");
            }
            if(userCouponRecord.getState() == 2){
@@ -915,23 +1342,77 @@
            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 1){
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupon cannot be used for this order." : "Le coupon ne peut pas être utilisé pour cette commande.", "");
            }
            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(userCouponRecord.getFullMoney()) < 0){
            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(new BigDecimal(userCouponRecord.getFullMoney())) < 0){
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupon cannot be used for this order." : "Le coupon ne peut pas être utilisé pour cette commande.", "");
            }
            orderMoney = orderMoney - userCouponRecord.getMoney();
            orderMoney = orderMoney.subtract(new BigDecimal(userCouponRecord.getMoney())).setScale(2, RoundingMode.HALF_EVEN);
            orderPrivateCar.setCouponMoney(userCouponRecord.getMoney());
            orderPrivateCar.setCouponId(couponId);
        }
        orderMoney=new BigDecimal(orderMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
        //计算红包
        UserRedPacketRecord query = userRedPacketRecordService.query(uid, orderPrivateCar.getCompanyId(), 1, 1, orderMoney);
        if(null != query && query.getMoney().compareTo(orderMoney) < 0){
            orderMoney = orderMoney - query.getMoney();
            orderPrivateCar.setRedPacketMoney(query.getMoney());
            orderPrivateCar.setRedPacketId(query.getId());
        if(null != redDeduction && 1 == redDeduction && null == orderPrivateCar.getRedPacketId()){
            RedEnvelopePaymentSettings redEnvelopePaymentSettings = redEnvelopePaymentSettingsService.getRedEnvelopePaymentSettings();
            if(null != redEnvelopePaymentSettings){
                List<UserRedPacketRecord> userRedPacketRecords = userRedPacketRecordService.selectList(new EntityWrapper<UserRedPacketRecord>().eq("userId", uid)
                        .eq("state", 1).eq("companyId", orderPrivateCar.getCompanyId()).gt("remainingAmount", 0).orderBy("insertTime", false));
                Double total = userRedPacketRecords.stream().mapToDouble(UserRedPacketRecord::getRemainingAmount).sum();
                BigDecimal deductionRatio = redEnvelopePaymentSettings.getDeductionRatio();
                BigDecimal multiply1 = orderMoney.multiply(deductionRatio.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN);
                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());
                            userRedPacketRecord.setState(2);
                            multiply1 = multiply1.subtract(remainingAmount).setScale(2, RoundingMode.HALF_EVEN);
                            jsonObject.put("money", remainingAmount.setScale(2, RoundingMode.HALF_EVEN));
                            jsonArray.add(jsonObject);
                        }else if(remainingAmount.compareTo(multiply1) > 0){
                            userRedPacketRecord.setRemainingAmount(remainingAmount.subtract(multiply1).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
                            jsonObject.put("money", multiply1.setScale(2, RoundingMode.HALF_EVEN));
                            jsonArray.add(jsonObject);
                            multiply1 = BigDecimal.ZERO;
                            break;
                        }
                    }
                    if(userRedPacketRecords.size() > 0){
                        userRedPacketRecordService.updateBatchById(userRedPacketRecords);
                    }
                    orderPrivateCar.setRedPacketId(jsonArray.toJSONString());
                }else if(total > 0 && total.compareTo(multiply1.doubleValue()) < 0){
                    orderPrivateCar.setRedPacketMoney(total);
                    orderMoney = orderMoney.subtract(new BigDecimal(total)).setScale(2, RoundingMode.HALF_EVEN);
                    //获取红包id
                    JSONArray jsonArray = new JSONArray();
                    for (UserRedPacketRecord userRedPacketRecord : userRedPacketRecords) {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("id", userRedPacketRecord.getId());
                        jsonObject.put("money", userRedPacketRecord.getRemainingAmount());
                        jsonArray.add(jsonObject);
                        userRedPacketRecord.setRemainingAmount(0D);
                        userRedPacketRecord.setEndTime(new Date());
                        userRedPacketRecord.setState(2);
                    }
                    if(userRedPacketRecords.size() > 0){
                        userRedPacketRecordService.updateBatchById(userRedPacketRecords);
                    }
                    orderPrivateCar.setRedPacketId(jsonArray.toJSONString());
                }
            }
        }
        if(payType == 1){//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "1" + language + orderId;
@@ -941,21 +1422,22 @@
            checkoutRequest.setAccountNumber(userInfo.getPhone());
            checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
            checkoutRequest.setCustomerLastName(userInfo.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setRequestAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderTaxi");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            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, null, 1);//添加预支付数据
                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);
@@ -967,75 +1449,70 @@
            checkoutRequest.setAccountNumber(bankCard.getCode());
            checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
            checkoutRequest.setCustomerLastName(bankCard.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setRequestAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderTaxi");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            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, null, 1);//添加预支付数据
                paymentRecordService.saveData(1, null, null, orderId, 1, 2,
                        orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), null, 1);//添加预支付数据
            }else{
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
            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(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            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, 2, 1, 1, 1, orderId);
            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);
            orderPrivateCar.setOrderMoney(orderPrivateCar.getOrderMoney()+orderPrivateCar.getFreeMoney().doubleValue());
            orderPrivateCar.setPayMoney(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            if(null != query){
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            //添加已收入明细
            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
            Double speMoney = company.getSpeMoney();
            BigDecimal d = null;//企业收入
            BigDecimal c = null;//司机收入
            if(company.getIsSpeFixedOrProportional() == 2){//固定
                d = new BigDecimal(speMoney);
                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
            }
            if(orderPrivateCar.getIsplatPay()==1){
                //添加已收入明细
                Company company = companyService.selectById(orderPrivateCar.getCompanyId());
                Double speMoney = company.getSpeMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(speMoney);
                    c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
                }
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
                    d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                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(company.getIsSpeFixedOrProportional() == 1){//比例
                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
                d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
            }
            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
            incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            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
@@ -1052,61 +1529,103 @@
                            if(null != orderPrivateCar.getDriverId()){
                                aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                            }
                            Double aDouble1 = Double.valueOf(orderPrivateCar.getMileage() / 1000);
                            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();
                                document.getElementsByTag("title").get(0).text("I-GO电子收据");
                                document.getElementsByTag("title").get(0).text("打车收据");
                                Element title_chinese = document.getElementById("title_chinese");
                                title_chinese.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderPrivateCar.getPayMoney());
                                Element xcf_chinese = document.getElementById("xcf_chinese");
                                xcf_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_chinese.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",您在I-GO此订单消费GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element qbj_chinese = document.getElementById("qbj_chinese");
                                qbj_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_chinese = document.getElementById("scf_chinese");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_chinese_div = document.getElementById("scf_chinese_div");
                                    scf_chinese_div.remove();
                                }
                                Element lcf_chinese = document.getElementById("lcf_chinese");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_chinese_div = document.getElementById("lcf_chinese_div");
                                    lcf_chinese_div.remove();
                                }
                                Element ddf_chinese = document.getElementById("ddf_chinese");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_chinese_div = document.getElementById("ddf_chinese_div");
                                    ddf_chinese_div.remove();
                                }
                                Element glf_chinese = document.getElementById("glf_chinese");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_chinese_div = document.getElementById("glf_chinese_div");
                                    glf_chinese_div.remove();
                                }
                                Element tcf_chinese = document.getElementById("tcf_chinese");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_chinese_div = document.getElementById("tcf_chinese_div");
                                    tcf_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_chinese = document.getElementById("yhq_chinese");
                                    yhq_chinese.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_chinese_div = document.getElementById("yhq_chinese_div");
                                    yhq_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_chinese = document.getElementById("zk_chinese");
                                    zk_chinese.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_chinese_div = document.getElementById("zk_chinese_div");
                                    zk_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_chinese = document.getElementById("hb_chinese");
                                    hb_chinese.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_chinese_div = document.getElementById("hb_chinese_div");
                                    hb_chinese_div.remove();
                                }
                                Element xj_chinese = document.getElementById("xj_chinese");
                                xj_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_chinese = document.getElementById("pay_type_chinese");
                                pay_type_chinese.text("余额支付");
                                Element pay_money_chinese = document.getElementById("pay_money_chinese");
                                pay_money_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_chinese = document.getElementById("dispute_chinese");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_chinese.text("(注意: 争议订单,经过三方协商,平台最终定价为 GHS" + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_chinese.remove();
                                }
                                Element pdf_chinese = document.getElementById("pdf_chinese");
                                pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                pdf_chinese.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                Element lost_item_chinese = document.getElementById("lost_item_chinese");
                                lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_chinese.size(); i++) {
                                    Element element = driver_chinese.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_chinese = document.getElementById("cp_chinese");
                                cp_chinese.text("车牌:" + car.getCarLicensePlate());
                                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");
@@ -1122,57 +1641,98 @@
                            if(2 == language){
                                document.getElementById("chinese").remove();
                                document.getElementById("french").remove();
                                document.getElementsByTag("title").get(0).text("Receipt");
                                document.getElementsByTag("title").get(0).text("Ride receipt");
                                Element title_english = document.getElementById("title_english");
                                title_english.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",You spent GHS " + orderPrivateCar.getPayMoney() + " on the trip ");
                                Element xcf_english = document.getElementById("xcf_english");
                                xcf_english.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_english.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",You spent GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + " on the trip ");
                                Element qbj_english = document.getElementById("qbj_english");
                                qbj_english.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_english = document.getElementById("scf_english");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_english.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_english_div = document.getElementById("scf_english_div");
                                    scf_english_div.remove();
                                }
                                Element lcf_english = document.getElementById("lcf_english");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_english.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_english_div = document.getElementById("lcf_english_div");
                                    lcf_english_div.remove();
                                }
                                Element ddf_english = document.getElementById("ddf_english");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_english.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_english_div = document.getElementById("ddf_english_div");
                                    ddf_english_div.remove();
                                }
                                Element glf_english = document.getElementById("glf_english");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_english.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_english_div = document.getElementById("glf_english_div");
                                    glf_english_div.remove();
                                }
                                Element tcf_english = document.getElementById("tcf_english");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_english.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_english_div = document.getElementById("tcf_english_div");
                                    tcf_english_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_english = document.getElementById("yhq_english");
                                    yhq_english.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_english.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_english_div = document.getElementById("yhq_english_div");
                                    yhq_english_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_english = document.getElementById("zk_english");
                                    zk_english.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_english.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_english_div = document.getElementById("zk_english_div");
                                    zk_english_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_english = document.getElementById("hb_english");
                                    hb_english.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_english.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_english_div = document.getElementById("hb_english_div");
                                    hb_english_div.remove();
                                }
                                Element xj_english = document.getElementById("xj_english");
                                xj_english.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_english.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_english = document.getElementById("pay_type_english");
                                pay_type_english.text("I-GO Wallet");
                                Element pay_money_english = document.getElementById("pay_money_english");
                                pay_money_english.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_english.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_english = document.getElementById("dispute_english");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_english.text("(Note: Disputed order, after tripartite negotiation, the final pricing of the platform is GHS " + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_english.remove();
                                }
                                Element pdf_english = document.getElementById("pdf_english");
                                pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                pdf_english.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                Element lost_item_english = document.getElementById("lost_item_english");
                                lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_english.size(); i++) {
                                    Element element = driver_english.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_english = document.getElementById("cp_english");
                                cp_english.text("Number Plate:" + car.getCarLicensePlate());
                                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");
@@ -1188,57 +1748,98 @@
                            if(3 == language){
                                document.getElementById("chinese").remove();
                                document.getElementById("english").remove();
                                document.getElementsByTag("title").get(0).text("Reçu");
                                document.getElementsByTag("title").get(0).text("Reçu de course");
                                Element title_french = document.getElementById("title_french");
                                title_french.text("Le " + DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ", vous avez dépensé GHS " + orderPrivateCar.getPayMoney() + " sur le voyage");
                                Element xcf_french = document.getElementById("xcf_french");
                                xcf_french.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_french.text("Le " + DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ", vous avez dépensé GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + " sur le voyage");
                                Element qbj_french = document.getElementById("qbj_french");
                                qbj_french.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_french = document.getElementById("scf_french");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_french.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_french_div = document.getElementById("scf_french_div");
                                    scf_french_div.remove();
                                }
                                Element lcf_french = document.getElementById("lcf_french");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_french.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_french_div = document.getElementById("lcf_french_div");
                                    lcf_french_div.remove();
                                }
                                Element ddf_french = document.getElementById("ddf_french");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_french.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_french_div = document.getElementById("ddf_french_div");
                                    ddf_french_div.remove();
                                }
                                Element glf_french = document.getElementById("glf_french");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_french.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_french_div = document.getElementById("glf_french_div");
                                    glf_french_div.remove();
                                }
                                Element tcf_french = document.getElementById("tcf_french");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_french.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_french_div = document.getElementById("tcf_french_div");
                                    tcf_french_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_french = document.getElementById("yhq_french");
                                    yhq_french.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_french.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_french_div = document.getElementById("yhq_french_div");
                                    yhq_french_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_french = document.getElementById("zk_french");
                                    zk_french.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_french.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_french_div = document.getElementById("zk_french_div");
                                    zk_french_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_french = document.getElementById("hb_french");
                                    hb_french.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_french.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_french_div = document.getElementById("hb_french_div");
                                    hb_french_div.remove();
                                }
                                Element xj_french = document.getElementById("xj_french");
                                xj_french.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_french.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_french = document.getElementById("pay_type_french");
                                pay_type_french.text("Portefeuille I-GO");
                                Element pay_money_french = document.getElementById("pay_money_french");
                                pay_money_french.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_french.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_french = document.getElementById("dispute_french");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_french.text("(Remarque: Il s’agit d’une commande contestée, et après des négociations entre trois parties, la plateforme l’a finalement tarifée à GHS " + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_french.remove();
                                }
                                Element pdf_french = document.getElementById("pdf_french");
                                pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                pdf_french.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                Element lost_item_french = document.getElementById("lost_item_french");
                                lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_french.size(); i++) {
                                    Element element = driver_french.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_french = document.getElementById("cp_french");
                                cp_french.text("Plaque: GS " + car.getCarLicensePlate());
                                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");
@@ -1251,14 +1852,14 @@
                                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 ? "I-GO电子收据" : language == 2 ? "Receipt" : "Reçu",  document.html());
                            EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course",  document.html());
                            //开始生成pdf收据和html收据
                            File file = new File("/usr/local/nginx/html/files/html/");
                            File file = new File("/home/igotechgh/nginx/html/files/html/");
                            if(!file.exists()){
                                file.mkdirs();
                            }
                            file = new File("/usr/local/nginx/html/files/html/ride_receipt_" + orderId + ".html");
                            file = new File("/home/igotechgh/nginx/html/files/html/ride_receipt_" + orderId + ".html");
                            if(!file.exists()){
                                file.createNewFile();
                            }
@@ -1266,28 +1867,28 @@
                            fileWriter.write(document.html());
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/usr/local/nginx/html/files/pdf/");
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
                            }
                            file1 = new File("/usr/local/nginx/html/files/pdf/ride_receipt_" + orderId + ".pdf");
                            file1 = new File("/home/igotechgh/nginx/html/files/pdf/ride_receipt_" + orderId + ".pdf");
                            if(!file1.exists()){
                                file1.createNewFile();
                            }
                            try {
                                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                                HtmlToPdfUtils.convertToPdf("/usr/local/nginx/html/files/html/ride_receipt_" + orderId + ".html", "I-GO", fileOutputStream);
                                HtmlToPdfUtils.convertToPdf("/home/igotechgh/nginx/html/files/html/ride_receipt_" + orderId + ".html", "I-GO", fileOutputStream);
                            }catch (Exception e){
                                e.printStackTrace();
                                System.out.println("html转pdf异常");
                            }
                            String link ="http://182.160.16.251:81/files/html/ride_receipt_" + orderId + ".html";
                            String link ="https://igo.i-go.group/files/html/ride_receipt_" + orderId + ".html";
                            TEmail tEmail = new TEmail();
                            tEmail.setLink(link);
                            tEmail.setUserId(uid);
                            tEmail.setName(language == 1 ? "I-GO电子收据" : language == 2 ? "Receipt" : "Reçu");
                            tEmail.setName(language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course");
                            tEmail.setType(1);
                            tEmail.setOrderId(orderId);
                            tEmail.setCreateTime(new Date());
@@ -1300,121 +1901,210 @@
                                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);
        }
        if(payType == 4){//现金支付
            SysIntegral query1 = sysIntegralMapper.query(orderPrivateCar.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "完成订单", orderMoney, 2, 1, 1, 1, orderId);
            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);
            orderPrivateCar.setOrderMoney(orderPrivateCar.getOrderMoney()+orderPrivateCar.getFreeMoney().doubleValue());
            orderPrivateCar.setPayMoney(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
                //添加优惠收入补贴
                Double money = userCouponRecord.getMoney();
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 5, orderPrivateCar.getId(), 1, money);
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                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 != query){
                query.setState(2);
                query.setEndTime(new Date());
                userRedPacketRecordService.updateById(query);
            if(null != orderPrivateCar.getRedPacketId()){
                Double money = orderPrivateCar.getRedPacketMoney();
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 7, orderPrivateCar.getId(), 1, money);
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                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(orderPrivateCar.getIsplatPay()==1){
                //添加已收入明细
                Company company = companyService.selectById(orderPrivateCar.getCompanyId());
                Double speMoney = company.getSpeMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(speMoney);
                    c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
                }
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
                    d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
            if(null != orderPrivateCar.getDiscountMoney() && 0 < orderPrivateCar.getDiscountMoney()){
                Double money = orderPrivateCar.getDiscountMoney();
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 6, orderPrivateCar.getId(), 1, money);
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                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();
            BigDecimal d = null;//企业收入
            BigDecimal c = null;//司机收入
            if(company.getIsSpeFixedOrProportional() == 2){//固定
                d = new BigDecimal(speMoney);
                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
                d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
            }
//                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
//                incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
//                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
//                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();
                    settlementDetail.setOrderId(orderId);
                    settlementDetail.setOrderType(1);
                    settlementDetail.setDriverId(driver.getId());
                    settlementDetail.setOrderMoney(orderPrivateCar.getOrderMoney());
                    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());
                        Double maxPrice = jsonObject.getDouble("maxPrice");
                        List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driver.getId()).isNull("settlementRecordId").last(" and DATE_FORMAT(now(), '%Y-%m-%d') = DATE_FORMAT(createTime, '%Y-%m-%d')"));
            //记录司机待结算金额
            if(d.compareTo(new BigDecimal(0)) > 0){
                SettlementDetail settlementDetail = new SettlementDetail();
                settlementDetail.setOrderId(orderId);
                settlementDetail.setOrderType(1);
                settlementDetail.setDriverId(driver.getId());
                settlementDetail.setOrderMoney(orderPrivateCar.getOrderMoney());
                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());
                    Double maxPrice = jsonObject.getDouble("maxPrice");
                    Integer type1 = jsonObject.getInteger("type");
                    if(null != maxPrice){
                        List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driver.getId())
                                .isNull("settlementRecordId").last(" and DATE_FORMAT(now(), '%Y-%m-%d') = DATE_FORMAT(createTime, '%Y-%m-%d')"));
                        BigDecimal total = new BigDecimal(0);
                        for (SettlementDetail detail : settlementDetailList) {
                            total = total.add(new BigDecimal(detail.getPrice()));
                        }
                        //日结算
                        if(maxPrice.compareTo(total.doubleValue()) <= 0){
                            SettlementRecord settlementRecord = new SettlementRecord();
                            settlementRecord.setDay(new Date());
                            settlementRecord.setDriverId(driver.getId());
                            settlementRecord.setType(1);
                            settlementRecord.setPaymentStatus(1);
                            settlementRecord.setPayMoney(total.doubleValue());
                            settlementRecord.setInsertTime(new Date());
                            settlementRecordService.insert(settlementRecord);
                            SettlementRecord settlementRecord = settlementRecordService.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", orderPrivateCar.getDriverId())
                                    .eq("type", type1).eq("paymentStatus", 1).last(" and day = DATE_FORMAT(now(), '%Y-%m-%d')"));
                            if(null == settlementRecord){
                                settlementRecord = new SettlementRecord();
                                settlementRecord.setDay(new Date());
                                settlementRecord.setDriverId(orderPrivateCar.getDriverId());
                                settlementRecord.setType(type1);
                                settlementRecord.setPaymentStatus(1);
                                settlementRecord.setPayMoney(total.doubleValue());
                                settlementRecord.setInsertTime(new Date());
                                settlementRecordService.insert(settlementRecord);
                            }else{
                                settlementRecord.setPayMoney(settlementRecord.getPayMoney() + total.doubleValue());
                                settlementRecordService.updateById(settlementRecord);
                            }
                            for (SettlementDetail detail : settlementDetailList) {
                                detail.setSettlementRecordId(settlementRecord.getId());
                                settlementDetailService.updateById(detail);
                            }
                            //强制司机下班
                            DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>()
                                    .eq("driverId", orderPrivateCar.getDriverId()).eq("state", 1));
                            if(null != driverWork){
                                driverWork.setEndTime(new Date());
                                driverWork.setState(2);
                                driverWorkService.updateById(driverWork);
                                driver.setState(1);
                                driverService.updateById(driver);
                                Car car = carService.selectById(driver.getCarId());
                                if(!org.apache.shiro.util.StringUtils.hasLength(car.getVehicleId())){
                                    car.setVehicleId(UUIDUtil.getRandomCode());
                                    carService.updateById(car);
                                }
                                //司机下班,修改谷歌上的车辆信息
                                new Thread(()->{
                                    try {
                                        CarModel carModel = carModelMapper.selectById(car.getCarModelId());
                                        String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
                                        if(ToolUtil.isEmpty(vehicles)){
                                            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;
                                                    }
                                                    Thread.sleep(5000L);
                                                }
                                            }
                                            boolean updateVehicles = fleetEngineUtil.updateVehicles("OFFLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                            if(!updateVehicles){
                                                for (int i = 0; i < 5; i++) {
                                                    updateVehicles = fleetEngineUtil.updateVehicles("OFFLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                                    if(updateVehicles){
                                                        break;
                                                    }
                                                    Thread.sleep(5000L);
                                                }
                                            }
                                        }else{
                                            boolean updateVehicles = fleetEngineUtil.updateVehicles("OFFLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                            if(!updateVehicles){
                                                for (int i = 0; i < 5; i++) {
                                                    updateVehicles = fleetEngineUtil.updateVehicles("OFFLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                                    if(updateVehicles){
                                                        break;
                                                    }
                                                    Thread.sleep(5000L);
                                                }
                                            }
                                        }
                                    }catch (Exception e){
                                        e.printStackTrace();
                                    }
                                }).start();
                            }
                        }
                    }
                }
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                new Thread(new Runnable() {
                    @Override
@@ -1430,62 +2120,104 @@
                            if(null != orderPrivateCar.getDriverId()){
                                aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                            }
                            Double aDouble1 = Double.valueOf(orderPrivateCar.getMileage() / 1000);
                            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();
                                document.getElementById("french").remove();
                                document.getElementsByTag("title").get(0).text("I-GO电子收据");
                                document.getElementsByTag("title").get(0).text("打车收据");
                                Element title_chinese = document.getElementById("title_chinese");
                                title_chinese.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderPrivateCar.getPayMoney());
                                Element xcf_chinese = document.getElementById("xcf_chinese");
                                xcf_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_chinese.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",您在I-GO此订单消费GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element qbj_chinese = document.getElementById("qbj_chinese");
                                qbj_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_chinese = document.getElementById("scf_chinese");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_chinese_div = document.getElementById("scf_chinese_div");
                                    scf_chinese_div.remove();
                                }
                                Element lcf_chinese = document.getElementById("lcf_chinese");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_chinese_div = document.getElementById("lcf_chinese_div");
                                    lcf_chinese_div.remove();
                                }
                                Element ddf_chinese = document.getElementById("ddf_chinese");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_chinese_div = document.getElementById("ddf_chinese_div");
                                    ddf_chinese_div.remove();
                                }
                                Element glf_chinese = document.getElementById("glf_chinese");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_chinese_div = document.getElementById("glf_chinese_div");
                                    glf_chinese_div.remove();
                                }
                                Element tcf_chinese = document.getElementById("tcf_chinese");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_chinese_div = document.getElementById("tcf_chinese_div");
                                    tcf_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_chinese = document.getElementById("yhq_chinese");
                                    yhq_chinese.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_chinese_div = document.getElementById("yhq_chinese_div");
                                    yhq_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_chinese = document.getElementById("zk_chinese");
                                    zk_chinese.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_chinese_div = document.getElementById("zk_chinese_div");
                                    zk_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_chinese = document.getElementById("hb_chinese");
                                    hb_chinese.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_chinese_div = document.getElementById("hb_chinese_div");
                                    hb_chinese_div.remove();
                                }
                                Element xj_chinese = document.getElementById("xj_chinese");
                                xj_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_chinese = document.getElementById("pay_type_chinese");
                                pay_type_chinese.text("现金");
                                Element pay_money_chinese = document.getElementById("pay_money_chinese");
                                pay_money_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_chinese = document.getElementById("dispute_chinese");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_chinese.text("(注意: 争议订单,经过三方协商,平台最终定价为 GHS" + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_chinese.remove();
                                }
                                Element pdf_chinese = document.getElementById("pdf_chinese");
                                pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                pdf_chinese.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                Element lost_item_chinese = document.getElementById("lost_item_chinese");
                                lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_chinese.size(); i++) {
                                    Element element = driver_chinese.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_chinese = document.getElementById("cp_chinese");
                                cp_chinese.text("车牌:" + car.getCarLicensePlate());
                                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");
@@ -1501,57 +2233,98 @@
                            if(2 == language){
                                document.getElementById("chinese").remove();
                                document.getElementById("french").remove();
                                document.getElementsByTag("title").get(0).text("Receipt");
                                document.getElementsByTag("title").get(0).text("Ride receipt");
                                Element title_english = document.getElementById("title_english");
                                title_english.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",You spent GHS " + orderPrivateCar.getPayMoney() + " on the trip ");
                                Element xcf_english = document.getElementById("xcf_english");
                                xcf_english.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_english.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",You spent GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + " on the trip ");
                                Element qbj_english = document.getElementById("qbj_english");
                                qbj_english.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_english = document.getElementById("scf_english");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_english.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_english_div = document.getElementById("scf_english_div");
                                    scf_english_div.remove();
                                }
                                Element lcf_english = document.getElementById("lcf_english");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_english.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_english_div = document.getElementById("lcf_english_div");
                                    lcf_english_div.remove();
                                }
                                Element ddf_english = document.getElementById("ddf_english");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_english.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_english_div = document.getElementById("ddf_english_div");
                                    ddf_english_div.remove();
                                }
                                Element glf_english = document.getElementById("glf_english");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_english.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_english_div = document.getElementById("glf_english_div");
                                    glf_english_div.remove();
                                }
                                Element tcf_english = document.getElementById("tcf_english");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_english.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_english_div = document.getElementById("tcf_english_div");
                                    tcf_english_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_english = document.getElementById("yhq_english");
                                    yhq_english.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_english.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_english_div = document.getElementById("yhq_english_div");
                                    yhq_english_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_english = document.getElementById("zk_english");
                                    zk_english.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_english.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_english_div = document.getElementById("zk_english_div");
                                    zk_english_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_english = document.getElementById("hb_english");
                                    hb_english.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_english.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_english_div = document.getElementById("hb_english_div");
                                    hb_english_div.remove();
                                }
                                Element xj_english = document.getElementById("xj_english");
                                xj_english.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_english.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_english = document.getElementById("pay_type_english");
                                pay_type_english.text("Cash");
                                Element pay_money_english = document.getElementById("pay_money_english");
                                pay_money_english.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_english.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_english = document.getElementById("dispute_english");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_english.text("(Note: Disputed order, after tripartite negotiation, the final pricing of the platform is GHS " + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_english.remove();
                                }
                                Element pdf_english = document.getElementById("pdf_english");
                                pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                pdf_english.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                Element lost_item_english = document.getElementById("lost_item_english");
                                lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_english.size(); i++) {
                                    Element element = driver_english.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_english = document.getElementById("cp_english");
                                cp_english.text("Number Plate:" + car.getCarLicensePlate());
                                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");
@@ -1567,57 +2340,98 @@
                            if(3 == language){
                                document.getElementById("chinese").remove();
                                document.getElementById("english").remove();
                                document.getElementsByTag("title").get(0).text("Reçu");
                                document.getElementsByTag("title").get(0).text("Reçu de course");
                                Element title_french = document.getElementById("title_french");
                                title_french.text("Le " + DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ", vous avez dépensé GHS " + orderPrivateCar.getPayMoney() + " sur le voyage");
                                Element xcf_french = document.getElementById("xcf_french");
                                xcf_french.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_french.text("Le " + DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ", vous avez dépensé GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + " sur le voyage");
                                Element qbj_french = document.getElementById("qbj_french");
                                qbj_french.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_french = document.getElementById("scf_french");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_french.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_french_div = document.getElementById("scf_french_div");
                                    scf_french_div.remove();
                                }
                                Element lcf_french = document.getElementById("lcf_french");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_french.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_french_div = document.getElementById("lcf_french_div");
                                    lcf_french_div.remove();
                                }
                                Element ddf_french = document.getElementById("ddf_french");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_french.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_french_div = document.getElementById("ddf_french_div");
                                    ddf_french_div.remove();
                                }
                                Element glf_french = document.getElementById("glf_french");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_french.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_french_div = document.getElementById("glf_french_div");
                                    glf_french_div.remove();
                                }
                                Element tcf_french = document.getElementById("tcf_french");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_french.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_french_div = document.getElementById("tcf_french_div");
                                    tcf_french_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_french = document.getElementById("yhq_french");
                                    yhq_french.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_french.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_french_div = document.getElementById("yhq_french_div");
                                    yhq_french_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_french = document.getElementById("zk_french");
                                    zk_french.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_french.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_french_div = document.getElementById("zk_french_div");
                                    zk_french_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_french = document.getElementById("hb_french");
                                    hb_french.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_french.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_french_div = document.getElementById("hb_french_div");
                                    hb_french_div.remove();
                                }
                                Element xj_french = document.getElementById("xj_french");
                                xj_french.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_french.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_french = document.getElementById("pay_type_french");
                                pay_type_french.text("En espèces");
                                Element pay_money_french = document.getElementById("pay_money_french");
                                pay_money_french.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_french.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_french = document.getElementById("dispute_french");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_french.text("(Remarque: Il s’agit d’une commande contestée, et après des négociations entre trois parties, la plateforme l’a finalement tarifée à GHS " + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_french.remove();
                                }
                                Element pdf_french = document.getElementById("pdf_french");
                                pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                pdf_french.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=1");
                                Element lost_item_french = document.getElementById("lost_item_french");
                                lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_french.size(); i++) {
                                    Element element = driver_french.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_french = document.getElementById("cp_french");
                                cp_french.text("Plaque: GS " + car.getCarLicensePlate());
                                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");
@@ -1630,15 +2444,15 @@
                                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 ? "I-GO电子收据" : language == 2 ? "Receipt" : "Reçu",  document.html());
                            EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course",  document.html());
                            //开始生成pdf收据和html收据
                            File file = new File("/usr/local/nginx/html/files/html/");
                            File file = new File("/home/igotechgh/nginx/html/files/html/");
                            if(!file.exists()){
                                file.mkdirs();
                            }
                            file = new File("/usr/local/nginx/html/files/html/ride_receipt_" + orderId + ".html");
                            file = new File("/home/igotechgh/nginx/html/files/html/ride_receipt_" + orderId + ".html");
                            if(!file.exists()){
                                file.createNewFile();
                            }
@@ -1646,27 +2460,27 @@
                            fileWriter.write(document.html());
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/usr/local/nginx/html/files/pdf/");
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
                            }
                            file1 = new File("/usr/local/nginx/html/files/pdf/ride_receipt_" + orderId + ".pdf");
                            file1 = new File("/home/igotechgh/nginx/html/files/pdf/ride_receipt_" + orderId + ".pdf");
                            if(!file1.exists()){
                                file1.createNewFile();
                            }
                            try {
                                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                                HtmlToPdfUtils.convertToPdf("/usr/local/nginx/html/files/html/ride_receipt_" + orderId + ".html", "I-GO", fileOutputStream);
                                HtmlToPdfUtils.convertToPdf("/home/igotechgh/nginx/html/files/html/ride_receipt_" + orderId + ".html", "I-GO", fileOutputStream);
                            }catch (Exception e){
                                e.printStackTrace();
                                System.out.println("html转pdf异常");
                            }
                            String link ="http://182.160.16.251:81/files/html/ride_receipt_" + orderId + ".html";
                            String link ="https://igo.i-go.group/files/html/ride_receipt_" + orderId + ".html";
                            TEmail tEmail = new TEmail();
                            tEmail.setLink(link);
                            tEmail.setUserId(uid);
                            tEmail.setName(language == 1 ? "I-GO电子收据" : language == 2 ? "Receipt" : "Reçu");
                            tEmail.setName(language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course");
                            tEmail.setType(1);
                            tEmail.setOrderId(orderId);
                            tEmail.setCreateTime(new Date());
@@ -1679,32 +2493,75 @@
                                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.pushOfflinePayment(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1);
                    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){
                        case 1:
                            text = "客户已选择支付现金,因此您必须收款。确定您已收到此订单费用:现金GHS " + orderPrivateCar.getPayMoney();
                            break;
                        case 2:
                            text = "The client chose to pay in cash, so you must collect the payment.Confirm if you received the charge for this order: Cash GHS " + orderPrivateCar.getPayMoney();
                            break;
                        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";
                    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);
                    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;
    }
@@ -1725,10 +2582,7 @@
            }else{//随机金额
                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
                int i = new BigDecimal(endMoney).subtract(new BigDecimal(startMoney)).intValue();
                Random random = new Random();
                int num = random.nextInt(i);
                money = new BigDecimal(startMoney).add(new BigDecimal(num)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                money = new BigDecimal(startMoney + (Math.random() * (endMoney - startMoney))).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            }
            //判断当前红包是否大于剩余可领取总金额
            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
@@ -1743,10 +2597,7 @@
            //添加临时红包数据
            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
            userRedPacketRecord.setMoney(money);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(query.get("effective"))));
            userRedPacketRecord.setExpirationTime(calendar.getTime());
            userRedPacketRecord.setRemainingAmount(money);
            userRedPacketRecord.setInsertTime(new Date());
            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
            userRedPacketRecord.setState(0);
@@ -1784,6 +2635,9 @@
            query.setState(1);
            query.setRedPacketActivityId(id.getId());
            userRedPacketRecordService.updateById(query);
            String content = 1 == language ? ("您收到一个额度为GHS " + money + " 的红包,请查收") : 2 == language ? "You have received a lucky promo of GHS " + money + ", please check" : "Vous avez reçu un bonus de GHS " + money + ", veuillez vérifier";
            systemNoticeService.addSystemNotice(1, content, query.getUserId(), 1);
            UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
@@ -1797,7 +2651,7 @@
                    Element user_chinese = document.getElementById("user_chinese");
                    user_chinese.text("您好 " + userInfo.getNickName() + ",");
                    Element time_chinese = document.getElementById("time_chinese");
                    time_chinese.text("此活动有效期在 " + DateUtil.conversionFormat(language, sdf.format(query.getInsertTime())) + " 至 " + DateUtil.conversionFormat(language, sdf.format(query.getExpirationTime())) + ",详情请查看I-GO平台");
                    time_chinese.text("此活动有效期在 " + DateUtil.conversionFormat(language, sdf.format(id.getStartTime())) + " 至 " + DateUtil.conversionFormat(language, sdf.format(id.getEndTime())) + ",详情请查看I-GO平台");
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
@@ -1806,7 +2660,7 @@
                    Element user_english = document.getElementById("user_english");
                    user_english.text("Hello " + userInfo.getNickName() + ",");
                    Element time_english = document.getElementById("time_english");
                    time_english.text("You could use it from " + DateUtil.conversionFormat(language, sdf.format(query.getInsertTime())) + " to " + DateUtil.conversionFormat(language, sdf.format(query.getExpirationTime())) + ",check more details on the app.");
                    time_english.text("You could use it from " + DateUtil.conversionFormat(language, sdf.format(id.getStartTime())) + " to " + DateUtil.conversionFormat(language, sdf.format(id.getEndTime())) + ",check more details on the app.");
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
@@ -1815,16 +2669,16 @@
                    Element user_french = document.getElementById("user_french");
                    user_french.text("Bonjour " + userInfo.getNickName() + ",");
                    Element time_french = document.getElementById("time_french");
                    time_french.text("Cette promotion est valable du " + DateUtil.conversionFormat(language, sdf.format(query.getInsertTime())) + " au " + DateUtil.conversionFormat(language, sdf.format(query.getExpirationTime())) + ". Veuillez consulter la plateforme i-go pour plus de détails.");
                    time_french.text("Cette promotion est valable du " + DateUtil.conversionFormat(language, sdf.format(id.getStartTime())) + " au " + DateUtil.conversionFormat(language, sdf.format(id.getEndTime())) + ". Veuillez consulter la plateforme I-GO pour plus de détails.");
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "红包活动" : language == 2 ? "Lucky-promo activities" : "Activités bonus",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/usr/local/nginx/html/files/html/");
                File file = new File("/home/igotechgh/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/usr/local/nginx/html/files/html/redpacket_" + orderId + ".html");
                file = new File("/home/igotechgh/nginx/html/files/html/redpacket_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
@@ -1833,7 +2687,7 @@
                fileWriter.flush();
                fileWriter.close();
                String link ="http://182.160.16.251:81/files/html/redpacket_" + orderId + ".html";
                String link ="https://igo.i-go.group/files/html/redpacket_" + orderId + ".html";
                TEmail tEmail = new TEmail();
                tEmail.setLink(link);
                tEmail.setUserId(userInfo.getId());
@@ -1874,7 +2728,7 @@
            orderPrivateCar.setState(10);
            //解除小号绑定
            if(orderPrivateCar.getBindId() != null){
                chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
                ChinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
            }
            orderPrivateCar.setBindId("");
            orderPrivateCar.setTelX("");
@@ -1889,28 +2743,38 @@
                query1.setState(2);
                orderCancelService.updateById(query1);
            }
//            //添加已收入明细
//            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, query.getAmount());
//            //添加已收入明细
//            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
//            Double taxi = company.getSpeMoney();
            BigDecimal c =new BigDecimal(query.getAmount());//司机收入
            incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            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);
            this.deleteTask(orderPrivateCar.getId());//删除定时任务
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
//            new Thread(new Runnable() {
//                @Override
//                public void run() {
//                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
//                }
//            }).start();
            Double amount = query.getAmount();
            if(null != orderPrivateCar.getDriverId()){
                //添加已收入明细
                Company company = companyService.selectById(orderPrivateCar.getCompanyId());
                Double speMoney = company.getSpeMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(speMoney);
                    c = new BigDecimal(amount).subtract(d);//只有出行金额参与抽成,其余归属司机
                }
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    d = new BigDecimal(amount).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(amount).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, d.doubleValue());
                if(c.doubleValue() > 0){
                    incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
                    Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                    driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                    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);
                }
                this.deleteTask(orderPrivateCar.getId());//删除定时任务
                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, "", "user");
            //添加消息
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
@@ -1946,40 +2810,31 @@
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            if(null != orderPrivateCar.getRedPacketId()){
                UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
                userRedPacketRecord.setState(2);
                userRedPacketRecord.setEndTime(new Date());
                userRedPacketRecordService.updateById(userRedPacketRecord);
            }
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            if(orderPrivateCar.getIsplatPay()==1){
                //添加已收入明细
                Company company = companyService.selectById(orderPrivateCar.getCompanyId());
                Double taxi = company.getSpeMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(taxi);
                    c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
                    d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
                incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                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);
            //添加已收入明细
            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
            Double taxi = company.getSpeMoney();
            BigDecimal d = null;//企业收入
            BigDecimal c = null;//司机收入
            if(company.getIsSpeFixedOrProportional() == 2){//固定
                d = new BigDecimal(taxi);
                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                Double price = orderPrivateCar.getStartMoney() + orderPrivateCar.getMileageMoney() + orderPrivateCar.getWaitMoney() + orderPrivateCar.getDurationMoney() + orderPrivateCar.getLongDistanceMoney();
                d = new BigDecimal(price).multiply(new BigDecimal(taxi).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                c = new BigDecimal(orderPrivateCar.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
            }
            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
            incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            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())){
@@ -1998,61 +2853,103 @@
                            if(null != orderPrivateCar.getDriverId()){
                                aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                            }
                            Double aDouble1 = Double.valueOf(orderPrivateCar.getMileage() / 1000);
                            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();
                                document.getElementsByTag("title").get(0).text("I-GO电子收据");
                                document.getElementsByTag("title").get(0).text("打车收据");
                                Element title_chinese = document.getElementById("title_chinese");
                                title_chinese.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderPrivateCar.getPayMoney());
                                Element xcf_chinese = document.getElementById("xcf_chinese");
                                xcf_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_chinese.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",您在I-GO此订单消费GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element qbj_chinese = document.getElementById("qbj_chinese");
                                qbj_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_chinese = document.getElementById("scf_chinese");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_chinese_div = document.getElementById("scf_chinese_div");
                                    scf_chinese_div.remove();
                                }
                                Element lcf_chinese = document.getElementById("lcf_chinese");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_chinese_div = document.getElementById("lcf_chinese_div");
                                    lcf_chinese_div.remove();
                                }
                                Element ddf_chinese = document.getElementById("ddf_chinese");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_chinese_div = document.getElementById("ddf_chinese_div");
                                    ddf_chinese_div.remove();
                                }
                                Element glf_chinese = document.getElementById("glf_chinese");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_chinese_div = document.getElementById("glf_chinese_div");
                                    glf_chinese_div.remove();
                                }
                                Element tcf_chinese = document.getElementById("tcf_chinese");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_chinese_div = document.getElementById("tcf_chinese_div");
                                    tcf_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_chinese = document.getElementById("yhq_chinese");
                                    yhq_chinese.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_chinese_div = document.getElementById("yhq_chinese_div");
                                    yhq_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_chinese = document.getElementById("zk_chinese");
                                    zk_chinese.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_chinese_div = document.getElementById("zk_chinese_div");
                                    zk_chinese_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_chinese = document.getElementById("hb_chinese");
                                    hb_chinese.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_chinese.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_chinese_div = document.getElementById("hb_chinese_div");
                                    hb_chinese_div.remove();
                                }
                                Element xj_chinese = document.getElementById("xj_chinese");
                                xj_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_chinese = document.getElementById("pay_type_chinese");
                                pay_type_chinese.text(orderPrivateCar.getPayType() == 1 ? "手机支付" : "银行卡支付");
                                pay_type_chinese.text(orderPrivateCar.getPayType() == 1 ? "手机支付" : (orderPrivateCar.getPayType() == 2?"银行卡支付":(orderPrivateCar.getPayType() == 3?"余额支付":"现金支付")));
                                Element pay_money_chinese = document.getElementById("pay_money_chinese");
                                pay_money_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_chinese.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_chinese = document.getElementById("dispute_chinese");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_chinese.text("(注意: 争议订单,经过三方协商,平台最终定价为 GHS" + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_chinese.remove();
                                }
                                Element pdf_chinese = document.getElementById("pdf_chinese");
                                pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=1");
                                pdf_chinese.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=1");
                                Element lost_item_chinese = document.getElementById("lost_item_chinese");
                                lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_chinese.size(); i++) {
                                    Element element = driver_chinese.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_chinese = document.getElementById("cp_chinese");
                                cp_chinese.text("车牌:" + car.getCarLicensePlate());
                                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");
@@ -2068,57 +2965,98 @@
                            if(2 == language){
                                document.getElementById("chinese").remove();
                                document.getElementById("french").remove();
                                document.getElementsByTag("title").get(0).text("Receipt");
                                document.getElementsByTag("title").get(0).text("Ride receipt");
                                Element title_english = document.getElementById("title_english");
                                title_english.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",You spent GHS " + orderPrivateCar.getPayMoney() + " on the trip ");
                                Element xcf_english = document.getElementById("xcf_english");
                                xcf_english.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_english.text(DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ",You spent GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + " on the trip ");
                                Element qbj_english = document.getElementById("qbj_english");
                                qbj_english.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_english = document.getElementById("scf_english");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_english.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_english_div = document.getElementById("scf_english_div");
                                    scf_english_div.remove();
                                }
                                Element lcf_english = document.getElementById("lcf_english");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_english.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_english_div = document.getElementById("lcf_english_div");
                                    lcf_english_div.remove();
                                }
                                Element ddf_english = document.getElementById("ddf_english");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_english.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_english_div = document.getElementById("ddf_english_div");
                                    ddf_english_div.remove();
                                }
                                Element glf_english = document.getElementById("glf_english");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_english.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_english_div = document.getElementById("glf_english_div");
                                    glf_english_div.remove();
                                }
                                Element tcf_english = document.getElementById("tcf_english");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_english.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_english_div = document.getElementById("tcf_english_div");
                                    tcf_english_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_english = document.getElementById("yhq_english");
                                    yhq_english.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_english.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_english_div = document.getElementById("yhq_english_div");
                                    yhq_english_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_english = document.getElementById("zk_english");
                                    zk_english.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_english.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_english_div = document.getElementById("zk_english_div");
                                    zk_english_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_english = document.getElementById("hb_english");
                                    hb_english.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_english.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_english_div = document.getElementById("hb_english_div");
                                    hb_english_div.remove();
                                }
                                Element xj_english = document.getElementById("xj_english");
                                xj_english.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_english.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_english = document.getElementById("pay_type_english");
                                pay_type_english.text(orderPrivateCar.getPayType() == 1 ? "Mobile money" : "Bank card");
                                pay_type_english.text(orderPrivateCar.getPayType() == 1 ? "Mobile money" :(orderPrivateCar.getPayType() == 2?"Bank card":(orderPrivateCar.getPayType() == 3?"I-GO Wallet":"Cash")));
                                Element pay_money_english = document.getElementById("pay_money_english");
                                pay_money_english.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_english.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_english = document.getElementById("dispute_english");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_english.text("(Note: Disputed order, after tripartite negotiation, the final pricing of the platform is GHS " + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_english.remove();
                                }
                                Element pdf_english = document.getElementById("pdf_english");
                                pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=1");
                                pdf_english.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=1");
                                Element lost_item_english = document.getElementById("lost_item_english");
                                lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_english.size(); i++) {
                                    Element element = driver_english.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_english = document.getElementById("cp_english");
                                cp_english.text("Number Plate:" + car.getCarLicensePlate());
                                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");
@@ -2134,57 +3072,98 @@
                            if(3 == language){
                                document.getElementById("chinese").remove();
                                document.getElementById("english").remove();
                                document.getElementsByTag("title").get(0).text("Reçu");
                                document.getElementsByTag("title").get(0).text("Reçu de course");
                                Element title_french = document.getElementById("title_french");
                                title_french.text("Le " + DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ", vous avez dépensé GHS " + orderPrivateCar.getPayMoney() + " sur le voyage");
                                Element xcf_french = document.getElementById("xcf_french");
                                xcf_french.text("GHS " + orderPrivateCar.getOrderMoney());
                                title_french.text("Le " + DateUtil.conversionFormat(language, sdf.format(orderPrivateCar.getTravelTime())) + ", vous avez dépensé GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue() + " sur le voyage");
                                Element qbj_french = document.getElementById("qbj_french");
                                qbj_french.text("GHS " + new BigDecimal(orderPrivateCar.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                Element scf_french = document.getElementById("scf_french");
                                if(null != orderPrivateCar.getDurationMoney() && orderPrivateCar.getDurationMoney() > 0){
                                    scf_french.text("GHS " + new BigDecimal(orderPrivateCar.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element scf_french_div = document.getElementById("scf_french_div");
                                    scf_french_div.remove();
                                }
                                Element lcf_french = document.getElementById("lcf_french");
                                if(null != orderPrivateCar.getMileageMoney() && orderPrivateCar.getMileageMoney() > 0){
                                    lcf_french.text("GHS " + new BigDecimal(orderPrivateCar.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element lcf_french_div = document.getElementById("lcf_french_div");
                                    lcf_french_div.remove();
                                }
                                Element ddf_french = document.getElementById("ddf_french");
                                if(null != orderPrivateCar.getWaitMoney() && orderPrivateCar.getWaitMoney() > 0){
                                    ddf_french.text("GHS " + new BigDecimal(orderPrivateCar.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element ddf_french_div = document.getElementById("ddf_french_div");
                                    ddf_french_div.remove();
                                }
                                Element glf_french = document.getElementById("glf_french");
                                if(null != orderPrivateCar.getRoadTollMoney() && orderPrivateCar.getRoadTollMoney() > 0){
                                    glf_french.text("GHS " + new BigDecimal(orderPrivateCar.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element glf_french_div = document.getElementById("glf_french_div");
                                    glf_french_div.remove();
                                }
                                Element tcf_french = document.getElementById("tcf_french");
                                if(null != orderPrivateCar.getParkMoney() && orderPrivateCar.getParkMoney() > 0){
                                    tcf_french.text("GHS " + new BigDecimal(orderPrivateCar.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element tcf_french_div = document.getElementById("tcf_french_div");
                                    tcf_french_div.remove();
                                }
                                if(null != orderPrivateCar.getCouponMoney() && orderPrivateCar.getCouponMoney() > 0){
                                    Element yhq_french = document.getElementById("yhq_french");
                                    yhq_french.text("GHS -" + orderPrivateCar.getCouponMoney());
                                    yhq_french.text("GHS -" + new BigDecimal(orderPrivateCar.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element yhq_french_div = document.getElementById("yhq_french_div");
                                    yhq_french_div.remove();
                                }
                                if(null != orderPrivateCar.getDiscountMoney() && orderPrivateCar.getDiscountMoney() > 0){
                                    Element zk_french = document.getElementById("zk_french");
                                    zk_french.text("GHS -" + orderPrivateCar.getDiscountMoney());
                                    zk_french.text("GHS -" + new BigDecimal(orderPrivateCar.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element zk_french_div = document.getElementById("zk_french_div");
                                    zk_french_div.remove();
                                }
                                if(null != orderPrivateCar.getRedPacketMoney() && orderPrivateCar.getRedPacketMoney() > 0){
                                    Element hb_french = document.getElementById("hb_french");
                                    hb_french.text("GHS -" + orderPrivateCar.getRedPacketMoney());
                                    hb_french.text("GHS -" + new BigDecimal(orderPrivateCar.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                                }else{
                                    Element hb_french_div = document.getElementById("hb_french_div");
                                    hb_french_div.remove();
                                }
                                Element xj_french = document.getElementById("xj_french");
                                xj_french.text("GHS " + orderPrivateCar.getPayMoney());
                                xj_french.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element pay_type_french = document.getElementById("pay_type_french");
                                pay_type_french.text(orderPrivateCar.getPayType() == 1 ? "Argent mobile" : "Carte bancaire");
                                pay_type_french.text(orderPrivateCar.getPayType() == 1 ? "Argent mobile" : (orderPrivateCar.getPayType() == 2?"Carte bancaire":(orderPrivateCar.getPayType() == 3?"Portefeuille I-GO":"En espèces")));
                                Element pay_money_french = document.getElementById("pay_money_french");
                                pay_money_french.text("GHS " + orderPrivateCar.getPayMoney());
                                pay_money_french.text("GHS " + new BigDecimal(orderPrivateCar.getPayMoney()).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                                Element dispute_french = document.getElementById("dispute_french");
                                if(null != orderPrivateCar.getIsDispute() && orderPrivateCar.getIsDispute() == 1){
                                    dispute_french.text("(Remarque: Il s’agit d’une commande contestée, et après des négociations entre trois parties, la plateforme l’a finalement tarifée à GHS " + new BigDecimal(orderPrivateCar.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                                }else{
                                    dispute_french.remove();
                                }
                                Element pdf_french = document.getElementById("pdf_french");
                                pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=1");
                                pdf_french.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=1");
                                Element lost_item_french = document.getElementById("lost_item_french");
                                lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=1");
                                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", "http://182.160.16.251:81/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");
                                for (int i = 0; i < driver_french.size(); i++) {
                                    Element element = driver_french.get(i);
                                    element.text(driver.getFirstName() + "." + driver.getLastName());
                                    element.text(" " + driver.getFirstName() + "." + driver.getLastName());
                                }
                                Element cp_french = document.getElementById("cp_french");
                                cp_french.text("Plaque: GS " + car.getCarLicensePlate());
                                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");
@@ -2198,14 +3177,14 @@
                                server_tel_french.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                            }
                            EmailUtil.send(userInfo.getEmail(), language == 1 ? "I-GO电子收据" : language == 2 ? "Receipt" : "Reçu",  document.html());
                            EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course",  document.html());
                            //开始生成pdf收据和html收据
                            File file = new File("/usr/local/nginx/html/files/html/");
                            File file = new File("/home/igotechgh/nginx/html/files/html/");
                            if(!file.exists()){
                                file.mkdirs();
                            }
                            file = new File("/usr/local/nginx/html/files/html/ride_receipt_" + id + ".html");
                            file = new File("/home/igotechgh/nginx/html/files/html/ride_receipt_" + id + ".html");
                            if(!file.exists()){
                                file.createNewFile();
                            }
@@ -2214,27 +3193,27 @@
                            fileWriter.flush();
                            fileWriter.close();
                            File file1 = new File("/usr/local/nginx/html/files/pdf/");
                            File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                            if(!file1.exists()){
                                file1.mkdirs();
                            }
                            file1 = new File("/usr/local/nginx/html/files/pdf/ride_receipt_" + id + ".pdf");
                            file1 = new File("/home/igotechgh/nginx/html/files/pdf/ride_receipt_" + id + ".pdf");
                            if(!file1.exists()){
                                file1.createNewFile();
                            }
                            try {
                                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                                HtmlToPdfUtils.convertToPdf("/usr/local/nginx/html/files/html/ride_receipt_" + id + ".html", "I-GO", fileOutputStream);
                                HtmlToPdfUtils.convertToPdf("/home/igotechgh/nginx/html/files/html/ride_receipt_" + id + ".html", "I-GO", fileOutputStream);
                            }catch (Exception e){
                                e.printStackTrace();
                                System.out.println("html转pdf异常");
                            }
                            String link ="http://182.160.16.251:81/files/html/ride_receipt_" + id + ".html";
                            String link ="https://igo.i-go.group/files/html/ride_receipt_" + id + ".html";
                            TEmail tEmail = new TEmail();
                            tEmail.setLink(link);
                            tEmail.setName(language == 1 ? "I-GO电子收据" : language == 2 ? "Receipt" : "Reçu");
                            tEmail.setName(language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de course");
                            tEmail.setUserId(userInfo.getId());
                            tEmail.setType(1);
                            tEmail.setOrderId(id);
@@ -2261,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();
@@ -2298,10 +3277,35 @@
                map.put("state", map.get("oldState"));
            }
            if(state == 8 || state == 9){
                map.put("receipt", "http://182.160.16.251:81/files/html/ride_receipt_" + orderId + ".html");
                map.put("receipt", "https://igo.i-go.group/files/html/ride_receipt_" + orderId + ".html");
            }else{
                map.put("receipt", "");
            }
            OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(orderId);
            Integer driverTimeOutTime = 0;
            Integer driverTimeOut = 0;
            CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", orderPrivateCar.getCompanyId()));
            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;
                }
            }
            map.put("driverTimeOutTime", driverTimeOutTime);
            map.put("driverTimeOut", driverTimeOut);
        }
        return maps;
    }
@@ -2312,7 +3316,7 @@
        endTime = dateUtil.getStartOrEndDate(endTime, "end");
        List<Map<String, Object>> list = orderPrivateCarMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid);
        for (Map<String, Object> map : list) {
            map.put("orderName", language == 1 ? "打车订单" : language == 2 ? "Ride" : "Course");
            map.put("orderName", language == 1 ? "打车" : language == 2 ? "Ride" : "Course");
            if(null != map.get("time")){
                String time = map.get("time").toString();
                map.put("time", DateUtil.conversionFormat(language, time));
@@ -2324,30 +3328,35 @@
    @Override
    public Map<String, Object> queryOrderInfo(Integer language, Integer orderId) throws Exception {
        Map<String, Object> map = orderPrivateCarMapper.queryOrderInfo(orderId);
        OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(orderId);
        if(null != map.get("travelTime")){
            String travelTime = map.get("travelTime").toString();
            map.put("travelTime", DateUtil.conversionFormat1(language, travelTime));
        }
        Integer state = Integer.valueOf(String.valueOf(map.get("state")));
        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
            OrderPrivateCar orderPrivateCar = this.selectById(orderId);
            orderPrivateCar.setReassignNotice(0);
            this.updateById(orderPrivateCar);
        }
        if(state == 11){
            map.put("state", map.get("oldState"));
        }
        if(state == 12){
            OrderCancel query = orderCancelService.query(orderId, 1, null, null, 1);
            map.put("cancelPayMoney", null == query ? 0 : query.getMoney());
            map.put("cancelMoney", null == query ? 0 : query.getMoney());
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) != 8 && Integer.valueOf(String.valueOf(map.get("state"))) != 9){
            map.put("redPacketMoney", null);
            map.put("couponMoney", null);
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) == 7){
            OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(orderId);
            UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(Integer.valueOf(String.valueOf(map.get("companyId"))));
            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())"));
                if(query2.getDistance()*1000>orderPrivateCar.getMileage() && query2.getOrderNum()>orderNum){
                    Double special = query2.getSpecial();
                    map.put("discount", special);
                    orderPrivateCar.setDiscount(special);
                    Double orderMoney = orderPrivateCar.getOrderMoney();
                    double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
@@ -2363,10 +3372,41 @@
        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
        map.put("orderType", 1);
        if(state == 8 || state == 9){
            map.put("receipt", "http://182.160.16.251:81/files/html/ride_receipt_" + orderId + ".html");
            map.put("receipt", "https://igo.i-go.group/files/html/ride_receipt_" + orderId + ".html");
        }else{
            map.put("receipt", "");
        }
        Integer companyId = 1;
        if(null != map.get("driverId")){
            companyId = Integer.valueOf(String.valueOf(map.get("companyId")));
        }
        Integer driverTimeOutTime = 0;
        Integer driverTimeOut = 0;
        CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", companyId));
        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;
                }
            }
        }
        map.put("driverTimeOutTime", driverTimeOutTime);
        map.put("driverTimeOut", driverTimeOut);
        map.put("isDispute", orderPrivateCar.getIsDispute());
        return map;
    }
@@ -2406,7 +3446,7 @@
                //读取文件(字符流)
                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
                //循环取出数据
                String str = null;
                String str;
                StringBuffer sb = new StringBuffer();
                while ((str = in.readLine()) != null) {
                    sb.append(str);
@@ -2421,10 +3461,11 @@
        String lnt = "0";
        String lat = "0";
        String tripId = redisUtil.getValue("trip" + uid);
        if(ToolUtil.isNotEmpty(value)){
            lnt = value.split(",")[0];
            lat = value.split(",")[1];
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(lat), Double.valueOf(lnt));
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(lat), Double.valueOf(lnt), tripId);
            if(null == distancematrix){
                System.err.println("查询距离出错了");
@@ -2452,7 +3493,7 @@
            orderServerWarpper.setLaveTime("0");
        }
        if(orderPrivateCar.getState() == 5 || orderPrivateCar.getState() == 6){//服务中
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(Double.valueOf(lat), Double.valueOf(lnt), orderPrivateCar.getEndLat(), orderPrivateCar.getEndLon());
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(Double.valueOf(lat), Double.valueOf(lnt), orderPrivateCar.getEndLat(), orderPrivateCar.getEndLon(), tripId);
            if(null == distancematrix){
                System.err.println("查询距离出错了");
            }else if(distancematrix.getDistance() == 0){
@@ -2495,7 +3536,7 @@
    public List<Map<String, Object>> queryRedEnvelope(Integer language, Integer uid) throws Exception {
        List<Map<String, Object>> list = orderPrivateCarMapper.queryRedEnvelope(uid);
        for (Map<String, Object> map : list) {
            map.put("name", language == 1 ? "打车订单" : language == 2 ? "Ride" : "Course");
            map.put("name", language == 1 ? "打车" : language == 2 ? "Ride" : "Course");
            if(null != map.get("time")){
                String time = map.get("time").toString();
                map.put("time", DateUtil.conversionFormat(language, time));
@@ -2533,4 +3574,44 @@
        }
        return endPushWarpper;
    }
    /**
     * 修改目的地
     * @param orderId
     * @param endLon
     * @param endLat
     * @param endAddress
     */
    @Override
    public void updateEndAddress(Integer orderId, String endLon, String endLat, String endAddress) {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if(null != orderPrivateCar.getDriverId()){
            orderPrivateCar.setDestination(endAddress);
            orderPrivateCar.setDestinationLat(endLat);
            orderPrivateCar.setDestinationLon(endLon);
            this.updateById(orderPrivateCar);
            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
            Integer language1 = driver.getLanguage();
            String audioUrl = "";
            switch (language1){
                case 1:
                    audioUrl = "https://igo.i-go.group/files/audio/system/ChangeAddress-CN.mp3";
                    break;
                case 2:
                    audioUrl = "https://igo.i-go.group/files/audio/system/ChangeAddress-EN.mp3";
                    break;
                case 3:
                    audioUrl = "https://igo.i-go.group/files/audio/system/ChangeAddress-FR.mp3";
                    break;
            }
            pushUtil.pushModifyAddress(2, orderPrivateCar.getDriverId(), orderId, 1, 1, audioUrl);
        }else{
            orderPrivateCar.setEndAddress(endAddress);
            orderPrivateCar.setEndLat(Double.valueOf(endLat));
            orderPrivateCar.setEndLon(Double.valueOf(endLon));
            this.updateById(orderPrivateCar);
        }
    }
}