From a075cdd2f76fae321ecf95dce363141ade30f0f1 Mon Sep 17 00:00:00 2001
From: zhibing.pu <393733352@qq.com>
Date: 星期五, 12 四月 2024 22:37:58 +0800
Subject: [PATCH] 新增加功能

---
 UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |  285 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 200 insertions(+), 85 deletions(-)

diff --git a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 722b037..d9f38a1 100644
--- a/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/UserIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -437,6 +437,22 @@
         //推单操作
         if(orderPrivateCar.getState() == 1){
             this.pushOrder(orderPrivateCar);
+        }else{
+            //接单后定时任务判断司机是否去接乘客,没有则推送提醒
+            CancleOrder cancleOrder = cancleOrderService.query(orderPrivateCar.getCompanyId());
+            if(null != cancleOrder){
+                JSONObject object = JSON.parseObject(cancleOrder.getContent());
+                long time = object.getInteger("driverTimeout") * 60000L;
+                new Timer().schedule(new TimerTask() {
+                    @Override
+                    public void run() {
+                        OrderPrivateCar orderPrivateCar1 = OrderPrivateCarServiceImpl.this.selectById(orderPrivateCar.getId());
+                        if(orderPrivateCar1.getState() == 2){
+                            pushUtil.pushDriverTimeOut(1, orderPrivateCar1.getUserId(), orderPrivateCar1.getId(), 1);
+                        }
+                    }
+                }, time);
+            }
         }
 
 
@@ -500,28 +516,89 @@
         }
         return ResultUtil.success();
     }
-
+    
+    /**
+     * 获取取消需要支付的金额
+     * @param id
+     * @param language
+     * @return
+     * @throws Exception
+     */
     @Override
     public ResultUtil<BaseWarpper> queryCancleAmount(Integer id, Integer language) throws Exception {
         OrderPrivateCar orderPrivateCar = this.selectById(id);
         if(null == orderPrivateCar){
             return ResultUtil.error(language == 1 ? "获取数据失败,订单信息有误" : language == 2 ? "Failed to obtain data, order-information error." : "Impossible d’obtenir les données, erreur d’information de commande. ");
         }
+        BaseWarpper baseWarpper = new BaseWarpper();
         double amount = 0;
-        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
-        if(null != orderPrivateCar.getDriverId() && orderPrivateCar.getSnatchOrderTime()!=null &&
-                (orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < new Date().getTime()){//收费的情况
-            if(null != query){
-                amount += query.getMoney();
+        CancleOrder query = cancleOrderService.query(orderPrivateCar.getCompanyId());
+        if(null == query || null == orderPrivateCar.getDriverId()){
+            baseWarpper.setAmount(amount);
+            return ResultUtil.success(baseWarpper);
+        }
+        JSONObject object = JSON.parseObject(query.getContent());
+        long t = object.getInteger("driverTimeout") * 60000L;
+        //司机超时未到达起点,免费取消
+        if(orderPrivateCar.getState() < 3 && orderPrivateCar.getSnatchOrderTime().getTime() + t < System.currentTimeMillis()){
+            baseWarpper.setAmount(amount);
+            return ResultUtil.success(baseWarpper);
+        }
+        //普通单
+        if(1 == orderPrivateCar.getOrderType()){
+            JSONObject order = object.getJSONObject("order");
+            long m = order.getInteger("orderAcceptanceTime") * 60000L;
+            //超过免费时间,计算费用
+            if(orderPrivateCar.getSnatchOrderTime().getTime() + m < System.currentTimeMillis()){
+                BigDecimal money = order.getBigDecimal("money");
+                if(null != orderPrivateCar.getSetOutTime()){
+                    //里程费
+                    BigDecimal mileageFee = order.getBigDecimal("mileageFee").multiply(new BigDecimal(orderPrivateCar.getMileage() / 1000));
+                    //时长费
+                    int s = Double.valueOf((System.currentTimeMillis() - orderPrivateCar.getSetOutTime().getTime()) / 60000).intValue();
+                    BigDecimal durationFee = order.getBigDecimal("durationFee").multiply(new BigDecimal(s));
+                    money = money.add(durationFee).add(mileageFee);
+                }
+                amount = money.setScale(2, RoundingMode.HALF_EVEN).doubleValue();
             }
         }
-        BaseWarpper baseWarpper = new BaseWarpper();
+        //预约单
+        if(2 == orderPrivateCar.getOrderType()){
+            JSONObject order = object.getJSONObject("reservationOrder");
+            long m = order.getInteger("orderAcceptanceTime") * 60000L;
+            //超过免费时间,计算费用
+            if(System.currentTimeMillis() + m > orderPrivateCar.getTravelTime().getTime()){
+                BigDecimal money = order.getBigDecimal("money");
+                if(null != orderPrivateCar.getSetOutTime()){
+                    //里程费
+                    BigDecimal mileageFee = order.getBigDecimal("mileageFee").multiply(new BigDecimal(orderPrivateCar.getMileage() / 1000));
+                    //时长费
+                    int s = Double.valueOf((System.currentTimeMillis() - orderPrivateCar.getSetOutTime().getTime()) / 60000).intValue();
+                    BigDecimal durationFee = order.getBigDecimal("durationFee").multiply(new BigDecimal(s));
+                    //预定费用
+                    BigDecimal reservationFee = order.getBigDecimal("reservationFee");
+                    money = money.add(durationFee).add(mileageFee).add(reservationFee);
+                }
+                amount = money.setScale(2, RoundingMode.HALF_EVEN).doubleValue();
+            }
+        }
         baseWarpper.setAmount(amount);
         return ResultUtil.success(baseWarpper);
     }
-
+    
+    
+    /**
+     * 添加取消操作
+     * @param id
+     * @param reason
+     * @param remark
+     * @param uid
+     * @param language
+     * @return
+     * @throws Exception
+     */
     @Override
-    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid, Integer language) throws Exception {
+    public ResultUtil addCancle(Integer id, String reason, String remark, Integer uid, Double lon, Double lat, String address, Integer language) throws Exception {
         if(ToolUtil.isNotEmpty(remark)){
             if(ToolUtil.isNotEmpty(remark)){
                 List<SensitiveWords> sensitiveWords = sensitiveWordsMapper.selectList(null);
@@ -540,6 +617,8 @@
         if(orderPrivateCar.getState() > 5 && orderPrivateCar.getState() != 11){
             return ResultUtil.error(language == 1 ? "取消订单失败,不合法的操作" : language == 2 ? "Failed to cancel order, illegal operation." : "Échec de l’annulation de la commande, opération illégale.");
         }
+        
+        //服务中也可以取消订单,所以取消订单时需要计算订单费用
         if(null == orderPrivateCar.getDriverId()){//没有接单的情况
             if(orderPrivateCar.getType() == 2){//摆渡车
                 OrderCrossCityServiceImpl.pushEndMap.remove(orderPrivateCar.getCrossCityOrderId());//删除标识数据
@@ -561,36 +640,48 @@
                 this.updateById(orderPrivateCar);
             }
         }else {
-            CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
-            if (null != query) {
-                if ((orderPrivateCar.getSnatchOrderTime().getTime() + query.getMinuteNum() * 60 * 1000) < System.currentTimeMillis() && query.getMoney().compareTo(0D) > 0) {//收费的情况
-                    orderPrivateCar.setState(12);
-                    this.updateById(orderPrivateCar);
-                    integer = orderCancelService.saveData(id, 1, reason, remark, null, query.getMoney(), 1, 1, uid);
-                } else {
-                    integer = orderCancelService.saveData(id, 1, reason, remark, null, null, 2, 1, uid);
-
+            BaseWarpper data = queryCancleAmount(id, language).getData();
+            Double amount = data.getAmount();
+            if(0 == amount){
+                integer = orderCancelService.saveData(id, 1, reason, remark, null, null, 2, 1, uid);
+                if(5 == orderPrivateCar.getState()){
+                    orderPrivateCar.setState(6);
+                    orderPrivateCar.setGetoffLon(lon);
+                    orderPrivateCar.setGetoffLat(lat);
+                    orderPrivateCar.setGetoffAddress(address);
+                    orderPrivateCar.setGetoffTime(new Date());
+                    orderPrivateCar.setEndServiceTime(new Date());
+                }else{
                     orderPrivateCar.setState(10);
-                    this.updateById(orderPrivateCar);
                 }
-                this.deleteTask(id);//删除定时任务
-
-                new Thread(new Runnable() {
-                    @Override
-                    public void run() {
-                        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
-                        System.err.println("推送取消操作---------------------");
-                    }
-                }).start();
-
-                //修改司机为空闲
-                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
-                driver.setState(2);
-                driverService.updateById(driver);
+                this.updateById(orderPrivateCar);
             }else{
-                return ResultUtil.error(language == 1 ? "请完善后台取消规则设置" : language == 2 ? "Please complete the setting of cancellation rules from the background." : "Veuillez compléter le réglage des règles d’annulation à partir de l’arrière-plan.");
+                if(5 == orderPrivateCar.getState()){
+                    orderPrivateCar.setGetoffLon(lon);
+                    orderPrivateCar.setGetoffLat(lat);
+                    orderPrivateCar.setGetoffAddress(address);
+                    orderPrivateCar.setGetoffTime(new Date());
+                    orderPrivateCar.setEndServiceTime(new Date());
+                }
+                orderPrivateCar.setOldState(6);
+                orderPrivateCar.setState(12);
+                this.updateById(orderPrivateCar);
+                integer = orderCancelService.saveData(id, 1, reason, remark, null, amount, 1, 1, uid);
             }
-
+            this.deleteTask(id);//删除定时任务
+    
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                    System.err.println("推送取消操作---------------------");
+                }
+            }).start();
+    
+            //修改司机为空闲
+            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+            driver.setState(2);
+            driverService.updateById(driver);
         }
 
         //添加消息
@@ -626,9 +717,9 @@
         }else{
             orderCancel = orderCancelService.selectById(cancleId);
         }
-
-        CancleOrder query = cancleOrderService.query(orderPrivateCar.getOrderType(), 1, orderPrivateCar.getCompanyId());
-        if(null != query){
+    
+        Double amount = queryCancleAmount(id, language).getData().getAmount();
+        if(0 < amount){
             if(payType == 1){//手机支付
                 orderCancel.setPayType(1);
                 orderCancelService.updateById(orderCancel);
@@ -640,7 +731,7 @@
                 checkoutRequest.setAccountNumber(userInfo.getPhone());
                 checkoutRequest.setCustomerFirstName(userInfo.getFirstName());
                 checkoutRequest.setCustomerLastName(userInfo.getLastName());
-                checkoutRequest.setRequestAmount(query.getMoney());
+                checkoutRequest.setRequestAmount(amount);
                 checkoutRequest.setMerchantTransactionId(merchantTransactionId);
                 checkoutRequest.setRequestDescription("Cancel a trip");
                 checkoutRequest.setCallbackUrl(callbackPath + "/base/wxCancelOrderTaxi");
@@ -649,7 +740,7 @@
                 checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
                 resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
                 if(resultUtil.getCode()==200){
-                    paymentRecordService.saveData(1, null, null, id, 1, 1, query.getMoney(), null, 1);//添加预支付数据
+                    paymentRecordService.saveData(1, null, null, id, 1, 1, amount, null, 1);//添加预支付数据
                 }
 
             }
@@ -665,7 +756,7 @@
                 checkoutRequest.setAccountNumber(bankCard.getCode());
                 checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
                 checkoutRequest.setCustomerLastName(bankCard.getLastName());
-                checkoutRequest.setRequestAmount(query.getMoney());
+                checkoutRequest.setRequestAmount(amount);
                 checkoutRequest.setMerchantTransactionId(merchantTransactionId);
                 checkoutRequest.setRequestDescription("Cancel a trip");
                 checkoutRequest.setCallbackUrl(callbackPath + "/base/wxCancelOrderTaxi");
@@ -674,26 +765,30 @@
                 checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
                 resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
                 if(resultUtil.getCode()==200){
-                    paymentRecordService.saveData(1, null, null, id, 1, 2, query.getMoney(), null, 1);//添加预支付数据
+                    paymentRecordService.saveData(1, null, null, id, 1, 2, amount, null, 1);//添加预支付数据
                 }
 
             }
             if(payType == 3){//余额支付
-                if(userInfo.getBalance() != null && userInfo.getBalance() < query.getMoney()){
+                if(userInfo.getBalance() != null && userInfo.getBalance() < amount){
                     return ResultUtil.error((language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant"), "");
                 }
 
-                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(query.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(amount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
                 //添加交易明细
-                transactionDetailsService.saveData(uid, "取消订单", query.getMoney(), 2, 1, 1, 1, id);
+                transactionDetailsService.saveData(uid, "取消订单", amount, 2, 1, 1, 1, id);
                 userInfoService.updateById(userInfo);
 
                 //解除小号绑定
                 if(orderPrivateCar.getBindId() != null){
-                    chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
+                    ChinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
                 }
-
-                orderPrivateCar.setState(10);
+    
+                if(5 == orderPrivateCar.getOldState()){
+                    orderPrivateCar.setState(6);
+                }else{
+                    orderPrivateCar.setState(10);
+                }
                 orderPrivateCar.setTelX("");
                 orderPrivateCar.setBindId("");
                 this.updateById(orderPrivateCar);
@@ -702,20 +797,19 @@
                 orderCancel.setPayType(3);
                 orderCancelService.updateById(orderCancel);
 
-//                //添加已收入明细
-//                incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, query.getMoney());
-//                //添加已收入明细
-//                Company company = companyService.selectById(orderPrivateCar.getCompanyId());
-//                Double taxi = company.getSpeMoney();
-                BigDecimal c =new BigDecimal(query.getMoney());//司机收入
-                incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
-                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
-                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-                driverService.updateById(driver);
-
-                this.deleteTask(id);//删除定时任务
+                if(null != orderPrivateCar.getDriverId()){
+                    BigDecimal c =new BigDecimal(amount);//司机收入
+                    incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
+                    Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+                    driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                    driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                    driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                    driverService.updateById(driver);
+    
+                    this.deleteTask(id);//删除定时任务
+                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+                }
+                pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
 
                 //添加消息
                 systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
@@ -1901,10 +1995,14 @@
         if(null != query){
             //添加交易明细
             transactionDetailsService.saveData(orderPrivateCar.getUserId(), "取消订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId());
-            orderPrivateCar.setState(10);
+            if(5 == orderPrivateCar.getOldState()){
+                orderPrivateCar.setState(6);
+            }else{
+                orderPrivateCar.setState(10);
+            }
             //解除小号绑定
             if(orderPrivateCar.getBindId() != null){
-                chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
+                ChinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(),orderPrivateCar.getTelX());
             }
             orderPrivateCar.setBindId("");
             orderPrivateCar.setTelX("");
@@ -1920,27 +2018,19 @@
                 orderCancelService.updateById(query1);
             }
 
-//            //添加已收入明细
-//            incomeService.saveData(1, orderPrivateCar.getCompanyId(), 3, orderPrivateCar.getId(), 1, query.getAmount());
-//            //添加已收入明细
-//            Company company = companyService.selectById(orderPrivateCar.getCompanyId());
-//            Double taxi = company.getSpeMoney();
-            BigDecimal c =new BigDecimal(query.getAmount());//司机收入
-            incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
-            Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
-            driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-            driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-            driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
-            driverService.updateById(driver);
-            this.deleteTask(orderPrivateCar.getId());//删除定时任务
-
-            // TODO: 2020/5/24 这里需要给司机和用户推送订单状态
-//            new Thread(new Runnable() {
-//                @Override
-//                public void run() {
-//                    pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
-//                }
-//            }).start();
+            if(null != orderPrivateCar.getDriverId()){
+                BigDecimal c =new BigDecimal(query.getAmount());//司机收入
+                incomeService.saveData(2, orderPrivateCar.getDriverId(), 3, orderPrivateCar.getId(), 1, c.doubleValue());
+                Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+                driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(c).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
+                driverService.updateById(driver);
+                this.deleteTask(orderPrivateCar.getId());//删除定时任务
+    
+                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+            }
+            pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
 
             //添加消息
             systemNoticeService.addSystemNotice(1, language == 1 ? "您已使用余额成功支付取消订单费用,谢谢使用!" : language == 2
@@ -2563,4 +2653,29 @@
         }
         return endPushWarpper;
     }
+    
+    
+    /**
+     * 修改目的地
+     * @param orderId
+     * @param endLon
+     * @param endLat
+     * @param endAddress
+     */
+    @Override
+    public void updateEndAddress(Integer orderId, String endLon, String endLat, String endAddress) {
+        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
+        if(null != orderPrivateCar.getDriverId()){
+            orderPrivateCar.setDestination(endAddress);
+            orderPrivateCar.setDestinationLat(endLat);
+            orderPrivateCar.setDestinationLon(endLon);
+            this.updateById(orderPrivateCar);
+            pushUtil.pushModifyAddress(2, orderPrivateCar.getDriverId(), orderId, 1, 1);
+        }else{
+            orderPrivateCar.setEndAddress(endAddress);
+            orderPrivateCar.setEndLat(Double.valueOf(endLat));
+            orderPrivateCar.setEndLon(Double.valueOf(endLon));
+            this.updateById(orderPrivateCar);
+        }
+    }
 }

--
Gitblit v1.7.1