Pu Zhibing
12 小时以前 e778f1ec4f911e0b6332432edca4650461ce5870
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
@@ -19,6 +19,8 @@
import com.supersavedriving.user.modular.system.util.mongodb.model.Location;
import com.supersavedriving.user.modular.system.warpper.*;
import io.swagger.models.auth.In;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
@@ -41,6 +43,7 @@
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -77,6 +80,9 @@
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private MongoTemplate mongoTemplate;
@@ -433,8 +439,9 @@
     */
    @Override
    public ResultUtil travelOrder(Integer uid, TravelOrder travelOrder) throws Exception {
        boolean lock = redisUtil.lock(uid + "_travelOrder");
        if(!lock){
        RLock lock1 = redissonClient.getLock("travelOrder:" + uid);
        boolean lock2 = lock1.tryLock(5, 10, TimeUnit.SECONDS);
        if(!lock2){
            return ResultUtil.error("系统繁忙,请稍后重试");
        }
        try {
@@ -537,7 +544,10 @@
                        pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
                    }else{
                        //推单
                        pushOrder(order.getId());
                        Order finalOrder = order;
                        new Thread(()->{
                            pushOrder(finalOrder.getId());
                        }).start();
                    }
                }
            }
@@ -546,7 +556,7 @@
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            redisUtil.unlock(uid + "_travelOrder");
            lock1.unlock();
        }
        return ResultUtil.error("系统异常");
    }
@@ -558,6 +568,7 @@
     * 订单推送逻辑
     */
    public void pushOrder(Long orderId){
        RLock lock1 = redissonClient.getLock("pushOrder:" + orderId);
        try {
            Order order = this.selectById(orderId);
            /**
@@ -567,20 +578,8 @@
             *        合适司:积分 > 评分 > 距离
             *      3.司机没有接单直接将订单置入大厅
             */
            boolean lock = redisUtil.lock(5);
            if(!lock){
                int num1 = 1;
                while (num1 <= 10){
                    Thread.sleep(3000);//等待3秒
                    lock = redisUtil.lock(5);
                    if(lock){
                        break;
                    }else{
                        num1++;
                    }
                }
            }
            if(!lock){
            boolean lock2 = lock1.tryLock(5, 10, TimeUnit.SECONDS);
            if(!lock2){
                order.setHallOrder(1);
                this.updateById(order);
                ExtraPushOrder(order);
@@ -776,10 +775,10 @@
                ExtraPushOrder(order);
                redisUtil.setStrValue("lobbyOrder", "true");
            }
            redisUtil.unlock();
        }catch (Exception e){
            e.printStackTrace();
            redisUtil.unlock();
        }finally {
            lock1.unlock();
        }
    }