From 6303854b482179fefc3498739aed3f86e930e6fb Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 02 六月 2023 15:30:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 user/guns-admin/src/main/java/com/agentdriving/user/modular/system/util/PushUtil.java                     |   33 +++
 driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/util/PushUtil.java                 |   34 +++
 management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html                          |   50 ++++
 user/guns-admin/src/main/java/com/agentdriving/user/modular/system/service/impl/OrderServiceImpl.java     |  130 +++++++++++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java |  132 +++++++++++++
 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java                  |   35 +++
 driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java |  131 +++++++++++++
 7 files changed, 536 insertions(+), 9 deletions(-)

diff --git a/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java b/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java
index 5c8b059..a88400a 100644
--- a/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java
+++ b/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/service/impl/OrderServiceImpl.java
@@ -576,6 +576,8 @@
                     if(order1.getState() == 101 || order1.getState() == 201){
                         order1.setHallOrder(1);
                         OrderServiceImpl.this.updateById(order1);
+
+                        ExtraPushOrder(order1,systemConfig);
                     }
                 }
             }, num4 * 1000);
@@ -586,6 +588,135 @@
     }
 
 
+    public void ExtraPushOrder(Order order, SystemConfig systemConfig){
+        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
+        Double num3 = jsonObject.getDouble("num3");//推单最大范围
+        Integer num4 = jsonObject.getInteger("num4");//接单时间
+        String startLat = order.getStartLat();
+        String startLng = order.getStartLng();
+
+        //找到中心点
+        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat));
+        Double num = num3 / 1000;//范围公里
+        //构造半径
+        Distance distanceR = new Distance(num, Metrics.KILOMETERS);
+        //画圆
+        Circle circle = new Circle(geoJsonPoint, distanceR);
+        // 构造query对象
+        Query query = Query.query(Criteria.where("location").withinSphere(circle));
+        List<Location> locations = mongoTemplate.find(query, Location.class);
+        List<Integer> driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+        Integer driver = null;
+        YouTuiDriver youTuiDriver1 = null;
+        if(driverIds.size() > 0){
+            List<YouTuiDriver> youTuiDrivers = youTuiDriverService.selectList(new EntityWrapper<YouTuiDriver>().in("driverId", driverIds)
+                    .eq("state", 2).last(" and (surplusQuantity > 0 or now() < endTime) and now() < failureTime"));
+            Double d = null;
+            for (YouTuiDriver youTuiDriver : youTuiDrivers) {
+                String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId());
+                if(ToolUtil.isEmpty(value)){
+                    continue;
+                }
+                Driver driver1 = driverService.selectById(youTuiDriver.getDriverId());
+                if(driver1.getServerStatus() == 2 || driver1.getOpenOrderQRCode() == 1){
+                    continue;
+                }
+                Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                Double wgs84 = distance.get("WGS84");
+                if(d == null || d.compareTo(wgs84) > 0){
+                    d = wgs84;
+                    driver = youTuiDriver.getDriverId();
+                    youTuiDriver1 = youTuiDriver;
+                }
+            }
+        }
+        if(null != youTuiDriver1 && youTuiDriver1.getType() == 1){
+            youTuiDriver1.setSurplusQuantity(youTuiDriver1.getSurplusQuantity() - 1);
+            youTuiDriverService.updateById(youTuiDriver1);
+        }
+        for (int i = 1; i < 4; i++) {
+            if(null == driver){
+
+                num = jsonObject.getDouble("num"+i) / 1000;//范围公里
+                //构造半径
+                distanceR = new Distance(num, Metrics.KILOMETERS);
+                //画圆
+                circle = new Circle(geoJsonPoint, distanceR);
+                // 构造query对象
+                query = Query.query(Criteria.where("location").withinSphere(circle));
+                locations = mongoTemplate.find(query, Location.class);
+
+                driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+
+                if(driverIds.size() > 0){
+                    List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2)
+                            .eq("serverStatus", 1).eq("openOrderQRCode", 0).eq("status", 1).in("id", driverIds));
+                    if(drivers.size() == 0){
+                        continue;
+                    }
+
+                    Integer integral = null;//积分
+                    Double score = null;//评分
+                    Double d = null;
+                    for (Driver driver1 : drivers) {
+                        String value = redisUtil.getValue("DRIVER" + driver1.getId());
+                        if(ToolUtil.isEmpty(value)){
+                            return;
+                        }
+                        if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            d = wgs84;
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) < 0){//积分相同对比评分
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            d = wgs84;
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            if(d.compareTo(wgs84) > 0){
+                                d = wgs84;
+                                integral = driver1.getIntegral();
+                                score = driver1.getScore();
+                                driver = driver1.getId();
+                                continue;
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        if(null != driver){
+            pushUtil.pushGrabOrderExtras(driver, 2);
+            //创建定时任务处理订单到大厅
+            new Timer().schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    Order order1 = OrderServiceImpl.this.selectById(order.getId());
+                    if(order1.getState() == 101 || order1.getState() == 201){
+                        order1.setHallOrder(1);
+                        OrderServiceImpl.this.updateById(order1);
+                    }
+                }
+            }, num4 * 1000);
+        }else{
+            order.setHallOrder(1);
+            this.updateById(order);
+        }
+    }
+
 
     /**
      * 获取大厅订单列表
diff --git a/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/util/PushUtil.java b/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/util/PushUtil.java
index da404d8..a580218 100644
--- a/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/util/PushUtil.java
+++ b/driver/guns-admin/src/main/java/com/agentdriving/driver/modular/system/util/PushUtil.java
@@ -165,6 +165,40 @@
 
 
     /**
+     * 系统推单推送 附加(防止 用户推单后,范围内的司机20s 内接不到单的补充方法)
+     * @param id            接受对象id
+     * @param type          接受对象类型(1=用户,2=司机)
+     */
+    public void pushGrabOrderExtras(Integer id, Integer type){
+        JSONObject msg = new JSONObject();
+        msg.put("code", 200);
+        msg.put("msg", "SUCCESS");
+        msg.put("method", "PUSH_ORDER");
+
+        Map<String, Object> map = new HashMap<>();
+        msg.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", msg.toJSONString());
+        params.add("id", id.toString());
+        params.add("type", type.toString());
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class);
+        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject1.getIntValue("code") != 200){
+            logger.debug(jsonObject1.getString("msg"));
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+
+    /**
      * 推送订单数据
      * @param id
      * @param type
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
index b2ef182..d26139d 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/TOrderServiceImpl.java
@@ -830,6 +830,8 @@
                     if(order1.getState() == 101 || order1.getState() == 201){
                         order1.setHallOrder(1);
                         TOrderServiceImpl.this.updateById(order1);
+
+                        ExtraPushOrder(order1,systemConfig);
                     }
                 }
             }, num4 * 1000);
@@ -838,4 +840,134 @@
             this.updateById(order);
         }
     }
+
+    public void ExtraPushOrder(TOrder order, TSystemConfig systemConfig){
+        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
+        Double num3 = jsonObject.getDouble("num3");//推单最大范围
+        Integer num4 = jsonObject.getInteger("num4");//接单时间
+        String startLat = order.getStartLat();
+        String startLng = order.getStartLng();
+
+        //找到中心点
+        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat));
+        Double num = num3 / 1000;//范围公里
+        //构造半径
+        Distance distanceR = new Distance(num, Metrics.KILOMETERS);
+        //画圆
+        Circle circle = new Circle(geoJsonPoint, distanceR);
+        // 构造query对象
+        Query query = Query.query(Criteria.where("location").withinSphere(circle));
+        List<Location> locations = mongoTemplate.find(query, Location.class);
+        List<Integer> driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+        Integer driver = null;
+        TYouTuiDriver youTuiDriver1 = null;
+        if(driverIds.size() > 0){
+            List<TYouTuiDriver> youTuiDrivers = youTuiDriverService.selectList(new EntityWrapper<TYouTuiDriver>().in("driverId", driverIds)
+                    .eq("state", 2).last(" and (surplusQuantity > 0 or now() < endTime) and now() < failureTime"));
+            Double d = null;
+            for (TYouTuiDriver youTuiDriver : youTuiDrivers) {
+                String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId());
+                if(ToolUtil.isEmpty(value)){
+                    continue;
+                }
+                TDriver driver1 = tDriverMapper.selectById(youTuiDriver.getDriverId());
+                if(driver1.getServerStatus() == 2 ){
+                    continue;
+                }
+                Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                Double wgs84 = distance.get("WGS84");
+                if(d == null || d.compareTo(wgs84) > 0){
+                    d = wgs84;
+                    driver = youTuiDriver.getDriverId();
+                    youTuiDriver1 = youTuiDriver;
+                }
+            }
+        }
+        if(null != youTuiDriver1 && youTuiDriver1.getType() == 1){
+            youTuiDriver1.setSurplusQuantity(youTuiDriver1.getSurplusQuantity() - 1);
+            youTuiDriverService.updateById(youTuiDriver1);
+        }
+        for (int i = 1; i < 4; i++) {
+            if(null == driver){
+
+                num = jsonObject.getDouble("num"+i) / 1000;//范围公里
+                //构造半径
+                distanceR = new Distance(num, Metrics.KILOMETERS);
+                //画圆
+                circle = new Circle(geoJsonPoint, distanceR);
+                // 构造query对象
+                query = Query.query(Criteria.where("location").withinSphere(circle));
+                locations = mongoTemplate.find(query, Location.class);
+
+                driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+
+                if(driverIds.size() > 0){
+                    List<TDriver> drivers = tDriverMapper.selectList(new EntityWrapper<TDriver>().eq("approvalStatus", 2)
+                            .eq("serverStatus", 1).eq("openOrderQRCode", 0).eq("status", 1).in("id", driverIds));
+                    if(drivers.size() == 0){
+                        continue;
+                    }
+
+                    Integer integral = null;//积分
+                    Double score = null;//评分
+                    Double d = null;
+                    for (TDriver driver1 : drivers) {
+                        String value = redisUtil.getValue("DRIVER" + driver1.getId());
+                        if(ToolUtil.isEmpty(value)){
+                            return;
+                        }
+                        if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            d = wgs84;
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) < 0){//积分相同对比评分
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            d = wgs84;
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            if(d.compareTo(wgs84) > 0){
+                                d = wgs84;
+                                integral = driver1.getIntegral();
+                                score = driver1.getScore();
+                                driver = driver1.getId();
+                                continue;
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        if(null != driver){
+            pushUtil.pushGrabOrderExtras(driver, 2);
+            //创建定时任务处理订单到大厅
+            new Timer().schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    TOrder order1 = TOrderServiceImpl.this.selectById(order.getId());
+                    if(order1.getState() == 101 || order1.getState() == 201){
+                        order1.setHallOrder(1);
+                        TOrderServiceImpl.this.updateById(order1);
+                    }
+                }
+            }, num4 * 1000);
+        }else{
+            order.setHallOrder(1);
+            this.updateById(order);
+        }
+    }
+
 }
diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
index 69f1e92..9291d96 100644
--- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
+++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/PushUtil.java
@@ -69,4 +69,39 @@
         }
     }
 
+
+    /**
+     * 系统推单推送 附加(防止 用户推单后,范围内的司机20s 内接不到单的补充方法)
+     * @param id            接受对象id
+     * @param type          接受对象类型(1=用户,2=司机)
+     */
+    public void pushGrabOrderExtras(Integer id, Integer type){
+        JSONObject msg = new JSONObject();
+        msg.put("code", 200);
+        msg.put("msg", "SUCCESS");
+        msg.put("method", "PUSH_ORDER");
+
+        Map<String, Object> map = new HashMap<>();
+        msg.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", msg.toJSONString());
+        params.add("id", id.toString());
+        params.add("type", type.toString());
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = restTemplate.postForObject(PushURL.zull_user_url + "/netty/sendMsgToClient",requestEntity , String.class);
+        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject1.getIntValue("code") != 200){
+            logger.debug(jsonObject1.getString("msg"));
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
+
 }
diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html
index 7dc2b2f..20ddd02 100644
--- a/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html
+++ b/management/guns-admin/src/main/webapp/WEB-INF/view/system/tOrder/tOrder_add.html
@@ -70,7 +70,7 @@
     }
 </script>
 <script src="${ctxPath}/static/modular/system/tOrder/tOrder_info.js"></script>
-<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=86fcccf007b64ae97b01c3c982c0ef0f&plugin=AMap.PlaceSearch,AMap.AutoComplete,AMap.Marker,AMap.Geocoder"></script>
+<script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=86fcccf007b64ae97b01c3c982c0ef0f&plugin=AMap.PlaceSearch,AMap.AutoComplete,AMap.Marker,AMap.Geocoder,AMap.Geolocation"></script>
 <script type="text/javascript">
     //地图加载
     var map1 = new AMap.Map("container1", {
@@ -81,7 +81,6 @@
 
     function autoInput1(){
         var keywords = document.getElementById("tipinput1").value;
-        AMap.plugin('AMap.AutoComplete', function(){
             // 实例化Autocomplete
             var autoOptions = {
                 city: '全国'
@@ -95,7 +94,6 @@
                     $(".amap-sug-result-one").append('<div class="auto-item amapaddr" id="amap-sug4" onclick="javascript:geoCode1(\''+result.tips[key].name+'\', \''+result.tips[key].district+ result.tips[key].address+'\');">' + result.tips[key].name+ " <span style='color: darkgray;margin-left: 13px;'>" + result.tips[key].district+ result.tips[key].address+ " </span></div>");
                 }
             })
-        })
     }
 
     autoInput1();
@@ -113,7 +111,7 @@
         var address  = t; //document.getElementById('address').value;
         geocoder1.getLocation(address, function(status, result) {
             if (status === 'complete'&&result.geocodes.length) {
-                console.log(result);
+                // console.log(result);
                 var lnglat = result.geocodes[0].location;
                 TOrderInfoDlg.startAddress = {
                     name: t,
@@ -135,7 +133,26 @@
 
 
     map1.on('click', function(e) {
-        console.log(e,'e')
+
+        var lnglatXY = [e.lnglat.getLng(), e.lnglat.getLat()];
+        geocoder1.getAddress(lnglatXY, function (status, result) {
+            if (status === 'complete' && result.info === 'OK') {
+                // console.log(result,'result')
+
+                var address = result.regeocode.formattedAddress;
+                // console.log(address,'address');
+                TOrderInfoDlg.startAddress = {
+                    name: address,
+                    address: result.regeocode.addressComponent.province+result.regeocode.addressComponent.city+result.regeocode.addressComponent.district,
+                    lat: e.lnglat.getLat(),
+                    lon: e.lnglat.getLng(),
+                };
+                document.getElementById('tipinput1').value = address;
+            } else {
+                log.error('根据坐标查询地址失败');
+            }
+        });
+        // console.log(e,'e')
         ln = e.lnglat.getLng();
         lt = e.lnglat.getLat();
         if (marker1){
@@ -166,7 +183,7 @@
             autoComplete.search(keywords, function(status, result) {
                 $(".amap-sug-result-two").html("");
                 $(".amap-sug-result-two").show();
-                console.log(result.info);
+                // console.log(result.info);
                 for(const key in result.tips){
                     $(".amap-sug-result-two").append('<div class="auto-item amapaddr" id="amap-sug4" onclick="javascript:geoCode2(\''+result.tips[key].name+'\', \''+result.tips[key].district+ result.tips[key].address+'\');">' + result.tips[key].name+ " <span style='color: darkgray;margin-left: 13px;'>" + result.tips[key].district+ result.tips[key].address+ " </span></div>");
                 }
@@ -189,8 +206,6 @@
         var address  = t; //document.getElementById('address').value;
         geocoder2.getLocation(address, function(status, result) {
             if (status === 'complete'&&result.geocodes.length) {
-                console.log(t);
-                console.log(result);
                 var lnglat = result.geocodes[0].location;
                 TOrderInfoDlg.endAddress = {
                     name: t,
@@ -211,7 +226,24 @@
 
 
     map2.on('click', function(e) {
-        console.log(e,'e');
+
+        var lnglatXY = [e.lnglat.getLng(), e.lnglat.getLat()];
+        geocoder2.getAddress(lnglatXY, function (status, result) {
+            if (status === 'complete' && result.info === 'OK') {
+
+                var address = result.regeocode.formattedAddress;
+                TOrderInfoDlg.endAddress = {
+                    name: address,
+                    address: result.regeocode.addressComponent.province+result.regeocode.addressComponent.city+result.regeocode.addressComponent.district,
+                    lat: e.lnglat.getLat(),
+                    lon: e.lnglat.getLng(),
+                };
+                document.getElementById('tipinput2').value = address;
+            } else {
+                log.error('根据坐标查询地址失败');
+            }
+        });
+
         ln = e.lnglat.getLng();
         lt = e.lnglat.getLat();
 
diff --git a/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/service/impl/OrderServiceImpl.java b/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/service/impl/OrderServiceImpl.java
index f639970..08723d3 100644
--- a/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/service/impl/OrderServiceImpl.java
+++ b/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/service/impl/OrderServiceImpl.java
@@ -644,6 +644,136 @@
                     if(order1.getState() == 101 || order1.getState() == 201){
                         order1.setHallOrder(1);
                         OrderServiceImpl.this.updateById(order1);
+                        ExtraPushOrder(order1,systemConfig);
+                    }
+                }
+            }, num4 * 1000);
+        }else{
+            order.setHallOrder(1);
+            this.updateById(order);
+        }
+    }
+
+    public void ExtraPushOrder(Order order, SystemConfig systemConfig){
+        JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
+        Double num3 = jsonObject.getDouble("num3");//推单最大范围
+        Integer num4 = jsonObject.getInteger("num4");//接单时间
+        String startLat = order.getStartLat();
+        String startLng = order.getStartLng();
+
+        //找到中心点
+        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(startLng), Double.valueOf(startLat));
+        Double num = num3 / 1000;//范围公里
+        //构造半径
+        Distance distanceR = new Distance(num, Metrics.KILOMETERS);
+        //画圆
+        Circle circle = new Circle(geoJsonPoint, distanceR);
+        // 构造query对象
+        Query query = Query.query(Criteria.where("location").withinSphere(circle));
+        List<Location> locations = mongoTemplate.find(query, Location.class);
+        List<Integer> driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+        Integer driver = null;
+        YouTuiDriver youTuiDriver1 = null;
+        if(driverIds.size() > 0){
+            List<YouTuiDriver> youTuiDrivers = youTuiDriverService.selectList(new EntityWrapper<YouTuiDriver>().in("driverId", driverIds)
+                    .eq("state", 2).last(" and (surplusQuantity > 0 or now() < endTime) and now() < failureTime"));
+            Double d = null;
+            for (YouTuiDriver youTuiDriver : youTuiDrivers) {
+                String value = redisUtil.getValue("DRIVER" + youTuiDriver.getDriverId());
+                if(ToolUtil.isEmpty(value)){
+                    continue;
+                }
+                Driver driver1 = driverService.selectById(youTuiDriver.getDriverId());
+                if(driver1.getServerStatus() == 2 || driver1.getOpenOrderQRCode() == 1){
+                    continue;
+                }
+                Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                Double wgs84 = distance.get("WGS84");
+                if(d == null || d.compareTo(wgs84) > 0){
+                    d = wgs84;
+                    driver = youTuiDriver.getDriverId();
+                    youTuiDriver1 = youTuiDriver;
+                }
+            }
+        }
+        if(null != youTuiDriver1 && youTuiDriver1.getType() == 1){
+            youTuiDriver1.setSurplusQuantity(youTuiDriver1.getSurplusQuantity() - 1);
+            youTuiDriverService.updateById(youTuiDriver1);
+        }
+        for (int i = 1; i < 4; i++) {
+            if(null == driver){
+
+                num = jsonObject.getDouble("num"+i) / 1000;//范围公里
+                //构造半径
+                distanceR = new Distance(num, Metrics.KILOMETERS);
+                //画圆
+                circle = new Circle(geoJsonPoint, distanceR);
+                // 构造query对象
+                query = Query.query(Criteria.where("location").withinSphere(circle));
+                locations = mongoTemplate.find(query, Location.class);
+
+                driverIds = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
+
+                if(driverIds.size() > 0){
+                    List<Driver> drivers = driverService.selectList(new EntityWrapper<Driver>().eq("approvalStatus", 2)
+                            .eq("serverStatus", 1).eq("openOrderQRCode", 0).eq("status", 1).in("id", driverIds));
+                    if(drivers.size() == 0){
+                        continue;
+                    }
+
+                    Integer integral = null;//积分
+                    Double score = null;//评分
+                    Double d = null;
+                    for (Driver driver1 : drivers) {
+                        String value = redisUtil.getValue("DRIVER" + driver1.getId());
+                        if(ToolUtil.isEmpty(value)){
+                            return;
+                        }
+                        if(integral == null || integral.compareTo(driver1.getIntegral()) < 0){//积分大
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            d = wgs84;
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) < 0){//积分相同对比评分
+                            integral = driver1.getIntegral();
+                            score = driver1.getScore();
+                            driver = driver1.getId();
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            d = wgs84;
+                            continue;
+                        }
+                        if(integral.compareTo(driver1.getIntegral()) == 0 && score.compareTo(driver1.getScore()) == 0){//积分相同/评分相同对比距离
+                            Map<String, Double> distance = GeodesyUtil.getDistance(value, order.getStartLng() + "," + order.getStartLat());
+                            Double wgs84 = distance.get("WGS84");
+                            if(d.compareTo(wgs84) > 0){
+                                d = wgs84;
+                                integral = driver1.getIntegral();
+                                score = driver1.getScore();
+                                driver = driver1.getId();
+                                continue;
+                            }
+                        }
+                    }
+
+                }
+            }
+        }
+
+        if(null != driver){
+            pushUtil.pushGrabOrderExtras(driver, 2);
+            //创建定时任务处理订单到大厅
+            new Timer().schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    Order order1 = OrderServiceImpl.this.selectById(order.getId());
+                    if(order1.getState() == 101 || order1.getState() == 201){
+                        order1.setHallOrder(1);
+                        OrderServiceImpl.this.updateById(order1);
                     }
                 }
             }, num4 * 1000);
diff --git a/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/util/PushUtil.java b/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/util/PushUtil.java
index 72aaae7..eaa0dd4 100644
--- a/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/util/PushUtil.java
+++ b/user/guns-admin/src/main/java/com/agentdriving/user/modular/system/util/PushUtil.java
@@ -203,6 +203,39 @@
     }
 
 
+    /**
+     * 系统推单推送 附加(防止 用户推单后,范围内的司机20s 内接不到单的补充方法)
+     * @param id            接受对象id
+     * @param type          接受对象类型(1=用户,2=司机)
+     */
+    public void pushGrabOrderExtras(Integer id, Integer type){
+        JSONObject msg = new JSONObject();
+        msg.put("code", 200);
+        msg.put("msg", "SUCCESS");
+        msg.put("method", "PUSH_ORDER");
+
+        Map<String, Object> map = new HashMap<>();
+        msg.put("data", map);
+
+        //调用推送
+        HttpHeaders headers = new HttpHeaders();
+        // 以表单的方式提交
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        //将请求头部和参数合成一个请求
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.add("msg", msg.toJSONString());
+        params.add("id", id.toString());
+        params.add("type", type.toString());
+        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
+        String s = internalRestTemplate.postForObject("http://zuul-gateway/netty/sendMsgToClient",requestEntity , String.class);
+        JSONObject jsonObject1 = JSON.parseObject(s, JSONObject.class);
+        if(jsonObject1.getIntValue("code") != 200){
+            logger.debug(jsonObject1.getString("msg"));
+            System.err.println(jsonObject1.getString("msg"));
+        }
+    }
+
+
 
 
     /**

--
Gitblit v1.7.1