liujie
2026-04-29 2d56c1d1ca0f7cbc05150b8cd48e63372f1a7f32
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -1,5 +1,6 @@
package com.stylefeng.guns.modular.specialTrain.server.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -46,6 +47,7 @@
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -57,7 +59,7 @@
@Service
public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
   
   public static List<Integer> orderIds = new ArrayList<>();
   public static Set<Integer> orderIds = ConcurrentHashMap.newKeySet();;
   @Resource
   private OrderPrivateCarMapper orderPrivateCarMapper;
   @Resource
@@ -130,6 +132,9 @@
   private IOrderTaxiService orderTaxiService;
   @Autowired
   private PayMoneyUtil payMoneyUtil;
   @Autowired
   private CbyzxOrderPayHelper cbyzxOrderPayHelper;
   @Autowired
   private TAbnormalPayOrderMapper abnormalPayOrderMapper;
   @Autowired
@@ -144,6 +149,9 @@
   private IUserTaxiCardService userTaxiCardService;
   @Autowired
   private IRegionService regionService;
   @Autowired
   private ITSysPushTypeService tSysPushTypeService;
   @Value("${callbackPath}")
   private String callbackPath;
   
@@ -163,6 +171,12 @@
   @Autowired
   private TDriverPromotionActivityService driverPromotionActivityService;
   private CarMapper carMapper;
   @Autowired
   private ITSysPaymentModeService tSysPaymentModeService;
   @Autowired
   private IServerCarModelService serverCarModelService;
   /**
    * 专车下单操作
@@ -294,6 +308,69 @@
               orderPrivateCar.setPassengersPhone(userInfo.getPhone());
            }
            orderPrivateCar.setState(1);
            // ===== 先付/后付模式判断 =====
            if (orderSource != 2) { // 扫码下单跳过先付判断(扫码下单已有固定司机)
               TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
                     new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
               if (paymentMode != null && paymentMode.getPrivateType() != null) {
                  baseWarpper.setPaymentMode(paymentMode.getPrivateType());
               }
               if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
                  // 先付模式:计算预估金额,订单状态改为7(待支付)
                  Company payCompany = companyCityService.query(geocode.get("districtCode"));
                  if (payCompany != null) {
                     try {
                        // 复用已获取的预估距离(米)和预估时间(分钟),还原为 getPrice 所需单位
                        double distanceMeters = orderPrivateCar.getEstimateMileage() != null
                              ? orderPrivateCar.getEstimateMileage() : 0;
                        long durationSeconds = orderPrivateCar.getEstimateTime() != null
                              ? (long) (orderPrivateCar.getEstimateTime() * 60) : 0;
                        List<ServerCarModelWarpper> priceList = serverCarModelService.getPrice(
                              payCompany.getId(), distanceMeters, durationSeconds, 0L, 1, geocode);
                        if (priceList != null && !priceList.isEmpty()) {
                           // 按 serverCarModelId 精确匹配,找不到则取第一条
                           ServerCarModelWarpper matched = priceList.stream()
                                 .filter(w -> w.getId() != null && w.getId().equals(serverCarModelId))
                                 .findFirst()
                                 .orElse(priceList.get(0));
                           // 根据 rideType 取对应金额 Map(key="zongfeiyong")
                           Map<String, Object> amountMap = null;
                           if (Integer.valueOf(2).equals(rideType)) {
                              amountMap = matched.getBuyNowAmount();         // 一口价
                           } else if (Integer.valueOf(3).equals(rideType)) {
                              amountMap = matched.getPutTogetherOneAmount(); // 拼车(1人拼成)
                           } else {
                              amountMap = matched.getAmount();               // 独享(默认)
                           }
                           if (amountMap != null && amountMap.get("zongfeiyong") != null) {
                              Double estimateMoney = Double.valueOf(amountMap.get("zongfeiyong").toString());
                              orderPrivateCar.setEstimateAmount(estimateMoney);
                              orderPrivateCar.setOrderMoney(estimateMoney);
                              baseWarpper.setEstimateAmount(estimateMoney);
                           }
                        }
                        // 先付模式:覆盖状态为7(待支付),不进行派单
                        orderPrivateCar.setState(7);
                        orderPrivateCar.setCompanyId(payCompany.getId());
                        orderPrivateCar.setPaymentMode(1); // 记录先付模式
                     } catch (Exception e) {
                        e.printStackTrace();
                        // 降级:计算失败时保持后付逻辑(state=1,正常派单)
                        orderPrivateCar.setPaymentMode(2); // 降级记录后付
                     }
                  } else {
                     orderPrivateCar.setPaymentMode(1); // 公司未找到,仍记录配置为先付
                  }
               } else {
                  // 后付模式(无配置 或 privateType=2)
                  orderPrivateCar.setPaymentMode(
                        (paymentMode != null && paymentMode.getPrivateType() != null)
                              ? paymentMode.getPrivateType()
                              : 2
                  );
               }
            }
            // ===== 先付/后付判断结束 =====
            orderPrivateCar.setInsertTime(new Date());
            orderPrivateCar.setTravelTime(travelTime);
            orderPrivateCar.setOrderType(reservation);
@@ -349,11 +426,19 @@
               driver.setState(3);
               driverService.updateById(driver);
            }
            //判断独享,一口价,拼车
            if (orderPrivateCar.getRideType() != 3) {
               orderPrivateCar.setTotalPeopleNum(peopleNum);
               orderPrivateCar.setIsReassign(1);
               orderPrivateCar.setIsDelete(1);
               orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
               this.insert(orderPrivateCar);
               
               if (orderSource == 2) {//扫码下单
@@ -371,6 +456,7 @@
               if (orderPrivateCar.getState() == 1) {
                  this.pushOrder(orderPrivateCar);
               }
            } else {
@@ -428,6 +514,7 @@
                  orderPrivateCar.setTotalPeopleNum(peopleNum);
                  orderPrivateCar.setIsReassign(1);
                  orderPrivateCar.setIsDelete(1);
                  orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
                  this.insert(orderPrivateCar);
                  this.pushOrder(orderPrivateCar);
               } else {
@@ -445,6 +532,7 @@
                  orderPrivateCar.setIsReassign(1);
                  orderPrivateCar.setIsDelete(1);
                  orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid());
                  orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
                  this.insert(orderPrivateCar);
                  //修改总订单人数
                  OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar();
@@ -615,6 +703,49 @@
               orderPrivateCar.setPassengersPhone(userInfo.getPhone());
            }
            orderPrivateCar.setState(1);
            if (orderSource != 2) {
               TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
                     new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
               if (paymentMode != null && paymentMode.getPrivateType() != null) {
                  baseWarpper.setPaymentMode(paymentMode.getPrivateType());
               }
               if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
                  Company payCompany = companyCityService.query(geocode.get("districtCode"));
                  if (payCompany != null) {
                     try {
                        double distanceMeters = orderPrivateCar.getEstimateMileage() != null
                              ? orderPrivateCar.getEstimateMileage() : 0;
                        long durationSeconds = orderPrivateCar.getEstimateTime() != null
                              ? (long) (orderPrivateCar.getEstimateTime() * 60) : 0;
                        List<ServerCarModelWarpper> priceList = serverCarModelService.getPrice(
                              payCompany.getId(), distanceMeters, durationSeconds, 0L, 1, geocode);
                        Double estimateMoney = getBatchEstimateAmount(serverCarModel, priceList);
                        if (estimateMoney != null) {
                           orderPrivateCar.setEstimateAmount(estimateMoney);
                           orderPrivateCar.setOrderMoney(estimateMoney);
                           orderPrivateCar.setState(7);
                           orderPrivateCar.setCompanyId(payCompany.getId());
                           orderPrivateCar.setPaymentMode(1);
                           baseWarpper.setEstimateAmount(estimateMoney);
                        } else {
                           orderPrivateCar.setPaymentMode(2);
                        }
                     } catch (Exception e) {
                        e.printStackTrace();
                        orderPrivateCar.setPaymentMode(2);
                        orderPrivateCar.setState(1);
                     }
                  } else {
                     orderPrivateCar.setPaymentMode(1);
                  }
               } else {
                  orderPrivateCar.setPaymentMode(
                        (paymentMode != null && paymentMode.getPrivateType() != null)
                              ? paymentMode.getPrivateType()
                              : 2
                  );
               }
            }
            orderPrivateCar.setInsertTime(new Date());
            orderPrivateCar.setTravelTime(travelTime);
            orderPrivateCar.setOrderType(reservation);
@@ -622,138 +753,126 @@
            orderPrivateCar.setTotalPeopleNum(peopleNum);
            orderPrivateCar.setIsReassign(1);
            orderPrivateCar.setIsDelete(1);
            orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0);
            //判断独享,一口价,拼车
            JSONArray jsonArray = JSON.parseArray(serverCarModel);
            this.insert(orderPrivateCar);
            for (int i = 0; i < jsonArray.size(); i++) {
               JSONObject jsonObject1 = jsonArray.getJSONObject(i);
               Integer serverCarModelId = jsonObject1.getInteger("serverCarModelId");
               Integer rideType = jsonObject1.getInteger("rideType");
               if (0 == serverCarModelId) {
                  OrderTaxi orderTaxi = new OrderTaxi();
                  orderTaxi.setId(orderPrivateCar.getId());
                  orderTaxi.setState(1);
                  orderTaxi.setUserId(orderPrivateCar.getUserId());
                  orderTaxi.setStartLon(orderPrivateCar.getStartLon());
                  orderTaxi.setStartLat(orderPrivateCar.getStartLat());
                  orderTaxiService.pushOrder(orderTaxi, 3);
               }
               if (rideType != 3) {
                  //推单操作-独享
                  this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
               } else {
                  OrderPrivateCar orderPrivateCar1 = null;
                  OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
                  TbSpellOrderRule spellOrderRule = spellOrderRuleService.selectOne(new EntityWrapper<TbSpellOrderRule>().eq("openCityId", openCity.getId()));
                  //判断是否有相同线路的拼车-有直接拼成功,或者推送拼车订单
                  List<OrderPrivateCar> orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).in("state", "2,3,4").le("totalPeopleNum", 4 - peopleNum));
                  for (OrderPrivateCar order : orderList) {
                     if (spellOrderRule != null) {
                        JSONObject jsonObject = JSONObject.parseObject(spellOrderRule.getContent());
                        //判断时间
                        if (travelTime.getTime() >= order.getTravelTime().getTime() - jsonObject.getInteger("num5") * 60000L && travelTime.getTime() <= order.getTravelTime().getTime() + jsonObject.getInteger("num6") * 60000L) {
                           //                        Double dis1 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), order.getStartLon() + "," + order.getStartLat(), 1).get("distance").toString());
                           //                        Double dis2 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat(), 1).get("distance").toString());
                           // TODO: 2023/11/4  已改成计算直线距离
                           Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), order.getStartLon() + "," + order.getStartLat()).get("WGS84");
                           Double dis2 = geodesyUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat()).get("WGS84");
                           //判断距离
                           if (dis1 <= jsonObject.getInteger("num1") * 1000 && dis2 <= jsonObject.getInteger("num2") * 1000) {
                              orderPrivateCar1 = order;
                              break;
                           }
                        }
                     }
            if (orderPrivateCar.getState() != 7) {
               for (int i = 0; i < jsonArray.size(); i++) {
                  JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                  Integer serverCarModelId = jsonObject1.getInteger("serverCarModelId");
                  Integer rideType = jsonObject1.getInteger("rideType");
                  if (0 == serverCarModelId) {
                     OrderTaxi orderTaxi = new OrderTaxi();
                     orderTaxi.setId(orderPrivateCar.getId());
                     orderTaxi.setState(1);
                     orderTaxi.setUserId(orderPrivateCar.getUserId());
                     orderTaxi.setStartLon(orderPrivateCar.getStartLon());
                     orderTaxi.setStartLat(orderPrivateCar.getStartLat());
                     orderTaxiService.pushOrder(orderTaxi, 3);
                  }
                  if (orderPrivateCar1 == null) {
                     orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).eq("state", 5).le("totalPeopleNum", 4 - peopleNum));
                  if (rideType != 3) {
                     //推单操作-独享
                     this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
                  } else {
                     OrderPrivateCar orderPrivateCar1 = null;
                     OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
                     TbSpellOrderRule spellOrderRule = spellOrderRuleService.selectOne(new EntityWrapper<TbSpellOrderRule>().eq("openCityId", openCity.getId()));
                     //判断是否有相同线路的拼车-有直接拼成功,或者推送拼车订单
                     List<OrderPrivateCar> orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).in("state", "2,3,4").le("totalPeopleNum", 4 - peopleNum));
                     for (OrderPrivateCar order : orderList) {
                        if (spellOrderRule != null) {
                           JSONObject jsonObject = JSONObject.parseObject(spellOrderRule.getContent());
                           //判断时间
                           if (travelTime.getTime() >= order.getTravelTime().getTime() - jsonObject.getInteger("num5") * 60000L && travelTime.getTime() <= order.getTravelTime().getTime() + jsonObject.getInteger("num6") * 60000L) {
                              String value = (String) redisTemplate.opsForValue().get("dache:DRIVER" + String.valueOf(order.getDriverId()));
                              //                            Double dis1 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1).get("distance").toString());
                              //                            Double dis2 = Double.valueOf(gdMapElectricFenceUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat(), 1).get("distance").toString());
                              // TODO: 2023/11/4  已改成计算直线距离
                              Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value).get("WGS84");
                              Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), order.getStartLon() + "," + order.getStartLat()).get("WGS84");
                              Double dis2 = geodesyUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat()).get("WGS84");
                              //判断距离
                              if (dis1 <= jsonObject.getInteger("num3") * 1000 && dis2 <= jsonObject.getInteger("num4") * 1000) {
                              if (dis1 <= jsonObject.getInteger("num1") * 1000 && dis2 <= jsonObject.getInteger("num2") * 1000) {
                                 orderPrivateCar1 = order;
                                 break;
                              }
                           }
                        }
                     }
                  }
                  if (orderPrivateCar1 == null) {
                     this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
                  } else {
                     Driver driver = driverService.selectById(orderPrivateCar1.getDriverId());
                     orderPrivateCar.setDriverId(driverId);
                     orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
                           driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
                     orderPrivateCar.setState(2);
                     orderPrivateCar.setDriverId(driver.getId());
                     orderPrivateCar.setCarId(driver.getCarId());
                     CarService query1 = carServiceMapper.query(1, driver.getCarId());
                     orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
                     orderPrivateCar.setRideType(3);
                     orderPrivateCar.setSnatchOrderTime(new Date());
                     orderPrivateCar.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
                     orderPrivateCar.setIsReassign(1);
                     orderPrivateCar.setIsDelete(1);
                     orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid());
                     Integer promotion1 = isPromotion(orderPrivateCar.getUserId(), driver.getPlaceOfEmployment());
                     if(promotion1!=null){
                        orderPrivateCar.setPromotion(2);
                        Driver driver1 = driverService.selectById(promotion1);
                        orderPrivateCar.setPromotionUser(driver1.getName());
                        orderPrivateCar.setPromotionPhone(driver1.getPhone());
                        orderPrivateCar.setPromotionDriverId(promotion1);
                     }
                     //修改总订单人数
                     OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar();
                     orderPrivateCar2.setSpellSuccess(1);
                     orderPrivateCar2.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
                     this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
                     this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
                     //
                     //调用移动的小号接口
//                     Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderPrivateCar.getPassengersPhone(), driver.getPhone(), (System.currentTimeMillis() + 86400000));
//                     if (String.valueOf(map.get("code")).equals("200")) {
//                        orderPrivateCar.setTelX(map.get("telX"));
//                        orderPrivateCar.setBindId(map.get("bindId"));
//                     }
                     new Thread(new Runnable() {
                        @Override
                        public void run() {
                           pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0);
                           pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 100, 0);
                           pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
                     if (orderPrivateCar1 == null) {
                        orderList = orderPrivateCarMapper.selectList(new EntityWrapper<OrderPrivateCar>().eq("rideType", 3).eq("state", 5).le("totalPeopleNum", 4 - peopleNum));
                        for (OrderPrivateCar order : orderList) {
                           if (spellOrderRule != null) {
                              JSONObject jsonObject = JSONObject.parseObject(spellOrderRule.getContent());
                              if (travelTime.getTime() >= order.getTravelTime().getTime() - jsonObject.getInteger("num5") * 60000L && travelTime.getTime() <= order.getTravelTime().getTime() + jsonObject.getInteger("num6") * 60000L) {
                                 String value = (String) redisTemplate.opsForValue().get("dache:DRIVER" + String.valueOf(order.getDriverId()));
                                 Double dis1 = geodesyUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value).get("WGS84");
                                 Double dis2 = geodesyUtil.getDistance(orderPrivateCar.getEndLon() + "," + orderPrivateCar.getEndLat(), order.getEndLon() + "," + order.getEndLat()).get("WGS84");
                                 if (dis1 <= jsonObject.getInteger("num3") * 1000 && dis2 <= jsonObject.getInteger("num4") * 1000) {
                                    orderPrivateCar1 = order;
                                    break;
                                 }
                              }
                           }
                        }
                     }).start();
                     List<OrderPrivateCar> orderList1 = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid()));
                     for (OrderPrivateCar orderPrivateCar3 : orderList1) {
                     }
                     if (orderPrivateCar1 == null) {
                        this.pushOrder(orderPrivateCar.getId(), rideType, serverCarModelId, orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat());
                     } else {
                        Driver driver = driverService.selectById(orderPrivateCar1.getDriverId());
                        orderPrivateCar.setDriverId(driverId);
                        orderPrivateCar.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
                              driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
                        orderPrivateCar.setState(2);
                        orderPrivateCar.setDriverId(driver.getId());
                        orderPrivateCar.setCarId(driver.getCarId());
                        CarService query1 = carServiceMapper.query(1, driver.getCarId());
                        orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
                        orderPrivateCar.setRideType(3);
                        orderPrivateCar.setSnatchOrderTime(new Date());
                        orderPrivateCar.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
                        orderPrivateCar.setIsReassign(1);
                        orderPrivateCar.setIsDelete(1);
                        orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid());
                        Integer promotion1 = isPromotion(orderPrivateCar.getUserId(), driver.getPlaceOfEmployment());
                        if(promotion1!=null){
                           orderPrivateCar.setPromotion(2);
                           Driver driver1 = driverService.selectById(promotion1);
                           orderPrivateCar.setPromotionUser(driver1.getName());
                           orderPrivateCar.setPromotionPhone(driver1.getPhone());
                           orderPrivateCar.setPromotionDriverId(promotion1);
                        }
                        OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar();
                        orderPrivateCar2.setSpellSuccess(1);
                        orderPrivateCar2.setTotalPeopleNum(peopleNum + orderPrivateCar1.getTotalPeopleNum());
                        this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
                        this.update(orderPrivateCar2, new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()).lt("state", 6));
                        new Thread(new Runnable() {
                           @Override
                           public void run() {
                              pushUtil.pushOrderState(1, uid, orderPrivateCar.getId(), 1, 2, 0);
                              pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, 100, 0);
                              pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
                           }
                        }).start();
                        List<OrderPrivateCar> orderList1 = this.selectList(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid()));
                        for (OrderPrivateCar orderPrivateCar3 : orderList1) {
                           pushUtil.pushOrderState(1, orderPrivateCar3.getUserId(), orderPrivateCar3.getId(), 1, 13, 0);
                        }
                        OrderPrivateCar orderPrivateCar3 = this.selectById(orderPrivateCar.getPid());
                        pushUtil.pushOrderState(1, orderPrivateCar3.getUserId(), orderPrivateCar3.getId(), 1, 13, 0);
                     }
                     OrderPrivateCar orderPrivateCar3 = this.selectById(orderPrivateCar.getPid());
                     pushUtil.pushOrderState(1, orderPrivateCar3.getUserId(), orderPrivateCar3.getId(), 1, 13, 0);
                  }
               }
            }
            
            //添加消息
            systemNoticeService.addSystemNotice(1, "您的快车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
            if (orderPrivateCar.getState() == 7) {
               systemNoticeService.addSystemNotice(1, "您的快车订单已生成,请先完成支付。", orderPrivateCar.getUserId(), 1);
            } else {
               systemNoticeService.addSystemNotice(1, "您的快车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
            }
            baseWarpper.setId(orderPrivateCar.getId());
         } catch (Exception e) {
            e.printStackTrace();
@@ -764,6 +883,45 @@
         return ResultUtil.error("系统繁忙,请稍后再试!");
      }
      return ResultUtil.success(baseWarpper);
   }
   private Double getBatchEstimateAmount(String serverCarModel, List<ServerCarModelWarpper> priceList) {
      if (ToolUtil.isEmpty(serverCarModel) || priceList == null || priceList.isEmpty()) {
         return null;
      }
      JSONArray jsonArray = JSON.parseArray(serverCarModel);
      Double minEstimateAmount = null;
      for (int i = 0; i < jsonArray.size(); i++) {
         JSONObject jsonObject = jsonArray.getJSONObject(i);
         Integer serverCarModelId = jsonObject.getInteger("serverCarModelId");
         Integer rideType = jsonObject.getInteger("rideType");
         if (serverCarModelId == null || serverCarModelId == 0) {
            continue;
         }
         ServerCarModelWarpper matched = priceList.stream()
               .filter(item -> item.getId() != null && item.getId().equals(serverCarModelId))
               .findFirst()
               .orElse(null);
         if (matched == null) {
            continue;
         }
         Map<String, Object> amountMap;
         if (Integer.valueOf(2).equals(rideType)) {
            amountMap = matched.getBuyNowAmount();
         } else if (Integer.valueOf(3).equals(rideType)) {
            amountMap = matched.getPutTogetherOneAmount();
         } else {
            amountMap = matched.getAmount();
         }
         if (amountMap == null || amountMap.get("zongfeiyong") == null) {
            continue;
         }
         Double estimateAmount = Double.valueOf(amountMap.get("zongfeiyong").toString());
         if (minEstimateAmount == null || estimateAmount < minEstimateAmount) {
            minEstimateAmount = estimateAmount;
         }
      }
      return minEstimateAmount;
   }
@@ -974,8 +1132,27 @@
//        if(orderPrivateCar.getState() == 4){
//            return ResultUtil.error("司机已到达预约点,取消会产生一定的费用");
//        }
      if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11) {
      if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11 && orderPrivateCar.getCancelType() ==2) {
         return ResultUtil.error("订单已取消,请刷新页面");
      }
      if (!Integer.valueOf(2).equals(orderPrivateCar.getPaymentMode()) && StrUtil.isNotEmpty(orderPrivateCar.getPrepaySecondPayNo())) {
         ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, reason, remark, uid);
         if (refundResult != null) {
            if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) {
               return refundResult;
            }
            Map<String, Object> map = new HashMap<>();
            map.put("id", null);
//            return ResultUtil.success(map);
         }
      }else if(!Integer.valueOf(2).equals(orderPrivateCar.getPaymentMode()) && StrUtil.isEmpty(orderPrivateCar.getPrepaySecondPayNo())){
         UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
         userInfo.setBalance(userInfo.getBalance() + orderPrivateCar.getPayMoney());
         userInfoService.updateById(userInfo);
      }
      Integer number1 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid() == null ? orderPrivateCar.getId() : orderPrivateCar.getPid()).lt("state", 6));
      Integer number2 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar.getPid() == null ? orderPrivateCar.getId() : orderPrivateCar.getPid()).lt("state", 6));
@@ -1103,9 +1280,14 @@
         if (payType == 1) {//微信支付
            orderCancel.setPayType(1);
            orderCancelService.updateById(orderCancel);
            String app = type == 1 ? "APP" : "JSAPI";
            resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_1_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), "", 1);//添加预支付数据
            String outTradeNo = "CANCEL_" + id + "_1_" + UUIDUtil.getRandomCode(5);
            JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, query.getMoney());
            if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
               return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
            }
            String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
            resultUtil = ResultUtil.success(response);
            paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), paymentCode, 1);//添加预支付数据
         }
         if (payType == 2) {//支付宝支付
            orderCancel.setPayType(2);
@@ -1805,6 +1987,9 @@
      if (orderPrivateCar.getState() != 7) {
         return ResultUtil.error("订单不在待支付状态,不允许支付", "");
      }
      if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
         return ResultUtil.error("订单退款处理中,请等待退款完成", "");
      }
      Integer uid = orderPrivateCar.getUserId();
      Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
      UserInfo userInfo = userInfoService.selectById(uid);
@@ -1858,14 +2043,25 @@
         }
      }
      orderMoney = orderMoney < 0 ? 0 : orderMoney;
      ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
      if (prepaySettleResult != null) {
         return prepaySettleResult;
      }
      orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
      if (payType == 1) {//微信支付
         String app = type == 1 ? "APP" : "JSAPI";
         resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据
         String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
         JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
         if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
            return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
         }
         String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
         resultUtil = ResultUtil.success(response);
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, paymentCode, 1);//添加预支付数据
      }
      if (payType == 2) {//支付宝支付
         resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据
         String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
         resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi");
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, outTradeNo, 1);//添加预支付数据
      }
      if (payType == 3) {//余额支付
         if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
@@ -1874,29 +2070,32 @@
         
         userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         
         boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar);
         boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
         if (isPrepayFirstStage) {
            handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3);
            return resultUtil;
         }
         OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分
         //添加交易明细
         transactionDetailsService.saveData(uid, "快车订单", orderMoney, 2, 1, 1, 1, orderId);
         userInfoService.updateById(userInfo);
         orderPrivateCar.setState(8);
         orderPrivateCar.setPayType(3);
         orderPrivateCar.setPayMoney(orderMoney);
         orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), orderMoney) : orderMoney);
         orderPrivateCar.setPayTime(new Date());
         //处理优惠券和红包
         if (null != userCouponRecord) {
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         if (isPrepaySpreadStage) {
            orderPrivateCar.setPrepayStage(5);
            orderPrivateCar.setPrepaySecondPayNo(buildBalancePayNo(1, orderId));
         }
         if (null != query) {
            query.setState(2);
            query.setEndTime(new Date());
            userRedPacketRecordService.updateById(query);
         if (!isPrepaySpreadStage) {
            consumePrivateCarBenefits(orderPrivateCar);
         }
         //非追缴单才需要添加收入
         if(0 == orderPrivateCar.getRecoveryOrder()){
@@ -1940,6 +2139,9 @@
      }
      if (orderPrivateCar.getState() != 7) {
         return ResultUtil.error("订单不在待支付状态,不允许支付", new ArrayList<>());
      }
      if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
         return ResultUtil.error("订单退款处理中,请等待退款完成", new ArrayList<>());
      }
      Integer uid = orderPrivateCar.getUserId();
@@ -2106,14 +2308,26 @@
      orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
      System.out.println("!!!" + orderMoney + "!!!!");
      orderMoney = orderMoney < 0 ? 0 : orderMoney;
      orderPrivateCar.setPayMoney(orderMoney);
      ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
      if (prepaySettleResult != null) {
         return prepaySettleResult;
      }
      orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
      if (!isPrivateCarPrepaySpreadStage(orderPrivateCar)) {
         orderPrivateCar.setPayMoney(orderMoney);
      }
      if (payType == 1) {//微信支付
         if (orderMoney == 0) {
            return ResultUtil.error("请使用余额支付");
         }
         String app = type == 1 ? "APP" : "JSAPI";
         resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId());
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据
         String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
         JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
         if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
            return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
         }
         String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
         resultUtil = ResultUtil.success(response);
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, paymentCode, 1);//添加预支付数据
         //创建定时任务查询订单支付状态
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
@@ -2144,8 +2358,9 @@
         if (orderMoney == 0) {
            return ResultUtil.error("请使用余额支付");
         }
         resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi");
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据
         String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
         resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi");
         paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, outTradeNo, 1);//添加预支付数据
      }
      if (payType == 3) {//余额支付
         if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) {
@@ -2153,7 +2368,14 @@
         }
         userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar);
         boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
         if (isPrepayFirstStage) {
            handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3);
            return resultUtil;
         }
         OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         if (null != query1) {
@@ -2166,22 +2388,15 @@
         
         orderPrivateCar.setState(8);
         orderPrivateCar.setPayType(3);
         orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), orderMoney) : orderMoney);
         orderPrivateCar.setPayTime(new Date());
         //处理优惠券和红包
         if (null != userCouponRecord) {
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         if (isPrepaySpreadStage) {
            orderPrivateCar.setPrepayStage(5);
            orderPrivateCar.setPrepaySecondPayNo(buildBalancePayNo(1, orderId));
         }
         //处理打车卡
         if (null != userTaxiCard) {
            userTaxiCardService.updateById(userTaxiCard);
         }
         if (null != query) {
            query.setState(2);
            query.setEndTime(new Date());
            userRedPacketRecordService.updateById(query);
         if (!isPrepaySpreadStage) {
            consumePrivateCarBenefits(orderPrivateCar);
         }
         //非追缴单才添加收入记录
         if(0 == orderPrivateCar.getRecoveryOrder()){
@@ -2372,54 +2587,428 @@
         System.err.println("预支付数据异常(orderId = " + id + ")");
      }
   }
   private boolean isPrivateCarPrepayFirstStage(OrderPrivateCar orderPrivateCar) {
      return orderPrivateCar != null
            && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
            && Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage());
   }
   private boolean isPrivateCarPrepaySpreadStage(OrderPrivateCar orderPrivateCar) {
      return orderPrivateCar != null
            && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
            && Integer.valueOf(3).equals(orderPrivateCar.getPrepayStage());
   }
   private String buildBalancePayNo(Integer orderType, Integer orderId) {
      return "BAL_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
   }
   private Double appendPayMoney(Double source, Double amount) {
      return new BigDecimal(source == null ? 0D : source)
            .add(new BigDecimal(amount == null ? 0D : amount))
            .setScale(2, BigDecimal.ROUND_HALF_EVEN)
            .doubleValue();
   }
   private boolean isPrivateCarPrepayFinalStage(OrderPrivateCar orderPrivateCar) {
      return orderPrivateCar != null
            && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
            && !Integer.valueOf(5).equals(orderPrivateCar.getPrepayStage());
   }
   private BigDecimal toMoney(Double amount) {
      return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP);
   }
   private PaymentRecord getPrivateCarPrepayPaidRecord(OrderPrivateCar orderPrivateCar) throws Exception {
      PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2);
      if (paymentRecord == null) {
         paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, null, 2);
      }
      if (paymentRecord != null && orderPrivateCar.getPayType() == null) {
         orderPrivateCar.setPayType(paymentRecord.getPayType());
      }
      return paymentRecord;
   }
   private BigDecimal getPrivateCarPrepayPaidAmount(OrderPrivateCar orderPrivateCar) throws Exception {
      PaymentRecord paymentRecord = getPrivateCarPrepayPaidRecord(orderPrivateCar);
      if (paymentRecord != null && paymentRecord.getAmount() != null && paymentRecord.getAmount() > 0) {
         return toMoney(paymentRecord.getAmount());
      }
      if (orderPrivateCar.getPayMoney() != null && orderPrivateCar.getPayMoney() > 0) {
         return toMoney(orderPrivateCar.getPayMoney());
      }
      return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
   }
   private Double getPrivateCarPrepayFinalPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) throws Exception {
      if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
         return toMoney(finalAmount).doubleValue();
      }
      BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar);
      if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) {
         return toMoney(finalAmount).doubleValue();
      }
      BigDecimal spreadAmount = toMoney(finalAmount).subtract(paidAmount).setScale(2, RoundingMode.HALF_UP);
      if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) {
         orderPrivateCar.setPrepayStage(3);
         return spreadAmount.doubleValue();
      }
      return 0D;
   }
   private ResultUtil settlePrivateCarPrepayIfNoSecondPay(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double finalAmount) throws Exception {
      if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
         return null;
      }
      BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar);
      if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) {
         return null;
      }
      BigDecimal settleAmount = toMoney(finalAmount);
      BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP);
      if (refundAmount.compareTo(BigDecimal.ZERO) < 0) {
         return null;
      }
      if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
         ResultUtil refundResult = refundPrivateCarPrepayDifference(orderPrivateCar, userInfo, refundAmount.doubleValue());
         if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) {
            return refundResult;
         }
      }
      finishPrivateCarPrepayOrder(orderPrivateCar, settleAmount.doubleValue());
      return ResultUtil.success();
   }
   private ResultUtil refundPrivateCarPrepayDifference(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double refundAmount) throws Exception {
      if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
         userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D)
               .add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
         userInfoService.updateById(userInfo);
         orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5));
         orderPrivateCar.setPrepayRefundAmount(refundAmount);
         orderPrivateCar.setPrepayRefundTime(new Date());
         transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
         return ResultUtil.success();
      }
      PaymentRecord paymentRecord = getPrivateCarPrepayPaidRecord(orderPrivateCar);
      if (paymentRecord == null) {
         return ResultUtil.error("先付订单缺少已支付流水,无法退款");
      }
      if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) {
         CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
         request.setOutRequestNo(ToolUtil.isNotEmpty(orderPrivateCar.getPrepaySecondPayNo()) ? orderPrivateCar.getPrepaySecondPayNo() : paymentRecord.getCode());
         request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_1_" + orderPrivateCar.getId() + ToolUtil.getRandomString(5));
         request.setRefundAmount(toFen(refundAmount));
         request.setRefundDesc("快车先付订单多退少补退款");
         JSONObject response = CbyzxPayUtil.closePayOrder(request);
         if (!isPrivateCarPrepayRefundSuccess(response)) {
            return ResultUtil.error(extractPrivateCarRefundMessage(response), response);
         }
         orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response));
         orderPrivateCar.setPrepayRefundAmount(refundAmount);
         orderPrivateCar.setPrepayRefundTime(new Date());
         transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
         return ResultUtil.success(response);
      }
      if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) {
         Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString());
         if (!"10000".equals(map.get("code"))) {
            return ResultUtil.error(map.get("msg"));
         }
         orderPrivateCar.setPrepayRefundNo(map.get("trade_no"));
         orderPrivateCar.setPrepayRefundAmount(refundAmount);
         orderPrivateCar.setPrepayRefundTime(new Date());
         transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
         return ResultUtil.success(map);
      }
      return ResultUtil.error("先付订单支付方式不支持退款");
   }
   private void finishPrivateCarPrepayOrder(OrderPrivateCar orderPrivateCar, Double settleAmount) throws Exception {
      orderPrivateCar.setState(8);
      orderPrivateCar.setPayMoney(settleAmount);
      orderPrivateCar.setPayTime(new Date());
      orderPrivateCar.setPrepayStage(5);
      if (orderPrivateCar.getRecoveryOrder() != null && 0 == orderPrivateCar.getRecoveryOrder()) {
         Double incomeAmount = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus()
               ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
         Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, incomeAmount);
         orderPrivateCar.setSplitAllocation(JSON.toJSONString(map));
      }
      this.updateAllColumnById(orderPrivateCar);
      promotion(orderPrivateCar.getId());
      new Thread(new Runnable() {
         @Override
         public void run() {
            pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
            pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
         }
      }).start();
      systemNoticeService.addSystemNotice(1, "您的快车先付订单已完成结算,请注意查收。", orderPrivateCar.getUserId(), 1);
   }
   private void consumePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception {
      if (null != orderPrivateCar.getCouponId()) {
         UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
         if (userCouponRecord != null) {
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         }
      }
      if (null != orderPrivateCar.getUserTaxiCardId()) {
         UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId());
         if (userTaxiCard != null && (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3)) {
            JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
            jsonObject.put("time", jsonObject.getInteger("time") - 1);
            userTaxiCard.setContent(jsonObject.toJSONString());
            userTaxiCardService.updateById(userTaxiCard);
         }
      }
      if (null != orderPrivateCar.getRedPacketId()) {
         UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
         if (userRedPacketRecord != null) {
            userRedPacketRecord.setState(2);
            userRedPacketRecord.setEndTime(new Date());
            userRedPacketRecordService.updateById(userRedPacketRecord);
         }
      }
   }
   private void restorePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception {
      if (null != orderPrivateCar.getCouponId()) {
         UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
         if (userCouponRecord != null) {
            userCouponRecord.setState(1);
            userCouponRecord.setEndTime(null);
            userCouponRecordService.updateById(userCouponRecord);
         }
      }
      if (null != orderPrivateCar.getUserTaxiCardId()) {
         UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId());
         if (userTaxiCard != null && (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3)) {
            JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
            Integer time = jsonObject.getInteger("time");
            jsonObject.put("time", (time == null ? 0 : time) + 1);
            userTaxiCard.setContent(jsonObject.toJSONString());
            userTaxiCardService.updateById(userTaxiCard);
         }
      }
      if (null != orderPrivateCar.getRedPacketId()) {
         UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
         if (userRedPacketRecord != null) {
            userRedPacketRecord.setState(1);
            userRedPacketRecord.setEndTime(null);
            userRedPacketRecordService.updateById(userRedPacketRecord);
         }
      }
   }
   private boolean isPrivateCarPrepayRefundSuccess(JSONObject response) {
      if (response == null) {
         return false;
      }
      Object code = response.get("code");
      if (code == null || !"0".equals(String.valueOf(code))) {
         return false;
      }
      JSONObject data = response.getJSONObject("data");
      return data != null && Boolean.TRUE.equals(data.getBoolean("isSuccess"));
   }
   private String extractPrivateCarRefundNo(JSONObject response) {
      if (response == null) {
         return null;
      }
      JSONObject data = response.getJSONObject("data");
      if (data == null) {
         return null;
      }
      String refundNo = data.getString("merchantRefundSerialNo");
      if (ToolUtil.isNotEmpty(refundNo)) {
         return refundNo;
      }
      refundNo = data.getString("refundId");
      if (ToolUtil.isNotEmpty(refundNo)) {
         return refundNo;
      }
      return data.getString("gatewaySerialNo");
   }
   private String extractPrivateCarRefundMessage(JSONObject response) {
      if (response == null) {
         return "微信先付退款失败";
      }
      JSONObject data = response.getJSONObject("data");
      if (data != null && ToolUtil.isNotEmpty(data.getString("failReason"))) {
         return data.getString("failReason");
      }
      String msg = response.getString("msg");
      return ToolUtil.isNotEmpty(msg) ? msg : "微信先付退款失败";
   }
   private Integer toFen(Double amount) {
      return new BigDecimal(String.valueOf(amount)).multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).intValue();
   }
   private String buildPrepayRefundOutNo(Integer orderId) {
      return "PREPAY_REFUND_1_" + orderId+ToolUtil.getRandomString(5);
   }
   private boolean isPrivateCarPrepayMode(OrderPrivateCar orderPrivateCar) {
      return orderPrivateCar != null && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode());
   }
   private ResultUtil handlePrivateCarPrepayCancelRefund(OrderPrivateCar orderPrivateCar, String reason, String remark, Integer uid) throws Exception {
      if (!isPrivateCarPrepayMode(orderPrivateCar)) {
         return null;
      }
      String outRequestNo = orderPrivateCar.getPrepaySecondPayNo();
      if (ToolUtil.isEmpty(outRequestNo)) {
         return ResultUtil.error("微信先付订单缺少支付单号,无法关闭支付单");
      }
      Double refundAmount = orderPrivateCar.getPayMoney();
      if (refundAmount == null || refundAmount <= 0) {
         return ResultUtil.error("微信先付订单退款金额异常");
      }
      CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
      request.setOutRequestNo(outRequestNo);
      request.setRefundOutRequestNo(buildPrepayRefundOutNo(orderPrivateCar.getId()));
      request.setRefundAmount(toFen(refundAmount));
      request.setRefundDesc(ToolUtil.isNotEmpty(reason) ? reason : "快车订单取消退款");
      JSONObject response = CbyzxPayUtil.closePayOrder(request);
      if (!isPrivateCarPrepayRefundSuccess(response)) {
         return ResultUtil.error(extractPrivateCarRefundMessage(response), response);
      }
      restorePrivateCarBenefits(orderPrivateCar);
      transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
      orderCancelService.saveData(orderPrivateCar.getId(), 1,
            ToolUtil.isNotEmpty(reason) ? reason : "无司机接单",
            ToolUtil.isNotEmpty(remark) ? remark : (ToolUtil.isNotEmpty(reason) ? reason : "无司机接单"),
            1, refundAmount, 2, 1, uid);
      orderPrivateCar.setState(10);
      orderPrivateCar.setPrepayStage(5);
      orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response));
      orderPrivateCar.setPrepayRefundAmount(refundAmount);
      orderPrivateCar.setPrepayRefundTime(new Date());
      this.updateById(orderPrivateCar);
      if (orderPrivateCar.getDriverId() != null) {
         this.deleteTask(orderPrivateCar.getId());
         pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
         Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
         if (driver != null) {
            driver.setState(2);
            driverService.updateById(driver);
         }
         if (orderPrivateCar.getBindId() != null) {
            chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(), orderPrivateCar.getTelX(), (System.currentTimeMillis() + 86400000));
         }
      }
      systemNoticeService.addSystemNotice(1, "您的快车微信先付订单已取消,退款已原路退回,请注意查收。", orderPrivateCar.getUserId(), 1);
      return ResultUtil.success(response);
   }
   private void dispatchPrepayPrivateCarOrder(OrderPrivateCar orderPrivateCar) throws Exception {
      if (Integer.valueOf(3).equals(orderPrivateCar.getType()) && ToolUtil.isNotEmpty(orderPrivateCar.getServerCarModel())) {
         JSONArray jsonArray = JSON.parseArray(orderPrivateCar.getServerCarModel());
         for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            Integer serverCarModelId = jsonObject.getInteger("serverCarModelId");
            Integer rideType = jsonObject.getInteger("rideType");
            if (serverCarModelId != null && serverCarModelId == 0) {
               OrderTaxi orderTaxi = new OrderTaxi();
               orderTaxi.setId(orderPrivateCar.getId());
               orderTaxi.setState(1);
               orderTaxi.setUserId(orderPrivateCar.getUserId());
               orderTaxi.setStartLon(orderPrivateCar.getStartLon());
               orderTaxi.setStartLat(orderPrivateCar.getStartLat());
               orderTaxiService.pushOrder(orderTaxi, 3);
               continue;
            }
            OrderPrivateCar pushOrder = new OrderPrivateCar();
            BeanUtils.copyProperties(orderPrivateCar, pushOrder);
            pushOrder.setRideType(rideType);
            pushOrder.setServerCarModelId(serverCarModelId);
            this.pushOrder(pushOrder);
         }
         return;
      }
      if (Integer.valueOf(3).equals(orderPrivateCar.getRideType())) {
         this.pushOrderPrivateCar(orderPrivateCar.getId());
         return;
      }
      this.pushOrder(orderPrivateCar);
   }
   private void handlePrivateCarPrepayFirstPaid(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double payAmount, Integer payType) throws Exception {
      OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
      SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
      if (null != query1) {
         userInfo.setIntegral(userInfo.getIntegral() + (payAmount.intValue() * query1.getIntegral()));
      }
      userInfoService.updateById(userInfo);
      consumePrivateCarBenefits(orderPrivateCar);
      transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车订单", payAmount, 2, 1, 1, 1, orderPrivateCar.getId());
      orderPrivateCar.setState(1);
      orderPrivateCar.setPayType(payType);
      orderPrivateCar.setPayMoney(payAmount);
      orderPrivateCar.setPayTime(new Date());
      orderPrivateCar.setPrepayStage(2);
      this.updateAllColumnById(orderPrivateCar);
      pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
      systemNoticeService.addSystemNotice(1, "您的快车订单已支付成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
      dispatchPrepayPrivateCarOrder(orderPrivateCar);
   }
   
   @Override
   public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
   public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type, String outTradeNo) throws Exception {
      OrderPrivateCar orderPrivateCar = this.selectById(id);
      PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1);
      PaymentRecord query = ToolUtil.isNotEmpty(outTradeNo) ? paymentRecordService.queryByCode(outTradeNo, 1) : null;
      if (query == null) {
         query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1);
      }
      if (null != query && query.getState() == 1) {
         UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
         query.setState(2);
         query.setCode(order_id);
         paymentRecordService.updateById(query);
         if (isPrivateCarPrepayFirstStage(orderPrivateCar)) {
            orderPrivateCar.setPrepaySecondPayNo(outTradeNo);
            handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, query.getAmount(), type);
            return;
         }
         //添加交易明细
         transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
         orderPrivateCar.setState(8);
         orderPrivateCar.setPayType(type);
         orderPrivateCar.setPayMoney(query.getAmount());
         boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
         orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), query.getAmount()) : query.getAmount());
         orderPrivateCar.setPayTime(new Date());
         UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId());
         if (isPrepaySpreadStage) {
            orderPrivateCar.setPrepayStage(5);
            orderPrivateCar.setPrepaySecondPayNo(order_id);
         }
         OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
         SysIntegral query1 = sysIntegralMapper.query(openCity.getId());
         if(null != query1){
            userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分
            userInfoService.updateById(userInfo);
         }
         //处理优惠券和红包
         if (null != orderPrivateCar.getCouponId()) {
            UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
            userCouponRecord.setState(2);
            userCouponRecord.setEndTime(new Date());
            userCouponRecordService.updateById(userCouponRecord);
         if (!isPrepaySpreadStage) {
            consumePrivateCarBenefits(orderPrivateCar);
         }
         if (null != orderPrivateCar.getUserTaxiCardId()) {
            UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId());
            if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) {
               JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
               jsonObject.put("time", jsonObject.getInteger("time") - 1);
               userTaxiCard.setContent(jsonObject.toJSONString());
               userTaxiCardService.updateById(userTaxiCard);
            }
         }
         if (null != orderPrivateCar.getRedPacketId()) {
            UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
            userRedPacketRecord.setState(2);
            userRedPacketRecord.setEndTime(new Date());
            userRedPacketRecordService.updateById(userRedPacketRecord);
         }
         query.setState(2);
         query.setCode(order_id);
         paymentRecordService.updateById(query);
         //非追缴单才需要记录收入
         if(null != orderPrivateCar.getRecoveryOrder() && 0 == orderPrivateCar.getRecoveryOrder()){
@@ -2548,9 +3137,14 @@
      OrderPrivateCar orderPrivateCar = this.selectById(orderId);
      ResultUtil resultUtil = ResultUtil.success();
      if (payType == 1) {//微信支付
         String app = type == 1 ? "APP" : "JSAPI";
         resultUtil = payMoneyUtil.weixinpay("感谢费", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/wxPayThankYouFee", app, userInfo.getAppletsOpenId());
         paymentRecordService.saveData(3, uid, 1, orderId, 1, 1, money, "", 1);//添加预支付数据
         String outTradeNo = "THANK_" + orderId + "_1_" + UUIDUtil.getRandomCode(5);
         JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, money);
         if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
            return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
         }
         String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
         resultUtil = ResultUtil.success(response);
         paymentRecordService.saveData(3, uid, 1, orderId, 1, 1, money, paymentCode, 1);//添加预支付数据
      }
      if (payType == 2) {//支付宝支付
         resultUtil = payMoneyUtil.alipay("感谢费", "感谢费", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/aliPayThankYouFee");
@@ -2691,7 +3285,7 @@
                     }
                     int finalI = i;
                     PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
                     System.out.println("pushOrder:" + pushOrder);
                     System.out.println("pushOrder2:" + pushOrder);
                     if (orderPrivateCar.getState() > 1) {
                        push = true;
                        break;
@@ -2731,8 +3325,11 @@
                        break;
                     }
                     if (num == 18) {
                        orderPrivateCar1.setState(10);
                        orderPrivateCarMapper.updateById(orderPrivateCar1);
                        ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar1, "无司机接单", "无司机接单", orderPrivateCar1.getUserId());
                        if (refundResult == null) {
                           orderPrivateCar1.setState(10);
                           orderPrivateCarMapper.updateById(orderPrivateCar1);
                        }
                        pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
                        orderIds.remove(orderPrivateCar.getId());
                     }
@@ -2756,10 +3353,13 @@
    * @throws Exception
    */
   public void pushOrder(OrderPrivateCar orderPrivateCar) throws Exception {
      new Thread(new Runnable() {
         @Override
         public void run() {
            try {
               System.out.println("推单推单推单!!");
               Integer id = orderPrivateCar.getId();
               Integer orderType = orderPrivateCar.getRideType() == 1 ? 1 : orderPrivateCar.getRideType() == 2 ? 9 : 8;
               orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
@@ -2769,56 +3369,179 @@
                  integers = JSON.parseArray(vehicle).toJavaList(Integer.class);
               }
               OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
               List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
               for (int i = 1; i <= querys.size() + 15; i++) {
               // 判断是否为派单模式
               TSysPushType sysPushType = tSysPushTypeService.selectOne(new EntityWrapper<TSysPushType>().eq("openCityId", openCity.getId()));
               if(sysPushType!=null && sysPushType.getPushType()==2){
                  System.out.println( "派单模式");
                  OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(id);
                  if (null == orderPrivateCar || orderPrivateCar.getState() > 1) {
                     break;
                  }
                  int finalI = i;
                  PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
                  System.out.println("pushOrder:" + pushOrder);
                  int i2 = pushOrder.getPushTime() / 10;
                  if (i2 == 0) {
                     i2 = 1;
                  }
                  for (int i1 = 0; i1 < i2; i1++) {
                     if (orderPrivateCar.getState() > 1) {
                        break;
                     }
                     //获取空闲司机
                     List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                  if (null != orderPrivateCar && orderPrivateCar.getState() == 1) {
                     // 固定5公里进行派单
                     List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), 5.0, null);//所有附近空闲司机
                     if (list.size() > 0) {
                        double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                        int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                        lastIndex = lastIndex == 0 ? list.size() : lastIndex;
                        list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                        for (Driver driver : list) {//开始进行推送
                           boolean bo = false;
                           for (Integer integer : integers) {
                              if (integer.compareTo(driver.getId()) == 0) {
                                 bo = true;
                                 break;
                        Driver driver1 = list.stream().sorted(Comparator.comparingDouble(Driver::getDistance).reversed()).findFirst().get();
                        if(orderPrivateCar.getType() == 3){
                           //批量订单
                           CarService carService = new CarService();
                           carService.setCarId(driver1.getCarId());
                           carService.setType(1);
                           CarService carService1 = carServiceMapper.selectOne(carService);
                           orderPrivateCar.setServerCarModelId(carService1.getServerCarModelId());
                           //1=独享,2=一口价
                           String serverCarModel = orderPrivateCar.getServerCarModel();
                           JSONArray jsonArray = JSON.parseArray(serverCarModel);
                           Integer rideType1 = null;
                           for (int i = 0; i < jsonArray.size(); i++) {
                              JSONObject jsonObject = jsonArray.getJSONObject(i);
                              Integer serverCarModelId = jsonObject.getInteger("serverCarModelId");
                              Integer rideType = jsonObject.getInteger("rideType");
                              if(serverCarModelId.equals(carService1.getServerCarModelId())){
                                 rideType1 = rideType;
                                 if(rideType == 1){
                                    break;
                                 }
                              }
                           }
                           if (bo) {
                              continue;
                           }
                           pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
                           orderPrivateCar.setRideType(rideType1);
                        }
                     }
                     Thread.sleep(10000);//设置等待时间
                     Integer state = orderPrivateCar.getState();
                     if (state > 1) {
                        orderIds.remove(orderPrivateCar.getId());
                        return;
                     }
                     if (i == querys.size() + 15 && state == 1) {
                        orderPrivateCar.setDriverId(driver1.getId());
                        orderPrivateCar.setCarId(driver1.getCarId());
                        orderPrivateCar.setCompanyId(driver1.getFranchiseeId() != null && driver1.getFranchiseeId() != 0 ? driver1.getFranchiseeId() : (
                              driver1.getCompanyId() != null && driver1.getCompanyId() != 0 ? driver1.getCompanyId() : 1));
                        orderPrivateCar.setState(2);
                        orderPrivateCar.setSnatchOrderTime(new Date());
                        // 是否推广订单
                        Integer promotion = isPromotion(orderPrivateCar.getUserId(), driver1.getPlaceOfEmployment());
                        if(null != promotion){
                           orderPrivateCar.setPromotion(2);
                           driver1 = driverService.selectById(promotion);
                           orderPrivateCar.setPromotionUser(driver1.getName());
                           orderPrivateCar.setPromotionPhone(driver1.getPhone());
                           orderPrivateCar.setPromotionDriverId(promotion);
                        }else{
                           orderPrivateCar.setPromotion(1);
                        }
                        orderPrivateCarMapper.updateById(orderPrivateCar);
                        //如果是预约单,则不修改司机为服务中
                        if(orderPrivateCar.getOrderType() != 2 || (orderPrivateCar.getOrderType() == 2 && orderPrivateCar.getTravelTime().getTime() < System.currentTimeMillis() + 600000)){
                           //修改司机为服务中
                           driver1.setState(3);
                           driverService.updateById(driver1);
                        }
                        //推送相关代码------------------start----------------
                        new Thread(new Runnable() {
                           @Override
                           public void run() {
                                 pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(),0);
                                 pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(),0);
                                 if(orderPrivateCar.getType() == 2){
                                    pushUtil.pushFerryOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 2);
                                 }
                           }
                        }).start();
                        new Thread(new Runnable() {
                           @Override
                           public void run() {
                              pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
                           }
                        }).start();
                        systemNoticeService.addSystemNotice(2, "已为您派得快车订单,请及时联系客户!", orderPrivateCar.getDriverId(), 1);
                        systemNoticeService.addSystemNotice(1, "您的订单已指派给" + driver1.getName().substring(0, 1) + "师傅,请保持电话畅通!", orderPrivateCar.getUserId(), 1);
                        if(pushMinistryOfTransport){
                           new Thread(new Runnable() {
                              @Override
                              public void run() {
                                 //上传数据
                                 pushMinistryOfTransportUtil.orderCreate(orderPrivateCar.getId());
                                 pushMinistryOfTransportUtil.orderMatch(orderPrivateCar.getId());
                              }
                           }).start();
                        }
                     }else {
                        // 没找到车辆
                        ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId());
                        if (refundResult == null) {
                           orderPrivateCar.setState(10);
                           orderPrivateCarMapper.updateById(orderPrivateCar);
                        }
                        pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
                        orderIds.remove(orderPrivateCar.getId());
                     }
                  }
               }else {
                  System.out.println( "推单模式");
                  List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
                  for (int i = 1; i <= querys.size() + 15; i++) {
                     OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(id);
                     if (null == orderPrivateCar || orderPrivateCar.getState() > 1) {
                        break;
                     }
                     int finalI = i;
                     PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null);
                     System.out.println("pushOrder1:" + pushOrder);
                     int i2 = pushOrder.getPushTime() / 10;
                     if (i2 == 0) {
                        i2 = 1;
                     }
                     for (int i1 = 0; i1 < i2; i1++) {
                        if (orderPrivateCar.getState() > 1) {
                           break;
                        }
                        //获取空闲司机
                        List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
                        System.out.println(list.toString()+"XXXXXXXX");
                        if (list.size() > 0) {
                           double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
                           int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
                           lastIndex = lastIndex == 0 ? list.size() : lastIndex;
                           list = list.subList(0, lastIndex);//获取空闲司机中占比数据
                           for (Driver driver : list) {//开始进行推送
                              boolean bo = false;
                              for (Integer integer : integers) {
                                 if (integer.compareTo(driver.getId()) == 0) {
                                    bo = true;
                                    break;
                                 }
                              }
                              if (bo) {
                                 continue;
                              }
                              pushUtil.pushOrderState(2, driver.getId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), pushOrder.getPushTime());
                           }
                        }
                        Thread.sleep(10000);//设置等待时间
                        Integer state = orderPrivateCar.getState();
                        if (state > 1) {
                           orderIds.remove(orderPrivateCar.getId());
                           return;
                        }
                        if (i == querys.size() + 15 && state == 1) {
                           pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
                           orderIds.remove(orderPrivateCar.getId());
                           // 没找到车辆
                           ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId());
                           if (refundResult == null) {
                              orderPrivateCar.setState(10);
                              orderPrivateCarMapper.updateById(orderPrivateCar);
                           }
                        }
                     }
                  }
               }
            } catch (Exception e) {
               e.printStackTrace();
            }
@@ -2890,4 +3613,6 @@
      }
      return maps;
   }
}