liujie
2026-05-08 461b3df61dfd1cc887dc24c58395dd9436605588
联调充电桩
3个文件已修改
142 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1320,14 +1320,29 @@
        if (chargingOrder.getOrderSource() == 1) {
            BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            Integer payMethod = chargingOrder.getPayMethod();
            //构建退款明细
            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(money);
            chargingOrderRefund.setBalanceRefundAmount(BigDecimal.ZERO);
            chargingOrderRefund.setThirdRefundAmount(money);
            BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
            BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
            if (Integer.valueOf(1).equals(payMethod)) {
                balanceRefundAmount = money.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
            } else if (Integer.valueOf(2).equals(payMethod)) {
                BigDecimal refundableThirdAmount = money(chargingOrder.getThirdPayAmount()).subtract(money(chargingOrder.getThirdRefundAmount()));
                if (refundableThirdAmount.compareTo(BigDecimal.ZERO) < 0) {
                    refundableThirdAmount = BigDecimal.ZERO;
                }
                thirdRefundAmount = money.min(refundableThirdAmount).setScale(2, RoundingMode.HALF_UP);
                balanceRefundAmount = money.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
            } else {
                thirdRefundAmount = money;
            }
            chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
            chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(rechargePaymentType);
            chargingOrderRefund.setRefundStatus(1);
@@ -1338,6 +1353,11 @@
            chargingOrderRefund.setRefundRemark("充电完成退款,手动退款");
            chargingOrderRefund.setRefundTotalAmount(money);
            chargingOrderRefund.setPayAmount(money);
            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                chargingOrderRefund.setRefundSerialNumber("BALANCE");
                finishManualChargingRefund(chargingOrder, chargingOrderRefund, money, balanceRefundAmount, thirdRefundAmount);
                return;
            }
            if (1 == rechargePaymentType) {
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(chargingOrder.getCode());
@@ -1345,7 +1365,7 @@
                model.setReason("充电完成退款");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(money.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);
@@ -1363,8 +1383,8 @@
            if (2 == rechargePaymentType) {
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(money.toString());
                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                dto.setRefundAmount(thirdRefundAmount.toString());
                dto.setRefundReason("充电完成退款");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if (null != resp) {
@@ -1380,8 +1400,8 @@
            if (3 == rechargePaymentType) {
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(money.toString());
                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                dto.setRefundAmount(thirdRefundAmount.toString());
                dto.setRefundReason("充电完成退款");
                RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                if (null != resp && "10000".equals(resp.getCode())) {
@@ -2999,8 +3019,17 @@
                chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
                chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
                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);
                Integer payMethod = chargingOrder.getPayMethod();
                BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                if (Integer.valueOf(1).equals(payMethod)) {
                    balanceRefundAmount = refundAmount.min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                } else if (Integer.valueOf(2).equals(payMethod)) {
                    thirdRefundAmount = refundAmount.min(money(chargingOrder.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                    balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                } else {
                    thirdRefundAmount = refundAmount;
                }
                BigDecimal actualThirdPayAmount = money(chargingOrder.getThirdPayAmount()).subtract(thirdRefundAmount);
                if (actualThirdPayAmount.compareTo(BigDecimal.ZERO) < 0) {
                    actualThirdPayAmount = BigDecimal.ZERO;
@@ -3124,6 +3153,8 @@
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                        chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
                        chargingOrderRefund.setRefundAmount(refundAmount);
                        chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
                        chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
                        chargingOrderRefund.setPayType(rechargePaymentType);
                        chargingOrderRefund.setRefundStatus(1);
                        chargingOrderRefund.setCode(chargingOrder.getCode());
@@ -3133,7 +3164,20 @@
                        chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
                        chargingOrderRefund.setRefundTotalAmount(refundAmount);
                        chargingOrderRefund.setPayAmount(rechargeAmount);
                        if (1 == rechargePaymentType) {
                        if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                            chargingOrderRefund.setRefundStatus(2);
                            chargingOrderRefund.setRefundSerialNumber("BALANCE");
                            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());
                            this.updateById(chargingOrder);
                        } else if (1 == rechargePaymentType) {
                            WxPaymentRefundModel model = new WxPaymentRefundModel();
                            model.setOut_trade_no(chargingOrder.getCode());
                            model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -3141,7 +3185,7 @@
                            model.setNotify_url("/payment/wx/refund/notify");
                            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                            amount.setRefund(thirdRefundAmount.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>> result = wxPaymentClient.refundOrderR(model);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -685,8 +685,17 @@
                        refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
                        if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
                            Integer rechargePaymentType = order.getRechargePaymentType();
                            BigDecimal thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                            BigDecimal balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                            Integer payMethod = order.getPayMethod();
                            BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                            BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
                            if (Integer.valueOf(1).equals(payMethod)) {
                                balanceRefundAmount = refundAmount.min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                            } else if (Integer.valueOf(2).equals(payMethod)) {
                                thirdRefundAmount = refundAmount.min(money(order.getThirdPayAmount())).setScale(2, RoundingMode.HALF_UP);
                                balanceRefundAmount = refundAmount.subtract(thirdRefundAmount).min(money(order.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                            } else {
                                thirdRefundAmount = refundAmount;
                            }
                            refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
                            order.setThirdRefundAmount(thirdRefundAmount);
                            order.setBalanceRefundAmount(balanceRefundAmount);
@@ -708,7 +717,18 @@
                            chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
                            chargingOrderRefund.setRefundTotalAmount(refundAmount);
                            chargingOrderRefund.setPayAmount(rechargeAmount);
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) {
                                chargingOrderRefund.setRefundStatus(2);
                                chargingOrderRefund.setRefundSerialNumber("BALANCE");
                                chargingOrderRefund.setRefundTime(LocalDateTime.now());
                                chargingOrderRefundService.save(chargingOrderRefund);
                                if (balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                                    recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode());
                                }
                                order.setRefundStatus(2);
                                order.setRefundTime(LocalDateTime.now());
                                chargingOrderService.updateById(order);
                            } else if (1 == rechargePaymentType) {
                                WxPaymentRefundModel model = new WxPaymentRefundModel();
                                model.setOut_trade_no(order.getCode());
                                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
@@ -730,7 +750,7 @@
                                    chargingOrderRefundService.updateById(chargingOrderRefund);
                                }
                            }
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
                            else if (2 == rechargePaymentType) {
                                RefundReq dto = new RefundReq();
                                dto.setOutTradeNo(order.getCode());
                                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
@@ -742,7 +762,7 @@
                                    chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                }
                            }
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
                            else if (3 == rechargePaymentType) {
                                RefundReq dto = new RefundReq();
                                dto.setOutTradeNo(order.getRechargeSerialNumber());
                                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
@@ -753,16 +773,6 @@
                                    chargingOrderRefundService.save(chargingOrderRefund);
                                    chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                }
                            }
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0 && balanceRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                                chargingOrderRefund.setRefundStatus(2);
                                chargingOrderRefund.setRefundSerialNumber("BALANCE");
                                chargingOrderRefund.setRefundTime(LocalDateTime.now());
                                chargingOrderRefundService.save(chargingOrderRefund);
                                recordBalanceRefund(order, balanceRefundAmount, chargingOrderRefund.getRefundCode());
                                order.setRefundStatus(2);
                                order.setRefundTime(LocalDateTime.now());
                                chargingOrderService.updateById(order);
                            }
                        }
                    }
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TExchangeCodePackageServiceImpl.java
@@ -759,11 +759,7 @@
        if (record == null || userId == null || record.getId() == null) {
            return;
        }
        List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
                .eq("user_id", userId)
                .le("id", record.getId())
                .orderByAsc("id"));
        record.setCurrentBalance(calculateCurrentBalance(records));
        record.setCurrentBalance(calculateCurrentBalanceAfterRecord(userId, record.getId()));
    }
    private void fillUseRecordBalances(List<TExchangeCodeUseRecord> records, Long userId) {
@@ -772,36 +768,42 @@
        }
        List<TExchangeCodeUseRecord> allRecords = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
                .eq("user_id", userId)
                .orderByAsc("id"));
                .orderByDesc("id"));
        Map<Long, BigDecimal> balanceMap = new HashMap<>();
        BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
        BigDecimal balance = getCurrentExchangeCodeBalance(userId);
        for (TExchangeCodeUseRecord item : allRecords) {
            balance = applyUseRecordChange(balance, item);
            balanceMap.put(item.getId(), balance);
            balance = rollbackUseRecordChange(balance, item);
        }
        for (TExchangeCodeUseRecord item : records) {
            item.setCurrentBalance(balanceMap.getOrDefault(item.getId(), BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP)));
        }
    }
    private BigDecimal calculateCurrentBalance(List<TExchangeCodeUseRecord> records) {
        BigDecimal balance = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
        if (records == null) {
            return balance;
        }
    private BigDecimal calculateCurrentBalanceAfterRecord(Long userId, Long recordId) {
        BigDecimal balance = getCurrentExchangeCodeBalance(userId);
        List<TExchangeCodeUseRecord> records = useRecordMapper.selectList(new QueryWrapper<TExchangeCodeUseRecord>()
                .eq("user_id", userId)
                .gt("id", recordId)
                .orderByDesc("id"));
        for (TExchangeCodeUseRecord item : records) {
            balance = applyUseRecordChange(balance, item);
            balance = rollbackUseRecordChange(balance, item);
        }
        return balance;
    }
    private BigDecimal applyUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) {
    private BigDecimal rollbackUseRecordChange(BigDecimal balance, TExchangeCodeUseRecord record) {
        BigDecimal amount = defaultMoney(record == null ? null : record.getUsedAmount());
        Integer changeType = record == null ? null : record.getChangeType();
        if (USE_RECORD_TYPE_CONSUME.equals(changeType)) {
            return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP);
            return balance.add(amount).setScale(2, RoundingMode.HALF_UP);
        }
        return balance.add(amount).setScale(2, RoundingMode.HALF_UP);
        return balance.subtract(amount).setScale(2, RoundingMode.HALF_UP);
    }
    private BigDecimal getCurrentExchangeCodeBalance(Long userId) {
        Map<Long, BigDecimal> balanceMap = getUserExchangeCodeBalanceMap(Collections.singletonList(userId));
        return defaultMoney(balanceMap.get(userId));
    }
    private void fillUseRecordView(TExchangeCodeUseRecord record) {