From f5da7281ee8fed938198afcd33a2a619f08a37f0 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期二, 19 八月 2025 14:27:26 +0800
Subject: [PATCH] 合并代码

---
 user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java |  227 +++++++++++++++++++++++++++++++-------------------------
 1 files changed, 124 insertions(+), 103 deletions(-)

diff --git a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
index 56f597a..b7090e1 100644
--- a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
+++ b/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,111 +439,126 @@
      */
     @Override
     public ResultUtil travelOrder(Integer uid, TravelOrder travelOrder) throws Exception {
-        List<Integer> state = Arrays.asList(101, 102, 103, 104, 105, 106, 107, 201, 401);
-        Order order = this.selectOne(new EntityWrapper<Order>().eq("userId", uid).eq("status", 1).in("state", state));
-        if(null != order){
-            return ResultUtil.error("您还有正在进行的订单");
+        RLock lock1 = redissonClient.getLock("travelOrder:" + uid);
+        boolean lock2 = lock1.tryLock(5, TimeUnit.SECONDS);
+        if(!lock2){
+            return ResultUtil.error("系统繁忙,请稍后重试");
         }
-        AppUser appUser = appUserService.selectById(uid);
-        order = this.selectOne(new EntityWrapper<Order>().eq("userPhone", appUser.getPhone()).eq("status", 1).in("state", state));
-        if(null != order){
-            return ResultUtil.error("您还有正在进行的订单");
-        }
-
-        String startAddress = travelOrder.getStartAddress();
-        startAddress = startAddress.replaceAll("& #40;", "(");
-        startAddress = startAddress.replaceAll("& #41;", ")");
-        travelOrder.setStartAddress(startAddress);
-        if(ToolUtil.isNotEmpty(travelOrder.getEndAddress())){
-            String endAddress = travelOrder.getEndAddress();
-            endAddress = endAddress.replaceAll("& #40;", "(");
-            endAddress = endAddress.replaceAll("& #41;", ")");
-            travelOrder.setEndAddress(endAddress);
-        }
-
-        order = new Order();
-        BeanUtils.copyProperties(travelOrder, order);
-        if(ToolUtil.isEmpty(travelOrder.getUserPhone())){
-            order.setUserPhone(appUser.getPhone());
-            order.setUserName(appUser.getNickname());
-        }
-        order.setUserId(uid);
-        order.setSource(1);
-        order.setHallOrder(0);
-        order.setStatus(1);
-        order.setCreateTime(new Date());
-        order.setState(null != travelOrder.getDriverId() ? 102 : 101);
-        Double d = 0D;
-        if(ToolUtil.isNotEmpty(travelOrder.getEndAddress())){
-            Map<String, String> distance = MapUtil.getDistance(order.getStartLng() + "," + order.getStartLat(), order.getEndLng() + "," + order.getEndLat(), 1);
-            if(null == distance){
-                return ResultUtil.error("获取预估距离出错");
+        try {
+            List<Integer> state = Arrays.asList(101, 102, 103, 104, 105, 106, 107, 201, 401);
+            Order order = this.selectOne(new EntityWrapper<Order>().eq("userId", uid).eq("status", 1).in("state", state));
+            if(null != order){
+                return ResultUtil.error("您还有正在进行的订单");
             }
-            d = Double.valueOf(distance.get("distance")) / 1000;
-            order.setEstimatedMileage(d);
-            order.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60);
-        }
-        String city = "";
-        Integer branchOfficeId = null;
-        District geocode = MapUtil.geocode(order.getStartLng().toString(), order.getStartLat().toString());
-        if(null != geocode){
-            String districtCode = geocode.getDistrictCode();
-            BranchOffice branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("status", 1).eq("districtCode", districtCode));
-            if(null == branchOffice){
-                String cityCode = geocode.getCityCode();
-                branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("status", 1).eq("cityCode", cityCode));
+            AppUser appUser = appUserService.selectById(uid);
+            order = this.selectOne(new EntityWrapper<Order>().eq("userPhone", appUser.getPhone()).eq("status", 1).in("state", state));
+            if(null != order){
+                return ResultUtil.error("您还有正在进行的订单");
+            }
+
+            String startAddress = travelOrder.getStartAddress();
+            startAddress = startAddress.replaceAll("& #40;", "(");
+            startAddress = startAddress.replaceAll("& #41;", ")");
+            travelOrder.setStartAddress(startAddress);
+            if(ToolUtil.isNotEmpty(travelOrder.getEndAddress())){
+                String endAddress = travelOrder.getEndAddress();
+                endAddress = endAddress.replaceAll("& #40;", "(");
+                endAddress = endAddress.replaceAll("& #41;", ")");
+                travelOrder.setEndAddress(endAddress);
+            }
+
+            order = new Order();
+            BeanUtils.copyProperties(travelOrder, order);
+            if(ToolUtil.isEmpty(travelOrder.getUserPhone())){
+                order.setUserPhone(appUser.getPhone());
+                order.setUserName(appUser.getNickname());
+            }
+            order.setUserId(uid);
+            order.setSource(1);
+            order.setHallOrder(0);
+            order.setStatus(1);
+            order.setCreateTime(new Date());
+            order.setState(null != travelOrder.getDriverId() ? 102 : 101);
+            Double d = 0D;
+            if(ToolUtil.isNotEmpty(travelOrder.getEndAddress())){
+                Map<String, String> distance = MapUtil.getDistance(order.getStartLng() + "," + order.getStartLat(), order.getEndLng() + "," + order.getEndLat(), 1);
+                if(null == distance){
+                    return ResultUtil.error("获取预估距离出错");
+                }
+                d = Double.valueOf(distance.get("distance")) / 1000;
+                order.setEstimatedMileage(d);
+                order.setEstimatedTime(Integer.valueOf(distance.get("duration")) / 60);
+            }
+            String city = "";
+            Integer branchOfficeId = null;
+            District geocode = MapUtil.geocode(order.getStartLng().toString(), order.getStartLat().toString());
+            if(null != geocode){
+                String districtCode = geocode.getDistrictCode();
+                BranchOffice branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("status", 1).eq("districtCode", districtCode));
                 if(null == branchOffice){
-                    String provinceCode = geocode.getProvinceCode();
-                    branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("status", 1).eq("provinceCode", provinceCode));
+                    String cityCode = geocode.getCityCode();
+                    branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("status", 1).eq("cityCode", cityCode));
+                    if(null == branchOffice){
+                        String provinceCode = geocode.getProvinceCode();
+                        branchOffice = branchOfficeService.selectOne(new EntityWrapper<BranchOffice>().eq("status", 1).eq("provinceCode", provinceCode));
+                    }
+                }
+                if(null == branchOffice){
+                    return ResultUtil.error("起点暂无企业服务");
+                }
+                branchOfficeId = branchOffice.getId();
+            }
+
+            order.setCreateTime(new Date());
+            order = getOrderPrice(1, d, 0, order, city, branchOfficeId);
+            if(null != travelOrder.getDriverId()){
+                DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", travelOrder.getDriverId()).eq("status", 1));
+                if(null == driverWork){
+                    return ResultUtil.error("司机还未上班");
+                }
+                Driver driver = driverService.selectById(travelOrder.getDriverId());
+                if(driver.getServerStatus() == 2){
+                    return ResultUtil.error("司机正在服务中");
+                }
+                order.setAgentId(driver.getAgentId());
+                order.setBranchOfficeId(driver.getBranchOfficeId());
+                order.setOrderTakingTime(new Date());
+                driver.setServerStatus(2);
+                driverService.updateById(driver);
+                appUser.setCancelCount(0);
+                appUser.setIsException(1);
+                appUserService.updateById(appUser);
+            }
+
+            for (Integer i = 0; i < travelOrder.getDriverNum(); i++) {
+                order.setId(null);
+                order.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5));
+                boolean insert = this.insert(order);
+                if(insert){
+                    //推送状态
+                    pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState());
+                    if(null != order.getDriverId()){
+                        PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
+                        pushOrderInfoWarpper.setId(order.getId());
+                        pushOrderInfoWarpper.setState(order.getState());
+                        pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
+                    }else{
+                        //推单
+                        Order finalOrder = order;
+                        new Thread(()->{
+                            pushOrder(finalOrder.getId());
+                        }).start();
+                    }
                 }
             }
-            if(null == branchOffice){
-                return ResultUtil.error("起点暂无企业服务");
-            }
-            branchOfficeId = branchOffice.getId();
+            redisUtil.setStrValue("newOrder", "true");
+            return ResultUtil.success(order.getId());
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            lock1.unlock();
         }
-
-        order.setCreateTime(new Date());
-        order = getOrderPrice(1, d, 0, order, city, branchOfficeId);
-        if(null != travelOrder.getDriverId()){
-            DriverWork driverWork = driverWorkService.selectOne(new EntityWrapper<DriverWork>().eq("driverId", travelOrder.getDriverId()).eq("status", 1));
-            if(null == driverWork){
-                return ResultUtil.error("司机还未上班");
-            }
-            Driver driver = driverService.selectById(travelOrder.getDriverId());
-            if(driver.getServerStatus() == 2){
-                return ResultUtil.error("司机正在服务中");
-            }
-            order.setAgentId(driver.getAgentId());
-            order.setBranchOfficeId(driver.getBranchOfficeId());
-            order.setOrderTakingTime(new Date());
-            driver.setServerStatus(2);
-            driverService.updateById(driver);
-            appUser.setCancelCount(0);
-            appUser.setIsException(1);
-            appUserService.updateById(appUser);
-        }
-
-        for (Integer i = 0; i < travelOrder.getDriverNum(); i++) {
-            order.setId(null);
-            order.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5));
-            boolean insert = this.insert(order);
-            if(insert){
-                //推送状态
-                pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState());
-                if(null != order.getDriverId()){
-                    PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
-                    pushOrderInfoWarpper.setId(order.getId());
-                    pushOrderInfoWarpper.setState(order.getState());
-                    pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
-                }else{
-                    //推单
-                    pushOrder(order.getId());
-                }
-            }
-        }
-        redisUtil.setStrValue("newOrder", "true");
-        return ResultUtil.success(order.getId());
+        return ResultUtil.error("系统异常");
     }
 
 
@@ -605,7 +626,7 @@
                         .eq("state", 2).last(" and surplusQuantity > 0 and now() < failureTime"));
                 Double d = null;
                 for (YouTuiDriver youTuiDriver : youTuiDrivers) {
-                    String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId());
+                    String value = redisUtil.getValue("daijia:DRIVER" + youTuiDriver.getDriverId());
                     if(ToolUtil.isEmpty(value)){
                         continue;
                     }
@@ -667,7 +688,7 @@
                         Double score = null;//评分
                         Double d = null;
                         for (Driver driver1 : drivers) {
-                            String value = redisUtil.getValue("DRIVER" + driver1.getId());
+                            String value = redisUtil.getValue("daijia:DRIVER" + driver1.getId());
                             if(ToolUtil.isEmpty(value)){
                                 continue;
                             }
@@ -801,7 +822,7 @@
             return;
         }
         for (Driver driver1 : drivers) {
-            String value = redisUtil.getValue("DRIVER" + driver1.getId());
+            String value = redisUtil.getValue("daijia:DRIVER" + driver1.getId());
             if (ToolUtil.isEmpty(value)) {
                 continue;
             }
@@ -876,7 +897,7 @@
             JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
             orderInfoWarpper.setServiceCell(jsonObject.getString("num1"));
         }
-        String value = redisUtil.getValue("DRIVER" + orderInfoWarpper.getDriverId());
+        String value = redisUtil.getValue("daijia:DRIVER" + orderInfoWarpper.getDriverId());
         if(ToolUtil.isNotEmpty(value)){
             String[] split = value.split(",");
             orderInfoWarpper.setDriverLon(split[0]);

--
Gitblit v1.7.1