Pu Zhibing
2024-10-10 19d2b6427ebed89895b402d5e61ab78f4687b550
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -1,16 +1,22 @@
package com.stylefeng.guns.modular.smallLogistics.server.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
import com.stylefeng.guns.modular.crossCity.server.impl.OrderCrossCityServiceImpl;
import com.stylefeng.guns.modular.smallLogistics.dao.OrderLogisticsMapper;
import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
import com.stylefeng.guns.modular.smallLogistics.model.OrderLogisticsSpread;
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsSpreadService;
import com.stylefeng.guns.modular.specialTrain.dao.OrderPrivateCarMapper;
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
import com.stylefeng.guns.modular.specialTrain.server.impl.OrderPrivateCarServiceImpl;
import com.stylefeng.guns.modular.system.dao.*;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
@@ -22,19 +28,32 @@
import com.stylefeng.guns.modular.system.util.Tingg.model.CheckoutRequest;
import com.stylefeng.guns.modular.system.util.Tingg.model.PayoutResponse;
import com.stylefeng.guns.modular.system.util.Tingg.model.Results;
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.OrderServerWarpper;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.model.PaymentRecord;
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;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.io.File;
import java.io.*;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
@@ -77,7 +96,8 @@
    @Autowired
    private IUserInfoService userInfoService;
    @Resource
    private UserActivityDiscount1Mapper userActivityDiscount1Mapper;
    @Autowired
    private IPaymentRecordService paymentRecordService;
@@ -126,7 +146,74 @@
    @Value("${spring.mail.template-path}")
    private String templatePath;
    @Autowired
    private TEmailService emailService;
    private static List<Integer> orderIds = new ArrayList<>();
    @Autowired
    private IPhoneService phoneService;
    @Autowired
    private ICancleOrderService cancleOrderService;
    @Autowired
    private RestTemplate internalRestTemplate;
    @Autowired
    private IRedEnvelopePaymentSettingsService redEnvelopePaymentSettingsService;
    @Autowired
    private IUserRedPacketRecordService userRedPacketRecordService;
    @Autowired
    private IOrderPrivateCarService orderPrivateCarService;
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
    @Autowired
    private IDriverServiceService driverServiceService;
    @Autowired
    private ISettlementRecordService settlementRecordService;
    @Resource
    private CarServiceMapper carServiceMapper;
    @Autowired
    private IAssignOrderService assignOrderService;
    @Autowired
    private ISettlementDetailService settlementDetailService;
    @Autowired
    private ISettlementAllocationService settlementAllocationService;
    @Resource
    private CarMapper carMapper;
    @Autowired
    private IOrderEvaluateService orderEvaluateService;
    @Autowired
    private IUserActivityRedenvelopeService userActivityRedenvelopeService;
    @Autowired
    private FleetEngineUtil fleetEngineUtil;
    @Resource
    private CarModelMapper carModelMapper;
    @Autowired
    private ICarService carService;
    @Resource
    private IDriverWorkService driverWorkService;
    @Value("${filePath}")
    private String filePath;
@@ -163,19 +250,16 @@
     * @throws Exception
     */
    @Override
    public ResultUtil queryLogisticsUnitPrice(Integer type, String startLonLat, String endAddress, Integer uid, Integer language) throws Exception {
        FindPlaceFromTextVo findplacefromtext = GoogleMapUtil.textsearch(endAddress);
        if(null == findplacefromtext){
            return ResultUtil.error(language == 1 ? "收货地址有误,无法查询具体地址信息" : language == 2 ? "The delivery address is incorrect, and the specific address information cannot be queried" : "L’adresse de livraison est incorrecte, impossible de vérifier l’adresse spécifique");
        }
        Double lng = findplacefromtext.getLng();
        Double lat = findplacefromtext.getLat();
        ResultUtil<Map<String, Double>> price = this.getPrice1(type, startLonLat.split(",")[0], startLonLat.split(",")[1], lng.toString(), lat.toString(), language);
    public ResultUtil queryLogisticsUnitPrice(Integer type, String startLonLat, String endLonLat, String endAddress, Integer uid, Integer language) throws Exception {
        String[] split = endLonLat.split(",");
        Double lng = Double.valueOf(split[0]);
        Double lat = Double.valueOf(split[1]);
        ResultUtil<Map<String, Object>> price = this.getPrice1(uid, type, startLonLat.split(",")[0], startLonLat.split(",")[1], lng.toString(), lat.toString(), language);
        if(price.getCode() != 200){
            return price;
        }
        Integer i = this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId", uid).eq("isDelete", 1));
        Map<String, Double> map = price.getData();
        Map<String, Object> map = price.getData();
        map.put("first", i.doubleValue());
        return price;
    }
@@ -189,18 +273,25 @@
     * @return
     * @throws Exception
     */
    public ResultUtil queryPayMoney(Integer number, Integer type, String startLonLat, String endAddress, Integer language) throws Exception{
        FindPlaceFromTextVo findplacefromtext = GoogleMapUtil.textsearch(endAddress);
        if(null == findplacefromtext){
            return ResultUtil.error(language == 1 ? "收货地址有误,无法查询具体地址信息" : language == 2 ? "The delivery address is incorrect, and the specific address information cannot be queried" : "L’adresse de livraison est incorrecte, impossible de vérifier l’adresse spécifique");
        }
        Double lng = findplacefromtext.getLng();
        Double lat = findplacefromtext.getLat();
        ResultUtil<Map<String, Double>> price = this.getPrice1(type, startLonLat.split(",")[0], startLonLat.split(",")[1], lng.toString(), lat.toString(), language);
    public ResultUtil queryPayMoney(Integer uid, Integer number, Integer type, String startLonLat, String endLonLat, String endAddress, Integer language) throws Exception{
        String[] split = endLonLat.split(",");
        Double lng = Double.valueOf(split[0]);
        Double lat = Double.valueOf(split[1]);
        ResultUtil<Map<String, Object>> price = this.getPrice1(uid, type, startLonLat.split(",")[0], startLonLat.split(",")[1], lng.toString(), lat.toString(), language);
        if(price.getCode() == 200 && type == 5){
            Map<String, Double> data = price.getData();
            data.put("ordinary", data.get("ordinary") * number);
            data.put("precious", data.get("precious") * number);
            Map<String, Object> data = price.getData();
            Double ordinary = Double.valueOf(data.get("ordinary").toString());
            Double precious = Double.valueOf(data.get("precious").toString());
            data.put("ordinary", ordinary * number);
            data.put("precious", precious * number);
        }
        if(price.getCode() == 200){
            Map<String, Object> data = price.getData();
            Double ordinary = Double.valueOf(data.get("ordinary").toString());
            Double precious = Double.valueOf(data.get("precious").toString());
            Double discountMoney = Double.valueOf(data.get("discountMoney").toString());
            data.put("ordinary", ordinary - discountMoney);
            data.put("precious", precious - discountMoney);
        }
        return price;
    }
@@ -230,15 +321,15 @@
     */
    @Override
    public ResultUtil smallLogistics(Integer type, Integer cargoType, Integer cargoNumber, String remark, String placementLon, String placementLat, String startLon, String startLat, String startAddress, String recipient,
                                     String recipientPhone, String endAddress, Integer urgent, Double tipMoney, Date travelTime, Integer orderSource, Integer uid, Integer language) throws Exception {
                                     String recipientPhone, String endLonLat, String endAddress, Integer urgent, Double tipMoney, Date travelTime, Integer orderSource, Integer uid, Integer language) throws Exception {
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        OrderLogistics orderLogistics = new OrderLogistics();
        Company query = companyCityService.query1(placementLon, placementLat);
        Company query = companyCityService.query1(uid, placementLon, placementLat);
        if(null == query){
            return ResultUtil.error(language == 1 ? "该地点暂无企业服务" : language == 2 ? "No corporate services are available at this location" : "Aucun service d’entreprise n’est disponible pour cet emplacement");
            return ResultUtil.error(language == 1 ? "该地点暂无企业服务" : language == 2 ? "No service yet at this area" : "Pas encore de service dans cette zone");
        }
        orderLogistics.setCompanyId(query.getId());
        orderLogistics.setType(type);
@@ -249,9 +340,10 @@
        orderLogistics.setRemark(remark);
        orderLogistics.setPlacementLon(Double.valueOf(placementLon));
        orderLogistics.setPlacementLat(Double.valueOf(placementLat));
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(placementLat), Double.valueOf(placementLon));
        String tripId = redisUtil.getValue("trip" + uid);
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(placementLat), Double.valueOf(placementLon), tripId);
        if(null == reverseGeocode){
            return ResultUtil.error(language == 1 ? "解析地址出错" : language == 2 ? "Resolve address error" : "Erreur dans la résolution de l’adresse");
            return ResultUtil.error(language == 1 ? "解析地址出错" : language == 2 ? "Address resolution error" : "Erreur de résolution d’adresse");
        }
        String address = reverseGeocode.getAddress();
@@ -259,12 +351,10 @@
        orderLogistics.setStartLon(Double.valueOf(startLon));
        orderLogistics.setStartLat(Double.valueOf(startLat));
        orderLogistics.setStartAddress(startAddress);
        FindPlaceFromTextVo findplacefromtext = GoogleMapUtil.textsearch(endAddress);
        if(null == findplacefromtext){
            return ResultUtil.error(language == 1 ? "收货地址有误,无法查询具体地址信息" : language == 2 ? "The delivery address is incorrect, and the specific address information cannot be queried" : "L’adresse de livraison est incorrecte, impossible de vérifier l’adresse spécifique");
        }
        Double lng = findplacefromtext.getLng();
        Double lat = findplacefromtext.getLat();
        String[] split = endLonLat.split(",");
        Double lng = Double.valueOf(split[0]);
        Double lat = Double.valueOf(split[1]);
        orderLogistics.setEndLon(lng);
        orderLogistics.setEndLat(lat);
        orderLogistics.setEndAddress(endAddress);
@@ -274,18 +364,31 @@
        orderLogistics.setMileage(0D);
        orderLogistics.setIsReassign(1);
        orderLogistics.setReassignNotice(0);
        ResultUtil<Map<String, Double>> price = this.getPrice1(type, String.valueOf(startLon), String.valueOf(startLat), lng.toString(), lat.toString(), language);
        ResultUtil<Map<String, Object>> price = this.getPrice1(uid, type, String.valueOf(startLon), String.valueOf(startLat), lng.toString(), lat.toString(), language);
        if(price.getCode() != 200){
            return price;
        }
        Map<String, Double> data = price.getData();
        orderLogistics.setOrderMoney((cargoType == 1 ? data.get("ordinary") : data.get("precious")) + tipMoney);
        orderLogistics.setTravelMoney(cargoType == 1 ? data.get("ordinary") : data.get("precious"));
        if(type == 5){
            orderLogistics.setOrderMoney(((cargoType == 1 ? data.get("ordinary") : data.get("precious")) * cargoNumber) + tipMoney);
            orderLogistics.setTravelMoney((cargoType == 1 ? data.get("ordinary") : data.get("precious")) * cargoNumber);
        Map<String, Object> data = price.getData();
        Double ordinary = Double.valueOf(data.get("ordinary").toString());
        Double precious = Double.valueOf(data.get("precious").toString());
        Double discount = null;
        if(null != data.get("discount")){
            discount = Double.valueOf(data.get("discount").toString());
        }
        orderLogistics.setTipMoney(tipMoney);
        Double discountMoney = Double.valueOf(data.get("discountMoney").toString());
        Integer activityId = null;
        if(null != data.get("activityId")){
            activityId = Integer.valueOf(data.get("activityId").toString());
        }
        orderLogistics.setOrderMoney((cargoType == 1 ? ordinary : precious) + tipMoney);
//        orderLogistics.setTravelMoney((cargoType == 1 ? ordinary : precious));
        if(type == 5){
            orderLogistics.setOrderMoney(((cargoType == 1 ? ordinary : precious) * cargoNumber) + tipMoney);
//            orderLogistics.setTravelMoney((cargoType == 1 ? ordinary : precious) * cargoNumber);
        }
        orderLogistics.setDiscount(discount);
        orderLogistics.setDiscountMoney(discountMoney);
        orderLogistics.setActivityId(activityId);
        orderLogistics.setState(7);//待支付
        orderLogistics.setInsertTime(new Date());
        orderLogistics.setTravelTime(null == travelTime ? new Date() : travelTime);
@@ -294,8 +397,9 @@
        this.insert(orderLogistics);
        //添加消息
        systemNoticeService.addSystemNotice(1, language == 1 ? "您的市内小件物流订单已下单成功,我们正在为您指派司机,请稍后!" :
                                            language == 2 ? "Your local small parts logistics order has been successfully placed, we are assigning you a driver, please wait!" : "Votre commande de city small pieces logistics a été passée avec succès. Nous vous assignons un chauffeur. Plus tard!", orderLogistics.getUserId(), 1);
        systemNoticeService.addSystemNotice(1, language == 1 ? "您的市内包裹订单已下单成功,我们正在为您指派司机,请稍后!" :
                                            language == 2 ? "You've placed the delivery order successfully, we are assigning you a driver, please wait."
                                                    : "Vous avez passé la commande de livraison avec succès, nous vous attribuons un chauffeur, veuillez patienter.", orderLogistics.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderLogistics.getId());
@@ -309,8 +413,8 @@
     * @return
     * @throws Exception
     */
    public ResultUtil<Map<String, Double>> getPrice(Integer type, String startLon, String startLat, String endLon, String endLat) throws Exception{
        Company query = companyCityService.query1(startLon, startLat);
    public ResultUtil<Map<String, Double>> getPrice(Integer uid, Integer type, String startLon, String startLat, String endLon, String endLat) throws Exception{
        Company query = companyCityService.query1(uid, startLon, startLat);
        if(null == query){
            return ResultUtil.error("预约取货点暂无企业服务");
        }
@@ -353,22 +457,26 @@
    public ResultUtil<Map<String, Double>> getPrice1(Integer type, String startLon, String startLat, String endLon, String endLat, Integer language) throws Exception{
        Company query = companyCityService.query1(startLon, startLat);
    public ResultUtil<Map<String, Object>> getPrice1(Integer uid, Integer type, String startLon, String startLat, String endLon, String endLat, Integer language) throws Exception{
        Company query = companyCityService.query1(uid, startLon, startLat);
        if(null == query){
            return ResultUtil.error(language == 1 ? "预约取货点暂无企业服务" : language == 2 ?
                    "There is no enterprise service at the reservation pickup point" : "Prise de rendez-vous point de collecte pas encore disponible pour les entreprises");
                    "No service yet at the reserved pickup point." : "Les points de ramassage prévus ne sont pas disponibles pour le moment.");
        }
        Double price1 = 0D;
        Double price2 = 0D;
        Double discount = null;
        Double discountMoney = 0D;
        Integer activityId = null;
        if(type == 4){//同城
            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(Double.valueOf(startLat), Double.valueOf(startLon), Double.valueOf(endLat), Double.valueOf(endLon));
            String tripId = redisUtil.getValue("trip" + uid);
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(Double.valueOf(startLat), Double.valueOf(startLon), Double.valueOf(endLat), Double.valueOf(endLon), tripId);
            if(null == distancematrix){
                return ResultUtil.error(language == 1 ? "计算距离出错" : language == 2 ? "Error in distance calculation" : "Erreur de calcul des distances");
                return ResultUtil.error(language == 1 ? "计算距离出错" : language == 2 ? "Errors in computing distance" : "Erreurs dans le calcul de la distance");
            }
            if(distancematrix.getDistance() == 0){
                return ResultUtil.error(language == 1 ? "未获取到有效的距离" : language == 2 ? "A valid distance was not obtained" : "La distance effective n’est pas acquise");
                return ResultUtil.error(language == 1 ? "未获取到有效的距离" : language == 2 ? "Not obtaining available distance" : "Ne pas obtenir la distance disponible");
            }
            String content = String.valueOf(query1.get("content"));
            JSONObject jsonObject = JSON.parseObject(content);
@@ -387,7 +495,7 @@
                price1 = jsonObject.getDouble("num11");
            }
            if(dist.compareTo(jsonObject.getDouble("num10")) > 0){
                return ResultUtil.error(language == 1 ? "超出可服务范围" : language == 2 ? "Out of service range" : "Au-delà du service disponible");
                return ResultUtil.error(language == 1 ? "超出可服务范围" : language == 2 ? "Beyond service range" : "Au-delà de la portée de service");
            }
        }else{
            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
@@ -396,9 +504,23 @@
            price1 = jsonObject.getDouble("num1");
            price2 = jsonObject.getDouble("num2");
        }
        Map<String, Double> map = new HashMap<>();
        //计算折扣
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(query.getId());
        if(null != query2){
            activityId = query2.getId();
            discount = query2.getLogistics();
            if(null != discount){
                discountMoney = new BigDecimal(price1).multiply(new BigDecimal(discount / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            }
        }
        Map<String, Object> map = new HashMap<>();
        map.put("ordinary", price1);//普通
        map.put("precious", price2);//贵重
        map.put("discount", discount);//折扣
        map.put("discountMoney", discountMoney);//折扣金额
        map.put("activityId", activityId);//折扣活动id
        return ResultUtil.success(map);
    }
@@ -420,12 +542,13 @@
                    if(ToolUtil.isNotEmpty(vehicle)){
                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
                    }
                    Company query = companyCityService.query1(String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司
                    Company query = companyCityService.query1(orderLogistics.getUserId(), String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司
                    List<PushOrder> querys = pushOrderService.querys(null, 1, query.getId());//用专车的推单配置
                    for(int i = 1; i <= querys.size(); i++){
                        PushOrder pushOrder = pushOrderService.querys(i, 1, query.getId()).get(0);
                        //获取空闲司机
                        List<Driver> list = driverService.queryIdleDriver(orderLogistics.getType(), null, orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        List<Driver> list = driverService.queryIdleDriver(orderLogistics.getUserId(), orderLogistics.getType(), orderLogistics.getServerCarModelId(), orderLogistics.getStartLon(), orderLogistics.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        System.err.println("【" + orderLogistics.getId() + "】空闲司机:" + JSON.toJSONString(list));
                        if(list.size() > 0){
                            double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                            int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
@@ -441,7 +564,57 @@
                                if(bo){
                                    continue;
                                }
                                pushUtil.pushOrderState(2, driver.getId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), pushOrder.getPushTime());
                                Driver driver1 = driverService.selectById(driver.getId());
                                DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId())
                                        .eq("state", 1).like("type", "4"));
                                if(null == driverWork || driver1.getState() != 2){
                                    continue;
                                }
                                String text = "";
                                Integer language1 = driver.getLanguage();
                                switch (language1){
                                    case 1:
                                        text = "收到新的包裹订单,从" + orderLogistics.getStartAddress() + "出发,全程约" + orderLogistics.getEstimatedMileage() + "公里";
                                        break;
                                    case 2:
                                        text = "Received a new delivery order, starting from " + orderLogistics.getStartAddress() + ", the whole journey is about " + orderLogistics.getEstimatedMileage() + "kilometre";
                                        break;
                                    case 3:
                                        text = "J'ai reçu une nouvelle commande de livraison, à partir de " + orderLogistics.getStartAddress() + ", le trajet complet est d’environ " + orderLogistics.getEstimatedMileage() + "kilométrage";
                                        break;
                                }
                                String audioUrl = "";
                                String fileName = "pushOrder" + orderLogistics.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
                                try {
                                    audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
                                } catch (Exception e) {
                                    throw new RuntimeException(e);
                                }
                                //定时任务删除语音文件
                                new Timer().schedule(new TimerTask() {
                                    @Override
                                    public void run() {
                                        try {
                                            // 使用Runtime执行命令
                                            Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
                                            // 读取命令的输出
                                            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                                            String line;
                                            while ((line = reader.readLine()) != null) {
                                                System.out.println(line);
                                            }
                                            // 等待命令执行完成
                                            process.waitFor();
                                            // 关闭流
                                            reader.close();
                                        } catch (IOException | InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }, 30000);
                                pushUtil.pushOrderState(2, driver.getId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), pushOrder.getPushTime(), audioUrl);
                            }
                        }
                        Thread.sleep(pushOrder.getPushTime() * 1000);//设置等待时间
@@ -460,10 +633,371 @@
            }
        }).start();
    }
    /**
     * 包裹下单2.0
     * @param remark
     * @param placementLon
     * @param placementLat
     * @param startLon
     * @param startLat
     * @param startAddress
     * @param recipient
     * @param recipientPhone
     * @param endLon
     * @param endLat
     * @param endAddress
     * @param serverCarModelId
     * @param driverId
     * @param orderSource
     * @param uid
     * @param language
     * @return
     */
    @Override
    public ResultUtil placeOrderPackage(String remark, String placementLon, String placementLat, String startLon, String startLat, String startAddress,
                                        String recipient, String recipientPhone, String endLon, String endLat, String endAddress,
                                        Integer serverCarModelId, Integer driverId, Integer orderSource, Integer uid, Integer language) throws Exception {
        /**
         * 1.下了即时单就不能下预约单和即时单
         * 2.下了预约单和再下一张即时单不能再下预约单
         */
        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6, 7, 11, 12);
        if(orderPrivateCars.size() > 0){
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "Uncompleted order(s)" : "Commande(s) non complétée(s)");
        }
        int selectCount = this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId", uid).eq("isDelete", 1)
                .in("state", Arrays.asList(1, 2, 3, 4, 5, 6, 7, 11, 12)));
        if(0 < selectCount){
            return ResultUtil.error(language == 1 ? "有未完成的订单" : language == 2 ? "Uncompleted order(s)" : "Commande(s) non complétée(s)");
        }
        startAddress = startAddress.replaceAll("& #40;", "(");
        startAddress = startAddress.replaceAll("& #41;", ")");
        endAddress = endAddress.replaceAll("& #40;", "(");
        endAddress = endAddress.replaceAll("& #41;", ")");
        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
            return ResultUtil.error(language == 1 ? "请选择服务车型" : language == 2 ? "Please select vehicle-type" : "Veuillez sélectionner le type de véhicule");
        }
        OrderLogistics orderLogistics = new OrderLogistics();
        orderLogistics.setType(4);
        orderLogistics.setUserId(uid);
        orderLogistics.setServerCarModelId(serverCarModelId);
        orderLogistics.setOrderNum(this.getOrderNum());
        orderLogistics.setPlacementLon(Double.valueOf(placementLon));
        orderLogistics.setPlacementLat(Double.valueOf(placementLat));
        orderLogistics.setCargoType(1);
        orderLogistics.setUrgent(1);
        orderLogistics.setCargoNumber(1);
        String tripId = redisUtil.getValue("trip" + uid);
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(placementLat), Double.valueOf(placementLon), tripId);
        orderLogistics.setPlacementAddress(reverseGeocode.getAddress());
        orderLogistics.setStartLon(Double.valueOf(startLon));
        orderLogistics.setStartLat(Double.valueOf(startLat));
        orderLogistics.setStartAddress(startAddress);
        orderLogistics.setEndLon(Double.valueOf(endLon));
        orderLogistics.setEndLat(Double.valueOf(endLat));
        orderLogistics.setEndAddress(endAddress);
        orderLogistics.setRecipient(recipient);
        orderLogistics.setRecipientPhone(recipientPhone);
        orderLogistics.setState(1);
        orderLogistics.setInsertTime(new Date());
        orderLogistics.setTravelTime(new Date());
        orderLogistics.setOrderSource(orderSource);
        orderLogistics.setRemark(remark);
        if(orderSource == 2){//扫码下单
            Driver driver = driverService.selectById(driverId);
            if(null == driver){
                return ResultUtil.error(language == 1 ? "司机信息有误,无法完成下单" : language == 2 ? "Wrong driver-information, unable to place an order." : "Informations erronées sur le chauffeur, il ne peut donc pas passer une commande.");
            }
            if(driver.getAuthState() == 1){
                return ResultUtil.error(language == 1 ? "司机信息还未完成审核,无法完成下单" : language == 2 ? "The driver is not yet done with review, unable to place an order." : "Le chauffeur n’a pas encore terminé son examen, il ne peut donc pas passer une commande.");
            }
            if(driver.getAuthState() == 3){
                return ResultUtil.error(language == 1 ? "司机账户已被冻结,无法提供服务" : language == 2 ? "Driver account is frozen, unable to provide service." : "Le compte du chauffeur est gelé, il n’est donc pas possible de fournir des services.");
            }
            if(driver.getAuthState() == 4){
                return ResultUtil.error(language == 1 ? "司机信息未通过审核,无法提供服务" : language == 2 ? "The driver is not verified and qualified, unable to provide service." : "Le chauffeur n’est pas vérifié et qualifié, incapable de fournir le services.");
            }
            if(driver.getState() == 1){
                return ResultUtil.error(language == 1 ? "司机还未上线,无法提供服务" : language == 2 ? "The driver is not online, unable to provide service." : "Le chauffeur n’est pas en ligne, incapable de fournir le services.");
            }
            if(driver.getState() == 3){
                return ResultUtil.error(language == 1 ? "司机正在服务中,无法提供服务" : language == 2 ? "The driver is on a trip, unable to provide service." : "Le chauffeur est en service, incapable de fournir des services.");
            }
            List<DriverService> query = driverServiceService.query(driverId, 4);
            if(query.size() == 0){
                return ResultUtil.error(language == 1 ? "该司机不能服务此业务" : language == 2 ? "Driver has outstanding fees to pay, unable to receive orders." : "Le chauffeur a des frais impayés à payer, incapable de recevoir des commandes.");
            }
            int count = settlementRecordService.selectCount(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
            if(count > 0){
                return ResultUtil.error(language == 1 ? "司机未支付订单费用,无法进行接单" : language == 2 ? "Driver has outstanding fees to pay, unable to receive orders." : "Le chauffeur a des frais impayés à payer, incapable de recevoir des commandes.");
            }
            orderLogistics.setDriverId(driverId);
            orderLogistics.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
                    driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
            orderLogistics.setState(2);
            orderLogistics.setCarId(driver.getCarId());
            CarService query1 = carServiceMapper.query(1, driver.getCarId());
            orderLogistics.setServerCarModelId(query1.getServerCarModelId());
            orderLogistics.setSnatchOrderTime(new Date());
            String value = redisUtil.getValue("DRIVER" + driver.getId());
            if(ToolUtil.isNotEmpty(value)) {
                String[] split = value.split(",");
                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                //超时时间
                long timeOut = System.currentTimeMillis() + (distancematrix.getDuration() * 1000);
                orderLogistics.setEstimateArriveTime(new Date(timeOut));
                orderLogistics.setEstimateArriveMileage(distancematrix.getDistance());
            }
            driver.setState(3);
            driverService.updateById(driver);
        }
        orderLogistics.setIsReassign(1);
        orderLogistics.setIsDelete(1);
        orderLogistics.setTripId(tripId);
        DistancematrixVo distancematrix1 = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), orderLogistics.getEndLat(), orderLogistics.getEndLon(), tripId);
        Long distance1 = distancematrix1.getDistance();
        orderLogistics.setEstimatedMileage(new BigDecimal(distance1).divide(new BigDecimal(1000)).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
        this.insert(orderLogistics);
        UserInfo userInfo = userInfoService.selectById(uid);
        userInfo.setLanguage(language);
        userInfoService.updateById(userInfo);
        new Thread(() -> {
            try {
                String vehicleId = null;
                if(null != orderLogistics.getDriverId()){
                    Driver driver = driverService.selectById(orderLogistics.getDriverId());
                    Car car = carMapper.selectById(driver.getCarId());
                    if(!StringUtils.hasLength(car.getVehicleId())){
                        car.setVehicleId(UUIDUtil.getRandomCode());
                        carMapper.updateById(car);
                    }
                    //查询车辆信息,没有则创建信息
                    String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
                    if(ToolUtil.isEmpty(vehicles)){
                        CarModel carModel = carModelMapper.selectById(car.getCarModelId());
                        fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                        fleetEngineUtil.updateVehicles("ONLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                    }
                }
                //创建行程数据
                fleetEngineUtil.createTrip(vehicleId, 1, orderLogistics.getTripId(),
                        orderLogistics.getStartLat().toString(), orderLogistics.getStartLon().toString(), orderLogistics.getEndLat().toString(), orderLogistics.getEndLon().toString());
            }catch (Exception e){
                e.printStackTrace();
            }
        }).start();
        if(orderSource == 2){//扫码下单
            Driver driver = driverService.selectById(orderLogistics.getDriverId());
            String text = "";
            Integer language1 = driver.getLanguage();
            switch (language1){
                case 1:
                    text = "收到新的包裹订单,从" + orderLogistics.getStartAddress() + "出发,全程约" + orderLogistics.getEstimatedMileage() + "公里";
                    break;
                case 2:
                    text = "Received a new delivery order, starting from " + orderLogistics.getStartAddress() + ", the whole journey is about " + orderLogistics.getEstimatedMileage() + "kilometre";
                    break;
                case 3:
                    text = "J'ai reçu une nouvelle commande de livraison, à partir de " + orderLogistics.getStartAddress() + ", le trajet complet est d’environ " + orderLogistics.getEstimatedMileage() + "kilométrage";
                    break;
            }
            String audioUrl = "";
            String fileName = "pushOrder" + orderLogistics.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
            try {
                audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            //定时任务删除语音文件
            new Timer().schedule(new TimerTask() {
                @Override
                public void run() {
                    try {
                        // 使用Runtime执行命令
                        Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
                        // 读取命令的输出
                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                        String line;
                        while ((line = reader.readLine()) != null) {
                            System.out.println(line);
                        }
                        // 等待命令执行完成
                        process.waitFor();
                        // 关闭流
                        reader.close();
                    } catch (IOException | InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, 30000);
            String finalAudioUrl = audioUrl;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, uid, orderLogistics.getId(), 4, 2, 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, 2, 0, finalAudioUrl);
                }
            }).start();
        }
        // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
        if(orderLogistics.getState() == 1){
            Company query = companyCityService.query1(uid, orderLogistics.getStartLon().toString(), orderLogistics.getStartLat().toString());
            if(null == query){
                return ResultUtil.error(language == 1 ? "起点暂未企业提供服务" : language == 2 ? "Starting point no enterprise to provide services" : "Point de départ pas encore disponible pour les entreprises");
            }
            AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1));
            if(null != assignOrder && assignOrder.getPeople() > 0){//配置了指派规则才处理
                //获取空闲司机
                List<Driver> drivers = driverService.queryIdleDriver(uid, 4, orderLogistics.getServerCarModelId(), orderLogistics.getStartLon(), orderLogistics.getStartLat(), assignOrder.getDistance(), null);//获取范围内空闲司机
                if(drivers.size() > 0){//有司机,直接指派给司机
                    Driver dr = null;
                    if(drivers.size() > 1){
                        List<Driver> ds = new ArrayList<>();//存储直线距离最近的几个司机
                        for(int i = 0; i < assignOrder.getPeople(); i++){
                            Driver driver = null;
                            long m = 0;
                            int index = 0;
                            for(int j = 0; j < drivers.size(); j++){
                                String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                if(null != value){
                                    String[] split = value.split(",");
                                    DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                    Long distance = distancematrix.getDistance();
                                    if((0 == m && null == driver) || (distance < m)){
                                        driver = drivers.get(j);
                                        m = distance;
                                        index = j;
                                    }
                                }
                            }
                            ds.add(driver);
                            drivers.remove(index);
                        }
                        //再根据直线距离最短的司机中找出行驶距离最短的司机
                        Long m = 0L;
                        for(Driver driver : ds){
                            String value = redisUtil.getValue("DRIVER" + driver.getId());
                            if(null != value){
                                String[] split = value.split(",");
                                DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]), tripId);
                                Long d = distancematrix.getDistance();
                                if((0 == m && null == dr) || (d.intValue() < m.intValue())){
                                    dr = driver;
                                    m = d;
                                }
                            }
                        }
                    }else{
                        dr = drivers.get(0);
                    }
                    Driver driver1 = driverService.selectById(dr.getId());
                    DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", driver1.getId())
                            .eq("state", 1).like("type", "4"));
                    if(driver1.getState() == 2 || null != driverWork){
                        orderLogistics.setDriverId(dr.getId());
                        orderLogistics.setCompanyId(dr.getFranchiseeId() != null && dr.getFranchiseeId() != 0 ? dr.getFranchiseeId() : (
                                dr.getCompanyId() != null && dr.getCompanyId() != 0 ? dr.getCompanyId() : 1));
                        orderLogistics.setState(2);
                        orderLogistics.setCarId(dr.getCarId());
                        CarService query1 = carServiceMapper.query(1, dr.getCarId());
                        orderLogistics.setServerCarModelId(query1.getServerCarModelId());
                        orderLogistics.setSnatchOrderTime(new Date());
                        dr.setState(3);
                        driverService.updateById(dr);
                        this.updateById(orderLogistics);
                        String text = "";
                        Integer language1 = dr.getLanguage();
                        switch (language1){
                            case 1:
                                text = "收到新的包裹订单,从" + orderLogistics.getStartAddress() + "出发,全程约" + orderLogistics.getEstimatedMileage() + "公里";
                                break;
                            case 2:
                                text = "Received a new delivery order, starting from " + orderLogistics.getStartAddress() + ", the whole journey is about " + orderLogistics.getEstimatedMileage() + "kilometre";
                                break;
                            case 3:
                                text = "J'ai reçu une nouvelle commande de livraison, à partir de " + orderLogistics.getStartAddress() + ", le trajet complet est d’environ " + orderLogistics.getEstimatedMileage() + "kilométrage";
                                break;
                        }
                        String audioUrl = "";
                        String fileName = "pushOrder" + orderLogistics.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
                        try {
                            audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                        //定时任务删除语音文件
                        new Timer().schedule(new TimerTask() {
                            @Override
                            public void run() {
                                try {
                                    // 使用Runtime执行命令
                                    Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
                                    // 读取命令的输出
                                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                                    String line;
                                    while ((line = reader.readLine()) != null) {
                                        System.out.println(line);
                                    }
                                    // 等待命令执行完成
                                    process.waitFor();
                                    // 关闭流
                                    reader.close();
                                } catch (IOException | InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }, 30000);
                        String finalAudioUrl = audioUrl;
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                pushUtil.pushOrderState(1, uid, orderLogistics.getId(), 4, 2, 0, "");
                                pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, 2, 0, finalAudioUrl);
                            }
                        }).start();
                    }
                }
            }
        }
        //推单操作
        if(orderLogistics.getState() == 1){
            this.pushOrder(orderLogistics);
        }
        //添加消息
        systemNoticeService.addSystemNotice(1, language == 1 ? "您的市内包裹订单已下单成功,我们正在为您指派司机,请稍后!" :
                language == 2 ? "You've placed the delivery order successfully, we are assigning you a driver, please wait."
                        : "Vous avez passé la commande de livraison avec succès, nous vous attribuons un chauffeur, veuillez patienter.", orderLogistics.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setState(orderLogistics.getState());
        baseWarpper.setId(orderLogistics.getId());
        baseWarpper.setContent(orderLogistics.getTripId());
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 订单支付
     * @param payType
@@ -473,19 +1007,129 @@
     * @throws Exception
     */
    @Override
    public ResultUtil payLogisticsOrder(Integer payType, Integer bankCardId, Integer orderId, Integer type, Integer language) throws Exception {
    public ResultUtil payLogisticsOrder(Integer payType, Integer bankCardId, Integer orderId,Integer couponId, Integer redDeduction, Integer type, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        if(orderLogistics.getState() != 7){
            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é", "");
            return ResultUtil.error(language == 1 ? "订单已完成支付,不允许重复支付" : language == 2 ? "The order has been paid, recurring payments is not allowed." : "La commande a été payée, les paiements récurrents ne sont pas autorisés.", "");
        }
        Integer uid = orderLogistics.getUserId();
        Double orderMoney = orderLogistics.getOrderMoney();
        BigDecimal orderMoney = new BigDecimal(orderLogistics.getOrderMoney());
        if(orderLogistics.getUrgent() == 2){
            orderMoney += null != orderLogistics.getTipMoney() ? orderLogistics.getTipMoney() : 0;
//            orderMoney += null != orderLogistics.getTipMoney() ? orderLogistics.getTipMoney() : 0;
        }
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success("");
        //计算折扣
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderLogistics.getCompanyId());
        if(null != query2){
            Integer orderNum=this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId",orderLogistics.getUserId()).eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
            if(query2.getDistance()*1000>orderLogistics.getMileage() && query2.getOrderNum()>orderNum){
                Double special = query2.getLogistics();
                if(null != special){
                    orderLogistics.setDiscount(special);
                    BigDecimal v = orderMoney.multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                    if(orderMoney.compareTo(v) > 0){
                        orderLogistics.setDiscountMoney(orderMoney.subtract(v).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                        orderLogistics.setActivityId(query2.getId());
                        orderMoney = v;
                    }
                }
            }
        }
        //计算优惠券
        UserCouponRecord userCouponRecord = null;
        if(null != couponId){
            //TODO 待翻译
            if(null != redDeduction && 1 == redDeduction){
                return ResultUtil.error(language == 1 ? "优惠券和红包不能同时使用" : language == 2 ? "Coupons and lucky-promo cannot be used at the same time." : "Les coupons et les bonus ne peuvent pas être utilisés en même temps", "");
            }
            userCouponRecord = userCouponRecordService.selectById(couponId);
            if(userCouponRecord.getCompanyId() != orderLogistics.getCompanyId()){
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupon cannot be used for this order." : "Le coupon ne peut pas être utilisé pour cette commande.", "");
            }
            if(userCouponRecord.getState() == 2){
                return ResultUtil.error(language == 1 ? "优惠券已使用" : language == 2 ? "Coupon has been used." : "Le coupon a été utilisé.", "");
            }
            if(userCouponRecord.getState() == 3){
                return ResultUtil.error(language == 1 ? "优惠券已过期" : language == 2 ? "Coupon is expired." : "Le coupon a expiré.", "");
            }
            if(userCouponRecord.getCouponUseType() != 0 && userCouponRecord.getCouponUseType() != 4){
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupon cannot be used for this order." : "Le coupon ne peut pas être utilisé pour cette commande.", "");
            }
            if(userCouponRecord.getCouponType() == 2 && orderMoney.compareTo(new BigDecimal(userCouponRecord.getFullMoney())) < 0){
                return ResultUtil.error(language == 1 ? "优惠券不能用于此订单" : language == 2 ? "Coupon cannot be used for this order." : "Le coupon ne peut pas être utilisé pour cette commande.", "");
            }
            orderMoney = orderMoney.subtract(new BigDecimal(userCouponRecord.getMoney())).setScale(2, RoundingMode.HALF_EVEN);
            orderLogistics.setCouponMoney(userCouponRecord.getMoney());
            orderLogistics.setCouponId(couponId);
        }
        //计算红包
        if(null != redDeduction && 1 == redDeduction && null == orderLogistics.getRedPacketId()){
            RedEnvelopePaymentSettings redEnvelopePaymentSettings = redEnvelopePaymentSettingsService.getRedEnvelopePaymentSettings();
            if(null != redEnvelopePaymentSettings){
                Double total = userRedPacketRecordService.queryRemainingAmount(uid);
                List<UserRedPacketRecord> userRedPacketRecords = userRedPacketRecordService.selectList(new EntityWrapper<UserRedPacketRecord>().eq("userId", uid)
                        .eq("state", 1).eq("companyId", orderLogistics.getCompanyId()).gt("remainingAmount", 0).orderBy("insertTime", false));
                BigDecimal deductionRatio = redEnvelopePaymentSettings.getDeductionRatio();
                BigDecimal multiply1 = orderMoney.multiply(deductionRatio.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN);
                if(total > 0 && multiply1.doubleValue() > 0 && total.compareTo(multiply1.doubleValue()) >= 0){
                    orderLogistics.setRedPacketMoney(multiply1.doubleValue());
                    orderMoney = orderMoney.subtract(multiply1).setScale(2, RoundingMode.HALF_EVEN);
                    //获取红包id
                    JSONArray jsonArray = new JSONArray();
                    for (UserRedPacketRecord userRedPacketRecord : userRedPacketRecords) {
                        if(multiply1.compareTo(BigDecimal.ZERO) == 0){
                            break;
                        }
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("id", userRedPacketRecord.getId());
                        BigDecimal remainingAmount = new BigDecimal(userRedPacketRecord.getRemainingAmount());
                        if(multiply1.compareTo(remainingAmount) >= 0){
                            userRedPacketRecord.setRemainingAmount(0D);
                            userRedPacketRecord.setEndTime(new Date());
                            userRedPacketRecord.setState(2);
                            multiply1 = multiply1.subtract(remainingAmount).setScale(2, RoundingMode.HALF_EVEN);
                            jsonObject.put("money", remainingAmount);
                            jsonArray.add(jsonObject);
                        }else if(remainingAmount.compareTo(multiply1) > 0){
                            userRedPacketRecord.setRemainingAmount(remainingAmount.subtract(multiply1).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
                            jsonObject.put("money", multiply1);
                            jsonArray.add(jsonObject);
                            multiply1 = BigDecimal.ZERO;
                        }
                    }
                    if(userRedPacketRecords.size() > 0){
                        userRedPacketRecordService.updateBatchById(userRedPacketRecords);
                    }
                    orderLogistics.setRedPacketId(jsonArray.toJSONString());
                }
                if(total > 0 && total.compareTo(multiply1.doubleValue()) < 0){
                    orderLogistics.setRedPacketMoney(total);
                    orderMoney = orderMoney.subtract(new BigDecimal(total)).setScale(2, RoundingMode.HALF_EVEN);
                    //获取红包id
                    JSONArray jsonArray = new JSONArray();
                    for (UserRedPacketRecord userRedPacketRecord : userRedPacketRecords) {
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("id", userRedPacketRecord.getId());
                        jsonObject.put("money", userRedPacketRecord.getRemainingAmount());
                        jsonArray.add(jsonObject);
                        userRedPacketRecord.setRemainingAmount(0D);
                        userRedPacketRecord.setEndTime(new Date());
                        userRedPacketRecord.setState(2);
                    }
                    if(userRedPacketRecords.size() > 0){
                        userRedPacketRecordService.updateBatchById(userRedPacketRecords);
                    }
                    orderLogistics.setRedPacketId(jsonArray.toJSONString());
                }
            }
        }
        if(payType == 1) {//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "4" + language + orderId;
@@ -495,16 +1139,17 @@
            checkoutRequest.setAccountNumber(userInfo.getPhone());
            checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
            checkoutRequest.setCustomerLastName(userInfo.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setRequestAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderTaxi");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 4, 1, orderMoney, null, 1);//添加预支付数据
                paymentRecordService.saveData(1, null, null, orderId, 4, 1,
                        orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), null, 1);//添加预支付数据
            }else{
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
@@ -521,17 +1166,18 @@
            checkoutRequest.setAccountNumber(bankCard.getCode());
            checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
            checkoutRequest.setCustomerLastName(bankCard.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setRequestAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderTaxi");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 4, 2, orderMoney, null, 1);//添加预支付数据
                paymentRecordService.saveData(1, null, null, orderId, 4, 2,
                        orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), null, 1);//添加预支付数据
            }else{
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
@@ -539,204 +1185,1100 @@
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant", "");
            if(userInfo.getBalance() == null || new BigDecimal(userInfo.getBalance()).compareTo(orderMoney) < 0){
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant", "");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(orderMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //处理优惠券
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            //添加交易明细
            transactionDetailsService.saveData(uid, "小件物流下单支付", orderMoney, 2, 1, 1, 4, orderId);
            transactionDetailsService.saveData(uid, "包裹下单支付",
                    orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), 2, 1, 1, 4, orderId);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(1);//小件物流先支付后司机抢单
            orderLogistics.setState(8);
            orderLogistics.setPayType(3);
            orderLogistics.setPayMoney(orderMoney);
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath + "user/receiptLogistics.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                if(1 == language){
                    document.getElementById("english").attr("style", "display: none;");
                    document.getElementById("french").attr("style", "display: none;");
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(sdf2.format(orderLogistics.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderLogistics.getPayMoney());
                    Element xcf_chinese = document.getElementById("xcf_chinese");
                    xcf_chinese.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_chinese = document.getElementById("start_address_chinese");
                    start_address_chinese.text(orderLogistics.getStartAddress());
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderLogistics.getEndAddress());
            orderLogistics.setPayMoney(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            if(null != orderLogistics.getRedPacketId()){
                JSONArray jsonArray = JSON.parseArray(orderLogistics.getRedPacketId());
                for (int i = 0; i < jsonArray.size(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    Integer id1 = jsonObject.getInteger("id");
                    Double money = jsonObject.getDouble("money");
                    UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(id1);
                    userRedPacketRecord.setRemainingAmount(userRedPacketRecord.getRemainingAmount() - money);
                    if(0 == userRedPacketRecord.getRemainingAmount()){
                        userRedPacketRecord.setState(2);
                        userRedPacketRecord.setEndTime(new Date());
                    }
                    userRedPacketRecordService.updateById(userRedPacketRecord);
                }
                if(2 == language){
                    document.getElementById("chinese").attr("style", "display: none;");
                    document.getElementById("french").attr("style", "display: none;");
                    Element title_english = document.getElementById("title_english");
                    title_english.text(sdf2.format(orderLogistics.getTravelTime()) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                    Element xcf_english = document.getElementById("xcf_english");
                    xcf_english.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_english = document.getElementById("start_address_english");
                    start_address_english.text(orderLogistics.getStartAddress());
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderLogistics.getEndAddress());
            }
            if(orderLogistics.getIsplatPay()==1){
                //添加已收入明细
                Company company = companyService.selectById(orderLogistics.getCompanyId());
                Double speMoney = company.getSpeMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(speMoney);
                    c = new BigDecimal(orderLogistics.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
                }
                if(3 == language){
                    document.getElementById("chinese").attr("style", "display: none;");
                    document.getElementById("english").attr("style", "display: none;");
                    Element title_french = document.getElementById("title_french");
                    title_french.text(sdf2.format(orderLogistics.getTravelTime()) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
                    Element xcf_french = document.getElementById("xcf_french");
                    xcf_french.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_french = document.getElementById("start_address_french");
                    start_address_french.text(orderLogistics.getStartAddress());
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderLogistics.getEndAddress());
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    Double price = orderLogistics.getStartMoney() + orderLogistics.getMileageMoney() + orderLogistics.getWaitMoney() + orderLogistics.getDurationMoney() + orderLogistics.getLongDistanceMoney();
                    d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(orderLogistics.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "市内小件物流收据" : language == 2 ? "Reset password" : "Réinitialiser le mot de passe",  document.html());
                incomeService.saveData(1, orderLogistics.getCompanyId(), 2, orderLogistics.getId(), 4, d.doubleValue());
                incomeService.saveData(2, orderLogistics.getDriverId(), 2, orderLogistics.getId(), 4, c.doubleValue());
                Driver driver = driverService.selectById(orderLogistics.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);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成小件物流订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the small parts logistics order payment, thank you for using!" :
                    "Vous avez complété avec succès le paiement de la commande small pieces logistics. Merci d’utiliser!", uid, 1);
            this.pushOrder(orderLogistics);//推单
        }
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单支付,谢谢使用!" : language == 2
                    ? "You've paid for the delivery order successfully, thank you for using I-GO" :
                    "Vous avez payé la commande de livraison avec succès, merci d’utiliser I-GO", uid, 1);
            language = userInfo.getLanguage();
            String payTypeChinese = "";
            String payTypeEnglish = "";
            String payTypeFrench = "";
            if(orderLogistics.getPayType() == 3){
                payTypeChinese = "余额支付";
                payTypeEnglish = "I-GO Wallet";
                payTypeFrench = "Portefeuille I-GO";
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath + "user/receiptLogistics.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                Driver driver = driverService.selectById(orderLogistics.getDriverId());
                Car car = carMapper.selectById(orderLogistics.getCarId());
                Double aDouble = 0D;
                if(null != orderLogistics.getDriverId()){
                    aDouble = orderEvaluateService.queryDriverScore(orderLogistics.getDriverId());
                }
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("包裹收据");
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderLogistics.getPayMoney());
                    Element qbj_chinese = document.getElementById("qbj_chinese");
                    qbj_chinese.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_chinese = document.getElementById("scf_chinese");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_chinese.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_chinese_div = document.getElementById("scf_chinese_div");
                        scf_chinese_div.remove();
                    }
                    Element lcf_chinese = document.getElementById("lcf_chinese");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_chinese_div = document.getElementById("lcf_chinese_div");
                        lcf_chinese_div.remove();
                    }
                    Element ddf_chinese = document.getElementById("ddf_chinese");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_chinese.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_chinese_div = document.getElementById("ddf_chinese_div");
                        ddf_chinese_div.remove();
                    }
                    Element glf_chinese = document.getElementById("glf_chinese");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_chinese.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_chinese_div = document.getElementById("glf_chinese_div");
                        glf_chinese_div.remove();
                    }
                    Element tcf_chinese = document.getElementById("tcf_chinese");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_chinese_div = document.getElementById("tcf_chinese_div");
                        tcf_chinese_div.remove();
                    }
                    Element bcj_chinese = document.getElementById("bcj_chinese");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_chinese_div = document.getElementById("bcj_chinese_div");
                        bcj_chinese_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_chinese = document.getElementById("yhq_chinese");
                        yhq_chinese.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_chinese_div = document.getElementById("yhq_chinese_div");
                        yhq_chinese_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_chinese = document.getElementById("zk_chinese");
                        zk_chinese.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_chinese_div = document.getElementById("zk_chinese_div");
                        zk_chinese_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_chinese = document.getElementById("hb_chinese");
                        hb_chinese.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_chinese_div = document.getElementById("hb_chinese_div");
                        hb_chinese_div.remove();
                    }
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_chinese = document.getElementById("pay_type_chinese");
                    pay_type_chinese.text(payTypeChinese);
                    Element pay_money_chinese = document.getElementById("pay_money_chinese");
                    pay_money_chinese.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_chinese = document.getElementById("dispute_chinese");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_chinese.text("(注意: 争议订单,经过三方协商,平台最终定价为 GHS" + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_chinese.remove();
                    }
                    Element pdf_chinese = document.getElementById("pdf_chinese");
                    pdf_chinese.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_chinese = document.getElementById("lost_item_chinese");
                    lost_item_chinese.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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 start_address_chinese = document.getElementById("start_address_chinese");
                    start_address_chinese.text(orderLogistics.getStartAddress());
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_chinese = document.getElementById("server_tel_chinese");
                    server_tel_chinese.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("Delivery receipt");
                    Element title_english = document.getElementById("title_english");
                    title_english.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                    Element qbj_english = document.getElementById("qbj_english");
                    qbj_english.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_english = document.getElementById("scf_english");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_english.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_english_div = document.getElementById("scf_english_div");
                        scf_english_div.remove();
                    }
                    Element lcf_english = document.getElementById("lcf_english");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_english.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_english_div = document.getElementById("lcf_english_div");
                        lcf_english_div.remove();
                    }
                    Element ddf_english = document.getElementById("ddf_english");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_english.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_english_div = document.getElementById("ddf_english_div");
                        ddf_english_div.remove();
                    }
                    Element glf_english = document.getElementById("glf_english");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_english.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_english_div = document.getElementById("glf_english_div");
                        glf_english_div.remove();
                    }
                    Element tcf_english = document.getElementById("tcf_english");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_english.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_english_div = document.getElementById("tcf_english_div");
                        tcf_english_div.remove();
                    }
                    Element bcj_english = document.getElementById("bcj_english");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_english.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_english_div = document.getElementById("bcj_english_div");
                        bcj_english_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_english = document.getElementById("yhq_english");
                        yhq_english.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_english_div = document.getElementById("yhq_english_div");
                        yhq_english_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_english = document.getElementById("zk_english");
                        zk_english.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_english_div = document.getElementById("zk_english_div");
                        zk_english_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_english = document.getElementById("hb_english");
                        hb_english.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_english_div = document.getElementById("hb_english_div");
                        hb_english_div.remove();
                    }
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_english = document.getElementById("pay_type_english");
                    pay_type_english.text(payTypeEnglish);
                    Element pay_money_english = document.getElementById("pay_money_english");
                    pay_money_english.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_english = document.getElementById("dispute_english");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_english.text("(Note: Disputed order, after tripartite negotiation, the final pricing of the platform is GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_english.remove();
                    }
                    Element pdf_english = document.getElementById("pdf_english");
                    pdf_english.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_english = document.getElementById("lost_item_english");
                    lost_item_english.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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 start_address_english = document.getElementById("start_address_english");
                    start_address_english.text(orderLogistics.getStartAddress());
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_english = document.getElementById("server_tel_english");
                    server_tel_english.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    document.getElementsByTag("title").get(0).text("Reçu de livraison");
                    Element title_french = document.getElementById("title_french");
                    title_french.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande I-GO ");
                    Element qbj_french = document.getElementById("qbj_french");
                    qbj_french.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_french = document.getElementById("scf_french");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_french.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_french_div = document.getElementById("scf_french_div");
                        scf_french_div.remove();
                    }
                    Element lcf_french = document.getElementById("lcf_french");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_french.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_french_div = document.getElementById("lcf_french_div");
                        lcf_french_div.remove();
                    }
                    Element ddf_french = document.getElementById("ddf_french");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_french.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_french_div = document.getElementById("ddf_french_div");
                        ddf_french_div.remove();
                    }
                    Element glf_french = document.getElementById("glf_french");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_french.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_french_div = document.getElementById("glf_french_div");
                        glf_french_div.remove();
                    }
                    Element tcf_french = document.getElementById("tcf_french");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_french.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_french_div = document.getElementById("tcf_french_div");
                        tcf_french_div.remove();
                    }
                    Element bcj_french = document.getElementById("bcj_french");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_french.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_french_div = document.getElementById("bcj_french_div");
                        bcj_french_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_french = document.getElementById("yhq_french");
                        yhq_french.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_french_div = document.getElementById("yhq_french_div");
                        yhq_french_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_french = document.getElementById("zk_french");
                        zk_french.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_french_div = document.getElementById("zk_french_div");
                        zk_french_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_french = document.getElementById("hb_french");
                        hb_french.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_french_div = document.getElementById("hb_french_div");
                        hb_french_div.remove();
                    }
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_french = document.getElementById("pay_type_french");
                    pay_type_french.text(payTypeFrench);
                    Element pay_money_french = document.getElementById("pay_money_french");
                    pay_money_french.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_french = document.getElementById("dispute_french");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_french.text("(Remarque: Il s’agit d’une commande contestée, et après des négociations entre trois parties, la plateforme l’a finalement tarifée à GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_french.remove();
                    }
                    Element pdf_french = document.getElementById("pdf_french");
                    pdf_french.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_french = document.getElementById("lost_item_french");
                    lost_item_french.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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: GS " + car.getCarLicensePlate());
                    Element pf_french = document.getElementById("pf_french");
                    pf_french.text("Note du chauffeur: " + aDouble);
                    Element start_address_french = document.getElementById("start_address_french");
                    start_address_french.text(orderLogistics.getStartAddress());
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_french = document.getElementById("server_tel_french");
                    server_tel_french.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "包裹收据" : language == 2 ? "Delivery receipt" : "Reçu de livraison",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/home/igotechgh/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/home/igotechgh/nginx/html/files/html/parcel_receipt_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/home/igotechgh/nginx/html/files/pdf/parcel_receipt_" + orderId + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                try{
                    FileOutputStream fileOutputStream = new FileOutputStream(file1);
                    HtmlToPdfUtils.convertToPdf("/home/igotechgh/nginx/html/files/html/parcel_receipt_" + orderId + ".html", "I-GO", fileOutputStream);
                }catch (Exception e){
                    e.printStackTrace();
                    System.out.println("html转pdf异常");
                }
                String link ="https://igo.i-go.group/files/html/parcel_receipt_" + orderId + ".html";
                TEmail tEmail = new TEmail();
                tEmail.setLink(link);
                tEmail.setUserId(userInfo.getId());
                tEmail.setType(1);
                tEmail.setName(language == 1 ? "包裹收据" : language == 2 ? "Delivery receipt" : "Reçu de livraison");
                tEmail.setOrderId(orderId);
                tEmail.setCreateTime(new Date());
                int i = cn.hutool.core.date.DateUtil.dayOfWeek(new Date())-1;
                String week = EmailUtil.getWeek(language, i);
                tEmail.setWeek(week);
                boolean am = cn.hutool.core.date.DateUtil.isAM(new Date());
                if(am){
                    tEmail.setAmOrPm(language==1?"上午":language==2?"morning":"matin");
                }else {
                    tEmail.setAmOrPm(language==1?"下午":language==2?"afternoon":"après-midi");
                }
                emailService.insert(tEmail);
            }
        }
        Driver driver = driverService.selectById(orderLogistics.getDriverId());
        if(payType == 4){//现金支付
            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "小件物流下单支付", orderMoney, 2, 1, 1, 4, orderId);
            transactionDetailsService.saveData(uid, "包裹下单支付",
                    orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue(), 2, 1, 1, 4, orderId);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(1);//小件物流先支付后司机抢单
            orderLogistics.setState(8);//小件物流先支付后司机抢单
            orderLogistics.setDriverPay(1);
            orderLogistics.setPayType(4);
            orderLogistics.setPayMoney(orderMoney);
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath + "user/receiptLogistics.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                if(1 == language){
                    document.getElementById("english").attr("style", "display: none;");
                    document.getElementById("french").attr("style", "display: none;");
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(sdf2.format(orderLogistics.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderLogistics.getPayMoney());
                    Element xcf_chinese = document.getElementById("xcf_chinese");
                    xcf_chinese.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_chinese = document.getElementById("start_address_chinese");
                    start_address_chinese.text(orderLogistics.getStartAddress());
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderLogistics.getEndAddress());
                }
                if(2 == language){
                    document.getElementById("chinese").attr("style", "display: none;");
                    document.getElementById("french").attr("style", "display: none;");
                    Element title_english = document.getElementById("title_english");
                    title_english.text(sdf2.format(orderLogistics.getTravelTime()) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                    Element xcf_english = document.getElementById("xcf_english");
                    xcf_english.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_english = document.getElementById("start_address_english");
                    start_address_english.text(orderLogistics.getStartAddress());
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderLogistics.getEndAddress());
                }
                if(3 == language){
                    document.getElementById("chinese").attr("style", "display: none;");
                    document.getElementById("english").attr("style", "display: none;");
                    Element title_french = document.getElementById("title_french");
                    title_french.text(sdf2.format(orderLogistics.getTravelTime()) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
                    Element xcf_french = document.getElementById("xcf_french");
                    xcf_french.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_french = document.getElementById("start_address_french");
                    start_address_french.text(orderLogistics.getStartAddress());
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderLogistics.getEndAddress());
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "市内小件物流收据" : language == 2 ? "Reset password" : "Réinitialiser le mot de passe",  document.html());
            orderLogistics.setPayMoney(orderMoney.setScale(2, RoundingMode.HALF_EVEN).doubleValue());
            //处理优惠券和红包
            if(null != userCouponRecord){
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
                //添加优惠收入补贴
                Double money = userCouponRecord.getMoney();
                incomeService.saveData(2, orderLogistics.getDriverId(), 5, orderLogistics.getId(), 4, money);
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driverService.updateById(driver);
            }
            if(null != orderLogistics.getRedPacketId()){
                Double money = orderLogistics.getRedPacketMoney();
                incomeService.saveData(2, orderLogistics.getDriverId(), 7, orderLogistics.getId(), 4, money);
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driverService.updateById(driver);
            }
            if(null != orderLogistics.getDiscountMoney() && 0 < orderLogistics.getDiscountMoney()){
                Double money = orderLogistics.getDiscountMoney();
                incomeService.saveData(2, orderLogistics.getDriverId(), 6, orderLogistics.getId(), 4, money);
                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                driverService.updateById(driver);
            }
            if(orderLogistics.getIsplatPay()==1){
                //添加已收入明细
                Company company = companyService.selectById(orderLogistics.getCompanyId());
                Double speMoney = company.getSpeMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(speMoney);
                    c = new BigDecimal(orderLogistics.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
                }
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    Double price = orderLogistics.getStartMoney() + orderLogistics.getMileageMoney() + orderLogistics.getWaitMoney() + orderLogistics.getDurationMoney() + orderLogistics.getLongDistanceMoney();
                    d = new BigDecimal(price).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(orderLogistics.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
//                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 2, orderPrivateCar.getId(), 1, d.doubleValue());
//                incomeService.saveData(2, orderPrivateCar.getDriverId(), 2, orderPrivateCar.getId(), 1, c.doubleValue());
//                driver.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(orderLogistics.getOrderMoney());
                    settlementDetail.setPrice(d.doubleValue());
                    settlementDetail.setCreateTime(new Date());
                    settlementDetailService.insert(settlementDetail);
                    SettlementAllocation settlementAllocation = settlementAllocationService.selectOne(null);
                    if(null != settlementAllocation){
                        JSONObject jsonObject = JSON.parseObject(settlementAllocation.getContent());
                        Double maxPrice = jsonObject.getDouble("maxPrice");
                        Integer type1 = jsonObject.getInteger("type");
                        if(null != maxPrice){
                            List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driver.getId())
                                    .isNull("settlementRecordId").last(" and DATE_FORMAT(now(), '%Y-%m-%d') = DATE_FORMAT(createTime, '%Y-%m-%d')"));
                            BigDecimal total = new BigDecimal(0);
                            for (SettlementDetail detail : settlementDetailList) {
                                total = total.add(new BigDecimal(detail.getPrice()));
                            }
                            //日结算
                            if(maxPrice.compareTo(total.doubleValue()) <= 0){
                                SettlementRecord settlementRecord = settlementRecordService.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", orderLogistics.getDriverId())
                                        .eq("type", type1).eq("paymentStatus", 1).last(" and day = DATE_FORMAT(now(), '%Y-%m-%d')"));
                                if(null == settlementRecord){
                                    settlementRecord = new SettlementRecord();
                                    settlementRecord.setDay(new Date());
                                    settlementRecord.setDriverId(orderLogistics.getDriverId());
                                    settlementRecord.setType(type1);
                                    settlementRecord.setPaymentStatus(1);
                                    settlementRecord.setPayMoney(total.doubleValue());
                                    settlementRecord.setInsertTime(new Date());
                                    settlementRecordService.insert(settlementRecord);
                                }else{
                                    settlementRecord.setPayMoney(settlementRecord.getPayMoney() + total.doubleValue());
                                    settlementRecordService.updateById(settlementRecord);
                                }
                                for (SettlementDetail detail : settlementDetailList) {
                                    detail.setSettlementRecordId(settlementRecord.getId());
                                    settlementDetailService.updateById(detail);
                                }
                                //强制司机下班
                                DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>()
                                        .eq("driverId", orderLogistics.getDriverId()).eq("state", 1));
                                if(null != driverWork){
                                    driverWork.setEndTime(new Date());
                                    driverWork.setState(2);
                                    driverWorkService.updateById(driverWork);
                                    driver.setState(1);
                                    driverService.updateById(driver);
                                    Car car = carService.selectById(driver.getCarId());
                                    if(!org.apache.shiro.util.StringUtils.hasLength(car.getVehicleId())){
                                        car.setVehicleId(UUIDUtil.getRandomCode());
                                        carService.updateById(car);
                                    }
                                    //司机下班,修改谷歌上的车辆信息
                                    new Thread(()->{
                                        try {
                                            CarModel carModel = carModelMapper.selectById(car.getCarModelId());
                                            String vehicles = fleetEngineUtil.getVehicles(car.getVehicleId());
                                            if(ToolUtil.isEmpty(vehicles)){
                                                fleetEngineUtil.createVehicles(carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                                fleetEngineUtil.updateVehicles("OFFLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                            }else{
                                                fleetEngineUtil.updateVehicles("OFFLINE", carModel.getSeat() - 1, car.getCarLicensePlate(), car.getVehicleId());
                                            }
                                        }catch (Exception e){
                                            e.printStackTrace();
                                        }
                                    }).start();
                                }
                            }
                        }
                    }
                }
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOfflinePayment(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4);
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    Integer language1 = driver.getLanguage();
                    String text = "";
                    switch (language1){
                        case 1:
                            text = "客户已选择支付现金,因此您必须收款。确定您已收到此订单费用:现金GHS " + orderLogistics.getPayMoney();
                            break;
                        case 2:
                            text = "The client chose to pay in cash, so you must collect the payment.Confirm if you received the charge for this order: Cash GHS " + orderLogistics.getPayMoney();
                            break;
                        case 3:
                            text = "Le client a choisi de payer en espèces, vous devez donc encaisser le paiement.Confirmez si vous avez reçu les frais pour cette commande : Espèces GHS " + orderLogistics.getPayMoney();
                            break;
                    }
                    String audioUrl = "";
                    String fileName = "offlinePayment" + orderLogistics.getDriverId() + UUIDUtil.getRandomCode(5) + ".mp3";
                    try {
                        audioUrl = TextToSpeechUtil.create(language1 == 1 ? "cmn-CN" : language1 == 2 ? "en-US" : "fr-FR", text, fileName);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                    //定时任务删除语音文件
                    new Timer().schedule(new TimerTask() {
                        @Override
                        public void run() {
                            try {
                                // 使用Runtime执行命令
                                Process process = Runtime.getRuntime().exec("sudo rm -rf /home/igotechgh/nginx/html/files/audio/" + fileName);
                                // 读取命令的输出
                                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                                String line;
                                while ((line = reader.readLine()) != null) {
                                    System.out.println(line);
                                }
                                // 等待命令执行完成
                                process.waitFor();
                                // 关闭流
                                reader.close();
                            } catch (IOException | InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }, 30000);
                    pushUtil.pushOfflinePayment(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, orderLogistics.getPayMoney(), audioUrl);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成小件物流订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the small parts logistics order payment, thank you for using!" :
                    "Vous avez complété avec succès le paiement de la commande small pieces logistics. Merci d’utiliser!", uid, 1);
            this.pushOrder(orderLogistics);//推单
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单支付,谢谢使用!" : language == 2
                    ? "You've paid for the delivery order successfully, thank you for using I-GO" :
                    "Vous avez payé la commande de livraison avec succès, merci d’utiliser I-GO", uid, 1);
            language = userInfo.getLanguage();
            String payTypeChinese = "";
            String payTypeEnglish = "";
            String payTypeFrench = "";
            if(orderLogistics.getPayType() == 3){
                payTypeChinese = "现金";
                payTypeEnglish = "Cash";
                payTypeFrench = "En espèces";
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath + "user/receiptLogistics.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                Car car = carMapper.selectById(orderLogistics.getCarId());
                Double aDouble = 0D;
                if(null != orderLogistics.getDriverId()){
                    aDouble = orderEvaluateService.queryDriverScore(orderLogistics.getDriverId());
                }
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("包裹收据");
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderLogistics.getPayMoney());
                    Element qbj_chinese = document.getElementById("qbj_chinese");
                    qbj_chinese.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_chinese = document.getElementById("scf_chinese");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_chinese.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_chinese_div = document.getElementById("scf_chinese_div");
                        scf_chinese_div.remove();
                    }
                    Element lcf_chinese = document.getElementById("lcf_chinese");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_chinese_div = document.getElementById("lcf_chinese_div");
                        lcf_chinese_div.remove();
                    }
                    Element ddf_chinese = document.getElementById("ddf_chinese");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_chinese.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_chinese_div = document.getElementById("ddf_chinese_div");
                        ddf_chinese_div.remove();
                    }
                    Element glf_chinese = document.getElementById("glf_chinese");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_chinese.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_chinese_div = document.getElementById("glf_chinese_div");
                        glf_chinese_div.remove();
                    }
                    Element tcf_chinese = document.getElementById("tcf_chinese");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_chinese_div = document.getElementById("tcf_chinese_div");
                        tcf_chinese_div.remove();
                    }
                    Element bcj_chinese = document.getElementById("bcj_chinese");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_chinese_div = document.getElementById("bcj_chinese_div");
                        bcj_chinese_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_chinese = document.getElementById("yhq_chinese");
                        yhq_chinese.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_chinese_div = document.getElementById("yhq_chinese_div");
                        yhq_chinese_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_chinese = document.getElementById("zk_chinese");
                        zk_chinese.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_chinese_div = document.getElementById("zk_chinese_div");
                        zk_chinese_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_chinese = document.getElementById("hb_chinese");
                        hb_chinese.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_chinese_div = document.getElementById("hb_chinese_div");
                        hb_chinese_div.remove();
                    }
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_chinese = document.getElementById("pay_type_chinese");
                    pay_type_chinese.text(payTypeChinese);
                    Element pay_money_chinese = document.getElementById("pay_money_chinese");
                    pay_money_chinese.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_chinese = document.getElementById("dispute_chinese");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_chinese.text("(注意: 争议订单,经过三方协商,平台最终定价为 GHS" + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_chinese.remove();
                    }
                    Element pdf_chinese = document.getElementById("pdf_chinese");
                    pdf_chinese.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_chinese = document.getElementById("lost_item_chinese");
                    lost_item_chinese.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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 start_address_chinese = document.getElementById("start_address_chinese");
                    start_address_chinese.text(orderLogistics.getStartAddress());
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_chinese = document.getElementById("server_tel_chinese");
                    server_tel_chinese.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("Delivery receipt");
                    Element title_english = document.getElementById("title_english");
                    title_english.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                    Element qbj_english = document.getElementById("qbj_english");
                    qbj_english.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_english = document.getElementById("scf_english");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_english.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_english_div = document.getElementById("scf_english_div");
                        scf_english_div.remove();
                    }
                    Element lcf_english = document.getElementById("lcf_english");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_english.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_english_div = document.getElementById("lcf_english_div");
                        lcf_english_div.remove();
                    }
                    Element ddf_english = document.getElementById("ddf_english");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_english.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_english_div = document.getElementById("ddf_english_div");
                        ddf_english_div.remove();
                    }
                    Element glf_english = document.getElementById("glf_english");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_english.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_english_div = document.getElementById("glf_english_div");
                        glf_english_div.remove();
                    }
                    Element tcf_english = document.getElementById("tcf_english");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_english.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_english_div = document.getElementById("tcf_english_div");
                        tcf_english_div.remove();
                    }
                    Element bcj_english = document.getElementById("bcj_english");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_english.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_english_div = document.getElementById("bcj_english_div");
                        bcj_english_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_english = document.getElementById("yhq_english");
                        yhq_english.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_english_div = document.getElementById("yhq_english_div");
                        yhq_english_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_english = document.getElementById("zk_english");
                        zk_english.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_english_div = document.getElementById("zk_english_div");
                        zk_english_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_english = document.getElementById("hb_english");
                        hb_english.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_english_div = document.getElementById("hb_english_div");
                        hb_english_div.remove();
                    }
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_english = document.getElementById("pay_type_english");
                    pay_type_english.text(payTypeEnglish);
                    Element pay_money_english = document.getElementById("pay_money_english");
                    pay_money_english.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_english = document.getElementById("dispute_english");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_english.text("(Note: Disputed order, after tripartite negotiation, the final pricing of the platform is GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_english.remove();
                    }
                    Element pdf_english = document.getElementById("pdf_english");
                    pdf_english.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_english = document.getElementById("lost_item_english");
                    lost_item_english.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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 start_address_english = document.getElementById("start_address_english");
                    start_address_english.text(orderLogistics.getStartAddress());
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_english = document.getElementById("server_tel_english");
                    server_tel_english.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    document.getElementsByTag("title").get(0).text("Reçu de livraison");
                    Element title_french = document.getElementById("title_french");
                    title_french.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande I-GO ");
                    Element qbj_french = document.getElementById("qbj_french");
                    qbj_french.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_french = document.getElementById("scf_french");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_french.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_french_div = document.getElementById("scf_french_div");
                        scf_french_div.remove();
                    }
                    Element lcf_french = document.getElementById("lcf_french");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_french.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_french_div = document.getElementById("lcf_french_div");
                        lcf_french_div.remove();
                    }
                    Element ddf_french = document.getElementById("ddf_french");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_french.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_french_div = document.getElementById("ddf_french_div");
                        ddf_french_div.remove();
                    }
                    Element glf_french = document.getElementById("glf_french");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_french.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_french_div = document.getElementById("glf_french_div");
                        glf_french_div.remove();
                    }
                    Element tcf_french = document.getElementById("tcf_french");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_french.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_french_div = document.getElementById("tcf_french_div");
                        tcf_french_div.remove();
                    }
                    Element bcj_french = document.getElementById("bcj_french");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_french.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_french_div = document.getElementById("bcj_french_div");
                        bcj_french_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_french = document.getElementById("yhq_french");
                        yhq_french.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_french_div = document.getElementById("yhq_french_div");
                        yhq_french_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_french = document.getElementById("zk_french");
                        zk_french.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_french_div = document.getElementById("zk_french_div");
                        zk_french_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_french = document.getElementById("hb_french");
                        hb_french.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_french_div = document.getElementById("hb_french_div");
                        hb_french_div.remove();
                    }
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_french = document.getElementById("pay_type_french");
                    pay_type_french.text(payTypeFrench);
                    Element pay_money_french = document.getElementById("pay_money_french");
                    pay_money_french.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_french = document.getElementById("dispute_french");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_french.text("(Remarque: Il s’agit d’une commande contestée, et après des négociations entre trois parties, la plateforme l’a finalement tarifée à GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_french.remove();
                    }
                    Element pdf_french = document.getElementById("pdf_french");
                    pdf_french.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_french = document.getElementById("lost_item_french");
                    lost_item_french.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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: GS " + car.getCarLicensePlate());
                    Element pf_french = document.getElementById("pf_french");
                    pf_french.text("Note du chauffeur: " + aDouble);
                    Element start_address_french = document.getElementById("start_address_french");
                    start_address_french.text(orderLogistics.getStartAddress());
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_french = document.getElementById("server_tel_french");
                    server_tel_french.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "包裹收据" : language == 2 ? "Delivery receipt" : "Reçu de livraison",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/home/igotechgh/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/home/igotechgh/nginx/html/files/html/parcel_receipt_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/home/igotechgh/nginx/html/files/pdf/parcel_receipt_" + orderId + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                try{
                    FileOutputStream fileOutputStream = new FileOutputStream(file1);
                    HtmlToPdfUtils.convertToPdf("/home/igotechgh/nginx/html/files/html/parcel_receipt_" + orderId + ".html", "I-GO", fileOutputStream);
                }catch (Exception e){
                    e.printStackTrace();
                    System.out.println("html转pdf异常");
                }
                String link ="https://igo.i-go.group/files/html/parcel_receipt_" + orderId + ".html";
                TEmail tEmail = new TEmail();
                tEmail.setLink(link);
                tEmail.setUserId(userInfo.getId());
                tEmail.setType(1);
                tEmail.setName(language == 1 ? "包裹收据" : language == 2 ? "Delivery receipt" : "Reçu de livraison");
                tEmail.setOrderId(orderId);
                tEmail.setCreateTime(new Date());
                int i = cn.hutool.core.date.DateUtil.dayOfWeek(new Date())-1;
                String week = EmailUtil.getWeek(language, i);
                tEmail.setWeek(week);
                boolean am = cn.hutool.core.date.DateUtil.isAM(new Date());
                if(am){
                    tEmail.setAmOrPm(language==1?"上午":language==2?"morning":"matin");
                }else {
                    tEmail.setAmOrPm(language==1?"下午":language==2?"afternoon":"après-midi");
                }
                emailService.insert(tEmail);
            }
        }
        this.updateById(orderLogistics);
@@ -776,8 +2318,8 @@
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderLogisticsSpread");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
            return TinggPayUtil.checkoutRequest(checkoutRequest);
        }
        if(payType == 2){//银行卡支付
@@ -795,14 +2337,14 @@
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderLogisticsSpread");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
            return TinggPayUtil.checkoutRequest(checkoutRequest);
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant");
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
@@ -811,7 +2353,7 @@
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "小件物流补差价", orderMoney, 2, 1, 1, 4, orderId);
            transactionDetailsService.saveData(uid, "包裹补差价", orderMoney, 2, 1, 1, 4, orderId);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(12);//已支付差价
@@ -852,14 +2394,14 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成小件物流订单差价支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the price difference payment of small parts logistics order, thank you for using!"
                    : "Vous avez complété avec succès le paiement de la différence de prix de la commande de petites pièces logistiques, merci d’utiliser!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单差价支付,谢谢使用!" : language == 2
                    ? "You've paid for the difference of delivery order successfully, thank you for using I-GO"
                    : "Vous avez payé la différence de commande de livraison avec succès, merci d’utiliser I-GO", uid, 1);
        }
        if(payType == 4){//现金支付
@@ -867,7 +2409,7 @@
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(uid, "小件物流补差价", orderMoney, 2, 1, 1, 4, orderId);
            transactionDetailsService.saveData(uid, "包裹补差价", orderMoney, 2, 1, 1, 4, orderId);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(12);//已支付差价
@@ -880,43 +2422,44 @@
            orderLogisticsSpreadService.updateById(orderLogisticsSpread);
            //添加已收入明细
            Company company = companyService.selectById(orderLogistics.getCompanyId());
            Double speMoney =  orderLogistics.getType() == 4 ? company.getSameLogisticsMoney() : company.getCrossLogisticsMoney();
            BigDecimal d = null;
            BigDecimal c = null;
            if(company.getIsSpeFixedOrProportional() == 2){//固定
                d = new BigDecimal(speMoney);
                c = new BigDecimal(orderMoney).subtract(d);
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                d = new BigDecimal(orderMoney).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                c = new BigDecimal(orderMoney).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
            }
            Income income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 1).eq("objectId", orderLogistics.getCompanyId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
            income.setMoney(income.getMoney() + d.doubleValue());
            incomeService.updateById(income);
            income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", orderLogistics.getCompanyId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
            income.setMoney(income.getMoney() + c.doubleValue());
            incomeService.updateById(income);
            Driver driver = driverService.selectById(orderLogistics.getDriverId());
            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            driverService.updateById(driver);
//            Company company = companyService.selectById(orderLogistics.getCompanyId());
//            Double speMoney =  orderLogistics.getType() == 4 ? company.getSameLogisticsMoney() : company.getCrossLogisticsMoney();
//            BigDecimal d = BigDecimal.ZERO;
//            BigDecimal c = BigDecimal.ZERO;
//            if(company.getIsSpeFixedOrProportional() == 2){//固定
//                d = new BigDecimal(speMoney);
//                c = new BigDecimal(orderMoney).subtract(d);
//            }
//            if(company.getIsSpeFixedOrProportional() == 1){//比例
//                d = new BigDecimal(orderMoney).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
//                c = new BigDecimal(orderMoney).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
//            }
//
//            Income income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 1).eq("objectId", orderLogistics.getCompanyId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
//            income.setMoney(income.getMoney() + d.doubleValue());
//            incomeService.updateById(income);
//            income = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", orderLogistics.getCompanyId()).eq("type", 2).eq("incomeId", orderLogistics.getId()).eq("orderType", orderLogistics.getType()));
//            System.out.println("小件物流补差价income======"+income);
//            income.setMoney(income.getMoney() + c.doubleValue());
//            incomeService.updateById(income);
//            Driver driver = driverService.selectById(orderLogistics.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);
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成小件物流订单差价支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the price difference payment of small parts logistics order, thank you for using!"
                    : "Vous avez complété avec succès le paiement de la différence de prix de la commande de petites pièces logistiques, merci d’utiliser!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单差价支付,谢谢使用!" : language == 2
                    ? "You've paid for the difference of delivery order successfully, thank you for using I-GO"
                    : "Vous avez payé la différence de commande de livraison avec succès, merci d’utiliser I-GO", uid, 1);
        }
@@ -933,7 +2476,7 @@
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, orderLogistics.getType(), query.getOrderId());
            orderLogistics.setState(1);//先支付后抢单
            orderLogistics.setState(8);
            orderLogistics.setPayType(query.getPayType());
            orderLogistics.setPayMoney(query.getAmount());
            this.updateById(orderLogistics);
@@ -943,95 +2486,434 @@
            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
            userInfoService.updateById(userInfo);
            //处理优惠券和红包
            if(null != orderLogistics.getCouponId()){
                UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderLogistics.getCouponId());
                userCouponRecord.setState(2);
                userCouponRecord.setEndTime(new Date());
                userCouponRecordService.updateById(userCouponRecord);
            }
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath + "user/receiptLogistics.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");
                if(1 == language){
                    document.getElementById("english").attr("style", "display: none;");
                    document.getElementById("french").attr("style", "display: none;");
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(sdf.format(orderLogistics.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderLogistics.getPayMoney());
                    Element xcf_chinese = document.getElementById("xcf_chinese");
                    xcf_chinese.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_chinese = document.getElementById("start_address_chinese");
                    start_address_chinese.text(orderLogistics.getStartAddress());
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderLogistics.getEndAddress());
                }
                if(2 == language){
                    document.getElementById("chinese").attr("style", "display: none;");
                    document.getElementById("french").attr("style", "display: none;");
                    Element title_english = document.getElementById("title_english");
                    title_english.text(sdf.format(orderLogistics.getTravelTime()) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                    Element xcf_english = document.getElementById("xcf_english");
                    xcf_english.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_english = document.getElementById("start_address_english");
                    start_address_english.text(orderLogistics.getStartAddress());
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderLogistics.getEndAddress());
                }
                if(3 == language){
                    document.getElementById("chinese").attr("style", "display: none;");
                    document.getElementById("english").attr("style", "display: none;");
                    Element title_french = document.getElementById("title_french");
                    title_french.text(sdf.format(orderLogistics.getTravelTime()) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
                    Element xcf_french = document.getElementById("xcf_french");
                    xcf_french.text("GHS " + orderLogistics.getOrderMoney());
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + orderLogistics.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 " + orderLogistics.getPayMoney());
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(sdf1.format(orderLogistics.getTravelTime()));
                    Element start_address_french = document.getElementById("start_address_french");
                    start_address_french.text(orderLogistics.getStartAddress());
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderLogistics.getEndAddress());
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "市内小件物流收据" : language == 2 ? "Reset password" : "Réinitialiser le mot de passe",  document.html());
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成小件物流订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the small parts logistics order payment, thank you for using!" :
                    "Vous avez complété avec succès le paiement de la commande small pieces logistics. Merci d’utiliser!", orderLogistics.getUserId(), 1);
            this.pushOrder(orderLogistics);//推单
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单支付,谢谢使用!" : language == 2
                    ? "You've paid for the delivery order successfully, thank you for using I-GO" :
                    "Vous avez payé la commande de livraison avec succès, merci d’utiliser I-GO", orderLogistics.getUserId(), 1);
            language = userInfo.getLanguage();
            String payTypeChinese = "";
            String payTypeEnglish = "";
            String payTypeFrench = "";
            if(orderLogistics.getPayType() == 1){
                payTypeChinese = "手机支付";
                payTypeEnglish = "Mobile money";
                payTypeFrench = "Argent mobile";
            }
            if(orderLogistics.getPayType() == 2){
                payTypeChinese = "银行卡支付";
                payTypeEnglish = "Bank card";
                payTypeFrench = "Carte bancaire";
            }
            if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                String path = templatePath + "user/receiptLogistics.html";
                Document document = Jsoup.parse(new File(path), "UTF-8");
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
                SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                Driver driver = driverService.selectById(orderLogistics.getDriverId());
                Car car = carMapper.selectById(orderLogistics.getCarId());
                Double aDouble = 0D;
                if(null != orderLogistics.getDriverId()){
                    aDouble = orderEvaluateService.queryDriverScore(orderLogistics.getDriverId());
                }
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("包裹收据");
                    Element title_chinese = document.getElementById("title_chinese");
                    title_chinese.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",您在I-GO此订单消费GHS " + orderLogistics.getPayMoney());
                    Element qbj_chinese = document.getElementById("qbj_chinese");
                    qbj_chinese.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_chinese = document.getElementById("scf_chinese");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_chinese.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_chinese_div = document.getElementById("scf_chinese_div");
                        scf_chinese_div.remove();
                    }
                    Element lcf_chinese = document.getElementById("lcf_chinese");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_chinese_div = document.getElementById("lcf_chinese_div");
                        lcf_chinese_div.remove();
                    }
                    Element ddf_chinese = document.getElementById("ddf_chinese");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_chinese.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_chinese_div = document.getElementById("ddf_chinese_div");
                        ddf_chinese_div.remove();
                    }
                    Element glf_chinese = document.getElementById("glf_chinese");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_chinese.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_chinese_div = document.getElementById("glf_chinese_div");
                        glf_chinese_div.remove();
                    }
                    Element tcf_chinese = document.getElementById("tcf_chinese");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_chinese.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_chinese_div = document.getElementById("tcf_chinese_div");
                        tcf_chinese_div.remove();
                    }
                    Element bcj_chinese = document.getElementById("bcj_chinese");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_chinese_div = document.getElementById("bcj_chinese_div");
                        bcj_chinese_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_chinese = document.getElementById("yhq_chinese");
                        yhq_chinese.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_chinese_div = document.getElementById("yhq_chinese_div");
                        yhq_chinese_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_chinese = document.getElementById("zk_chinese");
                        zk_chinese.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_chinese_div = document.getElementById("zk_chinese_div");
                        zk_chinese_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_chinese = document.getElementById("hb_chinese");
                        hb_chinese.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_chinese_div = document.getElementById("hb_chinese_div");
                        hb_chinese_div.remove();
                    }
                    Element xj_chinese = document.getElementById("xj_chinese");
                    xj_chinese.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_chinese = document.getElementById("pay_type_chinese");
                    pay_type_chinese.text(payTypeChinese);
                    Element pay_money_chinese = document.getElementById("pay_money_chinese");
                    pay_money_chinese.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_chinese = document.getElementById("dispute_chinese");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_chinese.text("(注意: 争议订单,经过三方协商,平台最终定价为 GHS" + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_chinese.remove();
                    }
                    Element pdf_chinese = document.getElementById("pdf_chinese");
                    pdf_chinese.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=4");
                    Element lost_item_chinese = document.getElementById("lost_item_chinese");
                    lost_item_chinese.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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 start_address_chinese = document.getElementById("start_address_chinese");
                    start_address_chinese.text(orderLogistics.getStartAddress());
                    Element end_address_chinese = document.getElementById("end_address_chinese");
                    end_address_chinese.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_chinese = document.getElementById("server_tel_chinese");
                    server_tel_chinese.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("Delivery receipt");
                    Element title_english = document.getElementById("title_english");
                    title_english.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                    Element qbj_english = document.getElementById("qbj_english");
                    qbj_english.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_english = document.getElementById("scf_english");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_english.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_english_div = document.getElementById("scf_english_div");
                        scf_english_div.remove();
                    }
                    Element lcf_english = document.getElementById("lcf_english");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_english.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_english_div = document.getElementById("lcf_english_div");
                        lcf_english_div.remove();
                    }
                    Element ddf_english = document.getElementById("ddf_english");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_english.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_english_div = document.getElementById("ddf_english_div");
                        ddf_english_div.remove();
                    }
                    Element glf_english = document.getElementById("glf_english");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_english.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_english_div = document.getElementById("glf_english_div");
                        glf_english_div.remove();
                    }
                    Element tcf_english = document.getElementById("tcf_english");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_english.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_english_div = document.getElementById("tcf_english_div");
                        tcf_english_div.remove();
                    }
                    Element bcj_english = document.getElementById("bcj_english");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_english.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_english_div = document.getElementById("bcj_english_div");
                        bcj_english_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_english = document.getElementById("yhq_english");
                        yhq_english.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_english_div = document.getElementById("yhq_english_div");
                        yhq_english_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_english = document.getElementById("zk_english");
                        zk_english.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_english_div = document.getElementById("zk_english_div");
                        zk_english_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_english = document.getElementById("hb_english");
                        hb_english.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_english_div = document.getElementById("hb_english_div");
                        hb_english_div.remove();
                    }
                    Element xj_english = document.getElementById("xj_english");
                    xj_english.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_english = document.getElementById("pay_type_english");
                    pay_type_english.text(payTypeEnglish);
                    Element pay_money_english = document.getElementById("pay_money_english");
                    pay_money_english.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_english = document.getElementById("dispute_english");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_english.text("(Note: Disputed order, after tripartite negotiation, the final pricing of the platform is GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_english.remove();
                    }
                    Element pdf_english = document.getElementById("pdf_english");
                    pdf_english.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=4");
                    Element lost_item_english = document.getElementById("lost_item_english");
                    lost_item_english.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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 start_address_english = document.getElementById("start_address_english");
                    start_address_english.text(orderLogistics.getStartAddress());
                    Element end_address_english = document.getElementById("end_address_english");
                    end_address_english.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_english = document.getElementById("server_tel_english");
                    server_tel_english.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    document.getElementsByTag("title").get(0).text("Reçu de livraison");
                    Element title_french = document.getElementById("title_french");
                    title_french.text(DateUtil.conversionFormat(language, sdf2.format(orderLogistics.getTravelTime())) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande I-GO ");
                    Element qbj_french = document.getElementById("qbj_french");
                    qbj_french.text("GHS " + new BigDecimal(orderLogistics.getStartMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element scf_french = document.getElementById("scf_french");
                    if(null != orderLogistics.getDurationMoney() && orderLogistics.getDurationMoney() > 0){
                        scf_french.text("GHS " + new BigDecimal(orderLogistics.getDurationMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element scf_french_div = document.getElementById("scf_french_div");
                        scf_french_div.remove();
                    }
                    Element lcf_french = document.getElementById("lcf_french");
                    if(null != orderLogistics.getMileageMoney() && orderLogistics.getMileageMoney() > 0){
                        lcf_french.text("GHS " + new BigDecimal(orderLogistics.getMileageMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element lcf_french_div = document.getElementById("lcf_french_div");
                        lcf_french_div.remove();
                    }
                    Element ddf_french = document.getElementById("ddf_french");
                    if(null != orderLogistics.getWaitMoney() && orderLogistics.getWaitMoney() > 0){
                        ddf_french.text("GHS " + new BigDecimal(orderLogistics.getWaitMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element ddf_french_div = document.getElementById("ddf_french_div");
                        ddf_french_div.remove();
                    }
                    Element glf_french = document.getElementById("glf_french");
                    if(null != orderLogistics.getRoadTollMoney() && orderLogistics.getRoadTollMoney() > 0){
                        glf_french.text("GHS " + new BigDecimal(orderLogistics.getRoadTollMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element glf_french_div = document.getElementById("glf_french_div");
                        glf_french_div.remove();
                    }
                    Element tcf_french = document.getElementById("tcf_french");
                    if(null != orderLogistics.getParkMoney() && orderLogistics.getParkMoney() > 0){
                        tcf_french.text("GHS " + new BigDecimal(orderLogistics.getParkMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element tcf_french_div = document.getElementById("tcf_french_div");
                        tcf_french_div.remove();
                    }
                    Element bcj_french = document.getElementById("bcj_french");
                    if(null != orderLogistics.getPriceDifference() && orderLogistics.getPriceDifference() > 0){
                        bcj_french.text("GHS " + new BigDecimal(orderLogistics.getPriceDifference()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element bcj_french_div = document.getElementById("bcj_french_div");
                        bcj_french_div.remove();
                    }
                    if(null != orderLogistics.getCouponMoney() && orderLogistics.getCouponMoney() > 0){
                        Element yhq_french = document.getElementById("yhq_french");
                        yhq_french.text("GHS -" + new BigDecimal(orderLogistics.getCouponMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element yhq_french_div = document.getElementById("yhq_french_div");
                        yhq_french_div.remove();
                    }
                    if(null != orderLogistics.getDiscountMoney() && orderLogistics.getDiscountMoney() > 0){
                        Element zk_french = document.getElementById("zk_french");
                        zk_french.text("GHS -" + new BigDecimal(orderLogistics.getDiscountMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element zk_french_div = document.getElementById("zk_french_div");
                        zk_french_div.remove();
                    }
                    if(null != orderLogistics.getRedPacketMoney() && orderLogistics.getRedPacketMoney() > 0){
                        Element hb_french = document.getElementById("hb_french");
                        hb_french.text("GHS -" + new BigDecimal(orderLogistics.getRedPacketMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    }else{
                        Element hb_french_div = document.getElementById("hb_french_div");
                        hb_french_div.remove();
                    }
                    Element xj_french = document.getElementById("xj_french");
                    xj_french.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element pay_type_french = document.getElementById("pay_type_french");
                    pay_type_french.text(payTypeFrench);
                    Element pay_money_french = document.getElementById("pay_money_french");
                    pay_money_french.text("GHS " + new BigDecimal(orderLogistics.getPayMoney()).setScale(2, RoundingMode.HALF_EVEN));
                    Element dispute_french = document.getElementById("dispute_french");
                    if(null != orderLogistics.getIsDispute() && orderLogistics.getIsDispute() == 1){
                        dispute_french.text("(Remarque: Il s’agit d’une commande contestée, et après des négociations entre trois parties, la plateforme l’a finalement tarifée à GHS " + new BigDecimal(orderLogistics.getOrderMoney()).setScale(2, RoundingMode.HALF_EVEN) + ")");
                    }else{
                        dispute_french.remove();
                    }
                    Element pdf_french = document.getElementById("pdf_french");
                    pdf_french.attr("href", "https://igo.i-go.group/user/base/order/uploadReceiptPdf?orderId=" + id + "&orderType=4");
                    Element lost_item_french = document.getElementById("lost_item_french");
                    lost_item_french.attr("href", "https://igo.i-go.group/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + id + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "https://igo.i-go.group/mailbox/user/location.html");
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(DateUtil.conversionFormat(language, sdf1.format(orderLogistics.getTravelTime())));
                    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: GS " + car.getCarLicensePlate());
                    Element pf_french = document.getElementById("pf_french");
                    pf_french.text("Note du chauffeur: " + aDouble);
                    Element start_address_french = document.getElementById("start_address_french");
                    start_address_french.text(orderLogistics.getStartAddress());
                    Element end_address_french = document.getElementById("end_address_french");
                    end_address_french.text(orderLogistics.getEndAddress());
                    Phone phone = phoneService.selectOne(new EntityWrapper<Phone>().eq("type", 2).eq("companyId", driver.getCompanyId()));
                    Element server_tel_french = document.getElementById("server_tel_french");
                    server_tel_french.attr("href", "tel:" + (null != phone ? phone.getPhone() : ""));
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "包裹收据" : language == 2 ? "Delivery receipt" : "Reçu de livraison",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/home/igotechgh/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/home/igotechgh/nginx/html/files/html/parcel_receipt_" + id + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                File file1 = new File("/home/igotechgh/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/home/igotechgh/nginx/html/files/pdf/parcel_receipt_" + id + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                try{
                    FileOutputStream fileOutputStream = new FileOutputStream(file1);
                    HtmlToPdfUtils.convertToPdf("/home/igotechgh/nginx/html/files/html/parcel_receipt_" + id + ".html", "I-GO", fileOutputStream);
                }catch (Exception e){
                    e.printStackTrace();
                    System.out.println("html转pdf异常");
                }
                String link ="https://igo.i-go.group/files/html/parcel_receipt_" + id + ".html";
                TEmail tEmail = new TEmail();
                tEmail.setLink(link);
                tEmail.setUserId(userInfo.getId());
                tEmail.setType(1);
                tEmail.setName(language == 1 ? "包裹收据" : language == 2 ? "Delivery receipt" : "Reçu de livraison");
                tEmail.setOrderId(id);
                tEmail.setCreateTime(new Date());
                int i = cn.hutool.core.date.DateUtil.dayOfWeek(new Date())-1;
                String week = EmailUtil.getWeek(language, i);
                tEmail.setWeek(week);
                boolean am = cn.hutool.core.date.DateUtil.isAM(new Date());
                if(am){
                    tEmail.setAmOrPm(language==1?"上午":language==2?"morning":"matin");
                }else {
                    tEmail.setAmOrPm(language==1?"下午":language==2?"afternoon":"après-midi");
                }
                emailService.insert(tEmail);
            }
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
@@ -1061,7 +2943,7 @@
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流补差价", orderMoney, 2, 1, 1, 4, id);
            transactionDetailsService.saveData(orderLogistics.getUserId(), "包裹补差价", orderMoney, 2, 1, 1, 4, id);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(12);//已支付差价
@@ -1097,14 +2979,14 @@
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0, "");
                }
            }).start();
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成小件物流订单差价支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the price difference payment of small parts logistics order, thank you for using!"
                    : "Vous avez complété avec succès le paiement de la différence de prix de la commande de petites pièces logistiques, merci d’utiliser!", orderLogistics.getUserId(), 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单差价支付,谢谢使用!" : language == 2
                    ? "You've paid for the difference of delivery order successfully, thank you for using I-GO"
                    : "Vous avez payé la différence de commande de livraison avec succès, merci d’utiliser I-GO", orderLogistics.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
@@ -1135,9 +3017,61 @@
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size) throws Exception {
    public List<Map<String, Object>> queryMyOrderList(Integer uid, Integer pageNum, Integer size, Integer language) throws Exception {
        pageNum = (pageNum - 1) * size;
        List<Map<String, Object>> maps = orderLogisticsMapper.queryMyOrderList(uid, pageNum, size);
        List<Map<String, Object>> maps = orderLogisticsMapper.queryMyOrderList(uid, pageNum, size, language);
        for (Map<String, Object> map : maps) {
            if(null != map.get("orderTime")){
                String orderTime = map.get("orderTime").toString();
                map.put("orderTime", DateUtil.conversionFormat(language, orderTime));
            }
            if(null != map.get("time")){
                String time = map.get("time").toString();
                map.put("time", DateUtil.conversionFormat(language, time));
            }
            Integer orderId = Integer.valueOf(String.valueOf(map.get("orderId")));
            Integer state = Integer.valueOf(String.valueOf(map.get("state")));
            if(state == 6){
                map.put("receipt", "https://igo.i-go.group/files/html/parcel_receipt_" + orderId + ".html");
            }else{
                map.put("receipt", "");
            }
            if(state == 7){
                Double discountMoney = 0D;
                OrderLogistics orderLogistics = this.selectById(orderId);
                UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(Integer.valueOf(String.valueOf(map.get("companyId"))));
                if(null != query2){
                    Integer orderNum=this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId",orderLogistics.getUserId()).eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
                    if(query2.getDistance()*1000>orderLogistics.getMileage() && query2.getOrderNum()>orderNum){
                        Double special = query2.getLogistics();
                        Double orderMoney = orderLogistics.getOrderMoney();
                        double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                        if(orderMoney.compareTo(v) > 0){
                            discountMoney = orderMoney - v;
                        }
                    }
                }
                Double orderMoney = Double.valueOf(map.get("orderMoney").toString());
                map.put("orderMoney", orderMoney - discountMoney);
            }
            OrderLogistics orderLogistics = this.selectById(orderId);
            map.put("driverTimeOutTime", 0);
            map.put("driverTimeOut", 0);
            if(null != orderLogistics.getEstimateArriveTime()){
                CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", orderLogistics.getCompanyId()));
                JSONObject jsonObject = JSON.parseObject(cancleOrder.getContent());
                int driverTimeout1 = jsonObject.getIntValue("driverTimeout");
                long time = orderLogistics.getEstimateArriveTime().getTime() + driverTimeout1 * 60000;
                if(System.currentTimeMillis() > time){
                    Integer driverTimeOutTime = Double.valueOf((System.currentTimeMillis() - time) / 60000).intValue();
                    driverTimeOutTime = driverTimeOutTime == 0 ? 1 : driverTimeOutTime;
                    map.put("driverTimeOutTime", driverTimeOutTime);
                    map.put("driverTimeOut", 1);
                }
            }
        }
        return maps;
    }
@@ -1148,22 +3082,37 @@
     * @return
     */
    @Override
    public List<Map<String, Object>> queryMyTravelRecord(Integer uid) {
        return orderLogisticsMapper.queryMyTravelRecord(uid);
    public List<Map<String, Object>> queryMyTravelRecord(Integer language, Integer uid) {
        List<Map<String, Object>> list = orderLogisticsMapper.queryMyTravelRecord(uid);
        for (Map<String, Object> map : list) {
            if(null != map.get("time")){
                String time = map.get("time").toString();
                map.put("time", DateUtil.conversionFormat(language, time));
            }
        }
        return list;
    }
    @Override
    public List<Map<String, Object>> queryInvoiceOrder(Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid, Integer orderType) throws Exception {
    public List<Map<String, Object>> queryInvoiceOrder(Integer language, Integer type, Date startTime, Date endTime, Double startMoney, Double endMoney, Integer uid, Integer orderType) throws Exception {
        startTime = dateUtil.getStartOrEndDate(startTime, "start");
        endTime = dateUtil.getStartOrEndDate(endTime, "end");
        return orderLogisticsMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
        List<Map<String, Object>> list = orderLogisticsMapper.queryInvoiceOrder(type, startTime, endTime, startMoney, endMoney, uid, orderType);
        for (Map<String, Object> map : list) {
            map.put("orderName", language == 1 ? "包裹订单" : language == 2 ? "Delivery" : "Livraison");
            if(null != map.get("time")){
                String time = map.get("time").toString();
                map.put("time", DateUtil.conversionFormat(language, time));
            }
        }
        return list;
    }
    @Override
    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid, Integer language) throws Exception {
    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid, Double lon, Double lat, String address, Integer language) throws Exception {
        if(ToolUtil.isNotEmpty(remark)){
            if(ToolUtil.isNotEmpty(remark)){
                List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
@@ -1177,119 +3126,84 @@
        OrderLogistics orderLogistics = this.selectById(id);
        Integer integer = null;
        if(null == orderLogistics){
            return ResultUtil.error(language == 1 ? "取消订单失败,订单信息有误" : language == 2 ? "Failed to cancel the order, the order information is incorrect" : "Échec de l'annulation de la commande, les informations de la commande sont incorrectes");
            return ResultUtil.error(language == 1 ? "取消订单失败,订单信息有误" : language == 2 ? "Failed to cancel order, order-information error." : "Échec de l’annulation de la commande, erreur d’information de commande.");
        }
        if(orderLogistics.getState() > 5 && orderLogistics.getState() != 7 && orderLogistics.getState() != 11){
            return ResultUtil.error(language == 1 ? "取消订单失败,不合法的操作" : language == 2 ? "Cancel order failed, illegal operation" : "Échec de l'annulation de la commande, opération illégale");
        if(orderLogistics.getState() > 5 && orderLogistics.getState() != 11 && orderLogistics.getState() != 12){
            return ResultUtil.error(language == 1 ? "取消订单失败,不合法的操作" : language == 2 ? "Failed to cancel order, illegal operation." : "Échec de l’annulation de la commande, opération illégale.");
        }
        if(orderLogistics.getState() == 7){
            OrderCancel orderCancel = new OrderCancel();
            orderCancel.setOrderId(id);
            orderCancel.setOrderType(orderLogistics.getType());
            orderCancel.setReason(reason);
            orderCancel.setRemark(remark);
            orderCancel.setState(2);
            orderCancel.setInsertTime(new Date());
            orderCancel.setUserType(1);
            orderCancelService.insert(orderCancel);
        if(null == orderLogistics.getDriverId()){//没有接单的情况
            integer = orderCancelService.saveData(id, 4, language == 1 ? "无司机接单" : language == 2 ? "No driver to take orders" : "Pas de chauffeur pour prendre les commandes", language == 1 ? "无司机接单" : language == 2 ? "No driver to take orders" : "Pas de chauffeur pour prendre les commandes", null, null, 2, 1, uid);
            orderLogistics.setState(10);
            this.updateById(orderLogistics);
            return ResultUtil.success();
        }
        //回退支付金额
        if(null != orderLogistics.getPayType() && orderLogistics.getPayType() == 1) {//微信
            OrderCancel orderCancel = new OrderCancel();
            orderCancel.setOrderId(id);
            orderCancel.setOrderType(orderLogistics.getType());
            orderCancel.setReason(reason);
            orderCancel.setRemark(remark);
            orderCancel.setState(1);
            orderCancel.setInsertTime(new Date());
            orderCancel.setUserType(1);
            orderCancelService.insert(orderCancel);
            orderLogistics.setState(10);
            this.updateById(orderLogistics);
            //调用回退接口
            PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, orderLogistics.getId(), orderLogistics.getType(), 1, 2);
            UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String payerTransactionID = sdf.format(new Date()) + orderCancel.getId();
            PayoutResponse payoutResponse = tinggPayoutUtil.sendPayout(userInfo.getPhoneOperator(), "+" + userInfo.getPhone(), payerTransactionID, query.getAmount().doubleValue(), callbackPath + "/base/orderCancelRefundCallback", "取消订单退款");
            AuthStatus authStatus = payoutResponse.getAuthStatus();
            Results results = payoutResponse.getResults().get(0);
            String statusCode = results.getStatusCode();
            if(!"131".equals(authStatus.getAuthStatusCode())){
                return ResultUtil.error(authStatus.getAuthStatusDescription());
        }else {
            BaseWarpper data = queryCancleAmount(id, language).getData();
            Double amount = data.getAmount();
            if(0 == amount){
                integer = orderCancelService.saveData(id, 4, reason, remark, null, null, 2, 1, uid);
                if(5 == orderLogistics.getState()){
                    orderLogistics.setState(6);
                    orderLogistics.setGetoffLon(lon);
                    orderLogistics.setGetoffLat(lat);
                    orderLogistics.setGetoffAddress(address);
                    orderLogistics.setGetoffTime(new Date());
                    orderLogistics.setEndServiceTime(new Date());
                    orderLogistics.setCancelMidway(1);
                }else{
                    orderLogistics.setState(10);
                }
                this.updateById(orderLogistics);
            }else{
                if(5 == orderLogistics.getState()){
                    orderLogistics.setGetoffLon(lon);
                    orderLogistics.setGetoffLat(lat);
                    orderLogistics.setGetoffAddress(address);
                    orderLogistics.setGetoffTime(new Date());
                    orderLogistics.setEndServiceTime(new Date());
                    orderLogistics.setCancelMidway(1);
                }
                orderLogistics.setOldState(orderLogistics.getState());
                orderLogistics.setState(12);
                this.updateById(orderLogistics);
                integer = orderCancelService.saveData(id, 4, reason, remark, null, amount, 1, 1, uid);
            }
            if(!"139".equals(statusCode)){
                return ResultUtil.error(results.getStatusDescription());
            }
        }
        if(null != orderLogistics.getPayType() && orderLogistics.getPayType() == 2){//支付宝
            OrderCancel orderCancel = new OrderCancel();
            orderCancel.setOrderId(id);
            orderCancel.setOrderType(orderLogistics.getType());
            orderCancel.setReason(reason);
            orderCancel.setRemark(remark);
            orderCancel.setState(1);
            orderCancel.setInsertTime(new Date());
            orderCancel.setUserType(1);
            orderCancelService.insert(orderCancel);
            orderLogistics.setState(10);
            this.updateById(orderLogistics);
            integer = orderCancel.getId();
            //调用回退接口
            PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, orderLogistics.getId(), orderLogistics.getType(), 1, 2);
            UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String payerTransactionID = sdf.format(new Date()) + orderCancel.getId();
            PayoutResponse payoutResponse = tinggPayoutUtil.sendPayout(userInfo.getPhoneOperator(), "+" + userInfo.getPhone(), payerTransactionID, query.getAmount().doubleValue(), callbackPath + "/base/orderCancelRefundCallback", "取消订单退款");
            AuthStatus authStatus = payoutResponse.getAuthStatus();
            Results results = payoutResponse.getResults().get(0);
            String statusCode = results.getStatusCode();
            if(!"131".equals(authStatus.getAuthStatusCode())){
                return ResultUtil.error(authStatus.getAuthStatusDescription());
            }
            if(!"139".equals(statusCode)){
                return ResultUtil.error(results.getStatusDescription());
            }
        }
        if(null != orderLogistics.getPayType() && orderLogistics.getPayType() == 3){//余额
            UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
            userInfo.setBalance(userInfo.getBalance() + orderLogistics.getPayMoney());
            OrderCancel orderCancel = new OrderCancel();
            orderCancel.setOrderId(id);
            orderCancel.setOrderType(orderLogistics.getType());
            orderCancel.setReason(reason);
            orderCancel.setRemark(remark);
            orderCancel.setState(2);
            orderCancel.setInsertTime(new Date());
            orderCancel.setUserType(1);
            orderCancelService.insert(orderCancel);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(10);
            this.updateById(orderLogistics);
            integer = orderCancel.getId();
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流取消退款", orderLogistics.getPayMoney(), 1, 1, 1, 4, orderLogistics.getId());
        }
        if(null != orderLogistics.getDriverId()){
            this.deleteTask(id);//删除定时任务
            //修改司机为空闲
            Driver driver = driverService.selectById(orderLogistics.getDriverId());
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    Integer language1 = driver.getLanguage();
                    String audioUrl = "";
                    switch (language1){
                        case 1:
                            audioUrl = "https://igo.i-go.group/files/audio/system/UserCancelledOrder-CN.mp3";
                            break;
                        case 2:
                            audioUrl = "https://igo.i-go.group/files/audio/system/UserCancelledOrder-EN.mp3";
                            break;
                        case 3:
                            audioUrl = "https://igo.i-go.group/files/audio/system/UserCancelledOrder-FR.mp3";
                            break;
                    }
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), 4, orderLogistics.getState(), 0, "");
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, orderLogistics.getState() == 12 ? orderLogistics.getState() : 10, 0, audioUrl);
                }
            }).start();
            driver.setState(2);
            driverService.updateById(driver);
        }
        if((orderLogistics.getState() == 10 || orderLogistics.getState() == 12) && null != orderLogistics.getDriverId()){
            //修改行程信息
            fleetEngineUtil.updateTrip("CANCELED", null, null, orderLogistics.getTripId(), null, null, null, null);
        }
        //添加消息
        systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功取消小件物流订单,谢谢使用!" : language == 2 ? "You have successfully cancelled the small logistics order, thank you for using" : "Vous avez annulé avec succès la petite commande logistique, merci d'utiliser", orderLogistics.getUserId(), 1);
        systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功取消包裹订单,谢谢使用!" : language == 2 ? "You've cancelled the delivery order successfully, thank you for using I-GO "
                : "Vous avez annulé la commande de livraison avec succès, merci d’utiliser I-GO", orderLogistics.getUserId(), 1);
        Map<String, Object> map = new HashMap<>();
        map.put("id", integer);
        return ResultUtil.success(map);
@@ -1344,29 +3258,94 @@
        Map<String, Object> map = new HashMap<>();
        UserInfo userInfo = userInfoService.selectById(uid);
        map.put("balance", userInfo.getBalance());
        map.put("coupon", 0);
        OrderLogistics orderLogistics = this.selectById(orderId);
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderLogistics.getCompanyId());
        double v = orderLogistics.getOrderMoney();
        if(null != query2){
            Integer orderNum=this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId",orderLogistics.getUserId()).eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
            if(query2.getDistance()*1000>orderLogistics.getMileage() && query2.getOrderNum()>orderNum){
                Double special = query2.getSpecial();
                orderLogistics.setDiscount(special);
                Double orderMoney = orderLogistics.getOrderMoney();
                v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            }
        }
        int i = userCouponRecordService.queryAvailable(uid, orderLogistics.getCompanyId(), 1, 4, v);
        i = i + userCouponRecordService.queryAvailable(uid, orderLogistics.getCompanyId(), 1, 0, v);
        map.put("coupon", i);
        return map;
    }
    @Override
    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
    public Map<String, Object> queryOrderInfo(Integer language, Integer orderId) throws Exception {
        Map<String, Object> map = orderLogisticsMapper.queryOrderInfo(orderId);
        if(null != map.get("travelTime")){
            String travelTime = map.get("travelTime").toString();
            map.put("travelTime", DateUtil.conversionFormat1(language, travelTime));
        }
        Integer state = Integer.valueOf(String.valueOf(map.get("state")));
        OrderLogistics orderLogistics = this.selectById(orderId);
        if(null != map.get("reassignNotice") && Integer.valueOf(String.valueOf(map.get("reassignNotice"))) == 2){//改派完成,重新获取了新的司机数据,开始修改数据防止继续调用
            orderLogistics.setReassignNotice(0);
            this.updateById(orderLogistics);
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) == 11){
        if(state == 11){
            map.put("state", map.get("oldState"));
        }
        Map<String, String> geocode = gdMapGeocodingUtil.geocode(map.get("startLon").toString(), map.get("startLat").toString());
        map.put("startCity", geocode.get("city"));
        geocode = gdMapGeocodingUtil.geocode(map.get("endLon").toString(), map.get("endLat").toString());
        map.put("endCity", geocode.get("city"));
        if(state == 12){
            OrderCancel query = orderCancelService.query(orderId, 4, null, null, 1);
            map.put("cancelPayMoney", null == query ? 0 : query.getMoney());
            map.put("cancelMoney", null == query ? 0 : query.getMoney());
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) != 8 && Integer.valueOf(String.valueOf(map.get("state"))) != 9){
            map.put("redPacketMoney", null);
            map.put("couponMoney", null);
        }
        if(Integer.valueOf(String.valueOf(map.get("state"))) == 7){
            UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(Integer.valueOf(String.valueOf(map.get("companyId"))));
            if(null != query2){
                Integer orderNum=this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId",orderLogistics.getUserId()).eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
                if(query2.getDistance()*1000>orderLogistics.getMileage() && query2.getOrderNum()>orderNum){
                    Double special = query2.getLogistics();
                    map.put("discount", special);
                    orderLogistics.setDiscount(special);
                    Double orderMoney = orderLogistics.getOrderMoney();
                    double v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
                    if(orderMoney.compareTo(v) > 0){
                        map.put("discountMoney",orderMoney - v);
                    }
                }
            }
        }
        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
        map.put("orderType", orderLogistics.getType());
        if(state == 8 || state == 9){
            map.put("receipt", "https://igo.i-go.group/files/html/parcel_receipt_" + orderId + ".html");
        }else{
            map.put("receipt", "");
        }
        Integer companyId = 1;
        if(null != map.get("driverId")){
            companyId = Integer.valueOf(String.valueOf(map.get("companyId")));
        }
        map.put("driverTimeOutTime", 0);
        map.put("driverTimeOut", 0);
        if(null != orderLogistics.getEstimateArriveTime()){
            CancleOrder cancleOrder = cancleOrderService.selectOne(new EntityWrapper<CancleOrder>().eq("companyId", companyId));
            JSONObject jsonObject = JSON.parseObject(cancleOrder.getContent());
            int driverTimeout1 = jsonObject.getIntValue("driverTimeout");
            long time = orderLogistics.getEstimateArriveTime().getTime() + driverTimeout1 * 60000;
            if(System.currentTimeMillis() > time){
                Integer driverTimeOutTime = Double.valueOf((System.currentTimeMillis() - time) / 60000).intValue();
                driverTimeOutTime = driverTimeOutTime == 0 ? 1 : driverTimeOutTime;
                map.put("driverTimeOutTime", driverTimeOutTime);
                map.put("driverTimeOut", 1);
            }
        }
        map.put("isDispute", orderLogistics.getIsDispute());
        return map;
    }
@@ -1377,11 +3356,665 @@
    @Override
    public List<Map<String, Object>> queryCoupon(Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
    public List<Map<String, Object>> queryCoupon(Integer language, Integer orderId, Integer uid, Integer pageNum, Integer size) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(uid, orderLogistics.getCompanyId(), 1, 4, orderLogistics.getOrderMoney(), pageNum, size);
        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(uid, orderLogistics.getCompanyId(), 1, 0, orderLogistics.getOrderMoney(), pageNum, size);
        UserActivityDiscount1 query2 = userActivityDiscount1Mapper.query(orderLogistics.getCompanyId());
        double v = orderLogistics.getOrderMoney();
        if(null != query2){
            Integer orderNum=this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId",orderLogistics.getUserId()).eq("activityId",query2.getId()).last(" and to_days(getoffTime) = to_days(now())"));
            if(query2.getDistance()*1000>orderLogistics.getMileage() && query2.getOrderNum()>orderNum){
                Double special = query2.getLogistics();
                orderLogistics.setDiscount(special);
                Double orderMoney = orderLogistics.getOrderMoney();
                v = new BigDecimal(orderMoney).multiply(new BigDecimal(special / 10)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            }
        }
        List<Map<String, Object>> list = userCouponRecordService.queryCoupon(language, uid, orderLogistics.getCompanyId(), 1, 4, v, pageNum, size);
        List<Map<String, Object>> list1 = userCouponRecordService.queryCoupon(language, uid, orderLogistics.getCompanyId(), 1, 0, v, pageNum, size);
        list.addAll(list1);
        return list;
    }
    /**
     * 获取取消需要支付的金额
     * @param id
     * @param language
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil<BaseWarpper> queryCancleAmount(Integer id, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(id);
        if(null == orderLogistics){
            return ResultUtil.error(language == 1 ? "获取数据失败,订单信息有误" : language == 2 ? "Failed to obtain data, order-information error." : "Impossible d’obtenir les données, erreur d’information de commande. ");
        }
        BaseWarpper baseWarpper = new BaseWarpper();
        double amount = 0;
        CancleOrder query = cancleOrderService.query(orderLogistics.getCompanyId());
        if(null == query || null == orderLogistics.getDriverId() || orderLogistics.getState() == 11){
            baseWarpper.setAmount(amount);
            return ResultUtil.success(baseWarpper);
        }
        JSONObject object = JSON.parseObject(query.getContent());
        long t = object.getInteger("driverTimeout") * 60000L;
        //司机超时未到达起点,免费取消
        if(orderLogistics.getState() <= 3 && orderLogistics.getEstimateArriveTime().getTime() + t <= System.currentTimeMillis()){
            baseWarpper.setAmount(amount);
            return ResultUtil.success(baseWarpper);
        }
        //非服务中且未超时
        if(orderLogistics.getState() != 5){
            JSONObject order = object.getJSONObject("order");
            long m = order.getInteger("orderAcceptanceTime") * 60000L;
            //超过免费时间,且没有超时,计算费用
            if(orderLogistics.getSnatchOrderTime().getTime() + m < System.currentTimeMillis() && orderLogistics.getEstimateArriveTime().getTime() + t > System.currentTimeMillis()){
                BigDecimal money = order.getBigDecimal("money");
                //里程费
                BigDecimal mileageFee = order.getBigDecimal("mileageFee").multiply(new BigDecimal(orderLogistics.getToStartPointMileage() / 1000));
                //时长费
                int s = Double.valueOf((System.currentTimeMillis() - orderLogistics.getSnatchOrderTime().getTime()) / 60000).intValue();
                BigDecimal durationFee = order.getBigDecimal("durationFee").multiply(new BigDecimal(s));
                money = money.add(durationFee).add(mileageFee);
                amount = money.setScale(2, RoundingMode.HALF_EVEN).doubleValue();
            }
        }
        baseWarpper.setAmount(amount);
        return ResultUtil.success(baseWarpper);
    }
    /**
     * 删除定时任务
     * @param orderId
     */
    @Override
    public void deleteTask(Integer orderId){
        //发送验证码短信
        HttpHeaders headers = new HttpHeaders();
        // 以表单的方式提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        //将请求头部和参数合成一个请求
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
        params.add("orderId", orderId + "");
        params.add("orderType", "4");
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        String s = internalRestTemplate.postForObject("http://driver-server/base/netty/deleteTask", requestEntity, String.class);
        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
        if(jsonObject.getIntValue("code") != 200){
            System.err.println("调用driver-server出错了");
        }
    }
    /**
     * 取消订单操作
     * @param id
     * @return
     * @throws Exception
     */
    @Override
    public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer bankCardId, Integer cancleId, Integer type, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(id);
        ResultUtil resultUtil = ResultUtil.success("");
        if(null == orderLogistics){
            return ResultUtil.error(language == 1 ? "取消订单失败,订单信息有误" : language == 2 ? "Failed to cancel order, order-information error." : "Échec de l’annulation de la commande, erreur d’information de commande.", "");
        }
        if(orderLogistics.getState() != 12){
            return ResultUtil.error(language == 1 ? "取消订单失败,不合法的操作" : language == 2 ? "Failed to cancel order, illegal operation." : "Échec de l’annulation de la commande, opération illégale.", "");
        }
        OrderCancel orderCancel = null;
        if(null == cancleId || cancleId==0){
            orderCancel = orderCancelService.query(id, 4, null, null, 1);
        }else{
            orderCancel = orderCancelService.selectById(cancleId);
        }
        Integer uid = orderLogistics.getUserId();
        UserInfo userInfo = userInfoService.selectById(uid);
        Double amount = orderCancel.getMoney();
        if(0 < amount){
            if(payType == 1){//手机支付
                orderCancel.setPayType(1);
                orderCancelService.updateById(orderCancel);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                String merchantTransactionId = sdf.format(new Date()) + "4" + 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(amount);
                checkoutRequest.setMerchantTransactionId(merchantTransactionId);
                checkoutRequest.setRequestDescription("Cancel a trip");
                checkoutRequest.setCallbackUrl(callbackPath + "/base/wxCancelOrderTaxi");
                checkoutRequest.setPendingRedirectUrl("");
                checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
                checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
                resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
                if(resultUtil.getCode()==200){
                    paymentRecordService.saveData(1, null, null, id, 4, 1, amount, null, 1);//添加预支付数据
                }
            }
            if(payType == 2){//银行卡支付
                orderCancel.setPayType(2);
                orderCancelService.updateById(orderCancel);
                BankCard bankCard = bankCardService.selectById(bankCardId);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                String merchantTransactionId = sdf.format(new Date()) + "4" + 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(amount);
                checkoutRequest.setMerchantTransactionId(merchantTransactionId);
                checkoutRequest.setRequestDescription("Cancel a trip");
                checkoutRequest.setCallbackUrl(callbackPath + "/base/wxCancelOrderTaxi");
                checkoutRequest.setPendingRedirectUrl("");
                checkoutRequest.setSuccessRedirectUrl("https://igo.i-go.group/payMoney/pages/success.html");
                checkoutRequest.setFailRedirectUrl("https://igo.i-go.group/payMoney/pages/fail.html");
                resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
                if(resultUtil.getCode()==200){
                    paymentRecordService.saveData(1, null, null, id, 4, 2, amount, null, 1);//添加预支付数据
                }
            }
            if(payType == 3){//余额支付
                if(userInfo.getBalance() != null && userInfo.getBalance() < amount){
                    return ResultUtil.error((language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant"), "");
                }
                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(amount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                //添加交易明细
                transactionDetailsService.saveData(uid, "取消订单", amount, 2, 1, 1, 4, id);
                userInfoService.updateById(userInfo);
                //解除小号绑定
                if(orderLogistics.getBindId() != null){
                    ChinaMobileUtil.midAxbUnBindSend(orderLogistics.getBindId(),orderLogistics.getTelX());
                }
                if(5 == orderLogistics.getOldState()){
                    orderLogistics.setState(6);
                }else{
                    orderLogistics.setState(10);
                }
                orderLogistics.setTelX("");
                orderLogistics.setBindId("");
                this.updateById(orderLogistics);
                orderCancel.setState(2);
                orderCancel.setPayType(3);
                orderCancelService.updateById(orderCancel);
                if(null != orderLogistics.getDriverId()){
                    //添加已收入明细
                    Company company = companyService.selectById(orderLogistics.getCompanyId());
                    Double speMoney = company.getSameLogisticsMoney();
                    BigDecimal d = null;//企业收入
                    BigDecimal c = null;//司机收入
                    if(company.getIsSpeFixedOrProportional() == 2){//固定
                        d = new BigDecimal(speMoney);
                        c = new BigDecimal(amount).subtract(d);//只有出行金额参与抽成,其余归属司机
                    }
                    if(company.getIsSpeFixedOrProportional() == 1){//比例
                        d = new BigDecimal(amount).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                        c = new BigDecimal(amount).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                    }
                    incomeService.saveData(1, orderLogistics.getCompanyId(), 3, orderLogistics.getId(), 4, d.doubleValue());
                    if(c.doubleValue() > 0){
                        incomeService.saveData(2, orderLogistics.getDriverId(), 3, orderLogistics.getId(), 4, c.doubleValue());
                        Driver driver = driverService.selectById(orderLogistics.getDriverId());
                        driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                        driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                        driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                        driverService.updateById(driver);
                    }
                    this.deleteTask(id);//删除定时任务
                    pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, orderLogistics.getState(), 0, "");
                }else{
                    incomeService.saveData(1, orderLogistics.getCompanyId(), 3, orderLogistics.getId(), 4, amount.doubleValue());
                }
                pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), 4, orderLogistics.getState(), 0, "");
                //添加消息
                systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
                        ? "You've paid for cancellation fee with the balance successfully, thank you for using I-GO"
                        : "Vous avez utilisé avec succès votre solde pour payer les frais d’annulation, merci d’utiliser I-GO", orderLogistics.getUserId(), 1);
            }
        }
        return resultUtil;
    }
    /**
     * 取消订单支付后的处理
     * @param id            订单=id
     * @param order_id      工行支付单号
     * @throws Exception
     */
    @Override
    public void payCancelOrderPrivateCar(Integer id, String order_id, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 4, null, 1);
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 4, query.getOrderId());
            //解除小号绑定
            if(orderLogistics.getBindId() != null){
                ChinaMobileUtil.midAxbUnBindSend(orderLogistics.getBindId(),orderLogistics.getTelX());
            }
            if(5 == orderLogistics.getOldState()){
                orderLogistics.setState(6);
            }else{
                orderLogistics.setState(10);
            }
            orderLogistics.setBindId("");
            orderLogistics.setTelX("");
            this.updateById(orderLogistics);
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            OrderCancel query1 = orderCancelService.query(query.getOrderId(), query.getOrderType(), query.getAmount(), query.getPayType(), 1);
            if (null != query1){
                query1.setState(2);
                orderCancelService.updateById(query1);
            }
            Double amount = query.getAmount();
            if(null != orderLogistics.getDriverId()){
                //添加已收入明细
                Company company = companyService.selectById(orderLogistics.getCompanyId());
                Double speMoney = company.getSameLogisticsMoney();
                BigDecimal d = null;//企业收入
                BigDecimal c = null;//司机收入
                if(company.getIsSpeFixedOrProportional() == 2){//固定
                    d = new BigDecimal(speMoney);
                    c = new BigDecimal(amount).subtract(d);//只有出行金额参与抽成,其余归属司机
                }
                if(company.getIsSpeFixedOrProportional() == 1){//比例
                    d = new BigDecimal(amount).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_EVEN)));
                    c = new BigDecimal(amount).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                }
                incomeService.saveData(1, orderLogistics.getCompanyId(), 3, orderLogistics.getId(), 4, d.doubleValue());
                if(c.doubleValue() > 0){
                    incomeService.saveData(2, orderLogistics.getDriverId(), 3, orderLogistics.getId(), 4, c.doubleValue());
                    Driver driver = driverService.selectById(orderLogistics.getDriverId());
                    driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                    driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                    driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                    driverService.updateById(driver);
                }
                this.deleteTask(orderLogistics.getId());//删除定时任务
                pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4, orderLogistics.getState(), 0, "");
            }else{
                incomeService.saveData(1, orderLogistics.getCompanyId(), 3, orderLogistics.getId(), 4, amount.doubleValue());
            }
            pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), 4, orderLogistics.getState(), 0, "");
            //添加消息
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
                    ? "You've paid for cancellation fee with the balance successfully, thank you for using I-GO"
                    : "Vous avez utilisé avec succès votre solde pour payer les frais d’annulation, merci d’utiliser I-GO", orderLogistics.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
    }
    /**
     * 修改目的地
     * @param orderId
     * @param endLon
     * @param endLat
     * @param endAddress
     */
    @Override
    public void updateEndAddress(Integer orderId, String endLon, String endLat, String endAddress) {
        OrderLogistics orderLogistics = this.selectById(orderId);
        if(null != orderLogistics.getDriverId()){
            orderLogistics.setDestination(endAddress);
            orderLogistics.setDestinationLat(endLat);
            orderLogistics.setDestinationLon(endLon);
            this.updateById(orderLogistics);
            Driver driver = driverService.selectById(orderLogistics.getDriverId());
            Integer language1 = driver.getLanguage();
            String audioUrl = "";
            switch (language1){
                case 1:
                    audioUrl = "https://igo.i-go.group/files/audio/system/ChangeAddress-CN.mp3";
                    break;
                case 2:
                    audioUrl = "https://igo.i-go.group/files/audio/system/ChangeAddress-EN.mp3";
                    break;
                case 3:
                    audioUrl = "https://igo.i-go.group/files/audio/system/ChangeAddress-FR.mp3";
                    break;
            }
            pushUtil.pushModifyAddress(2, orderLogistics.getDriverId(), orderId, 4, 1, audioUrl);
        }else{
            orderLogistics.setEndAddress(endAddress);
            orderLogistics.setEndLat(Double.valueOf(endLat));
            orderLogistics.setEndLon(Double.valueOf(endLon));
            this.updateById(orderLogistics);
        }
    }
    @Override
    public synchronized ResultUtil<BaseWarpper> queryRedMoney(Integer orderId) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        Integer companyId = orderLogistics.getCompanyId();
        Map<String, Object> query = userActivityRedenvelopeService.query(companyId, orderLogistics.getTravelTime());
        Double money = 0D;
        BaseWarpper baseWarpper = new BaseWarpper();
        if(null != query){
            Integer type = Integer.valueOf(String.valueOf(query.get("type")));
            if(type == 1){//固定金额
                money = Double.valueOf(String.valueOf(query.get("money")));
            }else{//随机金额
                Double startMoney = Double.valueOf(String.valueOf(query.get("startMoney")));
                Double endMoney = Double.valueOf(String.valueOf(query.get("endMoney")));
                money = new BigDecimal(startMoney + (Math.random() * (endMoney - startMoney))).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            }
            //判断当前红包是否大于剩余可领取总金额
            if(money.compareTo(Double.valueOf(query.get("lavePrice").toString())) > 0){
                baseWarpper.setAmount(0D);
                return ResultUtil.success(baseWarpper);
            }
        }
        baseWarpper.setAmount(money);
        if(money > 0){
            //添加临时红包数据
            UserRedPacketRecord userRedPacketRecord = new UserRedPacketRecord();
            userRedPacketRecord.setMoney(money);
            userRedPacketRecord.setRemainingAmount(money);
            userRedPacketRecord.setInsertTime(new Date());
            userRedPacketRecord.setCompanyId(Integer.valueOf(String.valueOf(query.get("companyId"))));
            userRedPacketRecord.setState(0);
            userRedPacketRecord.setOrderId(orderLogistics.getId());
            userRedPacketRecord.setOrderType(4);
            userRedPacketRecord.setUserId(orderLogistics.getUserId());
            userRedPacketRecordService.insert(userRedPacketRecord);
        }
        return ResultUtil.success(baseWarpper);
    }
    @Override
    public synchronized ResultUtil shareRedEnvelope(Integer orderId, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        UserRedPacketRecord query = userRedPacketRecordService.query_(orderLogistics.getUserId(), orderLogistics.getCompanyId(), 0, 4, null);
        if(null != query){
            Double money = query.getMoney();
            Map<String, Object> map = userActivityRedenvelopeService.query(orderLogistics.getCompanyId(), orderLogistics.getTravelTime());
            Double laveMoney = Double.valueOf(String.valueOf(map.get("laveMoney")));
            if(money.compareTo(laveMoney) > 0){
                return ResultUtil.error(language == 1 ? "手速太慢了,红包已派发完啦!" : language == 2 ? "Too slow, all the lucky-promo has been distributed!" : "Trop lent, toute la promo chanceuse a été distribuée !");
            }
            //判断当前红包是否大于剩余可领取总金额
            if(money.compareTo(Double.valueOf(map.get("lavePrice").toString())) > 0){
                return ResultUtil.error(language == 1 ? "手速太慢了,红包已派发完啦!" : language == 2 ? "Too slow, all the lucky-promo has been distributed!" : "Trop lent, toute la promo chanceuse a été distribuée !");
            }
            double v = new BigDecimal(laveMoney).subtract(new BigDecimal(money)).doubleValue();
            UserActivityRedenvelope id = userActivityRedenvelopeService.selectById(String.valueOf(map.get("id")));
            id.setLaveMoney(v);
            id.setLavePrice(new BigDecimal(id.getLavePrice() - money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            userActivityRedenvelopeService.updateById(id);
            query.setState(1);
            query.setRedPacketActivityId(id.getId());
            userRedPacketRecordService.updateById(query);
            UserInfo userInfo = userInfoService.selectById(orderLogistics.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();
                    document.getElementsByTag("title").get(0).text("红包活动");
                    Element user_chinese = document.getElementById("user_chinese");
                    user_chinese.text("您好 " + userInfo.getNickName() + ",");
                    Element time_chinese = document.getElementById("time_chinese");
                    time_chinese.text("此活动有效期在 " + DateUtil.conversionFormat(language, sdf.format(id.getStartTime())) + " 至 " + DateUtil.conversionFormat(language, sdf.format(id.getEndTime())) + ",详情请查看I-GO平台");
                }
                if(2 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("french").remove();
                    document.getElementsByTag("title").get(0).text("Lucky-promo activities");
                    Element user_english = document.getElementById("user_english");
                    user_english.text("Hello " + userInfo.getNickName() + ",");
                    Element time_english = document.getElementById("time_english");
                    time_english.text("You could use it from " + DateUtil.conversionFormat(language, sdf.format(id.getStartTime())) + " to " + DateUtil.conversionFormat(language, sdf.format(id.getEndTime())) + ",check more details on the app.");
                }
                if(3 == language){
                    document.getElementById("chinese").remove();
                    document.getElementById("english").remove();
                    document.getElementsByTag("title").get(0).text("Activités bonus");
                    Element user_french = document.getElementById("user_french");
                    user_french.text("Bonjour " + userInfo.getNickName() + ",");
                    Element time_french = document.getElementById("time_french");
                    time_french.text("Cette promotion est valable du " + DateUtil.conversionFormat(language, sdf.format(id.getStartTime())) + " au " + DateUtil.conversionFormat(language, sdf.format(id.getEndTime())) + ". Veuillez consulter la plateforme I-GO pour plus de détails.");
                }
                EmailUtil.send(userInfo.getEmail(), language == 1 ? "红包活动" : language == 2 ? "Lucky-promo activities" : "Activités bonus",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/home/igotechgh/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/home/igotechgh/nginx/html/files/html/redpacket_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                String link ="https://igo.i-go.group/files/html/redpacket_" + orderId + ".html";
                TEmail tEmail = new TEmail();
                tEmail.setLink(link);
                tEmail.setUserId(userInfo.getId());
                tEmail.setType(1);
                tEmail.setName(language == 1 ? "红包活动" : language == 2 ? "Lucky-promo activities" : "Activités bonus");
                tEmail.setOrderId(orderId);
                tEmail.setCreateTime(new Date());
                int i = cn.hutool.core.date.DateUtil.dayOfWeek(new Date())-1;
                tEmail.setWeek(EmailUtil.getWeek(language,i));
                boolean am = cn.hutool.core.date.DateUtil.isAM(new Date());
                if(am){
                    tEmail.setAmOrPm(language==1?"上午":language==2?"morning":"matin");
                }else {
                    tEmail.setAmOrPm(language==1?"下午":language==2?"afternoon":"après-midi");
                }
                emailService.insert(tEmail);
            }
        }
        return ResultUtil.success();
    }
    /**
     * 获取红包使用记录
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public List<Map<String, Object>> queryRedEnvelope(Integer language, Integer uid) throws Exception {
        List<Map<String, Object>> list = this.baseMapper.queryRedEnvelope(uid);
        for (Map<String, Object> map : list) {
            map.put("name", language == 1 ? "包裹" : language == 2 ? "Delivery" : "Livraison");
            if(null != map.get("time")){
                String time = map.get("time").toString();
                map.put("time", DateUtil.conversionFormat(language, time));
            }
        }
        return list;
    }
    /**
     * 获取服务中的订单数据
     * @param uid
     * @return
     * @throws Exception
     */
    @Override
    public OrderServerWarpper queryOrderServer(Integer orderId, Integer uid) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        //计算预计距离和剩余时间
        String value = redisUtil.getValue("DRIVER" + orderLogistics.getDriverId());
        String d = "0";
        String t = "0";
        if(null == value || "".equals(value)){
            System.err.println("司机没有上传位置信息");
            //调用获取轨迹中的数据
            File file = new File(filePath + orderId + "_4.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 tripId = redisUtil.getValue("trip" + uid);
        String lnt = "0";
        String lat = "0";
        if(ToolUtil.isNotEmpty(value)){
            lnt = value.split(",")[0];
            lat = value.split(",")[1];
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(orderLogistics.getStartLat(), orderLogistics.getStartLon(), Double.valueOf(lat), Double.valueOf(lnt), tripId);
            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() + "";
            }
        }
        OrderServerWarpper orderServerWarpper = new OrderServerWarpper();
        orderServerWarpper.setOrderId(orderLogistics.getId());
        orderServerWarpper.setOrderType(4);
        orderServerWarpper.setState(orderLogistics.getState());
        orderServerWarpper.setLon(lnt);
        orderServerWarpper.setLat(lat);
        orderServerWarpper.setReassignNotice(orderLogistics.getReassignNotice());
        if(orderLogistics.getState() == 2 || orderLogistics.getState() == 3){//前往预约地
            orderServerWarpper.setReservationMileage(d);
            orderServerWarpper.setReservationTime(t);
            orderServerWarpper.setServedMileage("0");
            orderServerWarpper.setServedTime("0");
            orderServerWarpper.setLaveMileage("0");
            orderServerWarpper.setLaveTime("0");
        }
        if(orderLogistics.getState() == 5 || orderLogistics.getState() == 6){//服务中
            DistancematrixVo distancematrix = GoogleMapUtil.getDistancematrix(Double.valueOf(lat), Double.valueOf(lnt), orderLogistics.getEndLat(), orderLogistics.getEndLon(), tripId);
            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() + "";
            }
            orderServerWarpper.setReservationMileage("0");
            orderServerWarpper.setReservationTime("0");
            orderServerWarpper.setServedMileage(String.valueOf((null == orderLogistics.getMileage() ? 0 : orderLogistics.getMileage()) / 1000));
            orderServerWarpper.setServedTime("0");
            if(null != orderLogistics.getStartServiceTime()){
                orderServerWarpper.setServedTime(Long.valueOf((new Date().getTime() - orderLogistics.getStartServiceTime().getTime()) / 60000).intValue() + "");
            }
            orderServerWarpper.setLaveMileage(d);
            orderServerWarpper.setLaveTime(t);
        }
        File file = new File(filePath + orderId + "_4.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);
            orderServerWarpper.setOrderPositionList(JSONObject.toJSONString(list));
        }
        return orderServerWarpper;
    }
    /**
     * 获取下单推送完后没有司机接单的提醒
     * @return
     * @throws Exception
     */
    @Override
    public EndPushWarpper queryEndPush(Integer uid) throws Exception {
        List<OrderLogistics> list = orderLogisticsMapper.queryByState(uid, null, null, 1);
        EndPushWarpper endPushWarpper = new EndPushWarpper();
        if(list.size() > 0){
            OrderLogistics orderPrivateCar = list.get(0);
            if(!orderIds.contains(orderPrivateCar.getId())){
                endPushWarpper.setOrderId(orderPrivateCar.getId());
                endPushWarpper.setOrderType(4);
                endPushWarpper.setState(1);
                List<PushOrder> querys = pushOrderService.querys(null, 2, orderPrivateCar.getCompanyId());//获取需要推送的次数
                int time = 0;
                for(int i = 1; i <= querys.size(); i++){
                    PushOrder pushOrder = pushOrderService.querys(i, 2, orderPrivateCar.getCompanyId()).get(0);
                    time += pushOrder.getPushTime() * 1000;
                }
                //当前时间减去推单总时间大于下单时间
                if((System.currentTimeMillis() - time) > orderPrivateCar.getInsertTime().getTime()){
                    endPushWarpper.setState(2);
                }
            }
        }
        return endPushWarpper;
    }
}