“mitao”
2026-03-23 fe6554694d8ddf332b3d050ebb8eb5a920554880
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -307,6 +307,7 @@
            if (orderSource != 2) { // 扫码下单跳过先付判断(扫码下单已有固定司机)
               TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
                     new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
               baseWarpper.setPaymentMode(paymentMode.getPrivateType());
               if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
                  // 先付模式:计算预估金额,订单状态改为7(待支付)
                  Company payCompany = companyCityService.query(geocode.get("districtCode"));
@@ -338,6 +339,7 @@
                              Double estimateMoney = Double.valueOf(amountMap.get("zongfeiyong").toString());
                              orderPrivateCar.setEstimateAmount(estimateMoney);
                              orderPrivateCar.setOrderMoney(estimateMoney);
                              baseWarpper.setEstimateAmount(estimateMoney);
                           }
                        }
                        // 先付模式:覆盖状态为7(待支付),不进行派单
@@ -691,6 +693,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);
@@ -703,133 +748,120 @@
            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();
@@ -842,6 +874,45 @@
      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;
   }
   private Integer isPromotion(Integer userId, String code){
      UserInfo userInfo = userInfoService.selectById(userId);