From 9a66aa395b78b5df07058560eec181a66d6db2b9 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期二, 30 九月 2025 11:41:51 +0800
Subject: [PATCH] 优化指派逻辑

---
 UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |  173 +++++++++++++++++++++++----------------------------------
 1 files changed, 69 insertions(+), 104 deletions(-)

diff --git a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 36411db..bc09638 100644
--- a/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -25,6 +25,8 @@
 import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
 import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService;
 import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpEntity;
@@ -55,6 +57,8 @@
 
 @Service
 public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
+
+    Logger logger = LoggerFactory.getLogger(OrderPrivateCarServiceImpl.class);
 
     @Resource
     private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -154,6 +158,9 @@
 
     @Autowired
     private GDMapElectricFenceUtil gdMapElectricFenceUtil;
+    
+    @Autowired
+    private GeodesyUtil geodesyUtil;
 
     @Autowired
     private IOrderPositionService orderPositionService;
@@ -211,7 +218,7 @@
     public synchronized ResultUtil<BaseWarpper> saveOrderPrivateCar(Integer serverCarModelId, Date travelTime, Integer reservation, Integer instead, String placementLon, String placementLat, String startLon, String startLat,
                                           String startAddress, String endLon, String endLat, String endAddress, String name, String phone, Integer orderSource, Integer driverId, Integer type, Integer uid,
                                                                     BigDecimal estimatedPrice,String cityCode,Integer carIndex) throws Exception {
-
+        long timeMillis = System.currentTimeMillis();
         //如果出行时间大于当前10分钟则默认为预约单
         if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
             reservation = 2;
@@ -225,10 +232,10 @@
         if(orderPrivateCars.size() > 0){
             return ResultUtil.error("有未完成的订单");
         }
-        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
-        if(list.size() > 0){
-            return ResultUtil.error("有未完成的订单");
-        }
+//        List<OrderTaxi> list = orderTaxiMapper.queryByState_(uid, 1, 1, 1, 2, 3, 4, 5, 6, 11);
+//        if(list.size() > 0){
+//            return ResultUtil.error("有未完成的订单");
+//        }
 
         orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6,  11);
         if(orderPrivateCars.size() > 0 && reservation == 2){
@@ -244,10 +251,10 @@
         }
 
 
-        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
-        if(list.size() > 0 && reservation == 2){
-            return ResultUtil.error("有未完成的订单");
-        }
+//        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
+//        if(list.size() > 0 && reservation == 2){
+//            return ResultUtil.error("有未完成的订单");
+//        }
 
         startAddress = startAddress.replaceAll("& #40;", "(");
         startAddress = startAddress.replaceAll("& #41;", ")");
@@ -323,7 +330,11 @@
             orderPrivateCar.setSnatchOrderTime(new Date());
             driver2.setState(3);
             driverService.updateById(driver2);
+            serverCarModelId = query1.getServerCarModelId();
         }
+        long timeMillis1 = System.currentTimeMillis();
+        logger.info("第一段用时:" + (timeMillis1 - timeMillis));
+        timeMillis = timeMillis1;
         // 查询城市的订单额度
         OpenCity openCity = openCityService.selectOne(new EntityWrapper<OpenCity>()
                 .eq("code", cityCode)
@@ -340,30 +351,17 @@
         }
 
         // 查询预估价格
-        ResultUtil<List<ServerCarModelWarpper>> listResultUtil = serverCarModelService.queryServerCarModel(startLon + "," + startLat, endLon + "," + endLat, 1);
-        List<ServerCarModelWarpper> data = listResultUtil.getData();
-        if(Objects.isNull(serverCarModelId)){
-            //获取经营业务
-            CarService query = new CarService();
-            query.setCarId(driver2.getCarId());
-            CarService service = carServiceMapper.selectOne(query);
-            if(Objects.nonNull(service)){
-                serverCarModelId = service.getServerCarModelId();
-            }
+        ResultUtil<ServerCarModelWarpper> listResultUtil = serverCarModelService.queryServerCarModel1(serverCarModelId, startLon + "," + startLat, endLon + "," + endLat, 1);
+        if(200 != listResultUtil.getCode()){
+            return ResultUtil.error(listResultUtil.getMsg());
         }
-        Integer finalServerCarModelId = serverCarModelId;
-        data = data.stream().filter(e -> finalServerCarModelId.equals(e.getId())).sorted(Comparator.comparing(ServerCarModelWarpper::getAmount)).collect(Collectors.toList());
-        if(Objects.nonNull(openCity) && !CollectionUtils.isEmpty(data) && BigDecimal.valueOf(data.get(0).getAmount()).compareTo(openCity.getOrderMagnitude()) > 0){
+        ServerCarModelWarpper data = listResultUtil.getData();
+        if(Objects.nonNull(openCity) && BigDecimal.valueOf(data.getAmount()).compareTo(openCity.getOrderMagnitude()) > 0){
             orderPrivateCar.setIsReassign(1);
             orderPrivateCar.setIsDelete(1);
             orderPrivateCar.setState(7);
-            if(orderSource == 2){
-                orderPrivateCar.setOrderMoney(data.get(0).getAmount());
-                orderPrivateCar.setEstimatedPrice(data.get(0).getAmount());
-            }else {
-                orderPrivateCar.setOrderMoney(data.get(carIndex).getAmount());
-                orderPrivateCar.setEstimatedPrice(data.get(carIndex).getAmount());
-            }
+            orderPrivateCar.setOrderMoney(data.getAmount());
+            orderPrivateCar.setEstimatedPrice(data.getAmount());
             orderPrivateCar.setPayMethod(0);
             this.insert(orderPrivateCar);
             BaseWarpper baseWarpper = new BaseWarpper();
@@ -373,13 +371,7 @@
             baseWarpper.setAmount(orderPrivateCar.getOrderMoney());
             return ResultUtil.success(baseWarpper);
         }else {
-            if(orderSource == 2){
-                if(!CollectionUtils.isEmpty(data)){
-                    orderPrivateCar.setEstimatedPrice(data.get(0).getAmount());
-                }
-            }else {
-                orderPrivateCar.setEstimatedPrice(data.get(carIndex).getAmount());
-            }
+            orderPrivateCar.setEstimatedPrice(data.getAmount());
             orderPrivateCar.setIsReassign(1);
             orderPrivateCar.setIsDelete(1);
             orderPrivateCar.setPayMethod(1);
@@ -395,7 +387,9 @@
                     }
                 }).start();
             }
-
+            long timeMillis2 = System.currentTimeMillis();
+            logger.info("第二段用时:" + (timeMillis2 - timeMillis));
+            timeMillis = timeMillis2;
 
             // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
             if(orderPrivateCar.getState() == 1){
@@ -405,18 +399,9 @@
                 }
                 AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1));
                 if(null != assignOrder){//配置了指派规则才处理
-                    boolean lock = redisUtil.lock("order_lock", 10);
+                    boolean lock = redisUtil.lock("order_lock", 10, 30);
                     if(!lock){
-                        int num1 = 1;
-                        while (num1 <= 10){
-                            Thread.sleep(3000);//等待3秒
-                            lock = redisUtil.lock("order_lock", 10);
-                            if(lock){
-                                break;
-                            }else{
-                                num1++;
-                            }
-                        }
+                        return ResultUtil.error("系统繁忙,请稍后重试");
                     }
                     try {
                         //获取空闲司机
@@ -446,11 +431,8 @@
                                         }
                                         String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
                                         if (null != value) {
-//                                Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 0);//计算距离
-//                                Integer d = Integer.valueOf(distance1.get("distance"));
-                                            String[] split = value.split(",");
-                                            double distance = GDMapGeocodingUtil.getDistance(orderPrivateCar.getStartLat(), orderPrivateCar.getStartLon(), Double.valueOf(split[1]), Double.valueOf(split[0]));
-                                            int d = Double.valueOf(distance).intValue();
+                                            Map<String, Double> distance1 = geodesyUtil.getDistance(orderPrivateCar.getStartLat() + "," + orderPrivateCar.getStartLon(), value);
+                                            int d = distance1.get("WGS84").intValue();
                                             if ((0 == m && null == driver) || (d < m)) {
                                                 driver = drivers.get(j);
                                                 m = d;
@@ -467,11 +449,11 @@
                                 for (Driver driver : ds) {
                                     String value = redisUtil.getValue("DRIVER" + driver.getId());
                                     if (null != value) {
-                                        Map<String, String> distance1 = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);//计算距离
-                                        Integer d = Integer.valueOf(distance1.get("distance"));
-                                        if ((0 == m && null == dr) || (d.intValue() < m.intValue())) {
+                                        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLon + "," + startLat, value, 1);
+                                        int distance1 = Integer.parseInt(distance.get("distance"));
+                                        if ((0 == m && null == dr) || (distance1 < m.intValue())) {
                                             dr = driver;
-                                            m = d;
+                                            m = distance1;
                                         }
                                     }
                                 }
@@ -495,6 +477,7 @@
                                     dr.setState(3);
                                 }
                                 driverService.updateById(dr);
+                                redisUtil.setStrValue("DRIVER_ORDER" + dr.getId(), orderPrivateCar.getId().toString(), 600);
                                 new Thread(new Runnable() {
                                     @Override
                                     public void run() {
@@ -516,7 +499,9 @@
                     }
                 }
             }
-
+            long timeMillis3 = System.currentTimeMillis();
+            logger.info("第三段用时:" + (timeMillis3 - timeMillis));
+            timeMillis = timeMillis3;
 
             //推单操作
             if(orderPrivateCar.getState() == 1){
@@ -528,6 +513,9 @@
             baseWarpper.setState(orderPrivateCar.getState());
             baseWarpper.setId(orderPrivateCar.getId());
             baseWarpper.setPayMethod(1);
+            long timeMillis4 = System.currentTimeMillis();
+            logger.info("第四段用时:" + (timeMillis4 - timeMillis));
+            timeMillis = timeMillis4;
             return ResultUtil.success(baseWarpper);
         }
     }
@@ -1043,18 +1031,9 @@
      */
     @Override
     public ResultUtil cancleOrderPrivateCar(Integer id, Integer payType, Integer cancleId, Integer type) throws Exception {
-        boolean lock = redisUtil.lock(id + "_cancleOrder", 10);
+        boolean lock = redisUtil.lock(id + "_cancleOrder", 10, 30);
         if(!lock){
-            int num1 = 1;
-            while (num1 <= 10){
-                Thread.sleep(3000);//等待3秒
-                lock = redisUtil.lock(id + "_cancleOrder", 10);
-                if(lock){
-                    break;
-                }else{
-                    num1++;
-                }
-            }
+            return ResultUtil.error("系统繁忙,请稍后重试");
         }
         ResultUtil resultUtil = ResultUtil.success("");
         try {
@@ -1393,19 +1372,15 @@
 
     @Override
     public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
-        boolean lock = redisUtil.lock(orderId + "_payment", 10);
+        boolean lock = redisUtil.lock(orderId + "_payment", 10, 30);
         if(!lock){
-            int num1 = 1;
-            while (num1 <= 10){
-                Thread.sleep(3000);//等待3秒
-                lock = redisUtil.lock(orderId + "_payment", 10);
-                if(lock){
-                    break;
-                }else{
-                    num1++;
-                }
-            }
+            return ResultUtil.error("系统繁忙,请稍后重试");
         }
+        String key = orderId + "_during_payment";
+        if(redisUtil.hasKey(key)){
+            return ResultUtil.error("支付中,不能重复发起支付");
+        }
+        redisUtil.setStrValue(key, UUIDUtil.getRandomCode(), 10);
         try {
             OrderPrivateCar orderPrivateCar = this.selectById(orderId);
             if(orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9){
@@ -1517,16 +1492,12 @@
                 resultUtil = payMoneyUtil.weixinpay("完成订单",orderId +"", code,orderMoney+"","/base/wxPayOrderTaxi","JSAPI",userInfo.getAppletsOpenId());
                 if(resultUtil.getCode()==200){
                     paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, null, 1, code);//添加预支付数据
-                    long millis = System.currentTimeMillis();
                     new Thread(()->{
-                        long time = millis;
-                        try {
-                            Thread.sleep(5000);
-                        } catch (InterruptedException e) {
-                            throw new RuntimeException(e);
-                        }
-                        //订单创建后15分钟
-                        while ((System.currentTimeMillis() - time) <= 900000) {
+                        int num = 1;
+                        int wait = 0;
+                        while (num <= 13) {
+                            int min = 5000;
+                            wait += (min * num);
                             OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderId);
                             if(orderPrivateCar1.getState() != 7){
                                 break;
@@ -1556,12 +1527,17 @@
                                     if ("NOTPAY".equals(s) || "USERPAYING".equals(s)) {
                                     }
                                 }
-                                Thread.sleep(5000);
                             }catch (Exception e){
                                 e.printStackTrace();
+                            }finally {
+                                try {
+                                    Thread.sleep(wait);
+                                } catch (InterruptedException e) {
+                                    e.printStackTrace();
+                                }
+                                num++;
                             }
                         }
-                
                         OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderId);
                         if(7 == orderPrivateCar1.getState()){
                             //关闭订单,不允许支付
@@ -1911,21 +1887,10 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public synchronized void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception {
-        boolean lock = redisUtil.lock(order_id + "_paymentCallback", 10);
+        boolean lock = redisUtil.lock(order_id + "_paymentCallback", 10, 30);
         if(!lock){
-            int num1 = 1;
-            while (num1 <= 10){
-                Thread.sleep(3000);//等待3秒
-                lock = redisUtil.lock(order_id + "_paymentCallback", 10);
-                if(lock){
-                    break;
-                }else{
-                    num1++;
-                }
-            }
+            return;
         }
-        
-        
         try {
             PaymentRecord query = paymentRecordService.query(1, null, null, Integer.valueOf(id), 1, type, null);
             if(null != query){

--
Gitblit v1.7.1