From aad8398747479ec7fbf3d40e9d6207c3d6e68f78 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期日, 12 十月 2025 01:27:07 +0800
Subject: [PATCH] 添加重复下单屏蔽功能

---
 UserZYTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |  611 ++++++++++++++++++++++++++-----------------------------
 1 files changed, 292 insertions(+), 319 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 9d5fbdb..549fccb 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
@@ -198,6 +198,9 @@
     @Autowired
     private IAppOperationLogService appOperationLogService;
 
+    @Resource
+    private DriverMapper driverMapper;
+
 
 
     /**
@@ -221,37 +224,45 @@
     public 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;
+        String k = "addOrder" + uid;
+        boolean b = redisUtil.hasKey(k);
+        if(b){
+            return ResultUtil.error("不能重复下单");
         }
+        redisUtil.setStrValue(k, UUIDUtil.getRandomCode(), 30);
 
-        /**
-         * 1.下了即时单就不能下预约单和即时单
-         * 2.下了预约单和再下一张即时单不能再下预约单
-         */
-        List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6,  11);
-        if(orderPrivateCars.size() > 0){
-            return ResultUtil.error("有未完成的订单");
-        }
+        try {
+            long timeMillis = System.currentTimeMillis();
+            //如果出行时间大于当前10分钟则默认为预约单
+            if(travelTime.getTime() > (System.currentTimeMillis() + 600000)){
+                reservation = 2;
+            }
+
+            /**
+             * 1.下了即时单就不能下预约单和即时单
+             * 2.下了预约单和再下一张即时单不能再下预约单
+             */
+            List<OrderPrivateCar> orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 1, 2, 3, 4, 5, 6,  11);
+            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("有未完成的订单");
 //        }
 
-        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6,  11);
-        if(orderPrivateCars.size() > 0 && reservation == 2){
-            return ResultUtil.error("有未完成的订单");
-        }
+            orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 2, 1, 1, 2, 3, 4, 5, 6,  11);
+            if(orderPrivateCars.size() > 0 && reservation == 2){
+                return ResultUtil.error("有未完成的订单");
+            }
 
-        orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 7,12);
-        if(orderPrivateCars.size() > 0){
-            BaseWarpper baseWarpper = new BaseWarpper();
-            baseWarpper.setState(7);
-            baseWarpper.setId(orderPrivateCars.get(0).getId());
-            return ResultUtil.success(baseWarpper);
-        }
+            orderPrivateCars = orderPrivateCarMapper.queryByState(uid, 1, 1, 7,12);
+            if(orderPrivateCars.size() > 0){
+                BaseWarpper baseWarpper = new BaseWarpper();
+                baseWarpper.setState(7);
+                baseWarpper.setId(orderPrivateCars.get(0).getId());
+                return ResultUtil.success(baseWarpper);
+            }
 
 
 //        list = orderTaxiMapper.queryByState_(uid, 2, 1, 1, 2, 3, 4, 5, 6, 11);
@@ -259,315 +270,279 @@
 //            return ResultUtil.error("有未完成的订单");
 //        }
 
-        startAddress = startAddress.replaceAll("& #40;", "(");
-        startAddress = startAddress.replaceAll("& #41;", ")");
-        endAddress = endAddress.replaceAll("& #40;", "(");
-        endAddress = endAddress.replaceAll("& #41;", ")");
-        if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
-            return ResultUtil.error("请选择服务车型");
-        }
-
-        OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
-        orderPrivateCar.setType(type);
-        orderPrivateCar.setUserId(uid);
-        orderPrivateCar.setServerCarModelId(serverCarModelId);
-        orderPrivateCar.setOrderNum(this.getOrderNum());
-        orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
-        orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
-        Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
-        orderPrivateCar.setPlacementAddress(geocode.get("address"));
-        orderPrivateCar.setStartLon(Double.valueOf(startLon));
-        orderPrivateCar.setStartLat(Double.valueOf(startLat));
-        orderPrivateCar.setStartAddress(startAddress);
-        orderPrivateCar.setEndLon(Double.valueOf(endLon));
-        orderPrivateCar.setEndLat(Double.valueOf(endLat));
-        orderPrivateCar.setEndAddress(endAddress);
-        orderPrivateCar.setSubstitute(instead);
-        orderPrivateCar.setPassengers(name);
-        orderPrivateCar.setPassengersPhone(phone);
-        if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
-            UserInfo userInfo = userInfoService.selectById(uid);
-            if(ToolUtil.isEmpty(userInfo.getPhone())){
-                return ResultUtil.error("请先绑定手机号码");
-            }
-            orderPrivateCar.setPassengers(userInfo.getName());
-            orderPrivateCar.setPassengersPhone(userInfo.getPhone());
-        }
-        orderPrivateCar.setState(1);
-        orderPrivateCar.setInsertTime(new Date());
-        orderPrivateCar.setTravelTime(travelTime);
-        orderPrivateCar.setOrderType(reservation);
-        orderPrivateCar.setOrderSource(orderSource);
-        Driver driver2 = driverService.selectById(driverId);
-        if(orderSource == 2){//扫码下单
-            if(null == driver2){
-                return ResultUtil.error("司机信息有误,无法完成下单");
-            }
-            if(driver2.getAuthState() == 1){
-                return ResultUtil.error("司机信息还未完成审核,无法完成下单");
-            }
-            if(driver2.getAuthState() == 3){
-                return ResultUtil.error("司机账户已被冻结,无法提供服务");
-            }
-            if(driver2.getAuthState() == 4){
-                return ResultUtil.error("司机信息未通过审核,无法提供服务");
-            }
-            if(driver2.getState() == 1){
-                return ResultUtil.error("司机还未上线,无法提供服务");
-            }
-            if(driver2.getState() == 3){
-                return ResultUtil.error("司机正在服务中,无法提供服务");
-            }
-            List<DriverService> query = driverServiceService.query(driverId, 1);
-            if(query.size() == 0){
-                return ResultUtil.error("该司机不能服务此业务");
+            startAddress = startAddress.replaceAll("& #40;", "(");
+            startAddress = startAddress.replaceAll("& #41;", ")");
+            endAddress = endAddress.replaceAll("& #40;", "(");
+            endAddress = endAddress.replaceAll("& #41;", ")");
+            if((orderSource == 1 || orderSource == 3) && null == serverCarModelId){
+                return ResultUtil.error("请选择服务车型");
             }
 
-            orderPrivateCar.setDriverId(driverId);
-            orderPrivateCar.setCompanyId(driver2.getFranchiseeId() != null && driver2.getFranchiseeId() != 0 ? driver2.getFranchiseeId() : (
-                    driver2.getCompanyId() != null && driver2.getCompanyId() != 0 ? driver2.getCompanyId() : 1));
-            orderPrivateCar.setState(2);
-            orderPrivateCar.setCarId(driver2.getCarId());
-            CarService query1 = carServiceMapper.query(1, driver2.getCarId());
-            orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
-            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)
-                .ne("flag", 3)
-                .orderBy("orderMagnitude", false)
-                .last("LIMIT 1"));
-        if(Objects.isNull(openCity)){
-            String city = cityCode.substring(0, 4) + "00";
-            openCity = openCityService.selectOne(new EntityWrapper<OpenCity>()
-                    .eq("code", city)
+            OrderPrivateCar orderPrivateCar = new OrderPrivateCar();
+            orderPrivateCar.setType(type);
+            orderPrivateCar.setUserId(uid);
+            orderPrivateCar.setServerCarModelId(serverCarModelId);
+            orderPrivateCar.setOrderNum(this.getOrderNum());
+            orderPrivateCar.setPlacementLon(Double.valueOf(placementLon));
+            orderPrivateCar.setPlacementLat(Double.valueOf(placementLat));
+            Map<String, String> geocode = gdMapGeocodingUtil.geocode(placementLon, placementLat);
+            orderPrivateCar.setPlacementAddress(geocode.get("address"));
+            orderPrivateCar.setStartLon(Double.valueOf(startLon));
+            orderPrivateCar.setStartLat(Double.valueOf(startLat));
+            orderPrivateCar.setStartAddress(startAddress);
+            orderPrivateCar.setEndLon(Double.valueOf(endLon));
+            orderPrivateCar.setEndLat(Double.valueOf(endLat));
+            orderPrivateCar.setEndAddress(endAddress);
+            orderPrivateCar.setSubstitute(instead);
+            orderPrivateCar.setPassengers(name);
+            orderPrivateCar.setPassengersPhone(phone);
+            if(instead == 0 || ToolUtil.isEmpty(orderPrivateCar.getPassengers())){
+                UserInfo userInfo = userInfoService.selectById(uid);
+                if(ToolUtil.isEmpty(userInfo.getPhone())){
+                    return ResultUtil.error("请先绑定手机号码");
+                }
+                orderPrivateCar.setPassengers(userInfo.getName());
+                orderPrivateCar.setPassengersPhone(userInfo.getPhone());
+            }
+            orderPrivateCar.setState(1);
+            orderPrivateCar.setInsertTime(new Date());
+            orderPrivateCar.setTravelTime(travelTime);
+            orderPrivateCar.setOrderType(reservation);
+            orderPrivateCar.setOrderSource(orderSource);
+            Driver driver2 = driverService.selectById(driverId);
+            if(orderSource == 2){//扫码下单
+                if(null == driver2){
+                    return ResultUtil.error("司机信息有误,无法完成下单");
+                }
+                if(driver2.getAuthState() == 1){
+                    return ResultUtil.error("司机信息还未完成审核,无法完成下单");
+                }
+                if(driver2.getAuthState() == 3){
+                    return ResultUtil.error("司机账户已被冻结,无法提供服务");
+                }
+                if(driver2.getAuthState() == 4){
+                    return ResultUtil.error("司机信息未通过审核,无法提供服务");
+                }
+                if(driver2.getState() == 1){
+                    return ResultUtil.error("司机还未上线,无法提供服务");
+                }
+                if(driver2.getState() == 3){
+                    return ResultUtil.error("司机正在服务中,无法提供服务");
+                }
+                List<DriverService> query = driverServiceService.query(driverId, 1);
+                if(query.size() == 0){
+                    return ResultUtil.error("该司机不能服务此业务");
+                }
+
+                orderPrivateCar.setDriverId(driverId);
+                orderPrivateCar.setCompanyId(driver2.getFranchiseeId() != null && driver2.getFranchiseeId() != 0 ? driver2.getFranchiseeId() : (
+                        driver2.getCompanyId() != null && driver2.getCompanyId() != 0 ? driver2.getCompanyId() : 1));
+                orderPrivateCar.setState(2);
+                orderPrivateCar.setCarId(driver2.getCarId());
+                CarService query1 = carServiceMapper.query(1, driver2.getCarId());
+                orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+                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)
                     .ne("flag", 3)
                     .orderBy("orderMagnitude", false)
                     .last("LIMIT 1"));
-        }
-
-        // 查询预估价格
-        ResultUtil<ServerCarModelWarpper> listResultUtil = serverCarModelService.queryServerCarModel1(serverCarModelId, startLon + "," + startLat, endLon + "," + endLat, 1);
-        if(200 != listResultUtil.getCode()){
-            return ResultUtil.error(listResultUtil.getMsg());
-        }
-        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);
-            orderPrivateCar.setOrderMoney(data.getAmount());
-            orderPrivateCar.setEstimatedPrice(data.getAmount());
-            orderPrivateCar.setPayMethod(0);
-            this.insert(orderPrivateCar);
-
-            appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户下单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
-
-            BaseWarpper baseWarpper = new BaseWarpper();
-            baseWarpper.setId(orderPrivateCar.getId());
-            baseWarpper.setState(orderPrivateCar.getState());
-            baseWarpper.setPayMethod(0);
-            baseWarpper.setAmount(orderPrivateCar.getOrderMoney());
-            return ResultUtil.success(baseWarpper);
-        }else {
-            orderPrivateCar.setEstimatedPrice(data.getAmount());
-            orderPrivateCar.setIsReassign(1);
-            orderPrivateCar.setIsDelete(1);
-            orderPrivateCar.setPayMethod(1);
-            this.insert(orderPrivateCar);
-            appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户下单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
-            if(orderSource == 2){//扫码下单
-                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, 2, 0);
-                        pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
-                    }
-                }).start();
+            if(Objects.isNull(openCity)){
+                String city = cityCode.substring(0, 4) + "00";
+                openCity = openCityService.selectOne(new EntityWrapper<OpenCity>()
+                        .eq("code", city)
+                        .ne("flag", 3)
+                        .orderBy("orderMagnitude", false)
+                        .last("LIMIT 1"));
             }
-            long timeMillis2 = System.currentTimeMillis();
-            logger.info("第二段用时:" + (timeMillis2 - timeMillis));
-            timeMillis = timeMillis2;
 
-            // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
-            if(orderPrivateCar.getState() == 1){
-                Company query = companyCityService.query(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
-                if(null == query){
-                    return ResultUtil.error("起点暂未企业提供服务");
-                }
-                AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1));
-                if(null != assignOrder){//配置了指派规则才处理
-                    boolean lock = redisUtil.lock("order_lock", 10, 30);
-                    if(!lock){
-                        return ResultUtil.error("系统繁忙,请稍后重试");
-                    }
-                    try {
-                        //获取空闲司机
-                        List<Driver> drivers = driverService.queryIdleDriver(1, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), assignOrder.getDistance(), null);//获取范围内空闲司机
-                        List<Integer> driverIds = drivers.stream().map(Driver::getId).collect(Collectors.toList());
-                        if(drivers.size() > 0) {//有司机,直接指派给司机
-                            Driver dr = null;
-                            if (drivers.size() > 1) {
-                                List<Driver> ds = new ArrayList<>();
-                                double dis = assignOrder.getDistance() * 1000;
-                                // 查询预约单
-                                List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
-                                List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList());
-                                for (int j = 0; j < drivers.size(); j++) {
-                                    Driver driver1 = drivers.get(j);
-                                    driver1.setDistance(0D);
-                                    if (orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver1.getId())) {
-                                        continue;
-                                    }
-                                    // 判断该司机是否有30分钟内预约单
-                                    long count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) &&
-                                            DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(query.getLimitationTime()).isBefore(LocalDateTime.now())).count();
-                                    if (count > 0) {
-                                        continue;
-                                    }
-                                    String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
-                                    if (null != value) {
-                                        Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);
-                                        double d = Double.parseDouble(distance.get("distance"));
-                                        if(dis >= d){
-                                            driver1.setDistance(d);
-                                            ds.add(driver1);
-                                        }
-                                    }
-                                }
+            // 查询预估价格
+            ResultUtil<ServerCarModelWarpper> listResultUtil = serverCarModelService.queryServerCarModel1(serverCarModelId, startLon + "," + startLat, endLon + "," + endLat, 1);
+            if(200 != listResultUtil.getCode()){
+                return ResultUtil.error(listResultUtil.getMsg());
+            }
+            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);
+                orderPrivateCar.setOrderMoney(data.getAmount());
+                orderPrivateCar.setEstimatedPrice(data.getAmount());
+                orderPrivateCar.setPayMethod(0);
+                this.insert(orderPrivateCar);
 
-                                if(!ds.isEmpty()){
-                                    ds.sort(new Comparator<Driver>() {
-                                        @Override
-                                        public int compare(Driver o1, Driver o2) {
-                                            return o1.getDistance().compareTo(o2.getDistance());
-                                        }
-                                    });
-                                    appOperationLogService.addAppOperationLog(uid, "{\"type\":\"指派推单,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(ds) + "\"}");
-                                    dr = ds.get(0);
-                                }
+                appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户下单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
 
-
-
-
-
-
-//                                for (int i = 0; i < assignOrder.getPeople(); i++) {
-//                                    Driver driver = null;
-//                                    int m = 0;
-//                                    int index = 0;
-//                                    // 查询预约单
-//                                    List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
-//                                    List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList());
-//                                    for (int j = 0; j < drivers.size(); j++) {
-//                                        Driver driver1 = drivers.get(j);
-//                                        if (orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver.getId())) {
-//                                            continue;
-//                                        }
-//                                        // 判断该司机是否有30分钟内预约单
-//                                        long count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) &&
-//                                                DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(query.getLimitationTime()).isBefore(LocalDateTime.now())).count();
-//                                        if (count > 0) {
-//                                            continue;
-//                                        }
-//                                        String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
-//                                        if (null != value) {
-//                                            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);
-//                                            int d = Integer.parseInt(distance.get("distance"));
-//                                            if ((0 == m && null == driver) || (d < m)) {
-//                                                driver = drivers.get(j);
-//                                                m = d;
-//                                                index = j;
-//                                            }
-//                                        }
-//                                    }
-//                                    ds.add(driver);
-//                                    drivers.remove(index);
-//                                }
-//
-//                                //再根据直线距离最短的司机中找出行驶距离最短的司机
-//                                Integer m = 0;
-//                                for (Driver driver : ds) {
-//                                    String value = redisUtil.getValue("DRIVER" + driver.getId());
-//                                    if (null != value) {
-//                                        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 = distance1;
-//                                        }
-//                                    }
-//                                }
-                            } else {
-                                List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
-                                if (orderPrivateCarss.size() == 0) {
-                                    dr = drivers.get(0);
-                                }
-                                appOperationLogService.addAppOperationLog(uid, "{\"type\":\"指派推单,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(dr) + "\"}");
-                            }
-
-                            if (Objects.nonNull(dr)) {
-                                orderPrivateCar.setDriverId(dr.getId());
-                                orderPrivateCar.setCompanyId(dr.getFranchiseeId() != null && dr.getFranchiseeId() != 0 ? dr.getFranchiseeId() : (
-                                        dr.getCompanyId() != null && dr.getCompanyId() != 0 ? dr.getCompanyId() : 1));
-                                orderPrivateCar.setState(2);
-                                orderPrivateCar.setCarId(dr.getCarId());
-                                CarService query1 = carServiceMapper.query(1, dr.getCarId());
-                                orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
-                                orderPrivateCar.setSnatchOrderTime(new Date());
-                                if (orderPrivateCar.getOrderType() != 2) {
-                                    dr.setState(3);
-                                }
-                                driverService.updateById(dr);
-                                redisUtil.setStrValue("DRIVER_ORDER" + dr.getId(), orderPrivateCar.getId().toString(), 600);
-                                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, 2, 0);
-                                        pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
-                                    }
-                                }).start();
-                            }
-                            this.updateById(orderPrivateCar);
-
-                            //发送短信给司机
-//                    aLiSendSms.sendSms(dr.getPhone(), "SMS_216832951", "{\"" + orderPrivateCar.getStartAddress() + "\"}");
+                BaseWarpper baseWarpper = new BaseWarpper();
+                baseWarpper.setId(orderPrivateCar.getId());
+                baseWarpper.setState(orderPrivateCar.getState());
+                baseWarpper.setPayMethod(0);
+                baseWarpper.setAmount(orderPrivateCar.getOrderMoney());
+                return ResultUtil.success(baseWarpper);
+            }else {
+                orderPrivateCar.setEstimatedPrice(data.getAmount());
+                orderPrivateCar.setIsReassign(1);
+                orderPrivateCar.setIsDelete(1);
+                orderPrivateCar.setPayMethod(1);
+                this.insert(orderPrivateCar);
+                appOperationLogService.addAppOperationLog(uid, "{\"type\":\"用户下单\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"orderPrivateCar\":\"" + JSON.toJSONString(orderPrivateCar) + "\"}");
+                if(orderSource == 2){//扫码下单
+                    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, 2, 0);
+                            pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
                         }
-                    }catch (Exception e){
-                        e.printStackTrace();
-                    }finally {
-                        redisUtil.unlock("order_lock");
+                    }).start();
+                }
+                long timeMillis2 = System.currentTimeMillis();
+                logger.info("第二段用时:" + (timeMillis2 - timeMillis));
+                timeMillis = timeMillis2;
+
+                // TODO: 2021/5/11 修改,根据后台设定的派单范围查询范围内有无司机,将单子指派给距离最近的司机(距离相同随机取),范围内没有司机再进行推单流程
+                if(orderPrivateCar.getState() == 1){
+                    Company query = companyCityService.query(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
+                    if(null == query){
+                        return ResultUtil.error("起点暂未企业提供服务");
+                    }
+                    AssignOrder assignOrder = assignOrderService.selectOne(new EntityWrapper<AssignOrder>().eq("companyId", query.getId()).eq("type", 1));
+                    if(null != assignOrder){//配置了指派规则才处理
+                        boolean lock = redisUtil.lock("order_lock", 10, 30);
+                        if(!lock){
+                            return ResultUtil.error("系统繁忙,请稍后重试");
+                        }
+                        try {
+                            //获取空闲司机
+                            List<Driver> drivers = driverMapper.queryIdleDriver_(1, serverCarModelId, null);
+                            List<Integer> driverIds = drivers.stream().map(Driver::getId).collect(Collectors.toList());
+                            logger.info("指派的空闲司机【" + orderPrivateCar.getOrderNum() + "】:" + JSON.toJSONString(drivers));
+                            if(drivers.size() > 0) {//有司机,直接指派给司机
+                                Driver dr = null;
+                                if (drivers.size() > 1) {
+                                    List<Driver> ds = new ArrayList<>();
+                                    double dis = assignOrder.getDistance() * 1000;
+                                    // 查询预约单
+                                    List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
+                                    List<Integer> orderPrivateCarDriverIds = orderPrivateCars.stream().map(OrderPrivateCar::getDriverId).collect(Collectors.toList());
+                                    for (int j = 0; j < drivers.size(); j++) {
+                                        Driver driver1 = drivers.get(j);
+                                        driver1.setDistance(0D);
+                                        if (orderPrivateCar.getOrderType() == 2 && orderPrivateCarDriverIds.contains(driver1.getId())) {
+                                            continue;
+                                        }
+                                        // 判断司机是否有订单进行中
+                                        long count = orderPrivateCarMapper.selectCount(new EntityWrapper<OrderPrivateCar>().eq("driverId", driver1.getId())
+                                                .in("state", Arrays.asList(2, 3, 4, 5, 6, 11)).eq("isDelete", 1));
+                                        if(0 != count){
+                                            continue;
+                                        }
+                                        // 判断该司机是否有30分钟内预约单
+                                        count = orderPrivateCarss.stream().filter(s -> s.getDriverId().equals(driver1.getId()) &&
+                                                DateUtil.dateToLocalDateTime(s.getTravelTime()).minusMinutes(query.getLimitationTime()).isBefore(LocalDateTime.now())).count();
+                                        if (count > 0) {
+                                            continue;
+                                        }
+                                        String value = redisUtil.getValue("DRIVER" + drivers.get(j).getId());
+                                        if (null != value) {
+                                            Map<String, String> distance = gdMapElectricFenceUtil.getDistance(orderPrivateCar.getStartLon() + "," + orderPrivateCar.getStartLat(), value, 1);
+                                            double d = Double.parseDouble(distance.get("distance"));
+                                            logger.info("指派推单,司机距离【" + orderPrivateCar.getOrderNum() + "】" + driver1.getPhone() + ":" + d);
+                                            if(dis >= d){
+                                                driver1.setDistance(d);
+                                                ds.add(driver1);
+                                            }
+                                        }
+                                    }
+
+                                    if(!ds.isEmpty()){
+                                        ds.sort(new Comparator<Driver>() {
+                                            @Override
+                                            public int compare(Driver o1, Driver o2) {
+                                                return o1.getDistance().compareTo(o2.getDistance());
+                                            }
+                                        });
+                                        logger.info("指派推单,符合条件的司机【" + orderPrivateCar.getOrderNum() + "】:" + JSON.toJSONString(ds));
+                                        appOperationLogService.addAppOperationLog(uid, "{\"type\":\"指派推单,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(ds) + "\"}");
+                                        dr = ds.get(0);
+                                    }
+                                } else {
+                                    List<OrderPrivateCar> orderPrivateCarss = orderPrivateCarMapper.queryOrderByState(driverIds, 2, 1, 2, 3, 4, 5, 6, 11);
+                                    if (orderPrivateCarss.size() == 0) {
+                                        dr = drivers.get(0);
+                                    }
+                                    logger.info("指派推单,符合条件的司机【" + orderPrivateCar.getOrderNum() + "】:" + JSON.toJSONString(dr));
+                                    appOperationLogService.addAppOperationLog(uid, "{\"type\":\"指派推单,符合条件的司机\",\"orderId\":\"" + orderPrivateCar.getId() + "\",\"driver\":\"" + JSON.toJSONString(dr) + "\"}");
+                                }
+
+                                if (Objects.nonNull(dr)) {
+                                    orderPrivateCar.setDriverId(dr.getId());
+                                    orderPrivateCar.setCompanyId(dr.getFranchiseeId() != null && dr.getFranchiseeId() != 0 ? dr.getFranchiseeId() : (
+                                            dr.getCompanyId() != null && dr.getCompanyId() != 0 ? dr.getCompanyId() : 1));
+                                    orderPrivateCar.setState(2);
+                                    orderPrivateCar.setCarId(dr.getCarId());
+                                    CarService query1 = carServiceMapper.query(1, dr.getCarId());
+                                    orderPrivateCar.setServerCarModelId(query1.getServerCarModelId());
+                                    orderPrivateCar.setSnatchOrderTime(new Date());
+                                    if (orderPrivateCar.getOrderType() != 2) {
+                                        dr.setState(3);
+                                    }
+                                    driverService.updateById(dr);
+                                    redisUtil.setStrValue("DRIVER_ORDER" + dr.getId(), orderPrivateCar.getId().toString(), 600);
+                                    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, 2, 0);
+                                            pushUtil.pushDriverPosition(orderPrivateCar.getId(), 1);
+                                        }
+                                    }).start();
+                                }
+                                this.updateById(orderPrivateCar);
+
+                                //发送短信给司机
+//                    aLiSendSms.sendSms(dr.getPhone(), "SMS_216832951", "{\"" + orderPrivateCar.getStartAddress() + "\"}");
+                            }
+                        }catch (Exception e){
+                            e.printStackTrace();
+                        }finally {
+                            redisUtil.unlock("order_lock");
+                        }
                     }
                 }
-            }
-            long timeMillis3 = System.currentTimeMillis();
-            logger.info("第三段用时:" + (timeMillis3 - timeMillis));
-            timeMillis = timeMillis3;
+                long timeMillis3 = System.currentTimeMillis();
+                logger.info("第三段用时:" + (timeMillis3 - timeMillis));
+                timeMillis = timeMillis3;
 
-            //推单操作
-            if(orderPrivateCar.getState() == 1){
-                this.pushOrder(orderPrivateCar);
+                //推单操作
+                if(orderPrivateCar.getState() == 1){
+                    this.pushOrder(orderPrivateCar);
+                }
+                //添加消息
+                systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
+                BaseWarpper baseWarpper = new BaseWarpper();
+                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);
             }
-            //添加消息
-            systemNoticeService.addSystemNotice(1, "您的专车订单已下单成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1);
-            BaseWarpper baseWarpper = new BaseWarpper();
-            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);
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            redisUtil.remove(k);
         }
+        return ResultUtil.error("下单失败");
     }
 
 //    @Override
@@ -1481,11 +1456,9 @@
     
             Integer uid = orderPrivateCar.getUserId();
             Double orderMoney = orderPrivateCar.getOrderMoney();
-            System.out.println("=========================订单金额====================="+orderMoney);
             if(Objects.nonNull(orderPrivateCar.getPaymentAdvanceMoney()) && orderPrivateCar.getPaymentAdvanceMoney() > 0){
                 double couponMoney1 = Objects.nonNull(orderPrivateCar.getCouponMoney()) ? orderPrivateCar.getCouponMoney() : 0.00;
                 orderMoney = orderMoney - orderPrivateCar.getPaymentAdvanceMoney() - couponMoney1;
-                System.out.println("=========================减去先付后金额====================="+orderMoney);
             }
             UserInfo userInfo = userInfoService.selectById(uid);
             ResultUtil resultUtil = ResultUtil.success(new HashMap<>());

--
Gitblit v1.7.1