liujie
2026-04-28 df3ab7ae2e3f33d9bd910c9e02b09e9497bcfe54
p0功能 小程序
1个文件已修改
84 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -32,8 +32,11 @@
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.dto.ExchangeCodeConsumeDTO;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.OtherClient;
import com.ruoyi.other.api.feignClient.VipClient;
import com.ruoyi.other.api.vo.ExchangeCodeConsumeResultVO;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.H5AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
@@ -128,6 +131,9 @@
    private AppUserIntegralChangeClient appUserIntegralChangeClient;
    @Resource
    private OtherClient otherClient;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
@@ -144,6 +150,31 @@
    @Resource
    private RedissonClient redissonClient;
    private boolean isBalancePayMode(Integer payMethod) {
        return payMethod != null && (payMethod == 1 || payMethod == 2);
    }
    private BigDecimal money(BigDecimal amount) {
        return amount == null ? BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP) : amount.setScale(2, RoundingMode.HALF_UP);
    }
    private void recordBalanceRefund(TChargingOrder order, BigDecimal refundAmount, String refundNo) {
        if (order == null || order.getAppUserId() == null || order.getId() == null
                || refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) {
            return;
        }
        ExchangeCodeConsumeDTO refundDTO = new ExchangeCodeConsumeDTO();
        refundDTO.setUserId(order.getAppUserId());
        refundDTO.setOrderId(order.getId());
        refundDTO.setAmount(refundAmount);
        refundDTO.setRefundNo(refundNo);
        R<ExchangeCodeConsumeResultVO> result = otherClient.refundExchangeCodeBalance(refundDTO);
        if (result == null || result.getCode() != 200) {
            throw new RuntimeException("??????????");
        }
    }
    @Scheduled(fixedRate = 1000 * 60)
    public void taskOneMinutes() {
@@ -650,11 +681,19 @@
                        //用户推荐奖励
                        chargingOrderService.referralReward(order);
                        //开始构建退款费用
                        //????????
                        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);
                            refundAmount = thirdRefundAmount.add(balanceRefundAmount).setScale(2, RoundingMode.HALF_UP);
                            order.setThirdRefundAmount(thirdRefundAmount);
                            order.setBalanceRefundAmount(balanceRefundAmount);
                            order.setRefundAmount(refundAmount);
                            order.setRefundStatus(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 1 : 2);
                            chargingOrderService.updateById(order);
                            //??????
                            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                            chargingOrderRefund.setChargingOrderId(order.getId());
                            SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
@@ -662,29 +701,28 @@
                            chargingOrderRefund.setRefundAmount(refundAmount);
                            chargingOrderRefund.setRefundStatus(1);
                            chargingOrderRefund.setPayType(rechargePaymentType);
                            chargingOrderRefund.setRefundStatus(1);
                            chargingOrderRefund.setCode(order.getCode());
                            chargingOrderRefund.setRefundTitle("充电完成退款");
                            chargingOrderRefund.setRefundContent("充电完成退款");
                            chargingOrderRefund.setRefundReason("充电完成退款");
                            chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
                            chargingOrderRefund.setRefundTitle("??????");
                            chargingOrderRefund.setRefundContent("??????");
                            chargingOrderRefund.setRefundReason("??????");
                            chargingOrderRefund.setRefundRemark("?????????" + order.getPaymentAmount());
                            chargingOrderRefund.setRefundTotalAmount(refundAmount);
                            chargingOrderRefund.setPayAmount(rechargeAmount);
                            if (1 == rechargePaymentType) {
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
                                WxPaymentRefundModel model = new WxPaymentRefundModel();
                                model.setOut_trade_no(order.getCode());
                                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                                model.setReason("充电完成退款");
                                model.setReason("??????");
                                model.setNotify_url("/payment/wx/refund/notify");
                                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                                amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
                                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                                amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                                amount.setTotal((isBalancePayMode(order.getPayMethod()) ? money(order.getThirdPayAmount()) : rechargeAmount).multiply(new BigDecimal(100)).intValue());
                                amount.setCurrency("CNY");
                                model.setAmount(amount);
                                R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
                                if (200 == result.getCode()) {
                                    chargingOrderRefundService.save(chargingOrderRefund);
                                    //手续费
                                    //???
                                    Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
                                    Object refund_fee1 = amount1.get("refund_fee");
                                    BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
@@ -692,30 +730,40 @@
                                    chargingOrderRefundService.updateById(chargingOrderRefund);
                                }
                            }
                            if (2 == rechargePaymentType) {
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 2 == rechargePaymentType) {
                                RefundReq dto = new RefundReq();
                                dto.setOutTradeNo(order.getCode());
                                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                                dto.setRefundAmount(refundAmount.toString());
                                dto.setRefundReason("充电完成退款");
                                dto.setRefundAmount(thirdRefundAmount.toString());
                                dto.setRefundReason("??????");
                                RefundResp resp = aliPaymentClient.refund(dto).getData();
                                if (null != resp) {
                                    chargingOrderRefundService.save(chargingOrderRefund);
                                    chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
                                }
                            }
                            if (3 == rechargePaymentType) {
                            if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 3 == rechargePaymentType) {
                                RefundReq dto = new RefundReq();
                                dto.setOutTradeNo(order.getRechargeSerialNumber());
                                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
                                dto.setRefundAmount(refundAmount.toString());
                                dto.setRefundReason("充电完成退款");
                                dto.setRefundAmount(thirdRefundAmount.toString());
                                dto.setRefundReason("??????");
                                RefundResp resp = h5AliPaymentClient.refund(dto).getData();
                                if (null != resp && "10000".equals(resp.getCode())) {
                                    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);
                            }
                        }
                    }