liujie
2026-04-28 c6f8f577298cb8d37f2179546ba6b5caa2b192e3
p0功能 小程序
1个文件已修改
104 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -639,7 +639,7 @@
        }
        accountingStrategyDetailOrderService.saveBatch(list1);
        
        if (balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
        if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0 && balancePayAmount.compareTo(BigDecimal.ZERO) > 0) {
            changeUserBalance(userId, balancePayAmount.negate());
        }
        if (thirdPayAmount.compareTo(BigDecimal.ZERO) == 0) {
@@ -703,6 +703,15 @@
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
        if (chargingOrder.getRechargePaymentStatus() == 2) {
            return AjaxResult.success();
        }
        if (isBalancePayMode(chargingOrder.getPayMethod())
                && money(chargingOrder.getThirdPayAmount()).compareTo(BigDecimal.ZERO) > 0
                && money(chargingOrder.getBalancePayAmount()).compareTo(BigDecimal.ZERO) > 0) {
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            if (money(appUser.getBalance()).compareTo(money(chargingOrder.getBalancePayAmount())) < 0) {
                throw new RuntimeException("余额不足,支付回调处理失败");
            }
            changeUserBalance(chargingOrder.getAppUserId(), money(chargingOrder.getBalancePayAmount()).negate());
        }
        chargingOrder.setRechargePaymentStatus(2);
        chargingOrder.setRechargeSerialNumber(transaction_id);
@@ -1101,15 +1110,24 @@
            if(tryLock){
                log.info(code + ":-------------------充电启动失败,执行退款-------------------");
                TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
                if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2) {
                if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2
                        && (chargingOrder.getRefundStatus() == null || chargingOrder.getRefundStatus() != 2)) {
                    Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
                    BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
                    BigDecimal rechargeAmount = money(chargingOrder.getRechargeAmount());
                    BigDecimal totalRefundAmount = isBalancePayMode(chargingOrder.getPayMethod())
                            ? money(chargingOrder.getBalancePayAmount()).add(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP)
                            : rechargeAmount;
                    BigDecimal thirdRefundAmount = totalRefundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                    if (!isBalancePayMode(chargingOrder.getPayMethod())) {
                        thirdRefundAmount = totalRefundAmount;
                    }
                    BigDecimal balanceRefundAmount = totalRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                    //构建退款明细
                    TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                    chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                    chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
                    chargingOrderRefund.setRefundAmount(rechargeAmount);
                    chargingOrderRefund.setRefundAmount(totalRefundAmount);
                    chargingOrderRefund.setRefundStatus(1);
                    chargingOrderRefund.setPayType(rechargePaymentType);
                    chargingOrderRefund.setRefundStatus(1);
@@ -1118,8 +1136,25 @@
                    chargingOrderRefund.setRefundContent("充电失败");
                    chargingOrderRefund.setRefundReason("充电失败");
                    chargingOrderRefund.setRefundRemark("全额退款");
                    chargingOrderRefund.setRefundTotalAmount(rechargeAmount);
                    chargingOrderRefund.setRefundTotalAmount(totalRefundAmount);
                    chargingOrderRefund.setPayAmount(rechargeAmount);
                    chargingOrder.setBalanceRefundAmount(balanceRefundAmount);
                    chargingOrder.setThirdRefundAmount(thirdRefundAmount);
                    chargingOrder.setRefundAmount(totalRefundAmount);
                    chargingOrder.setRefundStatus(thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2);
                    if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                        if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                            changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
                        }
                        chargingOrderRefund.setRefundStatus(2);
                        chargingOrderRefund.setRefundSerialNumber("BALANCE");
                        chargingOrderRefund.setRefundTime(LocalDateTime.now());
                        chargingOrderRefundService.save(chargingOrderRefund);
                        this.updateById(chargingOrder);
                        return;
                    }
                    this.updateById(chargingOrder);
                    chargingOrderRefund.setRefundAmount(thirdRefundAmount);
                    if (1 == rechargePaymentType) {
                        WxPaymentRefundModel model = new WxPaymentRefundModel();
                        model.setOut_trade_no(chargingOrder.getCode());
@@ -1127,8 +1162,8 @@
                        model.setReason("充电失败,取消充电订单");
                        model.setNotify_url("/payment/wx/refund/notify");
                        WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                        amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                        amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                        amount.setRefund(thirdRefundAmount.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);
@@ -1158,7 +1193,7 @@
                        RefundReq dto = new RefundReq();
                        dto.setOutTradeNo(chargingOrder.getCode());
                        dto.setOutRequestNo(chargingOrderRefund.getCode());
                        dto.setRefundAmount(rechargeAmount.toString());
                        dto.setRefundAmount(thirdRefundAmount.toString());
                        dto.setRefundReason("充电失败,取消充电订单");
                        RefundResp resp = aliPaymentClient.refund(dto).getData();
                        if (null != resp) {
@@ -1188,7 +1223,7 @@
                        RefundReq dto = new RefundReq();
                        dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
                        dto.setOutRequestNo(chargingOrderRefund.getCode());
                        dto.setRefundAmount(rechargeAmount.toString());
                        dto.setRefundAmount(thirdRefundAmount.toString());
                        dto.setRefundReason("充电失败,取消充电订单");
                        RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                        if (null != resp && "10000".equals(resp.getCode())) {
@@ -1333,6 +1368,9 @@
                    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());
@@ -2724,32 +2762,24 @@
                }
                chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
                chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
                BigDecimal balanceUsedAmount = BigDecimal.ZERO;
                if (isBalancePayMode(chargingOrder.getPayMethod()) && chargingOrder.getAppUserId() != null && payAmount.compareTo(BigDecimal.ZERO) > 0) {
                    balanceUsedAmount = money(chargingOrder.getBalancePayAmount()).min(payAmount).setScale(2, RoundingMode.HALF_UP);
                    if (balanceUsedAmount.compareTo(BigDecimal.ZERO) > 0) {
                        ExchangeCodeConsumeDTO exchangeCodeConsumeDTO = new ExchangeCodeConsumeDTO();
                        exchangeCodeConsumeDTO.setUserId(chargingOrder.getAppUserId());
                        exchangeCodeConsumeDTO.setOrderId(chargingOrder.getId());
                        exchangeCodeConsumeDTO.setAmount(balanceUsedAmount);
                        R<ExchangeCodeConsumeResultVO> consumeResult = otherClient.consumeExchangeCodeBalance(exchangeCodeConsumeDTO);
                        if (consumeResult != null && consumeResult.getData() != null
                                && consumeResult.getData().getDeductedAmount() != null) {
                            balanceUsedAmount = consumeResult.getData().getDeductedAmount();
                        }
                    }
                }
                BigDecimal balanceRefundAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceUsedAmount);
                if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                    changeUserBalance(chargingOrder.getAppUserId(), balanceRefundAmount);
                }
                BigDecimal actualThirdPayAmount = payAmount.subtract(balanceUsedAmount);
                refundAmount = refundAmount.max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP);
                BigDecimal thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
                if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
                    actualThirdPayAmount = BigDecimal.ZERO;
                }
                BigDecimal thirdRefundAmount = money(chargingOrder.getThirdPayAmount()).subtract(actualThirdPayAmount);
                if (thirdRefundAmount.compareTo(BigDecimal.ZERO) < 0) {
                    thirdRefundAmount = BigDecimal.ZERO;
                BigDecimal actualBalancePayAmount = money(chargingOrder.getBalancePayAmount()).subtract(balanceRefundAmount);
                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));
@@ -2882,7 +2912,7 @@
                            model.setReason("充电完成退款");
                            model.setNotify_url("/payment/wx/refund/notify");
                            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                            amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setCurrency("CNY");
                            model.setAmount(amount);
@@ -2896,11 +2926,11 @@
                                chargingOrderRefundService.save(chargingOrderRefund);
                            }
                        }
                        if (2 == rechargePaymentType) {
                        if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
                            RefundReq dto = new RefundReq();
                            dto.setOutTradeNo(chargingOrder.getCode());
                            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                            dto.setRefundAmount(refundAmount.toString());
                            dto.setRefundAmount(thirdRefundAmount.toString());
                            dto.setRefundReason("充电完成退款");
                            RefundResp resp = aliPaymentClient.refund(dto).getData();
                            if (null != resp) {
@@ -2908,11 +2938,11 @@
                                this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                            }
                        }
                        if (3 == rechargePaymentType) {
                        if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
                            RefundReq dto = new RefundReq();
                            dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
                            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                            dto.setRefundAmount(refundAmount.toString());
                            dto.setRefundAmount(thirdRefundAmount.toString());
                            dto.setRefundReason("充电完成退款");
                            RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                            if (null != resp && "10000".equals(resp.getCode())) {