From e1735c6321318ed0edad6d324989f8a379814888 Mon Sep 17 00:00:00 2001
From: lishouyi <linlangsur163@163.com>
Date: 星期五, 02 六月 2023 14:16:39 +0800
Subject: [PATCH] 用户端、司机端、后台:订单推送的附加推送;后台订单添加的地图点击获取到地址信息的优化

---
 user/guns-admin/src/main/java/com/agentdriving/user/modular/system/service/impl/OrderServiceImpl.java |  238 +++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 180 insertions(+), 58 deletions(-)

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 de79ec0..fc16a71 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
@@ -222,7 +222,6 @@
 
             if(date.getTime() >= s.getTimeInMillis() && date.getTime() < e.getTimeInMillis()){
                 b = false;
-                Double dd = 0d;
                 for (int j = 0; j < num3.size(); j++) {
                     JSONObject jsonObject2 = num3.getJSONObject(j);
                     Double num1_1 = jsonObject2.getDouble("num1");
@@ -231,58 +230,13 @@
                     if(num1_1.compareTo(distance) <= 0 && num2_1.compareTo(distance) > 0){
                         order.setStartDistance(distance);//起步里程
                         order.setStartPrice(num3_1);//起步价
+                        break;
                     }
                     if(j == num3.size() - 1 && order.getStartPrice() == 0){
                         order.setStartDistance(num2_1);//起步里程
                         order.setStartPrice(num3_1);//起步价
-                        dd = distance - num2_1;
                     }
                 }
-                if(dd != 0){
-                    //计算长途费
-                    if(distance.compareTo(num4) > 0){
-                        order.setLongDistance(num4 + "-" + num5);//长途里程
-                        order.setLongDistancePrice(num6);//长途费
-                    }
-                    //计算长途里程超出的部分
-                    if(distance.compareTo(num5) > 0){
-                        BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num5));
-                        BigDecimal divide1 = subtract1.divide(new BigDecimal(num7), new MathContext(2, RoundingMode.HALF_EVEN));
-                        BigDecimal multiply1 = divide1.multiply(new BigDecimal(num8));
-                        order.setOverLongDistance(subtract1.doubleValue());//超出长途里程
-                        order.setOverLongDistancePrice(multiply1.doubleValue());//超出长途里程费
-                    }
-                }
-                break;
-            }
-        }
-
-        if(b){//默认配置
-            JSONObject jsonObject1 = chargeStandard.getJSONObject(0);
-            JSONArray num3 = jsonObject1.getJSONArray("num3");//起步里程
-            Double num4 = jsonObject1.getDouble("num4");//长途里程
-            Double num5 = jsonObject1.getDouble("num5");//长途里程
-            Double num6 = jsonObject1.getDouble("num6");//长途费
-            Double num7 = jsonObject1.getDouble("num7");//超出长途里程每num10公里
-            Double num8 = jsonObject1.getDouble("num8");//超过num8每num10公里收取num11
-
-            Double dd = 0d;
-            for (int j = 0; j < num3.size(); j++) {
-                JSONObject jsonObject2 = num3.getJSONObject(j);
-                Double num1_1 = jsonObject2.getDouble("num1");
-                Double num2_1 = jsonObject2.getDouble("num2");
-                Double num3_1 = jsonObject2.getDouble("num3");
-                if(num1_1.compareTo(distance) <= 0 && num2_1.compareTo(distance) > 0){
-                    order.setStartDistance(distance);//起步里程
-                    order.setStartPrice(num3_1);//起步价
-                }
-                if(j == num3.size() - 1 && order.getStartPrice() == 0){
-                    order.setStartDistance(num2_1);//起步里程
-                    order.setStartPrice(num3_1);//起步价
-                    dd = distance - num2_1;
-                }
-            }
-            if(dd != 0){
                 //计算长途费
                 if(distance.compareTo(num4) > 0){
                     order.setLongDistance(num4 + "-" + num5);//长途里程
@@ -296,6 +250,45 @@
                     order.setOverLongDistance(subtract1.doubleValue());//超出长途里程
                     order.setOverLongDistancePrice(multiply1.doubleValue());//超出长途里程费
                 }
+            }
+        }
+
+        if(b){//默认配置
+            JSONObject jsonObject1 = chargeStandard.getJSONObject(0);
+            JSONArray num3 = jsonObject1.getJSONArray("num3");//起步里程
+            Double num4 = jsonObject1.getDouble("num4");//长途里程
+            Double num5 = jsonObject1.getDouble("num5");//长途里程
+            Double num6 = jsonObject1.getDouble("num6");//长途费
+            Double num7 = jsonObject1.getDouble("num7");//超出长途里程每num10公里
+            Double num8 = jsonObject1.getDouble("num8");//超过num8每num10公里收取num11
+
+            for (int j = 0; j < num3.size(); j++) {
+                JSONObject jsonObject2 = num3.getJSONObject(j);
+                Double num1_1 = jsonObject2.getDouble("num1");
+                Double num2_1 = jsonObject2.getDouble("num2");
+                Double num3_1 = jsonObject2.getDouble("num3");
+                if(num1_1.compareTo(distance) <= 0 && num2_1.compareTo(distance) > 0){
+                    order.setStartDistance(distance);//起步里程
+                    order.setStartPrice(num3_1);//起步价
+                    break;
+                }
+                if(j == num3.size() - 1 && order.getStartPrice() == 0){
+                    order.setStartDistance(num2_1);//起步里程
+                    order.setStartPrice(num3_1);//起步价
+                }
+            }
+            //计算长途费
+            if(distance.compareTo(num4) > 0){
+                order.setLongDistance(num4 + "-" + num5);//长途里程
+                order.setLongDistancePrice(num6);//长途费
+            }
+            //计算长途里程超出的部分
+            if(distance.compareTo(num5) > 0){
+                BigDecimal subtract1 = new BigDecimal(distance).subtract(new BigDecimal(num5));
+                BigDecimal divide1 = subtract1.divide(new BigDecimal(num7), new MathContext(2, RoundingMode.HALF_EVEN));
+                BigDecimal multiply1 = divide1.multiply(new BigDecimal(num8));
+                order.setOverLongDistance(subtract1.doubleValue());//超出长途里程
+                order.setOverLongDistancePrice(multiply1.doubleValue());//超出长途里程费
             }
         }
 
@@ -465,15 +458,14 @@
                 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());
+            if(driver.getServerStatus() == 1){
+                order.setAgentId(driver.getAgentId());
+                order.setBranchOfficeId(driver.getBranchOfficeId());
+                order.setOrderTakingTime(new Date());
 
-            driver.setServerStatus(2);
-            driverService.updateById(driver);
+                driver.setServerStatus(2);
+                driverService.updateById(driver);
+            }
 
             appUser.setCancelCount(0);
             appUser.setIsException(1);
@@ -635,6 +627,136 @@
 
         if(null != driver){
             pushUtil.pushGrabOrder(driver, 2, order.getId(), num4);
+            //创建定时任务处理订单到大厅
+            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);
+                        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
@@ -1042,9 +1164,9 @@
         }
 
         if(appUser.getHavDiscount() == 1){//9折
-            payMoney = payMoney * 0.9;
             order.setDiscount(9D);
             order.setDiscountAmount(payMoney * 0.1);
+            payMoney = payMoney * 0.9;
         }
 
         order.setPayType(2);
@@ -1107,7 +1229,7 @@
         order.setPayType(1);
         order.setPayMoney(payMoney);
 
-        payMoney = payMoney > appUser.getAccountBalance() ? payMoney - appUser.getAccountBalance() : 0D;
+        payMoney = payMoney.compareTo(appUser.getAccountBalance()) > 0 ? payMoney - appUser.getAccountBalance() : 0D;
 
         AccountChangeDetail accountChangeDetail = new AccountChangeDetail();
         accountChangeDetail.setCode(System.currentTimeMillis() + UUIDUtil.getNumberRandom(3));
@@ -1119,7 +1241,7 @@
         accountChangeDetail.setChangeType(2);
         accountChangeDetail.setOrderId(order.getId());
         accountChangeDetail.setExplain("代驾服务费");
-        appUser.setAccountBalance(appUser.getAccountBalance() > payMoney ? appUser.getAccountBalance() - payMoney : 0);
+        appUser.setAccountBalance(appUser.getAccountBalance().compareTo(payMoney) > 0 ? appUser.getAccountBalance() - payMoney : 0);
         accountChangeDetail.setNewData(appUser.getAccountBalance());
         appUserService.updateById(appUser);
         accountChangeDetailService.insert(accountChangeDetail);

--
Gitblit v1.7.1