From 4f75e746dc006f487a1a7de8e14c497148911b0e Mon Sep 17 00:00:00 2001
From: guyue <1721849008@qq.com>
Date: 星期六, 16 八月 2025 00:30:09 +0800
Subject: [PATCH] 抢单以及转派

---
 DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java |  157 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 155 insertions(+), 2 deletions(-)

diff --git a/DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
index 31aeec1..867187b 100644
--- a/DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
+++ b/DriverOKTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -111,7 +111,8 @@
 
     @Resource
     private OrderTaxiMapper orderTaxiMapper;
-
+    @Autowired
+    private ICompanyService companyService;
     @Resource
     private PhoneMapper phoneMapper;
 
@@ -126,6 +127,9 @@
 
     @Autowired
     private GeodesyUtil geodesyUtil;
+
+    @Autowired
+    private ICarService carService;
 
     @Value("${filePath}")
     private String filePath;
@@ -262,11 +266,54 @@
 
                 //修改司机空闲状态
                 List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryWithin30Minutes(orderCrossCity.getDriverId(), 2, 3, 4, 5, 11);
+                Driver driver = driverService.selectById(orderCrossCity.getDriverId());
                 if(orderCrossCities.size() == 0){
-                    Driver driver = driverService.selectById(orderCrossCity.getDriverId());
                     driver.setState(2);
                     driverService.updateById(driver);
                 }
+
+                Integer placeOrderWay = null;
+                switch (orderCrossCity.getOrderSource()){
+                    case 2:
+                        placeOrderWay = 4;
+                        break;
+                    case 3:
+                        placeOrderWay = 4;
+                        break;
+                    case 6:
+                        placeOrderWay = 1;
+                        break;
+                    case 7:
+                        placeOrderWay = 2;
+                        break;
+                    case 5:
+                        placeOrderWay = 3;
+                        break;
+                }
+
+                Company company = companyService.selectById(driver.getFranchiseeId());
+                if(Objects.isNull(company)){
+                    company = companyService.selectById(driver.getCompanyId());
+                }
+                // 司机收入
+                double moneyTwo;
+                // 平台收入
+                double money;
+                if(orderCrossCity.getOrderSource() == 2 || orderCrossCity.getOrderSource() == 3){
+                    double v = company.getPercentageDeduction() / 100;
+                    money = v * orderCrossCity.getOrderMoney();
+                    moneyTwo = orderCrossCity.getOrderMoney()-money;
+                }else {
+                    money = company.getFixedDeduction();
+                    moneyTwo = orderCrossCity.getOrderMoney()-money;
+                }
+                driver.setBalance(driver.getBalance() + moneyTwo);
+                // 新增扣除使用费记录
+                transactionDetailsService.saveDataTaxi(driver.getId(), "软件使用费", money, 2, 1, 2, 6, orderCrossCity.getId(),placeOrderWay,company.getId());
+                // 司机订单收入
+                transactionDetailsService.saveDataTaxi(driver.getId(), "完成订单", moneyTwo, 1, 1, 2, 3, orderCrossCity.getId(),placeOrderWay,company.getId());
+
+                driverService.updateById(driver);
 
                 pushUtil.removeTask(orderId, 3);//删除定时任务,结束推送数据
                 systemNoticeService.addSystemNotice(1, "司机已结束本次行程,谢谢使用", orderCrossCity.getUserId());
@@ -909,6 +956,7 @@
      * @return
      * @throws Exception
      */
+    @Override
     public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception{
         List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
         if(orderCrossCities.size() > 0){
@@ -924,4 +972,109 @@
             size++;
         }
     }
+
+    /**
+     * 抢单操作
+     * @param orderId
+     * @param uid
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public synchronized ResultUtil grabOrder(Integer orderId, Integer uid) throws Exception {
+        OrderCrossCity orderCrossCity = selectById(orderId);
+
+        if(orderCrossCity.getState() == 9){
+            return ResultUtil.error("订单已取消");
+        }
+        if(orderCrossCity.getState() != 1){
+            return ResultUtil.error("手速有点慢哦,订单已被抢啦!");
+        }
+        Driver driver = driverService.selectById(uid);
+        orderCrossCity.setDriverId(uid);
+        orderCrossCity.setCarId(driver.getCarId());
+        orderCrossCity.setCompanyId(driver.getFranchiseeId() != null && driver.getFranchiseeId() != 0 ? driver.getFranchiseeId() : (
+                driver.getCompanyId() != null && driver.getCompanyId() != 0 ? driver.getCompanyId() : 1));
+        orderCrossCity.setState(2);
+        orderCrossCity.setSnatchOrderTime(new Date());
+
+        //调用高德创建轨迹
+        String s = gdFalconUtil.selectTerminal(driver.getPhone());
+        String track = gdFalconUtil.createTrack(s);
+        orderCrossCity.setTrackId(track);
+
+        //调用移动的小号接口
+        Map<String, String> geocode = gdMapGeocodingUtil.geocode(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString());
+        Region region = regionMapper.query(geocode.get("districtCode"));
+        Map<String, String> map = chinaMobileUtil.midAxbBindSend(orderCrossCity.getPassengersPhone(), driver.getPhone(), Integer.valueOf(region.getCitycode().substring(1)));
+        if(String.valueOf(map.get("code")).equals("200")){
+            orderCrossCity.setTelX(map.get("telX"));
+            orderCrossCity.setBindId(map.get("bindId"));
+        }
+
+        this.updateById(orderCrossCity);
+
+           //修改司机为服务中
+        if (driver.getState() == 2) {
+            driver.setState(3);
+
+        }
+
+        //TODO:补充订单、支付明细信息
+        // 处理公司和司机收入(原支付方法中删除的逻辑移到这里)
+        Line line = lineService.selectById(orderCrossCity.getLineId());
+        Double speMoney = Double.valueOf(line.getRakeRate());
+        BigDecimal d = new BigDecimal(orderCrossCity.getOrderMoney()).multiply(new BigDecimal(speMoney).divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_HALF_EVEN);//企业收入
+        BigDecimal c = new BigDecimal(orderCrossCity.getOrderMoney()).subtract(d).setScale(2, BigDecimal.ROUND_HALF_EVEN);//司机收入
+        incomeService.saveData(1, orderCrossCity.getCompanyId(), 2, orderCrossCity.getId(), 3, d.doubleValue());
+        incomeService.saveData(2, orderCrossCity.getDriverId(), 2, orderCrossCity.getId(), 3, c.doubleValue());
+
+        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);
+
+        //推送相关代码------------------start----------------
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                pushUtil.pushOrderState(1, orderCrossCity.getUserId(), orderCrossCity.getId(), 1, orderCrossCity.getState());
+                pushUtil.pushOrderState(2, orderCrossCity.getDriverId(), orderCrossCity.getId(), 1, orderCrossCity.getState());
+//                if(orderCrossCity.getType() == 2){
+//                    pushUtil.pushFerryOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 2);
+//                }
+            }
+        }).start();
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                pushUtil.pushDriverPosition(orderId, 1);
+            }
+        }).start();
+
+        systemNoticeService.addSystemNotice(2, "您已成功抢得跨城订单,请及时联系客户!", orderCrossCity.getDriverId());
+        systemNoticeService.addSystemNotice(1, "您的订单已指派给" + driver.getName().substring(0, 1) + "师傅,请保持电话畅通!", orderCrossCity.getUserId());
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                if(pushMinistryOfTransport){
+                    //上传数据
+                    pushMinistryOfTransportUtil.orderCreate(orderId);
+                    pushMinistryOfTransportUtil.orderMatch(orderId);
+                }
+            }
+        }).start();
+        //发送短信
+        try{
+            Car car = carService.selectById(orderCrossCity.getCarId());
+            SMSUtil.send(orderCrossCity.getPassengersPhone(), "您的订单已被司机" + driver.getName() + "接单,联系电话" + driver.getPhone() + "车牌号" + car.getCarLicensePlate() + "请耐心等待。", "2431012312845");
+//            String sData = aLiSendSms.sendSms(orderPrivateCar.getPassengersPhone(), "SMS_476900230", "{\"code1\":\"" + driver.getName() + "\",\"code2\":\"" + driver.getPhone() + "\",\"code3\":\"" + car.getCarLicensePlate() + "\"}");
+        }catch (Exception e){
+
+        }
+        return ResultUtil.success();
+    }
+
 }

--
Gitblit v1.7.1