liujie
2026-04-28 88197952a54bee75e4fb181253d34992063ea9e8
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -441,6 +441,39 @@
        appUser.setBalance(money(appUser.getBalance()).add(delta).setScale(2, RoundingMode.HALF_UP));
        appUserClient.updateAppUser(appUser);
    }
    private void recordBalanceConsume(TChargingOrder chargingOrder, BigDecimal consumeAmount) {
        if (chargingOrder == null || chargingOrder.getAppUserId() == null || chargingOrder.getId() == null
                || consumeAmount == null || consumeAmount.compareTo(BigDecimal.ZERO) <= 0) {
            return;
        }
        ExchangeCodeConsumeDTO consumeDTO = new ExchangeCodeConsumeDTO();
        consumeDTO.setUserId(chargingOrder.getAppUserId());
        consumeDTO.setOrderId(chargingOrder.getId());
        consumeDTO.setAmount(consumeAmount);
        R<ExchangeCodeConsumeResultVO> result = otherClient.consumeExchangeCodeBalance(consumeDTO);
        if (result == null || result.getCode() != 200) {
            throw new RuntimeException("??????????");
        }
    }
    private void recordBalanceRefund(TChargingOrder chargingOrder, BigDecimal refundAmount, String refundNo) {
        if (chargingOrder == null || chargingOrder.getAppUserId() == null || chargingOrder.getId() == null
                || refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) {
            return;
        }
        ExchangeCodeConsumeDTO refundDTO = new ExchangeCodeConsumeDTO();
        refundDTO.setUserId(chargingOrder.getAppUserId());
        refundDTO.setOrderId(chargingOrder.getId());
        refundDTO.setAmount(refundAmount);
        refundDTO.setRefundNo(refundNo);
        R<ExchangeCodeConsumeResultVO> result = otherClient.refundExchangeCodeBalance(refundDTO);
        if (result == null || result.getCode() != 200) {
            throw new RuntimeException("??????????");
        }
    }
   @Override
   public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
      Long userId = tokenService.getLoginUserApplet().getUserId();
@@ -641,6 +674,7 @@
      
      if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
         changeUserBalance(userId, balancePayAmount.negate());
         recordBalanceConsume(chargingOrder, balancePayAmount);
      }
      if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) {
         return chargingOrderCallback(addChargingOrder.getPaymentType(), chargingOrder.getCode(), "BALANCE", null);
@@ -712,6 +746,7 @@
            throw new RuntimeException("余额不足,支付回调处理失败");
         }
         changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate());
         recordBalanceConsume(chargingOrder, money(chargingOrder.getBalancePayAmount()));
      }
      chargingOrder.setRechargePaymentStatus(2);
      chargingOrder.setRechargeSerialNumber(transaction_id);
@@ -1145,6 +1180,7 @@
                    if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                        if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                            changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
                            recordBalanceRefund(chargingOrder, balanceRefundAmount, chargingOrderRefund.getRefundCode());
                        }
                        chargingOrderRefund.setRefundStatus(2);
                        chargingOrderRefund.setRefundSerialNumber("BALANCE");
@@ -1155,7 +1191,7 @@
                    }
                    this.updateById(chargingOrder);
                    chargingOrderRefund.setRefundAmount(thirdRefundAmount);
                    if (1 == rechargePaymentType) {
                    if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
                        WxPaymentRefundModel model = new WxPaymentRefundModel();
                        model.setOut_trade_no(chargingOrder.getCode());
                        model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -1292,7 +1328,7 @@
            model.setNotify_url("/payment/wx/refund/notify");
            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
            amount.setRefund(money.multiply(new BigDecimal(100)).intValue());
            amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
            amount.setTotal((isBalancePayMode(chargingOrder.getPayMethod()) ? money(chargingOrder.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
            amount.setCurrency("CNY");
            model.setAmount(amount);
            R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
@@ -1361,24 +1397,33 @@
            boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS);
            if(tryLock){
                TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
                if(null != one && one.getRefundStatus() == 1){
                    one.setRefundSerialNumber(refund_id);
                    one.setRefundStatus(2);
                    one.setRefundTime(LocalDateTime.now());
                    chargingOrderRefundService.updateById(one);
                    TChargingOrder order = this.getById(one.getChargingOrderId());
                    if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) {
                        changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount()));
                    }
                    TChargingOrder chargingOrder = new TChargingOrder();
                    chargingOrder.setId(one.getChargingOrderId());
                    chargingOrder.setAppUserId(order.getAppUserId());
                    chargingOrder.setRefundStatus(2);
                    chargingOrder.setRefundSerialNumber(refund_id);
                    chargingOrder.setRefundTime(LocalDateTime.now());
                    this.updateById(chargingOrder);
                if (null == one || one.getRefundStatus() == null || one.getRefundStatus() != 1) {
                    return AjaxResult.success();
                }
                if (!"SUCCESS".equals(tradeState)) {
                    return AjaxResult.success();
                }
                TChargingOrder order = this.getById(one.getChargingOrderId());
                if (order == null || (order.getRefundStatus() != null && order.getRefundStatus() == 2)) {
                    return AjaxResult.success();
                }
                one.setRefundSerialNumber(refund_id);
                one.setRefundStatus(2);
                one.setRefundTime(LocalDateTime.now());
                chargingOrderRefundService.updateById(one);
                if (money(order.getBalanceRefundAmount()).compareTo(BigDecimal.ZERO) > 0) {
                    changeUserBalance(order.getAppUserId(), money(order.getBalanceRefundAmount()));
                    recordBalanceRefund(order, money(order.getBalanceRefundAmount()), one.getRefundCode());
                }
                TChargingOrder chargingOrder = new TChargingOrder();
                chargingOrder.setId(one.getChargingOrderId());
                chargingOrder.setAppUserId(order.getAppUserId());
                chargingOrder.setRefundStatus(2);
                chargingOrder.setRefundSerialNumber(refund_id);
                chargingOrder.setRefundTime(LocalDateTime.now());
                this.updateById(chargingOrder);
            }
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
@@ -2773,14 +2818,6 @@
                if (actualBalancePayAmount.compareTo(BigDecimal.ZERO) < 0) {
                    actualBalancePayAmount = BigDecimal.ZERO;
                }
                if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null
                        && actualBalancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
                    ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO();
                    exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId());
                    exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId());
                    exchangeCodeConsumeDTO.setAmount(actualBalancePayAmount);
                    otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO);
                }
                refundAmount = thirdRefundAmount.add(balanceRefundAmount);
                chargingOrder.setBalanceRefundAmount(balanceRefundAmount.setScale(2, RoundingMode.HALF_UP));
                chargingOrder.setThirdRefundAmount(thirdRefundAmount.setScale(2, RoundingMode.HALF_UP));
@@ -2968,6 +3005,10 @@
                        chargingOrderRefund.setPayAmount(rechargeAmount);
                        chargingOrderRefund.setRefundTime(LocalDateTime.now());
                        chargingOrderRefundService.save(chargingOrderRefund);
                        if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                            changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
                            recordBalanceRefund(chargingOrder, balanceRefundAmount, chargingOrderRefund.getRefundCode());
                        }
                        chargingOrder.setRefundStatus(2);
                        chargingOrder.setRefundTime(LocalDateTime.now());