puzhibing
2023-08-22 00caef45a8833dc58919e23eb88a3484cfacdaa4
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -10,6 +10,8 @@
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;
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
@@ -20,6 +22,9 @@
import com.stylefeng.guns.modular.system.util.GoogleMap.DistancematrixVo;
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;
import com.stylefeng.guns.modular.system.util.Tingg.model.CheckoutRequest;
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;
@@ -30,6 +35,11 @@
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
@@ -41,11 +51,11 @@
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -112,12 +122,6 @@
    @Autowired
    private IPaymentRecordService paymentRecordService;
    /*@Autowired
    private ICBCPayUtil icbcPayUtil;*/
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Autowired
    private ITransactionDetailsService transactionDetailsService;
@@ -143,19 +147,7 @@
    private RedisUtil redisUtil;
    @Autowired
    private GDFalconUtil gdFalconUtil;
    @Autowired
    private GDMapGeocodingUtil gdMapGeocodingUtil;
    @Autowired
    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
    @Autowired
    private IOrderPositionService orderPositionService;
    @Autowired
    private PushMinistryOfTransportUtil pushMinistryOfTransportUtil;
    @Autowired
    private IOrderCrossCityService orderCrossCityService;
@@ -163,8 +155,17 @@
    @Autowired
    private IAssignOrderService assignOrderService;
    @Resource
    private CarMapper carMapper;
    @Autowired
    private ALiSendSms aLiSendSms;
    private IOrderEvaluateService orderEvaluateService;
    @Autowired
    private IOrderLogisticsService orderLogisticsService;
    @Autowired
    private IBankCardService bankCardService;
    @Value("${filePath}")
@@ -178,8 +179,17 @@
    @Value("${callbackPath}")
    private String callbackPath;
    @Value("${pushMinistryOfTransport}")
    private boolean pushMinistryOfTransport;
    @Value("${spring.mail.template-path}")
    private String templatePath;
    @Autowired
    private ISettlementDetailService settlementDetailService;
    @Autowired
    private ISettlementRecordService settlementRecordService;
    @Autowired
    private ISettlementAllocationService settlementAllocationService;
@@ -202,7 +212,7 @@
     */
    @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) throws Exception {
                                          String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid, Integer language) throws Exception {
        //如果出行时间大于当前10分钟则默认为预约单
        if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
@@ -215,16 +225,16 @@
         */
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6,  11);
        if(orderPrivateCars.size() > 0){
            return ResultUtil.error("有未完成的订单");
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "There are outstanding orders" : "Il y a des commandes en attente");
        }
        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
        if(list.size() > 0){
            return ResultUtil.error("有未完成的订单");
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "There are outstanding orders" : "Il y a des commandes en attente");
        }
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6,  11);
        if(orderPrivateCars.size() > 0 && reservation == 2){
            return ResultUtil.error("有未完成的订单");
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "There are outstanding orders" : "Il y a des commandes en attente");
        }
        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 7,12);
@@ -238,7 +248,7 @@
        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
        if(list.size() > 0 && reservation == 2){
            return ResultUtil.error("有未完成的订单");
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "There are outstanding orders" : "Il y a des commandes en attente");
        }
        startAddress = startAddress.replaceAll("& #40;", "(");
@@ -246,7 +256,7 @@
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
            return ResultUtil.error("请选择服务车型");
            return ResultUtil.error(language == 1 ? "请选择服务车型" : language == 2 ? "Please select the service model" : "Veuillez sélectionner un modèle de service");
        }
        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
@@ -271,9 +281,9 @@
        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
            UserInfo userInfo = userInfoService.selectById(uid);
            if(ToolUtil.isEmpty(userInfo.getPhone())){
                return ResultUtil.error("请先绑定手机号码");
                return ResultUtil.error(language == 1 ? "请先绑定手机号码" : language == 2 ? "Please bind the mobile phone number first" : "Veuillez d’abord lier le numéro de téléphone mobile");
            }
            orderPrivateCar.setPassengers(userInfo.getName());
            orderPrivateCar.setPassengers(userInfo.getFirstName() + "." + userInfo.getLastName());
            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
        }
        orderPrivateCar.setState(1);
@@ -284,26 +294,35 @@
        if(orderSource == 2){//扫码下单
            Driver driver = driverService.selectById(driverId);
            if(null == driver){
                return ResultUtil.error("司机信息有误,无法完成下单");
                return ResultUtil.error(language == 1 ? "司机信息有误,无法完成下单" : language == 2 ? "Incorrect driver information, unable to complete the order" : "Les informations du conducteur sont incorrectes pour compléter la commande");
            }
            if(driver.getAuthState() == 1){
                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
                return ResultUtil.error(language == 1 ? "司机信息还未完成审核,无法完成下单" : language == 2 ? "The driver information has not been reviewed, and the order cannot be completed" : "Les informations du conducteur n’ont pas été vérifiées et la commande n’a pas pu être finalisée");
            }
            if(driver.getAuthState() == 3){
                return ResultUtil.error("司机账户已被冻结,无法提供服务");
                return ResultUtil.error(language == 1 ? "司机账户已被冻结,无法提供服务" : language == 2 ? "The driver's account has been frozen, unable to provide service" : "Le compte du conducteur a été bloqué et le service n’est pas disponible");
            }
            if(driver.getAuthState() == 4){
                return ResultUtil.error("司机信息未通过审核,无法提供服务");
                return ResultUtil.error(language == 1 ? "司机信息未通过审核,无法提供服务" : language == 2 ? "Driver information has not passed the audit, unable to provide service" : "Les informations du conducteur n’ont pas été vérifiées et le service n’a pas pu être fourni");
            }
            if(driver.getState() == 1){
                return ResultUtil.error("司机还未上线,无法提供服务");
                return ResultUtil.error(language == 1 ? "司机还未上线,无法提供服务" : language == 2 ? "The driver is not online and cannot provide service" : "Le chauffeur n’est pas en ligne et n’est pas en mesure d’offrir ses services");
            }
            if(driver.getState() == 3){
                return ResultUtil.error("司机正在服务中,无法提供服务");
                return ResultUtil.error(language == 1 ? "司机正在服务中,无法提供服务" : language == 2 ? "The driver is in service and cannot provide service" : "Le chauffeur est en service et le service n’est pas disponible");
            }
            List<DriverService> query = driverServiceService.query(driverId, 1);
            if(query.size() == 0){
                return ResultUtil.error("该司机不能服务此业务");
                return ResultUtil.error(language == 1 ? "该司机不能服务此业务" : language == 2 ? "The driver cannot serve this service" : "Ce conducteur ne peut pas servir cette entreprise");
            }
            int count = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("driverId", driverId).eq("driverPay", 1).in("state", Arrays.asList(7, 8, 9)).eq("isDelete", 1));
            if(count > 0){
                return ResultUtil.error("司机未支付订单费用,无法进行接单");
            }
            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("司机未支付订单费用,无法进行接单");
            }
            orderPrivateCar.setDriverId(driverId);
@@ -314,20 +333,6 @@
            CarService query1 = carServiceMapper.query(1, driver.getCarId());
            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
            orderPrivateCar.setSnatchOrderTime(new Date());
            //调用高德创建轨迹
//            String s = gdFalconUtil.selectTerminal(driver.getPhone());
//            String track = gdFalconUtil.createTrack(s);
//            orderPrivateCar.setTrackId(track);
            //调用移动的小号接口
           /* Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            Region region = regionMapper.query(geocode1.get("districtCode"));*/
//            Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), null);
//            if(String.valueOf(map.get("code")).equals("200")){
//                orderPrivateCar.setTelX(map.get("telX"));
//                orderPrivateCar.setBindId(map.get("bindId"));
//            }
            driver.setState(3);
            driverService.updateById(driver);
@@ -351,12 +356,12 @@
        // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
        if(orderPrivateCar.getState() == 1){
            Company query = companyCityService.query(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            Company query = companyCityService.query1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
            if(null == query){
                return ResultUtil.error("起点暂未企业提供服务");
                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){//配置了指派规则才处理
            if(null != assignOrder && assignOrder.getPeople() > 0){//配置了指派规则才处理
                //获取空闲司机
                List<Driver> drivers = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), assignOrder.getDistance(), null);//获取范围内空闲司机
                if(drivers.size() > 0){//有司机,直接指派给司机
@@ -411,20 +416,6 @@
                    orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
                    orderPrivateCar.setSnatchOrderTime(new Date());
                    //调用高德创建轨迹
//                    String s = gdFalconUtil.selectTerminal(dr.getPhone());
//                    String track = gdFalconUtil.createTrack(s);
//                    orderPrivateCar.setTrackId(track);
                    //调用移动的小号接口
               /* Map<String, String> geocode1 = gdMapGeocodingUtil.geocode(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
                Region region = regionMapper.query(geocode1.get("districtCode"));*/
//                    Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), dr.getPhone(), null);
//                    if(String.valueOf(map.get("code")).equals("200")){
//                        orderPrivateCar.setTelX(map.get("telX"));
//                        orderPrivateCar.setBindId(map.get("bindId"));
//                    }
                    dr.setState(3);
                    driverService.updateById(dr);
                    this.updateById(orderPrivateCar);
@@ -449,7 +440,9 @@
        //添加消息
        systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
        systemNoticeService.addSystemNotice(1, language == 1 ? "您的打车订单已下单成功,我们正在为您指派司机,请稍后!" :
                language == 2 ? "Your ride order has been successfully placed, we are assigning a driver for you, please wait!" :
                        "Votre commande a bien été passée, nous vous assignons un chauffeur, veuillez patienter!", orderPrivateCar.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setState(orderPrivateCar.getState());
@@ -515,8 +508,8 @@
        }
        double amount = 0;
        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
        if(null != orderPrivateCar.getDriverId() && orderPrivateCar.getArriveTime()!=null &&
                (orderPrivateCar.getArriveTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
        if(null != orderPrivateCar.getDriverId() && orderPrivateCar.getSnatchOrderTime()!=null &&
                (orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
            if(null != query){
                amount += query.getMoney();
            }
@@ -599,16 +592,6 @@
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(pushMinistryOfTransport){
                    //上传数据
                    pushMinistryOfTransportUtil.orderCancel(orderPrivateCar.getId());
                }
            }
        }).start();
        //添加消息
        systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功取消出行订单,谢谢使用!" : language == 2 ? "You have successfully canceled the travel order, thank you for using" : "Vous avez annulé avec succès la commande de voyage, merci d'utiliser", orderPrivateCar.getUserId(), 1);
        Map<String, Object> map = new HashMap<>();
@@ -624,17 +607,17 @@
     * @throws Exception
     */
    @Override
    public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
    public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer bankCardId, Integer cancleId, Integer type, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(id);
        Integer uid = orderPrivateCar.getUserId();
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success("");
        if(null == orderPrivateCar){
            return ResultUtil.error("取消订单失败,订单信息有误", "");
            return ResultUtil.error(language == 1 ? "取消订单失败,订单信息有误" : language == 2 ? "Order cancellation failed because the order information is incorrect" : "Annulation échouée, informations de commande incorrectes", "");
        }
        if(orderPrivateCar.getState() != 12){
            return ResultUtil.error("取消订单失败,不合法的操作", "");
            return ResultUtil.error(language == 1 ? "取消订单失败,不合法的操作" : language == 2 ? "Order cancellation failed, illegal operation" : "Annulation de la commande échouée, opération illégale", "");
        }
        OrderCancel orderCancel = null;
        if(null == cancleId || cancleId==0){
@@ -645,33 +628,58 @@
        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
        if(null != query){
            if(payType == 1){//微信支付
            if(payType == 1){//手机支付
                orderCancel.setPayType(1);
                orderCancelService.updateById(orderCancel);
                resultUtil =  payMoneyUtil.weixinpay("订单取消",id +"",id + "_1_fei",query.getMoney()+"","/base/wxCancelOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
                //Map<String, String> map = icbcPayUtil.placeAnOrder(id + ",1", 9, 5, uid.toString(), "订单取消", query.getMoney(), callbackPath + "/base/wxCancelOrderTaxi", "", type, userInfo.getAppletsOpenId());
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                String merchantTransactionId = sdf.format(new Date()) + "1" + language + id;
                CheckoutRequest checkoutRequest = new CheckoutRequest();
                checkoutRequest.setMsisdn(Long.valueOf(userInfo.getPhone()));
                checkoutRequest.setCustomerEmail(userInfo.getEmail());
                checkoutRequest.setAccountNumber(userInfo.getPhone());
                checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
                checkoutRequest.setCustomerLastName(userInfo.getLastName());
                checkoutRequest.setRequestAmount(query.getMoney());
                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");
                resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
                if(resultUtil.getCode()==200){
                    paymentRecordService.saveData(1, null, null, id, 1, 1, query.getMoney(), null, 1);//添加预支付数据
                    resultUtil = resultUtil;
                }else{
                    resultUtil = ResultUtil.error("支付失败", "");
                }
            }
            if(payType == 2){//支付宝支付
            if(payType == 2){//银行卡支付
                orderCancel.setPayType(2);
                orderCancelService.updateById(orderCancel);
                resultUtil =  payMoneyUtil.alipay("订单取消","订单取消",id + "_1_fei",query.getMoney()+"","/base/aliCancelOrderTaxi");
                BankCard bankCard = bankCardService.selectById(bankCardId);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                String merchantTransactionId = sdf.format(new Date()) + "1" + id;
                CheckoutRequest checkoutRequest = new CheckoutRequest();
                checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
                checkoutRequest.setCustomerEmail(userInfo.getEmail());
                checkoutRequest.setAccountNumber(bankCard.getCode());
                checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
                checkoutRequest.setCustomerLastName(bankCard.getLastName());
                checkoutRequest.setRequestAmount(query.getMoney());
                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");
                resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
                if(resultUtil.getCode()==200){
                    paymentRecordService.saveData(1, null, null, id, 1, 2, query.getMoney(), null, 1);//添加预支付数据
                    resultUtil = resultUtil;
                }else{
                    resultUtil = ResultUtil.error("支付失败", "");
                }
            }
            if(payType == 3){//余额支付
                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
                    return ResultUtil.error("余额不足,无法完成支付", "");
                    return ResultUtil.error((language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant"), "");
                }
                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
@@ -708,15 +716,10 @@
                this.deleteTask(id);//删除定时任务
//                new Thread(new Runnable() {
//                    @Override
//                    public void run() {
//                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
//                    }
//                }).start();
                //添加消息
                systemNoticeService.addSystemNotice(1, "您已使用余额成功支付取消订单费用,谢谢使用!", orderPrivateCar.getUserId(), 1);
                systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
                        ? "You have successfully paid the cancellation fee, thank you for using!"
                        : "Vous avez payé avec succès les frais d’annulation de commande, merci d’utiliser!", orderPrivateCar.getUserId(), 1);
            }
        }
        return resultUtil;
@@ -739,7 +742,7 @@
                    if(ToolUtil.isNotEmpty(vehicle)){
                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
                    }
                    Company query = companyCityService.query(String.valueOf(orderPrivateCar.getStartLon()), String.valueOf(orderPrivateCar.getStartLat()));//获取起点所属分公司
                    Company query = companyCityService.query1(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);
@@ -769,8 +772,11 @@
                            break;
                        }
                        if(i == querys.size() && state == 1){
                            pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
                            orderIds.remove(orderPrivateCar.getId());
                            OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderPrivateCar.getId());
                            if(orderPrivateCar1.getState() == 1){
                                pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1);
                                orderIds.remove(orderPrivateCar.getId());
                            }
                        }
                    }
                } catch (Exception e) {
@@ -829,19 +835,22 @@
        return list;
    }
    @Override
    public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
    public ResultUtil payPrivateCarOrder(Integer payType, Integer bankCardId, Integer orderId, Integer couponId, Integer type, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
            return ResultUtil.error("订单已完成支付,不允许重复支付", "");
            return ResultUtil.error(language == 1 ? "订单已完成支付,不允许重复支付" : language == 2 ? "The order has been paid, no double payment is allowed" : "La commande a été payée, aucun paiement en double n’est autorisé", "");
        }
        if(orderPrivateCar.getState() != 7){
            return ResultUtil.error("订单不在待支付状态,不允许支付", "");
            return ResultUtil.error(language == 1 ? "订单不在待支付状态,不允许支付" : language == 2 ? "The order is not pending payment and cannot be paid" : "La commande n’est pas en attente de paiement et ne permet pas le paiement", "");
        }
        Integer uid = orderPrivateCar.getUserId();
        Double orderMoney = orderPrivateCar.getOrderMoney();
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success(new HashMap<>());
        ResultUtil resultUtil = ResultUtil.success("");
        orderPrivateCar.setCouponMoney(0D);//初始化历史数据
        orderPrivateCar.setCouponId(null);
@@ -850,19 +859,19 @@
        if(null != couponId){
            userCouponRecord = userCouponRecordService.selectById(couponId);
            if(userCouponRecord.getCompanyId() != orderPrivateCar.getCompanyId()){
                return ResultUtil.error("优惠券不能用于此订单", "");
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupons cannot be used for this order" : "Le coupon ne peut pas être utilisé pour cette commande", "");
            }
            if(userCouponRecord.getState() == 2){
                return ResultUtil.error("优惠券已使用", "");
                return ResultUtil.error(language == 1 ? "优惠券已使用" : language == 2 ? "Coupon used" : "Coupon a été utilisé", "");
            }
            if(userCouponRecord.getState() == 3){
                return ResultUtil.error("优惠券已过期", "");
                return ResultUtil.error(language == 1 ? "优惠券已过期" : language == 2 ? "Coupon has expired" : "Le coupon a expiré", "");
            }
            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 1){
                return ResultUtil.error("优惠券不能用于此类型订单", "");
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupons 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){
                return ResultUtil.error("优惠券不能用于此订单", "");
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupons cannot be used for this order" : "Le coupon ne peut pas être utilisé pour cette commande", "");
            }
            orderMoney = orderMoney - userCouponRecord.getMoney();
            orderPrivateCar.setCouponMoney(userCouponRecord.getMoney());
@@ -895,30 +904,58 @@
        }
        if(payType == 1){//手机支付
            //Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 9, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "", type, userInfo.getAppletsOpenId());
            resultUtil =  payMoneyUtil.weixinpay("完成订单",orderId +"",orderId + "_1_fei",orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "1" + language + orderId;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(userInfo.getPhone()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(userInfo.getPhone());
            checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
            checkoutRequest.setCustomerLastName(userInfo.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            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");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 1, 1, orderMoney, null, 1);//添加预支付数据
                resultUtil = resultUtil;
            }else{
                resultUtil = ResultUtil.error("支付失败", "");
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
        }
        if(payType == 2) {//银行卡支付
            resultUtil =  payMoneyUtil.alipay("完成订单","完成订单",orderId + "_1_fei",orderMoney+"","/base/aliPayOrderTaxi");
            //Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + ",1", 10, 5, uid.toString(), "完成订单", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
            if (resultUtil.getCode()==200) {
        if(payType == 2){//银行卡支付
            BankCard bankCard = bankCardService.selectById(bankCardId);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "1" + language + orderId;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(bankCard.getCode());
            checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
            checkoutRequest.setCustomerLastName(bankCard.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            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");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 1, 2, orderMoney, null, 1);//添加预支付数据
                resultUtil = resultUtil;
            } else {
                resultUtil = ResultUtil.error("支付失败", "");
            }else{
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error("余额不足,无法完成支付", "");
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant", "");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
@@ -958,7 +995,7 @@
                }
                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))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                    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());
@@ -970,6 +1007,171 @@
                driverService.updateById(driver);
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath +  "user/receipt.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
                Car car = carMapper.selectById(orderPrivateCar.getCarId());
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                Double aDouble = 0D;
                if(null != orderPrivateCar.getDriverId()){
                    aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                }
                Double aDouble1 = Double.valueOf(orderPrivateCar.getMileage() / 1000);
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(sdf.format(orderPrivateCar.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderPrivateCar.getPayMoney());
                    Element xcf_chinese = document.getElementById("xcf_chinese");
                    xcf_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                    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());
                    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");
                    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");
                    Element track_chinese = document.getElementById("track_chinese");
                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + orderId);
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(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 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() + "分钟");
                    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");
                    start_address_chinese.text(orderPrivateCar.getStartAddress());
                    Element end_time_chinese = document.getElementById("end_time_chinese");
                    end_time_chinese.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderPrivateCar.getEndAddress());
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    Element title_english = document.getElementById("title_english");
                    title_english.text(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());
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element pay_type_english = document.getElementById("pay_type_english");
                    pay_type_english.text("balance");
                    Element pay_money_english = document.getElementById("pay_money_english");
                    pay_money_english.text("GHS " + orderPrivateCar.getPayMoney());
                    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");
                    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");
                    Element track_english = document.getElementById("track_english");
                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + orderId);
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(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 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");
                    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");
                    start_address_english.text(orderPrivateCar.getStartAddress());
                    Element end_time_english = document.getElementById("end_time_english");
                    end_time_english.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderPrivateCar.getEndAddress());
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    Element title_french = document.getElementById("title_french");
                    title_french.text("Vous consommez GHS " + orderPrivateCar.getPayMoney() + " sur votre commande i-go1 le " + sdf.format(orderPrivateCar.getTravelTime()));
                    Element xcf_french = document.getElementById("xcf_french");
                    xcf_french.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element pay_type_french = document.getElementById("pay_type_french");
                    pay_type_french.text("Le solde");
                    Element pay_money_french = document.getElementById("pay_money_french");
                    pay_money_french.text("GHS " + orderPrivateCar.getPayMoney());
                    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");
                    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");
                    Element track_french = document.getElementById("track_french");
                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + orderId);
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(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 cp_french = document.getElementById("cp_french");
                    cp_french.text("Plaque d’immatriculation:" + car.getCarLicensePlate());
                    Element pf_french = document.getElementById("pf_french");
                    pf_french.text("Évaluation des pilotes: " + aDouble);
                    Element lc_french = document.getElementById("lc_french");
                    lc_french.text("Kilométrage: " + aDouble1 + "km / " + orderPrivateCar.getDuration() + "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");
                    start_address_french.text(orderPrivateCar.getStartAddress());
                    Element end_time_french = document.getElementById("end_time_french");
                    end_time_french.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderPrivateCar.getEndAddress());
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de Ride",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/usr/local/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/usr/local/nginx/html/files/html/ride_receipt_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                FileInputStream fileInputStream = new FileInputStream(file);
                File file1 = new File("/usr/local/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/usr/local/nginx/html/files/pdf/ride_receipt_" + orderId + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
@@ -980,7 +1182,9 @@
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成出行订单支付,谢谢使用!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成出行订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the travel order payment, thank you for using!"
                    : "Vous avez complété avec succès le paiement de votre commande de voyage. Merci d’utiliser!", orderPrivateCar.getUserId(), 1);
        }
@@ -994,7 +1198,7 @@
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(4);
            orderPrivateCar.setDriverPay(1);
            orderPrivateCar.setDriverPay(2);
            orderPrivateCar.setPayMoney(orderMoney);
            orderPrivateCar.setOrderMoney(orderPrivateCar.getOrderMoney()+orderPrivateCar.getFreeMoney().doubleValue());
@@ -1021,17 +1225,222 @@
                }
                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))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                    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());
//                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);
//                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')"));
                        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);
                            for (SettlementDetail detail : settlementDetailList) {
                                detail.setSettlementRecordId(settlementRecord.getId());
                                settlementDetailService.updateById(detail);
                            }
                        }
                    }
                }
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath +  "user/receipt.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
                Car car = carMapper.selectById(orderPrivateCar.getCarId());
                Double aDouble = 0D;
                if(null != orderPrivateCar.getDriverId()){
                    aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                }
                Double aDouble1 = Double.valueOf(orderPrivateCar.getMileage() / 1000);
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(sdf.format(orderPrivateCar.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderPrivateCar.getPayMoney());
                    Element xcf_chinese = document.getElementById("xcf_chinese");
                    xcf_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                    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());
                    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");
                    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");
                    Element track_chinese = document.getElementById("track_chinese");
                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + orderId);
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(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 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() + "分钟");
                    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");
                    start_address_chinese.text(orderPrivateCar.getStartAddress());
                    Element end_time_chinese = document.getElementById("end_time_chinese");
                    end_time_chinese.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderPrivateCar.getEndAddress());
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    Element title_english = document.getElementById("title_english");
                    title_english.text(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());
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + orderPrivateCar.getOrderMoney());
                    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());
                    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");
                    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");
                    Element track_english = document.getElementById("track_english");
                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + orderId);
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(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 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");
                    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");
                    start_address_english.text(orderPrivateCar.getStartAddress());
                    Element end_time_english = document.getElementById("end_time_english");
                    end_time_english.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderPrivateCar.getEndAddress());
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    Element title_french = document.getElementById("title_french");
                    title_french.text("Vous consommez GHS " + orderPrivateCar.getPayMoney() + " sur votre commande i-go1 le " + sdf.format(orderPrivateCar.getTravelTime()));
                    Element xcf_french = document.getElementById("xcf_french");
                    xcf_french.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element pay_type_french = document.getElementById("pay_type_french");
                    pay_type_french.text("espèces");
                    Element pay_money_french = document.getElementById("pay_money_french");
                    pay_money_french.text("GHS " + orderPrivateCar.getPayMoney());
                    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");
                    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");
                    Element track_french = document.getElementById("track_french");
                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + orderId);
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(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 cp_french = document.getElementById("cp_french");
                    cp_french.text("Plaque d’immatriculation:" + car.getCarLicensePlate());
                    Element pf_french = document.getElementById("pf_french");
                    pf_french.text("Évaluation des pilotes: " + aDouble);
                    Element lc_french = document.getElementById("lc_french");
                    lc_french.text("Kilométrage: " + aDouble1 + "km / " + orderPrivateCar.getDuration() + "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");
                    start_address_french.text(orderPrivateCar.getStartAddress());
                    Element end_time_french = document.getElementById("end_time_french");
                    end_time_french.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderPrivateCar.getEndAddress());
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de Ride",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/usr/local/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/usr/local/nginx/html/files/html/ride_receipt_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                FileInputStream fileInputStream = new FileInputStream(file);
                File file1 = new File("/usr/local/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/usr/local/nginx/html/files/pdf/ride_receipt_" + orderId + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
@@ -1040,22 +1449,16 @@
                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);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用现金成功完成出行订单支付,谢谢使用!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成出行订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the travel order payment, thank you for using!"
                    : "Vous avez complété avec succès le paiement de votre commande de voyage. Merci d’utiliser!", orderPrivateCar.getUserId(), 1);
        }
        this.updateAllColumnById(orderPrivateCar);
        new Thread(new Runnable() {
            @Override
            public void run() {
                if(pushMinistryOfTransport){//上传数据
                    pushMinistryOfTransportUtil.operatePay(orderId);
                }
            }
        }).start();
        return resultUtil;
    }
@@ -1109,7 +1512,7 @@
    }
    @Override
    public synchronized ResultUtil shareRedEnvelope(Integer orderId) throws Exception {
    public synchronized ResultUtil shareRedEnvelope(Integer orderId, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        UserRedPacketRecord query = userRedPacketRecordService.query_(orderPrivateCar.getUserId(), orderPrivateCar.getCompanyId(), 0, 1, null);
        if(null != query){
@@ -1133,6 +1536,40 @@
            query.setState(1);
            query.setRedPacketActivityId(id.getId());
            userRedPacketRecordService.updateById(query);
            UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath +  "user/redEnvelopes.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    Element user_chinese = document.getElementById("user_chinese");
                    user_chinese.text("您好 " + userInfo.getNickName() + ",");
                    Element time_chinese = document.getElementById("time_chinese");
                    time_chinese.text("此活动有效期在" + sdf.format(query.getInsertTime()) + "至" + sdf.format(query.getEndTime()) + ",详情请查看I-GO平台");
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    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" + sdf.format(query.getInsertTime()) + "to" + sdf.format(query.getEndTime()) + ",check more details on the app.");
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    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" + sdf.format(query.getInsertTime()) + "au" + sdf.format(query.getEndTime()) + ". Veuillez consulter la plateforme i-go pour plus de détails.");
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "红包活动" : language == 2 ? "Red envelope activity" : "Activité de l’enveloppe rouge",  document.html());
            }
        }
        return ResultUtil.success();
    }
@@ -1142,13 +1579,12 @@
     * 取消订单支付后的处理
     * @param id            订单=id
     * @param order_id      工行支付单号
     * @param type          1=微信,2=支付宝
     * @throws Exception
     */
    @Override
    public void payCancelOrderPrivateCar(Integer id, String order_id, Integer type) throws Exception {
    public void payCancelOrderPrivateCar(Integer id, String order_id, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, 1);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, null, 1);
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
@@ -1194,21 +1630,23 @@
//            }).start();
            //添加消息
            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功支付取消订单费用,谢谢使用!", orderPrivateCar.getUserId(), 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
                    ? "You have successfully paid the cancellation fee, thank you for using!"
                    : "Vous avez payé avec succès les frais d’annulation de commande, merci d’utiliser!", orderPrivateCar.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
    }
    @Override
    public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
    public void payOrderPrivateCarCallback(Integer id, String order_id, Integer language) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, 1);
        PaymentRecord query = paymentRecordService.query(1, null, null, id, 1, null, 1);
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
            orderPrivateCar.setState(8);
            orderPrivateCar.setPayType(type);
            orderPrivateCar.setPayType(query.getPayType());
            orderPrivateCar.setOrderMoney(orderPrivateCar.getOrderMoney()+orderPrivateCar.getFreeMoney().doubleValue());
            orderPrivateCar.setPayMoney(query.getAmount());
            this.updateById(orderPrivateCar);
@@ -1248,7 +1686,7 @@
                }
                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))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                    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());
@@ -1259,6 +1697,174 @@
                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())){
                String path = templatePath +  "user/receipt.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
                Car car = carMapper.selectById(orderPrivateCar.getCarId());
                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
                Double aDouble = 0D;
                if(null != orderPrivateCar.getDriverId()){
                    aDouble = orderEvaluateService.queryDriverScore(orderPrivateCar.getDriverId());
                }
                Double aDouble1 = Double.valueOf(orderPrivateCar.getMileage() / 1000);
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(sdf.format(orderPrivateCar.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderPrivateCar.getPayMoney());
                    Element xcf_chinese = document.getElementById("xcf_chinese");
                    xcf_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element pay_type_chinese = document.getElementById("pay_type_chinese");
                    pay_type_chinese.text(orderPrivateCar.getPayType() == 1 ? "手机" : "银行卡");
                    Element pay_money_chinese = document.getElementById("pay_money_chinese");
                    pay_money_chinese.text("GHS " + orderPrivateCar.getPayMoney());
                    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");
                    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");
                    Element track_chinese = document.getElementById("track_chinese");
                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + id);
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(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 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() + "分钟");
                    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");
                    start_address_chinese.text(orderPrivateCar.getStartAddress());
                    Element end_time_chinese = document.getElementById("end_time_chinese");
                    end_time_chinese.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderPrivateCar.getEndAddress());
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    Element title_english = document.getElementById("title_english");
                    title_english.text(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());
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element pay_type_english = document.getElementById("pay_type_english");
                    pay_type_english.text(orderPrivateCar.getPayType() == 1 ? "Mobile" : "Bank card");
                    Element pay_money_english = document.getElementById("pay_money_english");
                    pay_money_english.text("GHS " + orderPrivateCar.getPayMoney());
                    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");
                    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");
                    Element track_english = document.getElementById("track_english");
                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + id);
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(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 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");
                    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");
                    start_address_english.text(orderPrivateCar.getStartAddress());
                    Element end_time_english = document.getElementById("end_time_english");
                    end_time_english.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderPrivateCar.getEndAddress());
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    Element title_french = document.getElementById("title_french");
                    title_french.text("Vous consommez GHS " + orderPrivateCar.getPayMoney() + " sur votre commande i-go1 le " + sdf.format(orderPrivateCar.getTravelTime()));
                    Element xcf_french = document.getElementById("xcf_french");
                    xcf_french.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + orderPrivateCar.getOrderMoney());
                    Element pay_type_french = document.getElementById("pay_type_french");
                    pay_type_french.text(orderPrivateCar.getPayType() == 1 ? "Mobile" : "Carte bancaire");
                    Element pay_money_french = document.getElementById("pay_money_french");
                    pay_money_french.text("GHS " + orderPrivateCar.getPayMoney());
                    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");
                    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");
                    Element track_french = document.getElementById("track_french");
                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html?orderId=" + id);
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(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 cp_french = document.getElementById("cp_french");
                    cp_french.text("Plaque d’immatriculation:" + car.getCarLicensePlate());
                    Element pf_french = document.getElementById("pf_french");
                    pf_french.text("Évaluation des pilotes: " + aDouble);
                    Element lc_french = document.getElementById("lc_french");
                    lc_french.text("Kilométrage: " + aDouble1 + "km / " + orderPrivateCar.getDuration() + "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");
                    start_address_french.text(orderPrivateCar.getStartAddress());
                    Element end_time_french = document.getElementById("end_time_french");
                    end_time_french.text(sdf2.format(orderPrivateCar.getEndServiceTime()));
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderPrivateCar.getEndAddress());
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "打车收据" : language == 2 ? "Ride receipt" : "Reçu de Ride",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/usr/local/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/usr/local/nginx/html/files/html/ride_receipt_" + id + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                FileInputStream fileInputStream = new FileInputStream(file);
                File file1 = new File("/usr/local/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/usr/local/nginx/html/files/pdf/ride_receipt_" + id + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
@@ -1268,8 +1874,9 @@
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成出行订单支付,谢谢使用!", orderPrivateCar.getUserId(), 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成出行订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the travel order payment, thank you for using!"
                    : "Vous avez complété avec succès le paiement de votre commande de voyage. Merci d’utiliser!", orderPrivateCar.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
@@ -1285,8 +1892,15 @@
        pageNum = (pageNum - 1) * size;
        List<Map<String, Object>> maps = orderPrivateCarMapper.queryMyOrderList(uid, pageNum, size);
        for(Map<String, Object> map : maps){
            if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
            Integer orderId = Integer.valueOf(String.valueOf(map.get("orderId")));
            Integer state = Integer.valueOf(String.valueOf(map.get("state")));
            if(state == 11){
                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");
            }else{
                map.put("receipt", "");
            }
        }
        return maps;
@@ -1302,12 +1916,13 @@
    @Override
    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
        Map<String, Object> map = orderPrivateCarMapper.queryOrderInfo(orderId);
        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(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
        if(state == 11){
            map.put("state", map.get("oldState"));
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) != 8 && Integer.valueOf(String.valueOf(map.get("state"))) != 9){
@@ -1335,6 +1950,11 @@
        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
        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");
        }else{
            map.put("receipt", "");
        }
        return map;
    }
@@ -1356,28 +1976,47 @@
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        //计算预计距离和剩余时间
        String value = redisUtil.getValue("DRIVER" + String.valueOf(orderPrivateCar.getDriverId()));
        String d = "0";
        String t = "0";
        if(null == value || "".equals(value)){
            System.err.println("司机没有上传位置信息");
            //调用获取轨迹中的数据
            List<Map<String, Object>> list = orderPositionService.queryTrack(orderId, 2);
            if(list.size() > 0){
                Map<String, Object> map = list.get(list.size() - 1);
                value = map.get("lon") + "," + map.get("lat");
            File file = new File(filePath + orderId + "_1.txt");
            if(file.exists()){
                //读取文件(字符流)
                BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
                //循环取出数据
                String str = null;
                StringBuffer sb = new StringBuffer();
                while ((str = in.readLine()) != null) {
                    sb.append(str);
                }
                List<OrderPosition> list = JSONArray.parseArray(sb.toString(), OrderPosition.class);
                if(list.size() > 0){
                    OrderPosition orderPosition = list.get(list.size() - 1);
                    value = orderPosition.getLon() + "," + orderPosition.getLat();
                }
            }
        }
        String lnt = "0";
        String lat = "0";
        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));
            if(null == distancematrix){
                System.err.println("查询距离出错了");
            }else if(distancematrix.getDistance() == 0){
                System.err.println("未获取到有效的距离");
            }else{
                d = new BigDecimal(distancematrix.getDistance()).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
                t = new BigDecimal(distancematrix.getDuration()).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
            }
        }
        String lnt = (null != value ? value.split(",")[0] : "0.0");
        String lat = (null != value ? value.split(",")[0] : "0.0");
        DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(lat), Double.valueOf(lnt));
        String d = "0";
        String t = "0";
        if(null == distancematrix){
            System.err.println("查询距离出错了");
        }else{
            d = new BigDecimal(distancematrix.getDistance()).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
            t = new BigDecimal(distancematrix.getDuration()).divide(new BigDecimal(60)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
        }
        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
        orderServerWarpper.setOrderId(orderPrivateCar.getId());
        orderServerWarpper.setOrderType(1);
@@ -1394,12 +2033,14 @@
            orderServerWarpper.setLaveTime("0");
        }
        if(orderPrivateCar.getState() == 5 || orderPrivateCar.getState() == 6){//服务中
            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());
            if(null == distancematrix){
                System.err.println("查询距离出错了");
            }else if(distancematrix.getDistance() == 0){
                System.err.println("未获取到有效的距离");
            }else{
                d = new BigDecimal(distancematrix.getDistance()).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_EVEN).toString();
                t = new BigDecimal(distancematrix.getDuration()).divide(new BigDecimal(60)).setScale(2, BigDecimal.ROUND_HALF_EVEN).intValue() + "";
                d = new BigDecimal(distancematrix.getDistance()).divide(new BigDecimal(1000), new MathContext(2, RoundingMode.HALF_EVEN)).toString();
                t = new BigDecimal(distancematrix.getDuration()).divide(new BigDecimal(60), new MathContext(2, RoundingMode.HALF_EVEN)).intValue() + "";
            }
            orderServerWarpper.setReservationMileage("0");
            orderServerWarpper.setReservationTime("0");