From 4228cb0f9ff33e4baa4be0ac904eb927f8d84a19 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期六, 11 十月 2025 14:28:27 +0800
Subject: [PATCH] 提交代码

---
 user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java |  336 +++++++++++++++++++++++++++++++++----------------------
 1 files changed, 199 insertions(+), 137 deletions(-)

diff --git a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
index 5e418be..57069a5 100644
--- a/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
+++ b/user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
@@ -15,11 +15,10 @@
 import com.supersavedriving.user.modular.system.util.MallBook.model.*;
 import com.supersavedriving.user.modular.system.util.MallBook.util.Transfer;
 import com.supersavedriving.user.modular.system.util.MallBook.util.TrhRequest;
-import com.supersavedriving.user.modular.system.util.juhe.WeatherUtil;
 import com.supersavedriving.user.modular.system.util.mongodb.model.Location;
+import com.supersavedriving.user.modular.system.util.qianyuntong.OrderUtil;
+import com.supersavedriving.user.modular.system.util.qianyuntong.model.*;
 import com.supersavedriving.user.modular.system.warpper.*;
-import io.swagger.models.auth.In;
-import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,12 +36,12 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.math.MathContext;
 import java.math.RoundingMode;
-import java.net.InetAddress;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -107,12 +106,6 @@
 
     @Autowired
     private IRevenueService revenueService;
-
-    @Autowired
-    private IAgentService agentService;
-
-    @Autowired
-    private IPlatformRechargeRecordService platformRechargeRecordService;
 
     @Autowired
     private IDivisionRecordService divisionRecordService;
@@ -439,11 +432,6 @@
      */
     @Override
     public ResultUtil travelOrder(Integer uid, TravelOrder travelOrder) throws Exception {
-        RLock lock1 = redissonClient.getLock("travelOrder:" + uid);
-        boolean lock2 = lock1.tryLock(5, 10, TimeUnit.SECONDS);
-        if(!lock2){
-            return ResultUtil.error("系统繁忙,请稍后重试");
-        }
         try {
             List<Integer> state = Arrays.asList(101, 102, 103, 104, 105, 106, 107, 201, 401);
             Order order = this.selectOne(new EntityWrapper<Order>().eq("userId", uid).eq("status", 1).in("state", state));
@@ -530,33 +518,54 @@
                 appUserService.updateById(appUser);
             }
 
+
+            List<Order> orderList = new ArrayList<>();
             for (Integer i = 0; i < travelOrder.getDriverNum(); i++) {
                 order.setId(null);
                 order.setCode(UUIDUtil.getTimeStr() + UUIDUtil.getNumberRandom(5));
                 boolean insert = this.insert(order);
+                if(null != order.getDriverId()){
+                    Driver driver = driverService.selectById(order.getDriverId());
+                    BranchOffice branchOffice = branchOfficeService.selectById(order.getBranchOfficeId());
+                    //调三方订单中心创建行程单
+                    CreateTravelItineraryRequest request = new CreateTravelItineraryRequest();
+                    request.setOrderNo("DJ" + order.getId());
+                    request.setCustomerId(appUser.getOnconUUID());
+                    request.setDriverId(driver.getEmpId().toString());
+                    request.setSupplierShopId(branchOffice.getEnterCode());
+                    request.setServiceType(2);
+                    String travelItinerary = OrderUtil.createTravelItinerary(request);
+                    order.setTravelId(travelItinerary);
+                    this.insertOrUpdate(order);
+                }
+
                 if(insert){
-                    //推送状态
-                    pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState());
-                    if(null != order.getDriverId()){
-                        PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
-                        pushOrderInfoWarpper.setId(order.getId());
-                        pushOrderInfoWarpper.setState(order.getState());
-                        pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
-                    }else{
-                        //推单
-                        Order finalOrder = order;
-                        new Thread(()->{
-                            pushOrder(finalOrder.getId());
-                        }).start();
-                    }
+                    orderList.add(order);
                 }
             }
+            new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    orderList.forEach(order -> {
+                        //推送状态
+                        pushUtil.pushOrderStatus(uid, 1, order.getId(), order.getState());
+                        if(null != order.getDriverId()){
+                            PushOrderInfoWarpper pushOrderInfoWarpper = new PushOrderInfoWarpper();
+                            pushOrderInfoWarpper.setId(order.getId());
+                            pushOrderInfoWarpper.setState(order.getState());
+                            pushUtil.pushOrderInfo(order.getDriverId(), 2, pushOrderInfoWarpper);
+                        }else{
+                            //推单
+                            pushOrder(order.getId(), uid);
+                        }
+                    });
+                }
+            }).start();
+
             redisUtil.setStrValue("newOrder", "true");
             return ResultUtil.success(order.getId());
         }catch (Exception e){
             e.printStackTrace();
-        }finally {
-            lock1.unlock();
         }
         return ResultUtil.error("系统异常");
     }
@@ -567,8 +576,9 @@
     /**
      * 订单推送逻辑
      */
-    public void pushOrder(Long orderId){
-        RLock lock1 = redissonClient.getLock("pushOrder:" + orderId);
+    public void pushOrder(Long orderId, Integer uid){
+        System.err.println("开始推单:" + orderId);
+//        RLock lock1 = redissonClient.getLock("pushOrder:" + uid);
         try {
             Order order = this.selectById(orderId);
             /**
@@ -578,16 +588,14 @@
              *        合适司:积分 > 评分 > 距离
              *      3.司机没有接单直接将订单置入大厅
              */
-            boolean lock2 = lock1.tryLock(5, 10, TimeUnit.SECONDS);
-            if(!lock2){
-                order.setHallOrder(1);
-                this.updateById(order);
-                ExtraPushOrder(order);
-                redisUtil.unlock();
-            }
+//            boolean lock2 = lock1.tryLock(5, 10, TimeUnit.SECONDS);
+//            if(!lock2){
+//                order.setHallOrder(1);
+//                this.updateById(order);
+//                ExtraPushOrder(order);
+//            }
             SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 1));
             if(null == systemConfig){
-                redisUtil.unlock();
                 return;
             }
             JSONObject jsonObject = JSON.parseObject(systemConfig.getContent());
@@ -734,6 +742,7 @@
             }
 
             if(null != driver){
+                System.err.println("完成司机查找:" + driver);
                 //防止多笔订单推给一个司机
                 Driver driver1 = driverService.selectById(driver);
                 driver1.setServerStatus(2);
@@ -778,7 +787,7 @@
         }catch (Exception e){
             e.printStackTrace();
         }finally {
-            lock1.unlock();
+//            lock1.unlock();
         }
 
     }
@@ -846,13 +855,25 @@
         order.setState(301);
         this.updateById(order);
         redisUtil.delSetValue("orderService", order.getId().toString());
+
+        Driver driver = driverService.selectById(order.getDriverId());
+        if(null != order.getTravelId()){
+            //中台修改订单状态
+            ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest();
+            request.setOrderId(order.getTravelId());
+            request.setStatus(getState(order.getState()));
+            BranchOffice branchOffice = branchOfficeService.selectById(order.getBranchOfficeId());
+            request.setDriverId(driver.getEmpId().toString());
+            request.setSupplierShopId(branchOffice.getEnterCode());
+            OrderUtil.modifyTravelItinerary(request);
+        }
+
         AppUser appUser = appUserService.selectById(uid);
         appUser.setCancelCount(appUser.getCancelCount() + 1);
         if(appUser.getCancelCount() >= 3){
             appUser.setIsException(2);
         }
         appUserService.updateById(appUser);
-        Driver driver = driverService.selectById(order.getDriverId());
         if(null != driver){
             driver.setServerStatus(1);
             driverService.updateById(driver);
@@ -868,6 +889,36 @@
         }
         redisUtil.setStrValue("cancelOrder", "true");
         return ResultUtil.success();
+    }
+
+
+
+    private Integer getState(Integer state){
+        switch (state){
+            case 101://待接单
+                return 1;
+            case 102://已接单
+                return 2;
+            case 103://前往预约点
+                return 3;
+            case 104://到达预约点
+                return 4;
+            case 105://开始服务
+                return 5;
+            case 106://到达目的地
+                return 6;
+            case 107://待支付
+                return 7;
+            case 108://待评价
+                return 8;
+            case 109://已完成
+                return 9;
+            case 201://转单中
+                return 11;
+            case 301://已取消
+                return 10;
+        }
+        return null;
     }
 
 
@@ -1104,16 +1155,16 @@
         }
         //开始支付操作
         if(orderPayment.getPayType() == 1){//微信支付
-            return weixinPay(order, appUser, orderPayment.getCouponId());
+            return weixinPay(order, appUser, orderPayment.getCouponId(), orderPayment.getPath(), orderPayment.getIp());
         }
         if(orderPayment.getPayType() == 2){//余额支付
             return balancePayment(order, appUser, orderPayment.getCouponId());
         }
 //        if(orderPayment.getPayType() == 3){//线下支付(由司机端操作)
 //        }
-        if(orderPayment.getPayType() == 4){//微信+余额
-            return weixinAndBalancePayment(order, appUser, orderPayment.getCouponId());
-        }
+//        if(orderPayment.getPayType() == 4){//微信+余额
+//            return weixinAndBalancePayment(order, appUser, orderPayment.getCouponId());
+//        }
         return ResultUtil.success();
     }
 
@@ -1127,100 +1178,100 @@
      * @return
      * @throws Exception
      */
-    public ResultUtil weixinPay(Order order, AppUser appUser, Integer couponId) throws Exception{
+    public ResultUtil weixinPay(Order order, AppUser appUser, Integer couponId, String path, String ip) throws Exception{
         Double payMoney = order.getPayMoney();
         order.setPayType(1);
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-        String out_trade_no = sdf.format(new Date()) + order.getId();
+        ResultUtil resultUtil = ResultUtil.success(new Object());
+        Driver driver = driverService.selectById(order.getDriverId());
+        if(null == order.getIsCreated() || 0 == order.getIsCreated()){
+            //调用中台创建订单及拉起支付接口
+            TradeOrderCreateData tradeOrderCreateData = new TradeOrderCreateData();
+            tradeOrderCreateData.setTreatShopId(driver.getEmpId().toString());
+            tradeOrderCreateData.setField1("{\"profitSharing\":\"1\",\"isCompensate\":\"0\",\"isPromote\":\"0\"}");
+            tradeOrderCreateData.setCharge(new BigDecimal(payMoney).setScale(2, RoundingMode.HALF_EVEN));
+            tradeOrderCreateData.setOrderNo("DJ" + order.getId());
+            tradeOrderCreateData.setCustomerId(appUser.getOnconUUID());
+            tradeOrderCreateData.setPartnerPayId(order.getTravelId());
+            tradeOrderCreateData.setTotalFee(Double.valueOf(payMoney * 100).intValue() + "");
+            tradeOrderCreateData.setOrderDesc("完成订单");
+            tradeOrderCreateData.setRetUrl(path);
+            tradeOrderCreateData.setClientIp(ip);
+            tradeOrderCreateData.setServiceType(3);
 
-//
-//        PaymentOrder paymentOrder = new PaymentOrder();
-//        paymentOrder.setBizOrderId(out_trade_no);
-//        paymentOrder.setAmount(new BigDecimal(payMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "");
-//        paymentOrder.setOrderName("代驾服务费");
-//        paymentOrder.setPayType("WX_MINI");
-//        paymentOrder.setTransferType("0");
-//        paymentOrder.setAsynSplitFlag("1");
-//        paymentOrder.setAppid(appletsAppid);
-//        paymentOrder.setOpenid(appUser.getOpenid());
-//        paymentOrder.setTerminalIp(InetAddress.getLocalHost().getHostAddress());
-//        List<PaymentOrderGood> goodsDetail = new ArrayList<>();
-//        PaymentOrderGood paymentOrderGood = new PaymentOrderGood();
-//        paymentOrderGood.setGoodsName("服务费");
-//        goodsDetail.add(paymentOrderGood);
-//        paymentOrder.setGoodsDetail(goodsDetail);
-//        paymentOrder.setFrontUrl(callbackPath + "/base/order/orderPayCallback");
-//        paymentOrder.setNotifyUrl(callbackPath + "/base/order/orderPayCallback");
-//        paymentOrder.setParameter1(order.getId().toString());
-//
-//        TrhRequest<PaymentOrder> request = new TrhRequest();
-//        InterfaceResponse execute = request.execute(paymentOrder, PaymentOrder.SERVICE_CODE);
-        return  MiniAppPay.pay(appUser.getOpenid(),new BigDecimal(payMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "","/base/order/orderPayCallback",order.getCode());
-//        return payMoneyUtil.weixinpay("服务费", String.valueOf(order.getId()),out_trade_no,new BigDecimal(payMoney).multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).longValue() + "","/base/order/orderPayCallback","APP");
+            List<GoodsInfoRequest> goodsInfo = new ArrayList<>();
+            GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest();
+            goodsInfoRequest.setSubOpenId(appUser.getOpenid());
+            goodsInfoRequest.setProfitSharing("1");
+            goodsInfo.add(goodsInfoRequest);
+            tradeOrderCreateData.setGoodsInfo(goodsInfo);
+            TradeOrderCreate tradeOrderCreate = OrderUtil.tradeOrderCreate1(tradeOrderCreateData, 0);
+            PayInfo payInfo = tradeOrderCreate.getPayInfo();
+            if(!"000000".equals(payInfo.getRetCode())){
+                return ResultUtil.error(payInfo.getRetMsg());
+            }
+            order.setIsCreated(1);
+            order.setTravelId(tradeOrderCreate.getOrderInfo().getOrderId());
+            resultUtil = ResultUtil.success(payInfo.getData().getRedirectUrl());
+        }else{
+            //拉起支付
+            TradePayOff1Data tradePayOff1Data = new TradePayOff1Data();
+            tradePayOff1Data.setPartnerPayId(order.getTravelId());
+            tradePayOff1Data.setTotalFee(Double.valueOf(payMoney * 100).intValue() + "");
+            tradePayOff1Data.setRetUrl(path);
+            tradePayOff1Data.setClientIp(ip);
+            tradePayOff1Data.setOrderDesc("完成订单");
+            List<GoodsInfoRequest> goodsInfo = new ArrayList<>();
+            GoodsInfoRequest goodsInfoRequest = new GoodsInfoRequest();
+            goodsInfoRequest.setSubOpenId(appUser.getOpenid());
+            goodsInfoRequest.setProfitSharing("1");
+            goodsInfo.add(goodsInfoRequest);
+            tradePayOff1Data.setGoodsInfo(goodsInfo);
+            PayInfo payInfo = OrderUtil.tradePayOff1(tradePayOff1Data, 0);
+            if(!"000000".equals(payInfo.getRetCode())){
+                return ResultUtil.error(payInfo.getRetMsg());
+            }
+            resultUtil = ResultUtil.success(payInfo.getData().getRedirectUrl());
+        }
+        this.updateById(order);
 
+        //创建定时任务查询订单支付状态
+        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+        threadPoolExecutor.execute(()->{
+            try {
+                int num = 1;
+                int wait = 0;
+                while (num <= 13) {
+                    int min = 5000;
+                    wait += (min * num);
+                    Order order1 = this.selectById(order.getId());
+                    if (order1.getState() != 107) {
+                        break;
+                    }
+                    GetTravelItineraryListRequest request = new GetTravelItineraryListRequest();
+                    request.setCustomerId(appUser.getOnconUUID());
+                    request.setOrderNo("DJ" + order1.getId());
+                    request.setDriverId(driver.getEmpId().toString());
+                    ListPage<List<TravelItinerary>> travelItineraryList = OrderUtil.getTravelItineraryList(request);
+                    TravelItinerary travelItinerary = travelItineraryList.getList().get(0);
+                    if(travelItinerary.getStatus() != 7 || Arrays.asList(3, 11).contains(travelItinerary.getOrderStatus())){
+                        GetPaymentInfoDataRequest getPaymentInfoDataRequest1 = new GetPaymentInfoDataRequest();
+                        getPaymentInfoDataRequest1.setPartnerPayId(order1.getTravelId());
+                        GetPaymentInfo getPaymentInfo1 = OrderUtil.paymentInfo(getPaymentInfoDataRequest1);
+                        orderPayCallback(order1.getId().toString(), getPaymentInfo1.getPayId());
+                        break;
+                    }
+                    Thread.sleep(wait);
+                    num++;
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }finally {
+                threadPoolExecutor.shutdown();
+            }
 
+        });
 
-//
-//        if(!"0000".equals(execute.getCode())){
-//            return ResultUtil.error(execute.getMsg());
-//        }
-//        JSONObject jsonObject = JSON.parseObject(execute.getResult());
-//        String status = jsonObject.getString("status");
-//        if("2".equals(status)){
-//            return ResultUtil.error("失败");
-//        }
-//        String merOrderId = jsonObject.getString("merOrderId");
-//        String payCode = jsonObject.getString("payCode");
-//        this.updateById(order);
-
-//        if(ToolUtil.isNotEmpty(payCode)){
-//            new Thread(new Runnable() {
-//                @Override
-//                public void run() {
-//                    try {
-//                        int num = 1;
-//                        int wait = 0;
-//                        while (num <= 10){
-//                            int min = 5000;
-//                            wait += (min * num);
-//                            Order order1 = OrderServiceImpl.this.selectById(order.getId());
-//                            if(order1.getState() != 107){
-//                                return;
-//                            }
-//                            QueryOrder queryOrder = new QueryOrder();
-//                            queryOrder.setOriginalMerOrderId(merOrderId);
-//                            queryOrder.setQueryType("1");
-//                            TrhRequest<QueryOrder> request = new TrhRequest();
-//                            InterfaceResponse execute1 = request.execute(queryOrder, QueryOrder.SERVICE_CODE);
-//                            if("0000".equals(execute1.getCode())){
-//                                JSONObject jsonObject1 = JSON.parseObject(execute1.getResult());
-//                                String status1 = jsonObject1.getString("status");
-//                                if("0".equals(status1)){//待处理
-//                                    Thread.sleep(wait);
-//                                    num++;
-//                                }
-//                                if("1".equals(status1)){//成功
-//                                    String merOrderId = jsonObject1.getString("merOrderId");
-//                                    ResultUtil resultUtil = orderPayCallback(order1.getId().toString(), merOrderId);
-
-//                                    break;
-//                                }
-//                                if("2".equals(status1) || 10 == num){//失败
-//                                    break;
-//                                }
-//                            }else{
-//                                Thread.sleep(wait);
-//                                num++;
-//                            }
-//                        }
-//                    }catch (Exception e){
-//                        e.printStackTrace();
-//                    }
-//                }
-//            }).start();
-//        }
-
-//        return ResultUtil.success(payCode);
+        return resultUtil;
     }
 
 
@@ -1505,6 +1556,18 @@
         }
         order.setState(109);
         this.updateById(order);
+        Driver driver = driverService.selectById(order.getDriverId());
+        //中台修改订单状态
+        if(null != order.getTravelId()){
+            ModifyTravelItineraryRequest request = new ModifyTravelItineraryRequest();
+            request.setOrderId(order.getTravelId());
+            request.setStatus(getState(order.getState()));
+            BranchOffice branchOffice = branchOfficeService.selectById(order.getBranchOfficeId());
+            request.setDriverId(driver.getEmpId().toString());
+            request.setSupplierShopId(branchOffice.getEnterCode());
+            OrderUtil.modifyTravelItinerary(request);
+        }
+
         Evaluate evaluate = new Evaluate();
         evaluate.setOrderId(orderId.intValue());
         evaluate.setCreateTime(new Date());
@@ -1513,7 +1576,6 @@
         evaluate.setStatus(1);
         evaluate.setUserId(uid);
         evaluateService.insert(evaluate);
-        Driver driver = driverService.selectById(order.getDriverId());
         driver.setScore(((null == driver.getScore() ? 0 : driver.getScore()) + score) / 2);
         if(score == 5){//司机积分奖励
             SystemConfig systemConfig = systemConfigService.selectOne(new EntityWrapper<SystemConfig>().eq("type", 4));

--
Gitblit v1.7.1