puzhibing
2023-08-22 00caef45a8833dc58919e23eb88a3484cfacdaa4
UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -11,24 +11,40 @@
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.system.dao.RegionMapper;
import com.stylefeng.guns.modular.system.dao.SensitiveWordsMapper;
import com.stylefeng.guns.modular.system.dao.SysIntegralMapper;
import com.stylefeng.guns.modular.system.dao.SystemPriceMapper;
import com.stylefeng.guns.modular.system.dao.*;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.GoogleMap.*;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayUtil;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayoutUtil;
import com.stylefeng.guns.modular.system.util.Tingg.model.AuthStatus;
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.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.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -71,9 +87,6 @@
    @Autowired
    private IPaymentRecordService paymentRecordService;
   /* @Autowired
    private ICBCPayUtil icbcPayUtil;*/
    @Autowired
    private PayMoneyUtil payMoneyUtil;
@@ -107,8 +120,17 @@
    @Autowired
    private IUserCouponRecordService userCouponRecordService;
    @Autowired
    private IBankCardService bankCardService;
    @Autowired
    private TinggPayoutUtil tinggPayoutUtil;
    @Value("${callbackPath}")
    private String callbackPath;
    @Value("${spring.mail.template-path}")
    private String templatePath;
    private static List<Integer> orderIds = new ArrayList<>();
@@ -122,18 +144,18 @@
     */
    @Override
    public ResultUtil judgingTheCity(String startLonLat, String endAddress) throws Exception {
        Map<String, String> sgeocode = gdMapGeocodingUtil.geocode(startLonLat.split(",")[0], startLonLat.split(",")[1]);
        String scityCode = sgeocode.get("cityCode");
        Map<String, Object> geocoding = gdMapGeocodingUtil.geocoding(endAddress);
        if(Integer.valueOf(geocoding.get("status").toString()) != 0){
            return ResultUtil.error("收货地址有误,无法查询具体地址信息");
        }
        List<String> list = (List<String>)geocoding.get("data");
        Map<String, String> egeocode = gdMapGeocodingUtil.geocode(list.get(0).split(",")[0], list.get(0).split(",")[1]);
        String ecityCode = egeocode.get("cityCode");
        if(!scityCode.equals(ecityCode)){
            return ResultUtil.error("已超出服务范围,请重新选择跨城小件物流");
        }
//        Map<String, String> sgeocode = gdMapGeocodingUtil.geocode(startLonLat.split(",")[0], startLonLat.split(",")[1]);
//        String scityCode = sgeocode.get("cityCode");
//        Map<String, Object> geocoding = gdMapGeocodingUtil.geocoding(endAddress);
//        if(Integer.valueOf(geocoding.get("status").toString()) != 0){
//            return ResultUtil.error("收货地址有误,无法查询具体地址信息");
//        }
//        List<String> list = (List<String>)geocoding.get("data");
//        Map<String, String> egeocode = gdMapGeocodingUtil.geocode(list.get(0).split(",")[0], list.get(0).split(",")[1]);
//        String ecityCode = egeocode.get("cityCode");
//        if(!scityCode.equals(ecityCode)){
//            return ResultUtil.error("已超出服务范围");
//        }
        return ResultUtil.success();
    }
@@ -147,47 +169,21 @@
     * @throws Exception
     */
    @Override
    public ResultUtil queryLogisticsUnitPrice(Integer type, String startLonLat, String endAddress, Integer uid) throws Exception {
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(startLonLat.split(",")[1]), Double.valueOf(startLonLat.split(",")[0]));
        if(null == reverseGeocode){
            return ResultUtil.error("地理位置解析失败");
    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");
        }
        AddressComponentsVo[] addressComponentsVos = reverseGeocode.getAddressComponentsVos();
        String[] city = new String[addressComponentsVos.length];
        for (int i = 0; i < addressComponentsVos.length; i++) {
            city[i] = addressComponentsVos[i].getLongName();
        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);
        if(price.getCode() != 200){
            return price;
        }
        Company query = companyCityService.query(city);
        if(null == query){
            return ResultUtil.error("预约取货点暂无企业服务");
        }
        Double price1 = 0D;
        Double price2 = 0D;
        if(type == 4){//同城
            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
            if(null == query1){
                return ResultUtil.error("请先完善价格设定");
            }
            String content = String.valueOf(query1.get("content"));
            JSONObject jsonObject = JSON.parseObject(content);
            price1 = jsonObject.getDouble("num2");
            price2 = jsonObject.getDouble("num13");
        }else{
            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
            if(null == query1){
                return ResultUtil.error("请先完善价格设定");
            }
            String content = String.valueOf(query1.get("content"));
            JSONObject jsonObject = JSON.parseObject(content);
            price1 = jsonObject.getDouble("num1");
            price2 = jsonObject.getDouble("num2");
        }
        int i = this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId", uid).eq("isDelete", 1));
        Map<String, Object> map = new HashMap<>();
        map.put("ordinary", price1);
        map.put("precious", price2);
        map.put("first", i);
        return ResultUtil.success(map);
        Integer i = this.selectCount(new EntityWrapper<OrderLogistics>().eq("userId", uid).eq("isDelete", 1));
        Map<String, Double> map = price.getData();
        map.put("first", i.doubleValue());
        return price;
    }
@@ -199,14 +195,14 @@
     * @return
     * @throws Exception
     */
    public ResultUtil queryPayMoney(Integer number, Integer type, String startLonLat, String endAddress) throws Exception{
        FindPlaceFromTextVo findplacefromtext = GoogleMapUtil.findplacefromtext(endAddress);
    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("收货地址有误,无法查询具体地址信息");
            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());
        ResultUtil<Map<String, Double>> price = this.getPrice1(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);
@@ -240,7 +236,7 @@
     */
    @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) throws Exception {
                                     String recipientPhone, 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;", "(");
@@ -248,7 +244,7 @@
        OrderLogistics orderLogistics = new OrderLogistics();
        Company query = companyCityService.query1(placementLon, placementLat);
        if(null == query){
            return ResultUtil.error("该地点暂无企业服务");
            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");
        }
        orderLogistics.setCompanyId(query.getId());
        orderLogistics.setType(type);
@@ -261,7 +257,7 @@
        orderLogistics.setPlacementLat(Double.valueOf(placementLat));
        ReverseGeocodeVo reverseGeocode = GoogleMapUtil.getReverseGeocode(Double.valueOf(placementLat), Double.valueOf(placementLon));
        if(null == reverseGeocode){
            return ResultUtil.error("解析地址出错");
            return ResultUtil.error(language == 1 ? "解析地址出错" : language == 2 ? "Resolve address error" : "Erreur dans la résolution de l’adresse");
        }
        String address = reverseGeocode.getAddress();
@@ -269,9 +265,9 @@
        orderLogistics.setStartLon(Double.valueOf(startLon));
        orderLogistics.setStartLat(Double.valueOf(startLat));
        orderLogistics.setStartAddress(startAddress);
        FindPlaceFromTextVo findplacefromtext = GoogleMapUtil.findplacefromtext(endAddress);
        FindPlaceFromTextVo findplacefromtext = GoogleMapUtil.textsearch(endAddress);
        if(null == findplacefromtext){
            return ResultUtil.error("收货地址有误,无法查询具体地址信息");
            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();
@@ -284,7 +280,7 @@
        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());
        ResultUtil<Map<String, Double>> price = this.getPrice1(type, String.valueOf(startLon), String.valueOf(startLat), lng.toString(), lat.toString(), language);
        if(price.getCode() != 200){
            return price;
        }
@@ -298,13 +294,15 @@
        orderLogistics.setTipMoney(tipMoney);
        orderLogistics.setState(7);//待支付
        orderLogistics.setInsertTime(new Date());
        orderLogistics.setTravelTime(travelTime);
        orderLogistics.setTravelTime(null == travelTime ? new Date() : travelTime);
        orderLogistics.setOrderSource(orderSource);
        orderLogistics.setIsDelete(1);
        this.insert(orderLogistics);
        //添加消息
        systemNoticeService.addSystemNotice(1, "您的"+ (type == 4 ? "同城" : "跨城") + "小件物流订单已下单成功,我们正在为您指派司机,请稍后!", orderLogistics.getUserId(), 1);
        systemNoticeService.addSystemNotice(1, language == 1 ? "您的市内包裹订单已下单成功,我们正在为您指派司机,请稍后!" :
                                            language == 2 ? "Your parcel order has been successfully placed, we are assigning a driver for you, please wait!"
                                                    : "Votre commande de colis a bien été passée, nous vous assignons un chauffeur, veuillez patienter!", orderLogistics.getUserId(), 1);
        BaseWarpper baseWarpper = new BaseWarpper();
        baseWarpper.setId(orderLogistics.getId());
@@ -319,7 +317,7 @@
     * @throws Exception
     */
    public ResultUtil<Map<String, Double>> getPrice(Integer type, String startLon, String startLat, String endLon, String endLat) throws Exception{
        Company query = companyCityService.query(startLon, startLat);
        Company query = companyCityService.query1(startLon, startLat);
        if(null == query){
            return ResultUtil.error("预约取货点暂无企业服务");
        }
@@ -335,29 +333,17 @@
            if(dist.compareTo(0D) >= 0 && dist.compareTo(jsonObject.getDouble("num1")) < 0){
                price1 = jsonObject.getDouble("num2");
            }
            if(dist.compareTo(0D) >= 0 && dist.compareTo(jsonObject.getDouble("num12")) < 0){
                price2 = jsonObject.getDouble("num13");
            }
            if(dist.compareTo(jsonObject.getDouble("num3")) >= 0 && dist.compareTo(jsonObject.getDouble("num4")) < 0){
                price1 = jsonObject.getDouble("num5");
            }
            if(dist.compareTo(jsonObject.getDouble("num14")) >= 0 && dist.compareTo(jsonObject.getDouble("num15")) < 0){
                price2 = jsonObject.getDouble("num16");
            }
            if(dist.compareTo(jsonObject.getDouble("num6")) >= 0 && dist.compareTo(jsonObject.getDouble("num7")) < 0){
                price1 = jsonObject.getDouble("num8");
            }
            if(dist.compareTo(jsonObject.getDouble("num17")) >= 0 && dist.compareTo(jsonObject.getDouble("num18")) < 0){
                price2 = jsonObject.getDouble("num19");
            }
            if(dist.compareTo(jsonObject.getDouble("num9")) >= 0 && dist.compareTo(jsonObject.getDouble("num10")) < 0){
                price1 = jsonObject.getDouble("num11");
            }
            if(dist.compareTo(jsonObject.getDouble("num20")) >= 0 && dist.compareTo(jsonObject.getDouble("num21")) < 0){
                price2 = jsonObject.getDouble("num22");
            }
        }else{
            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
@@ -374,10 +360,11 @@
    public ResultUtil<Map<String, Double>> getPrice1(Integer type, String startLon, String startLat, String endLon, String endLat) throws Exception{
    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);
        if(null == query){
            return ResultUtil.error("预约取货点暂无企业服务");
            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");
        }
        Double price1 = 0D;
        Double price2 = 0D;
@@ -385,7 +372,10 @@
            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));
            if(null == distancematrix){
                return ResultUtil.error("计算距离出错");
                return ResultUtil.error(language == 1 ? "计算距离出错" : language == 2 ? "Error in distance calculation" : "Erreur de calcul des distances");
            }
            if(distancematrix.getDistance() == 0){
                return ResultUtil.error(language == 1 ? "未获取到有效的距离" : language == 2 ? "A valid distance was not obtained" : "La distance effective n’est pas acquise");
            }
            String content = String.valueOf(query1.get("content"));
            JSONObject jsonObject = JSON.parseObject(content);
@@ -394,29 +384,17 @@
            if(dist.compareTo(0D) >= 0 && dist.compareTo(jsonObject.getDouble("num1")) < 0){
                price1 = jsonObject.getDouble("num2");
            }
            if(dist.compareTo(0D) >= 0 && dist.compareTo(jsonObject.getDouble("num12")) < 0){
                price2 = jsonObject.getDouble("num13");
            }
            if(dist.compareTo(jsonObject.getDouble("num3")) >= 0 && dist.compareTo(jsonObject.getDouble("num4")) < 0){
                price1 = jsonObject.getDouble("num5");
            }
            if(dist.compareTo(jsonObject.getDouble("num14")) >= 0 && dist.compareTo(jsonObject.getDouble("num15")) < 0){
                price2 = jsonObject.getDouble("num16");
            }
            if(dist.compareTo(jsonObject.getDouble("num6")) >= 0 && dist.compareTo(jsonObject.getDouble("num7")) < 0){
                price1 = jsonObject.getDouble("num8");
            }
            if(dist.compareTo(jsonObject.getDouble("num17")) >= 0 && dist.compareTo(jsonObject.getDouble("num18")) < 0){
                price2 = jsonObject.getDouble("num19");
            }
            if(dist.compareTo(jsonObject.getDouble("num9")) >= 0 && dist.compareTo(jsonObject.getDouble("num10")) < 0){
                price1 = jsonObject.getDouble("num11");
            }
            if(dist.compareTo(jsonObject.getDouble("num20")) >= 0 && dist.compareTo(jsonObject.getDouble("num21")) < 0){
                price2 = jsonObject.getDouble("num22");
            if(dist.compareTo(jsonObject.getDouble("num10")) > 0){
                return ResultUtil.error(language == 1 ? "超出可服务范围" : language == 2 ? "Out of service range" : "Au-delà du service disponible");
            }
        }else{
            Map<String, Object> query1 = systemPriceMapper.query(query.getId(), type, null);
@@ -449,7 +427,7 @@
                    if(ToolUtil.isNotEmpty(vehicle)){
                        integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
                    }
                    Company query = companyCityService.query(String.valueOf(orderLogistics.getStartLon()), String.valueOf(orderLogistics.getStartLat()));//获取起点所属分公司
                    Company query = companyCityService.query1(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);
@@ -502,10 +480,10 @@
     * @throws Exception
     */
    @Override
    public ResultUtil payLogisticsOrder(Integer payType, Integer orderId, Integer type) throws Exception {
    public ResultUtil payLogisticsOrder(Integer payType, Integer bankCardId, Integer orderId, Integer type, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        if(orderLogistics.getState() != 7){
            return ResultUtil.error("订单已完成支付,不允许重复支付", "");
            return ResultUtil.error(language == 1 ? "订单已完成支付,不允许重复支付" : language == 2 ? "The order has been paid, no double payment is allowed" : "La commande a été payée, aucun paiement en double n’est autorisé", "");
        }
        Integer uid = orderLogistics.getUserId();
        Double orderMoney = orderLogistics.getOrderMoney();
@@ -513,33 +491,63 @@
            orderMoney += null != orderLogistics.getTipMoney() ? orderLogistics.getTipMoney() : 0;
        }
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success(new HashMap<>());
        ResultUtil resultUtil = ResultUtil.success("");
        if(payType == 1){//手机支付
           return payMoneyUtil.weixinpay("小件物流下单支付",orderId +"",orderId + "_" + orderLogistics.getType(),orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
                  /*  icbcPayUtil.placeAnOrder(orderId + "," + orderLogistics.getType(), 9, 5, uid.toString(),
                            "小件物流下单支付", orderMoney, callbackPath + "/base/wxPayOrderTaxi", "",
                            type, userInfo.getAppletsOpenId());*/
            /*if(map.get("code").equals("200")){
                paymentRecordService.saveData(1, null, null, orderId, orderLogistics.getType(), 1, orderMoney, map.get("order_id"), 1);//添加预支付数据
                resultUtil = ResultUtil.success(map.get("data"));
        if(payType == 1) {//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "4" + language + orderId;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(userInfo.getPhone()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(userInfo.getPhone());
            checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
            checkoutRequest.setCustomerLastName(userInfo.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderTaxi");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 4, 1, orderMoney, null, 1);//添加预支付数据
            }else{
                resultUtil = ResultUtil.error(map.get("msg"), "");
            }*/
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
            return resultUtil;
        }
        if(payType == 2){//银行卡支付
            return payMoneyUtil.alipay("小件物流下单支付","小件物流下单支付",orderId + "," + orderLogistics.getType(),orderMoney+"","/base/aliPayOrderTaxi");
           /* Map<String, String> map = icbcPayUtil.placeAnOrder(orderId + "," + orderLogistics.getType(), 10, 5, uid.toString(), "小件物流下单支付", orderMoney, callbackPath + "/base/aliPayOrderTaxi", "", type, null);
            if(map.get("code").equals("200")){
                paymentRecordService.saveData(1, null, null, orderId, orderLogistics.getType(), 2, orderMoney, map.get("order_id"), 1);//添加预支付数据
                resultUtil = ResultUtil.success(map.get("data"));
        if(payType == 2) {//银行卡支付
            BankCard bankCard = bankCardService.selectById(bankCardId);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "4" + language + orderId;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(bankCard.getCode());
            checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
            checkoutRequest.setCustomerLastName(bankCard.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/wxPayOrderTaxi");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()==200){
                paymentRecordService.saveData(1, null, null, orderId, 4, 2, orderMoney, null, 1);//添加预支付数据
            }else{
                resultUtil = ResultUtil.error(map.get("msg"), "");
            }*/
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
            return resultUtil;
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error("余额不足,无法完成支付", "");
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant", "");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
@@ -548,12 +556,36 @@
            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(1);//小件物流先支付后司机抢单
            orderLogistics.setPayType(3);
            orderLogistics.setPayMoney(orderMoney);
            //添加已收入明细
            Company company = companyService.selectById(orderLogistics.getCompanyId());
            Double speMoney = company.getCrossLogisticsMoney();
            BigDecimal d = null;//企业收入
            BigDecimal c = null;//司机收入
            if(company.getIsCrossLogisticsFixedOrProportional() == 2){//固定
                d = new BigDecimal(speMoney);
                c = new BigDecimal(orderLogistics.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                Double price = orderLogistics.getOrderMoney();
                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, 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() {
@@ -562,9 +594,9 @@
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成小件物流订单支付,谢谢使用!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the parcel order payment, thank you for using!" :
                    "Vous avez terminé avec succès le paiement de la commande de colis, merci de l’utiliser!", uid, 1);
            this.pushOrder(orderLogistics);//推单
        }
@@ -573,7 +605,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(1);//小件物流先支付后司机抢单
@@ -581,15 +613,147 @@
            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");
                Driver driver = driverService.selectById(orderLogistics.getDriverId());
                if(1 == language){
                    document.getElementById("english").remove();
                    document.getElementById("french").remove();
                    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 pdf_chinese = document.getElementById("pdf_chinese");
                    pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_chinese = document.getElementById("lost_item_chinese");
                    lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                    Element pay_time_chinese = document.getElementById("pay_time_chinese");
                    pay_time_chinese.text(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 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").remove();
                    document.getElementById("french").remove();
                    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 pdf_english = document.getElementById("pdf_english");
                    pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_english = document.getElementById("lost_item_english");
                    lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                    Element pay_time_english = document.getElementById("pay_time_english");
                    pay_time_english.text(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 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").remove();
                    document.getElementById("english").remove();
                    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 pdf_french = document.getElementById("pdf_french");
                    pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                    Element lost_item_french = document.getElementById("lost_item_french");
                    lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                    Element pay_time_french = document.getElementById("pay_time_french");
                    pay_time_french.text(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 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 ? "Parcel receipt" : "Réception de colis",  document.html());
                //开始生成pdf收据和html收据
                File file = new File("/usr/local/nginx/html/files/html/");
                if(!file.exists()){
                    file.mkdirs();
                }
                file = new File("/usr/local/nginx/html/files/html/parcel_receipt_" + orderId + ".html");
                if(!file.exists()){
                    file.createNewFile();
                }
                FileWriter fileWriter = new FileWriter(file);
                fileWriter.write(document.html());
                fileWriter.flush();
                fileWriter.close();
                FileInputStream fileInputStream = new FileInputStream(file);
                File file1 = new File("/usr/local/nginx/html/files/pdf/");
                if(!file1.exists()){
                    file1.mkdirs();
                }
                file1 = new File("/usr/local/nginx/html/files/pdf/parcel_receipt_" + orderId + ".pdf");
                if(!file1.exists()){
                    file1.createNewFile();
                }
                FileOutputStream fileOutputStream = new FileOutputStream(file1);
                HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
            }
            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
            new Thread(new Runnable() {
                @Override
                public void run() {
                    pushUtil.pushOrderState(1, orderLogistics.getUserId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState(), 0);
                    pushUtil.pushOfflinePayment(2, orderLogistics.getDriverId(), orderLogistics.getId(), 4);
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用现金成功完成小件物流订单支付,谢谢使用!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the parcel order payment, thank you for using!" :
                    "Vous avez terminé avec succès le paiement de la commande de colis, merci de l’utiliser!", uid, 1);
            this.pushOrder(orderLogistics);//推单
        }
@@ -610,7 +774,7 @@
     * @throws Exception
     */
    @Override
    public ResultUtil payLogisticsOrder_(Integer payType, Integer orderId, Integer type) throws Exception {
    public ResultUtil payLogisticsOrder_(Integer payType, Integer bankCardId, Integer orderId, Integer type, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(orderId);
        Integer uid = orderLogistics.getUserId();
        OrderLogisticsSpread orderLogisticsSpread = orderLogisticsSpreadService.selectOne(new EntityWrapper<OrderLogisticsSpread>().eq("orderLogisticsId", orderId));
@@ -618,14 +782,46 @@
        UserInfo userInfo = userInfoService.selectById(uid);
        ResultUtil resultUtil = ResultUtil.success("");
        if(payType == 1){//手机支付
            return payMoneyUtil.weixinpay("小件物流下单支付",orderId +"",orderId + "_" + orderLogistics.getType(),orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "4" + language + orderId;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(userInfo.getPhone()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(userInfo.getPhone());
            checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
            checkoutRequest.setCustomerLastName(userInfo.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/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");
            return TinggPayUtil.checkoutRequest(checkoutRequest);
        }
        if(payType == 2){//银行卡支付
            return payMoneyUtil.alipay("小件物流下单支付","小件物流下单支付",orderId + "," + orderLogistics.getType(),orderMoney+"","/base/aliPayOrderTaxi");
            BankCard bankCard = bankCardService.selectById(bankCardId);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + "4" + language + orderId;
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
            checkoutRequest.setCustomerEmail(userInfo.getEmail());
            checkoutRequest.setAccountNumber(bankCard.getCode());
            checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
            checkoutRequest.setCustomerLastName(bankCard.getLastName());
            checkoutRequest.setRequestAmount(orderMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Travel completion payment");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/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");
            return TinggPayUtil.checkoutRequest(checkoutRequest);
        }
        if(payType == 3){//余额支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error("余额不足,无法完成支付", "");
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
@@ -634,7 +830,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);//已支付差价
@@ -655,14 +851,14 @@
                c = new BigDecimal(orderMoney).subtract(d);
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                d = new BigDecimal(orderMoney).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                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 = incomeService.selectOne(new EntityWrapper<Income>().eq("userType", 2).eq("objectId", orderLogistics.getDriverId()).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());
@@ -680,21 +876,17 @@
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用余额成功完成小件物流订单差价支付,谢谢使用!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单差价支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the difference payment of parcel order, thank you for using!"
                    : "Vous avez complété avec succès le paiement de la différence de commande de colis, merci de l’utiliser!", uid, 1);
        }
        if(payType == 4){//现金支付
            if(userInfo.getBalance() == null || userInfo.getBalance() < orderMoney){
                return ResultUtil.error("余额不足,无法完成支付", "");
            }
            userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            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, 2, 1, 1, 4, orderId);
            userInfoService.updateById(userInfo);
            orderLogistics.setState(12);//已支付差价
@@ -716,7 +908,7 @@
                c = new BigDecimal(orderMoney).subtract(d);
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                d = new BigDecimal(orderMoney).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                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);
            }
@@ -741,7 +933,9 @@
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用现金成功完成小件物流订单差价支付,谢谢使用!", uid, 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单差价支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the difference payment of parcel order, thank you for using!"
                    : "Vous avez complété avec succès le paiement de la différence de commande de colis, merci de l’utiliser!", uid, 1);
        }
@@ -752,14 +946,14 @@
    @Override
    public void payOrderLogisticsCallback(Integer id, String order_id, Integer type) throws Exception {
    public void payOrderLogisticsCallback(Integer id, String order_id, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(id);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), orderLogistics.getType(), type, 1);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), orderLogistics.getType(), null, 1);
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "完成订单", query.getAmount(), 2, 1, 1, orderLogistics.getType(), query.getOrderId());
            orderLogistics.setState(1);//先支付后抢单
            orderLogistics.setPayType(type);
            orderLogistics.setPayType(query.getPayType());
            orderLogistics.setPayMoney(query.getAmount());
            this.updateById(orderLogistics);
@@ -772,6 +966,29 @@
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            //添加已收入明细
            Company company = companyService.selectById(orderLogistics.getCompanyId());
            Double speMoney = company.getCrossLogisticsMoney();
            BigDecimal d = null;//企业收入
            BigDecimal c = null;//司机收入
            if(company.getIsCrossLogisticsFixedOrProportional() == 2){//固定
                d = new BigDecimal(speMoney);
                c = new BigDecimal(orderLogistics.getOrderMoney()).subtract(d);//只有出行金额参与抽成,其余归属司机
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                Double price = orderLogistics.getOrderMoney();
                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, 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
@@ -781,7 +998,9 @@
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成小件物流订单支付,谢谢使用!", orderLogistics.getUserId(), 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the parcel order payment, thank you for using!" :
                    "Vous avez terminé avec succès le paiement de la commande de colis, merci de l’utiliser!", orderLogistics.getUserId(), 1);
            this.pushOrder(orderLogistics);//推单
        }else{
@@ -792,29 +1011,32 @@
    @Override
    public void payOrderLogisticsSpreadCallback(Integer id, String order_id, Integer type) throws Exception {
    public void payOrderLogisticsSpreadCallback(Integer id, String order_id, Integer language) throws Exception {
        OrderLogistics orderLogistics = this.selectById(id);
        OrderLogisticsSpread orderLogisticsSpread = orderLogisticsSpreadService.selectOne(new EntityWrapper<OrderLogisticsSpread>().eq("orderLogisticsId", id));
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), orderLogistics.getType(), type, 1);
        PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), orderLogistics.getType(), null, 1);
        if(null != query){
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流补差价", query.getAmount(), 2, 1, 1, 4, query.getOrderId());
            orderLogistics.setState(4);//待取货
            this.updateById(orderLogistics);
            Double orderMoney = query.getAmount();
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            orderLogisticsSpread.setPayMoney(query.getAmount());
            orderLogisticsSpread.setPayTime(new Date());
            orderLogisticsSpread.setPayType(3);
            orderLogisticsSpread.setPayType(query.getPayType());
            orderLogisticsSpread.setDriverPay(1);
            orderLogisticsSpreadService.updateById(orderLogisticsSpread);
            UserInfo userInfo = userInfoService.selectById(orderLogistics.getUserId());
            SysIntegral query1 = sysIntegralMapper.query(orderLogistics.getCompanyId());
            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
            userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "包裹补差价", orderMoney, 2, 1, 1, 4, id);
            userInfoService.updateById(userInfo);
            query.setState(2);
            query.setCode(order_id);
            paymentRecordService.updateById(query);
            orderLogistics.setState(12);//已支付差价
            this.updateById(orderLogistics);
            //添加已收入明细
            Company company = companyService.selectById(orderLogistics.getCompanyId());
@@ -823,12 +1045,13 @@
            BigDecimal c = null;
            if(company.getIsSpeFixedOrProportional() == 2){//固定
                d = new BigDecimal(speMoney);
                c = new BigDecimal(query.getAmount()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                c = new BigDecimal(orderMoney).subtract(d);
            }
            if(company.getIsSpeFixedOrProportional() == 1){//比例
                d = new BigDecimal(query.getAmount()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                c = new BigDecimal(query.getAmount()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);
                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);
@@ -850,8 +1073,9 @@
                }
            }).start();
            systemNoticeService.addSystemNotice(1, "您已使用" + (type == 1 ? "微信" : "支付宝") + "成功完成小件物流订单差价支付,谢谢使用!", orderLogistics.getUserId(), 1);
            systemNoticeService.addSystemNotice(1, language == 1 ? "您已成功完成包裹订单差价支付,谢谢使用!" : language == 2
                    ? "You have successfully completed the difference payment of parcel order, thank you for using!"
                    : "Vous avez complété avec succès le paiement de la différence de commande de colis, merci de l’utiliser!", orderLogistics.getUserId(), 1);
        }else{
            System.err.println("预支付数据异常(orderId = "  + id + ")");
        }
@@ -882,9 +1106,18 @@
     * @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) {
            Integer orderId = Integer.valueOf(String.valueOf(map.get("orderId")));
            Integer state = Integer.valueOf(String.valueOf(map.get("state")));
            if(state == 6){
                map.put("receipt", "http://182.160.16.251:81/files/html/parcel_receipt_" + orderId + ".html");
            }else{
                map.put("receipt", "");
            }
        }
        return maps;
    }
@@ -959,24 +1192,21 @@
            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);
            Map<String, String>  merrefund = payMoneyUtil.wxRefund(query.getCode(),orderLogistics.getId() + "," + orderLogistics.getType(),query.getAmount()+"",query.getAmount()+"","");
            //Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), orderLogistics.getId() + "_" + orderLogistics.getType(), orderLogistics.getOrderNum());
            if ("SUCCESS".equals(merrefund.get("return_code"))) {//成功
                //添加交易明细
                transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流取消退款", query.getAmount(), 1, 1, 1, 4, orderLogistics.getId());
            }else{
                return ResultUtil.error("退款返回未知异常");
            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 (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1) {//失败
                return ResultUtil.error("订单取消失败(退款不成功)");
            if(!"139".equals(statusCode)){
                return ResultUtil.error(results.getStatusDescription());
            }
            if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2) {//未知
            }*/
        }
        if(null != orderLogistics.getPayType() && orderLogistics.getPayType() == 2){//支付宝
            OrderCancel orderCancel = new OrderCancel();
@@ -992,29 +1222,19 @@
            this.updateById(orderLogistics);
            integer = orderCancel.getId();
            //调用回退接口
            PaymentRecord query = paymentRecordService.query(1, orderLogistics.getUserId(), 1, orderLogistics.getId(), orderLogistics.getType(), 2, 2);
            /*Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), orderLogistics.getId() + "_" + orderLogistics.getType(), orderLogistics.getOrderNum());
            if (Integer.valueOf(merrefund.get("code").toString()) == 0) {
                Map<String, Object> refundqry = icbcPayUtil.refundqry("", query.getCode(), orderLogistics.getOrderNum());
                if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 0) {//成功
                    //添加交易明细
                    transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流取消退款", query.getAmount(), 1, 1, 1, 4, orderLogistics.getId());
                }
                if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 1) {//失败
                    return ResultUtil.error("订单取消失败(退款不成功)");
                }
                if (Integer.valueOf(refundqry.get("code").toString()) == 0 && Integer.valueOf(refundqry.get("pay_status").toString()) == 2) {//未知
                    return ResultUtil.error("退款返回未知异常");
                }
            }*/
            Map<String, String>  merrefund = payMoneyUtil.aliRefund(query.getCode(),query.getAmount()+"");
            //Map<String, Object> merrefund = icbcPayUtil.merrefund(query.getCode(), "", query.getAmount(), orderLogistics.getId() + "_" + orderLogistics.getType(), orderLogistics.getOrderNum());
            if ("SUCCESS".equals(merrefund.get("return_code"))) {//成功
                //添加交易明细
                transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流取消退款", query.getAmount(), 1, 1, 1, 4, orderLogistics.getId());
            }else{
                return ResultUtil.error("退款返回未知异常");
            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){//余额
@@ -1036,7 +1256,7 @@
            integer = orderCancel.getId();
            //添加交易明细
            transactionDetailsService.saveData(orderLogistics.getUserId(), "小件物流取消退款", orderLogistics.getPayMoney(), 1, 1, 1, 4, orderLogistics.getId());
            transactionDetailsService.saveData(orderLogistics.getUserId(), "包裹取消退款", orderLogistics.getPayMoney(), 1, 1, 1, 4, orderLogistics.getId());
        }
        if(null != orderLogistics.getDriverId()){
@@ -1049,7 +1269,8 @@
        }
        //添加消息
        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 have successfully cancelled your parcel order, thank you for using!"
                : "Vous avez annulé avec succès votre commande de colis, merci de l’utiliser!", orderLogistics.getUserId(), 1);
        Map<String, Object> map = new HashMap<>();
        map.put("id", integer);
        return ResultUtil.success(map);
@@ -1111,12 +1332,13 @@
    @Override
    public Map<String, Object> queryOrderInfo(Integer orderId) throws Exception {
        Map<String, Object> map = orderLogisticsMapper.queryOrderInfo(orderId);
        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());
@@ -1127,6 +1349,11 @@
        String driverId = redisUtil.getValue("DEVICE_" + map.get("driverId"));
        map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1);
        map.put("orderType", orderLogistics.getType());
        if(state == 6){
            map.put("receipt", "http://182.160.16.251:81/files/html/parcel_receipt_" + orderId + ".html");
        }else{
            map.put("receipt", "");
        }
        return map;
    }