Pu Zhibing
9 小时以前 55132b44cd49f2a312a8fb2523ffda35a7485fd7
user/guns-admin/src/main/java/com/supersavedriving/user/modular/system/service/impl/OrderServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.supersavedriving.user.core.util.ToolUtil;
import com.supersavedriving.user.modular.system.dao.OrderMapper;
import com.supersavedriving.user.modular.system.dao.TCompanyMapper;
import com.supersavedriving.user.modular.system.model.*;
import com.supersavedriving.user.modular.system.service.*;
import com.supersavedriving.user.modular.system.util.*;
@@ -16,6 +17,8 @@
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.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 org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
@@ -37,8 +40,12 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -132,6 +139,9 @@
    @Value("${callbackPath}")
    private String callbackPath;//支付回调网关地址
    @Autowired
    private TCompanyMapper companyMapper;
@@ -521,11 +531,27 @@
                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());
                    TCompany company = companyMapper.selectById(order.getDriverId());
                    //调三方订单中心创建行程单
                    CreateTravelItineraryRequest request = new CreateTravelItineraryRequest();
                    request.setOrderNo("DJ" + order.getId());
                    request.setCustomerId(appUser.getOnconUUID());
                    request.setDriverId(driver.getEmpId().toString());
                    request.setSupplierShopId(company.getEnterCode());
                    request.setServiceType(2);
                    String travelItinerary = OrderUtil.createTravelItinerary(request);
                    order.setTravelId(travelItinerary);
                    this.insertOrUpdate(order);
                }
                if(insert){
                    orderList.add(order);
                }
@@ -842,13 +868,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()));
            TCompany company = companyMapper.selectById(driver.getBranchOfficeId());
            request.setDriverId(driver.getEmpId().toString());
            request.setSupplierShopId(company.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);
@@ -864,6 +902,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;
    }
@@ -1100,16 +1168,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();
    }
@@ -1123,100 +1191,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;
    }
@@ -1501,6 +1569,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()));
            TCompany company = companyMapper.selectById(driver.getBranchOfficeId());
            request.setDriverId(driver.getEmpId().toString());
            request.setSupplierShopId(company.getEnterCode());
            OrderUtil.modifyTravelItinerary(request);
        }
        Evaluate evaluate = new Evaluate();
        evaluate.setOrderId(orderId.intValue());
        evaluate.setCreateTime(new Date());
@@ -1509,7 +1589,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));