liujie
2026-04-29 80396225b11b09d8c00179032f45253a939bfbe3
update
2个文件已修改
257 ■■■■■ 已修改文件
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -2043,6 +2043,11 @@
            }
        }
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        }
        orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
        if (payType == 1) {//微信支付
            String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
            JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
@@ -2303,7 +2308,14 @@
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        System.out.println("!!!" + orderMoney + "!!!!");
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        orderPrivateCar.setPayMoney(orderMoney);
        ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        }
        orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
        if (!isPrivateCarPrepaySpreadStage(orderPrivateCar)) {
            orderPrivateCar.setPayMoney(orderMoney);
        }
        if (payType == 1) {//微信支付
            if (orderMoney == 0) {
                return ResultUtil.error("请使用余额支付");
@@ -2599,6 +2611,120 @@
                .doubleValue();
    }
    private boolean isPrivateCarPrepayFinalStage(OrderPrivateCar orderPrivateCar) {
        return orderPrivateCar != null
                && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
                && !Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage())
                && !Integer.valueOf(5).equals(orderPrivateCar.getPrepayStage())
                && orderPrivateCar.getPayMoney() != null
                && orderPrivateCar.getPayMoney() > 0;
    }
    private BigDecimal toMoney(Double amount) {
        return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP);
    }
    private Double getPrivateCarPrepayFinalPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) {
        if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
            return toMoney(finalAmount).doubleValue();
        }
        BigDecimal spreadAmount = toMoney(finalAmount).subtract(toMoney(orderPrivateCar.getPayMoney())).setScale(2, RoundingMode.HALF_UP);
        if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) {
            orderPrivateCar.setPrepayStage(3);
            return spreadAmount.doubleValue();
        }
        return 0D;
    }
    private ResultUtil settlePrivateCarPrepayIfNoSecondPay(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double finalAmount) throws Exception {
        if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) {
            return null;
        }
        BigDecimal paidAmount = toMoney(orderPrivateCar.getPayMoney());
        BigDecimal settleAmount = toMoney(finalAmount);
        BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP);
        if (refundAmount.compareTo(BigDecimal.ZERO) < 0) {
            return null;
        }
        if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
            ResultUtil refundResult = refundPrivateCarPrepayDifference(orderPrivateCar, userInfo, refundAmount.doubleValue());
            if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) {
                return refundResult;
            }
        }
        finishPrivateCarPrepayOrder(orderPrivateCar, settleAmount.doubleValue());
        return ResultUtil.success();
    }
    private ResultUtil refundPrivateCarPrepayDifference(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double refundAmount) throws Exception {
        if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) {
            userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D)
                    .add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            userInfoService.updateById(userInfo);
            orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5));
            orderPrivateCar.setPrepayRefundAmount(refundAmount);
            orderPrivateCar.setPrepayRefundTime(new Date());
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
            return ResultUtil.success();
        }
        PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2);
        if (paymentRecord == null) {
            return ResultUtil.error("先付订单缺少已支付流水,无法退款");
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) {
            CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
            request.setOutRequestNo(ToolUtil.isNotEmpty(orderPrivateCar.getPrepaySecondPayNo()) ? orderPrivateCar.getPrepaySecondPayNo() : paymentRecord.getCode());
            request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_1_" + orderPrivateCar.getId() + ToolUtil.getRandomString(5));
            request.setRefundAmount(toFen(refundAmount));
            request.setRefundDesc("快车先付订单多退少补退款");
            JSONObject response = CbyzxPayUtil.closePayOrder(request);
            if (!isPrivateCarPrepayRefundSuccess(response)) {
                return ResultUtil.error(extractPrivateCarRefundMessage(response), response);
            }
            orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response));
            orderPrivateCar.setPrepayRefundAmount(refundAmount);
            orderPrivateCar.setPrepayRefundTime(new Date());
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
            return ResultUtil.success(response);
        }
        if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) {
            Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString());
            if (!"10000".equals(map.get("code"))) {
                return ResultUtil.error(map.get("msg"));
            }
            orderPrivateCar.setPrepayRefundNo(map.get("trade_no"));
            orderPrivateCar.setPrepayRefundAmount(refundAmount);
            orderPrivateCar.setPrepayRefundTime(new Date());
            transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
            return ResultUtil.success(map);
        }
        return ResultUtil.error("先付订单支付方式不支持退款");
    }
    private void finishPrivateCarPrepayOrder(OrderPrivateCar orderPrivateCar, Double settleAmount) throws Exception {
        orderPrivateCar.setState(8);
        orderPrivateCar.setPayMoney(settleAmount);
        orderPrivateCar.setPayTime(new Date());
        orderPrivateCar.setPrepayStage(5);
        if (orderPrivateCar.getRecoveryOrder() != null && 0 == orderPrivateCar.getRecoveryOrder()) {
            Double incomeAmount = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus()
                    ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
            Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, incomeAmount);
            orderPrivateCar.setSplitAllocation(JSON.toJSONString(map));
        }
        this.updateAllColumnById(orderPrivateCar);
        promotion(orderPrivateCar.getId());
        new Thread(new Runnable() {
            @Override
            public void run() {
                pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
                pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
            }
        }).start();
        systemNoticeService.addSystemNotice(1, "您的快车先付订单已完成结算,请注意查收。", orderPrivateCar.getUserId(), 1);
    }
    private void consumePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception {
        if (null != orderPrivateCar.getCouponId()) {
            UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -1355,6 +1355,11 @@
            }
        }
        
        ResultUtil prepaySettleResult = settleTaxiPrepayIfNoSecondPay(orderTaxi, userInfo, orderMoney);
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        }
        orderMoney = getTaxiPrepayFinalPayAmount(orderTaxi, orderMoney);
        if (payType == 1) {//微信支付
            String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5);
            JSONObject response = cbyzxOrderPayHelper.createOrder(orderTaxi.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
@@ -1608,6 +1613,11 @@
        }
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        ResultUtil prepaySettleResult = settleTaxiPrepayIfNoSecondPay(orderTaxi, userInfo, orderMoney);
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        }
        orderMoney = getTaxiPrepayFinalPayAmount(orderTaxi, orderMoney);
        System.out.println("!!!" + orderMoney + "!!!!");
        if (payType == 1) {//微信支付
            if (orderMoney == 0) {
@@ -1748,6 +1758,11 @@
            return ResultUtil.error("订单不在待支付中,无法完成订单");
        }
        orderTaxi.setPayManner(2);//其他方式支付
        UserInfo userInfo = userInfoService.selectById(orderTaxi.getUserId());
        ResultUtil prepaySettleResult = settleTaxiPrepayIfNoSecondPay(orderTaxi, userInfo, orderTaxi.getOrderMoney());
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        }
//        orderTaxi.setOrderMoney(0D);
//        orderTaxi.setTravelMoney(0D);
//        orderTaxi.setParkMoney(0D);
@@ -2094,6 +2109,120 @@
                .doubleValue();
    }
    private boolean isTaxiPrepayFinalStage(OrderTaxi orderTaxi) {
        return orderTaxi != null
                && Integer.valueOf(1).equals(orderTaxi.getPaymentMode())
                && !Integer.valueOf(1).equals(orderTaxi.getPrepayStage())
                && !Integer.valueOf(5).equals(orderTaxi.getPrepayStage())
                && orderTaxi.getPayMoney() != null
                && orderTaxi.getPayMoney() > 0;
    }
    private BigDecimal toMoney(Double amount) {
        return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP);
    }
    private Double getTaxiPrepayFinalPayAmount(OrderTaxi orderTaxi, Double finalAmount) {
        if (!isTaxiPrepayFinalStage(orderTaxi)) {
            return toMoney(finalAmount).doubleValue();
        }
        BigDecimal spreadAmount = toMoney(finalAmount).subtract(toMoney(orderTaxi.getPayMoney())).setScale(2, RoundingMode.HALF_UP);
        if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) {
            orderTaxi.setPrepayStage(3);
            return spreadAmount.doubleValue();
        }
        return 0D;
    }
    private ResultUtil settleTaxiPrepayIfNoSecondPay(OrderTaxi orderTaxi, UserInfo userInfo, Double finalAmount) throws Exception {
        if (!isTaxiPrepayFinalStage(orderTaxi)) {
            return null;
        }
        BigDecimal paidAmount = toMoney(orderTaxi.getPayMoney());
        BigDecimal settleAmount = toMoney(finalAmount);
        BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP);
        if (refundAmount.compareTo(BigDecimal.ZERO) < 0) {
            return null;
        }
        if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
            ResultUtil refundResult = refundTaxiPrepayDifference(orderTaxi, userInfo, refundAmount.doubleValue());
            if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) {
                return refundResult;
            }
        }
        finishTaxiPrepayOrder(orderTaxi, settleAmount.doubleValue());
        return ResultUtil.success();
    }
    private ResultUtil refundTaxiPrepayDifference(OrderTaxi orderTaxi, UserInfo userInfo, Double refundAmount) throws Exception {
        if (Integer.valueOf(3).equals(orderTaxi.getPayType())) {
            userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D)
                    .add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            userInfoService.updateById(userInfo);
            orderTaxi.setPrepayRefundNo("BALANCE_REFUND_2_" + orderTaxi.getId() + "_" + ToolUtil.getRandomString(5));
            orderTaxi.setPrepayRefundAmount(refundAmount);
            orderTaxi.setPrepayRefundTime(new Date());
            transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车先付订单退款", refundAmount, 1, 1, 1, 2, orderTaxi.getId());
            return ResultUtil.success();
        }
        PaymentRecord paymentRecord = paymentRecordService.query(1, orderTaxi.getUserId(), 1, orderTaxi.getId(), 2, orderTaxi.getPayType(), 2);
        if (paymentRecord == null) {
            return ResultUtil.error("先付订单缺少已支付流水,无法退款");
        }
        if (Integer.valueOf(1).equals(orderTaxi.getPayType())) {
            CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
            request.setOutRequestNo(ToolUtil.isNotEmpty(orderTaxi.getPrepaySecondPayNo()) ? orderTaxi.getPrepaySecondPayNo() : paymentRecord.getCode());
            request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_2_" + orderTaxi.getId() + ToolUtil.getRandomString(5));
            request.setRefundAmount(toFen(refundAmount));
            request.setRefundDesc("出租车先付订单多退少补退款");
            JSONObject response = CbyzxPayUtil.closePayOrder(request);
            if (!isTaxiPrepayRefundSuccess(response)) {
                return ResultUtil.error(extractTaxiRefundMessage(response), response);
            }
            orderTaxi.setPrepayRefundNo(extractTaxiRefundNo(response));
            orderTaxi.setPrepayRefundAmount(refundAmount);
            orderTaxi.setPrepayRefundTime(new Date());
            transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车先付订单退款", refundAmount, 1, 1, 1, 2, orderTaxi.getId());
            return ResultUtil.success(response);
        }
        if (Integer.valueOf(2).equals(orderTaxi.getPayType())) {
            Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString());
            if (!"10000".equals(map.get("code"))) {
                return ResultUtil.error(map.get("msg"));
            }
            orderTaxi.setPrepayRefundNo(map.get("trade_no"));
            orderTaxi.setPrepayRefundAmount(refundAmount);
            orderTaxi.setPrepayRefundTime(new Date());
            transactionDetailsService.saveData(orderTaxi.getUserId(), "出租车先付订单退款", refundAmount, 1, 1, 1, 2, orderTaxi.getId());
            return ResultUtil.success(map);
        }
        return ResultUtil.error("先付订单支付方式不支持退款");
    }
    private void finishTaxiPrepayOrder(OrderTaxi orderTaxi, Double settleAmount) throws Exception {
        orderTaxi.setState(8);
        orderTaxi.setPayMoney(settleAmount);
        orderTaxi.setPayTime(new Date());
        orderTaxi.setPrepayStage(5);
        if (0 == orderTaxi.getRecoveryOrder()) {
            Double incomeAmount = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus()
                    ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
            Map<String, Object> map = incomeService.saveIncome(orderTaxi.getId(), 2, incomeAmount);
            orderTaxi.setSplitAllocation(JSON.toJSONString(map));
        }
        this.updateAllColumnById(orderTaxi);
        promotion(orderTaxi.getId());
        new Thread(new Runnable() {
            @Override
            public void run() {
                pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
                pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState(), 0);
            }
        }).start();
        systemNoticeService.addSystemNotice(1, "您的出租车先付订单已完成结算,请注意查收。", orderTaxi.getUserId(), 1);
    }
    private void consumeTaxiBenefits(OrderTaxi orderTaxi) throws Exception {
        if (null != orderTaxi.getCouponId()) {
            UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderTaxi.getCouponId());