puzhibing
2026-08-14 74bce573f6eb00f9f4942afd903cfad53addc9cf
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -16,6 +16,7 @@
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
@@ -610,6 +611,21 @@
        Integer payMethod = addChargingOrder.getPayMethod() == null ? 3 : addChargingOrder.getPayMethod();
        BigDecimal rechargeAmount = money(addChargingOrder.getPaymentAmount());
        TChargingGun tChargingGun = chargingGunClient.getChargingGunById(addChargingOrder.getId()).getData();
        if(tChargingGun == null){
            return AjaxResult.error("发起支付失败,请联系管理员!");
        }
        if(tChargingGun.getStatus() == 1){
            return AjaxResult.error("充电枪已离线,请更换其他设备!");
        }
        if(tChargingGun.getStatus() == 2){
            return AjaxResult.error("请先将充电枪连接车辆充电口!");
        }
        if(Arrays.asList(4, 5, 6).contains(tChargingGun.getStatus())){
            return AjaxResult.error("设备正在充电中,请更换其他设备!");
        }
        if(tChargingGun.getStatus() == 7){
            return AjaxResult.error("设备发生故障,请更换其他设备!");
        }
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
        AppUserWhitelistMatchVO whitelist = appUserWhitelistClient.matchWhitelist(userId, tChargingGun.getSiteId()).getData();
        boolean whitelistMatched = whitelist != null && Boolean.TRUE.equals(whitelist.getMatched());
@@ -942,8 +958,8 @@
                list.addAll(list);
                boolean sta = false;
                for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
                    Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
                    Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
                    int start = Integer.parseInt(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
                    int end = Integer.parseInt(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
                    String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
                    if (sta || (now >= start && now < end)) {
                        sta = true;
@@ -1328,10 +1344,10 @@
                    BigDecimal thirdRefundAmount = channelRefundAmount.min(getRefundableThirdPayAmount(chargingOrder)).setScale(2, RoundingMode.HALF_UP);
                    BigDecimal balanceRefundAmount = channelRefundAmount.subtract(thirdRefundAmount).min(money(chargingOrder.getBalancePayAmount())).setScale(2, RoundingMode.HALF_UP);
                    //构建退款明细
                    String refundCode = "CDF" + chargingOrder.getCode().substring(2);
                    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.setRefundCode(refundCode);
                    chargingOrderRefund.setRefundAmount(recordedRefundAmount);
                    chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
                    chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
@@ -1367,21 +1383,29 @@
                            .eq(TChargingOrder::getId, chargingOrder.getId())
                            .eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()));
                    if (thirdRefundAmount.compareTo(BigDecimal.ZERO) > 0 && 1 == rechargePaymentType) {
                        WxPaymentRefundModel model = new WxPaymentRefundModel();
                        model.setOut_trade_no(chargingOrder.getCode());
                        model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                        model.setReason("充电失败,取消充电订单");
                        model.setNotify_url("/payment/wx/refund/notify");
                        WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                        amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                        amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                        amount.setCurrency("CNY");
                        model.setAmount(amount);
                        R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                        if (200 == orderR.getCode()) {
                        Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
                        Map<String, Object> amount1 = null;
                        if(null != objectMap && null != objectMap.get("refund_id")){
                            amount1 = (Map<String, Object>) objectMap.get("amount");
                        }else{
                            WxPaymentRefundModel model = new WxPaymentRefundModel();
                            model.setOut_trade_no(chargingOrder.getCode());
                            model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                            model.setReason("充电失败,取消充电订单");
                            model.setNotify_url("/payment/wx/refund/notify");
                            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                            amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                            amount.setCurrency("CNY");
                            model.setAmount(amount);
                            R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                            if(200 == orderR.getCode()){
                                amount1 = (Map<String, Object>) orderR.getData().get("amount");
                            }
                        }
                        if (null != amount1) {
                            chargingOrderRefundService.save(chargingOrderRefund);
                            //手续费
                            Map<String, Object> amount1 = (Map<String, Object>) orderR.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));
                            chargingOrderRefund.setRefundFee(refund_fee);
@@ -1486,10 +1510,10 @@
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            Integer payMethod = chargingOrder.getPayMethod();
            //构建退款明细
            String refundCode = "CDF" + chargingOrder.getCode().substring(2);
            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.setRefundCode(refundCode);
            chargingOrderRefund.setRefundAmount(money);
            BigDecimal thirdRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
            BigDecimal balanceRefundAmount = BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
@@ -1523,21 +1547,29 @@
                return;
            }
            if (1 == rechargePaymentType) {
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(chargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setReason("充电完成退款");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                if (200 == orderR.getCode()) {
                Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
                Map<String, Object> amount1 = null;
                if(null != objectMap && null != objectMap.get("refund_id")){
                    amount1 = (Map<String, Object>) objectMap.get("amount");
                }else{
                    WxPaymentRefundModel model = new WxPaymentRefundModel();
                    model.setOut_trade_no(chargingOrder.getCode());
                    model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                    model.setReason("充电完成退款");
                    model.setNotify_url("/payment/wx/refund/notify");
                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                    amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                    amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                    amount.setCurrency("CNY");
                    model.setAmount(amount);
                    R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                    if(200 == orderR.getCode()){
                        amount1 = (Map<String, Object>) orderR.getData().get("amount");
                    }
                }
                if (null != amount1) {
                    chargingOrderRefundService.save(chargingOrderRefund);
                    //手续费
                    Map<String, Object> amount1 = (Map<String, Object>) orderR.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));
                    chargingOrderRefund.setRefundFee(refund_fee);
@@ -1918,11 +1950,6 @@
    @Override
    public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) {
        TCharingOrderVO tCharingOrderVO = new TCharingOrderVO();
        List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
        List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
        List<Site> data9 = siteClient.getSiteAll().getData();
        List<TAppUser> data6 = appUserClient.getAllUser().getData();
        List<TAppUserCar> data4 = appUserCarClient.getAllCar().getData();
        String startTime1 = null;
        String startTime2 = null;
        String endTime1 = null;
@@ -1956,15 +1983,29 @@
        List<Integer> siteIds = dto.getSiteIds();
        List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
        fillChargingOrderBalanceIncome(list);
        List<TChargingOrderAccountingStrategy> list3 = null;
        if (null != startTime1) {
        List<Long> collect = list.stream().map(ChargingOrderVO::getId).collect(Collectors.toList());
        List<TChargingOrderAccountingStrategy> list3 = new ArrayList<>();
        if (!collect.isEmpty()) {
            list3 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .between(null != startTime1, TChargingOrderAccountingStrategy::getCreateTime, startTime1, startTime2));
                    .in(TChargingOrderAccountingStrategy::getChargingOrderId, collect));
        }
        if (null != endTime1) {
            list3 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
                    .between(null != startTime1, TChargingOrderAccountingStrategy::getCreateTime, endTime1, endTime2));
        if(list.isEmpty()){
            return tCharingOrderVO;
        }
        List<Integer> chargingPileId = list.stream().map(ChargingOrderVO::getChargingPileId).collect(Collectors.toList());
        GetChargingGunByChargingPileIdsVo getChargingGunByChargingPileIdsVo = new GetChargingGunByChargingPileIdsVo();
        getChargingGunByChargingPileIdsVo.setChargingPileIds(chargingPileId);
        List<TChargingGun> allGun = chargingGunClient.getChargingGunByChargingPileIds(getChargingGunByChargingPileIdsVo).getData();
        List<Integer> siteIdss = list.stream().map(ChargingOrderVO::getSiteId).collect(Collectors.toList());
        List<TChargingPile> allPile = chargingPileClient.getChargingPileBySiteIds(siteIdss).getData();
        List<Site> data9 = siteClient.getSiteByIds(siteIdss).getData();
        List<Long> appUserIds = list.stream().map(ChargingOrderVO::getAppUserId).collect(Collectors.toList());
        List<TAppUser> data6 = appUserClient.getUserByIds(appUserIds).getData();
        List<Long> appUserCarIds = list.stream().map(ChargingOrderVO::getAppUserCarId).collect(Collectors.toList());
        List<TAppUserCar> data4 = appUserCarClient.getCarByIds(appUserCarIds).getData();
        for (ChargingOrderVO chargingOrderVO : list) {
            if (roleType == 2) {
                for (Integer siteId : siteIds) {
@@ -3071,7 +3112,7 @@
                //获取订单的计费策略
                List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
                if (accountingStrategyDetailOrderList.isEmpty()) {
                if (null == accountingStrategyDetailOrderList || accountingStrategyDetailOrderList.isEmpty()) {
                    return R.fail("计费策略为空,无法计算费用");
                }
                accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59");
@@ -3514,10 +3555,10 @@
                    Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
                    if (channelRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                        //构建退款明细
                        String refundCode = "CDF" + chargingOrder.getCode().substring(2);
                        TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                        chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                        chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
                        chargingOrderRefund.setRefundCode(refundCode);
                        chargingOrderRefund.setRefundAmount(refundAmount);
                        chargingOrderRefund.setBalanceRefundAmount(balanceRefundAmount);
                        chargingOrderRefund.setThirdRefundAmount(thirdRefundAmount);
@@ -3546,20 +3587,29 @@
                                    .eq(TChargingOrder::getId, chargingOrder.getId())
                                    .eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()));
                        } else if (1 == rechargePaymentType) {
                            WxPaymentRefundModel model = new WxPaymentRefundModel();
                            model.setOut_trade_no(chargingOrder.getCode());
                            model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                            model.setReason("充电完成退款");
                            model.setNotify_url("/payment/wx/refund/notify");
                            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                            amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                            amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                            amount.setCurrency("CNY");
                            model.setAmount(amount);
                            R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
                            if (200 == result.getCode()) {
                            Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
                            Map<String, Object> amount1 = null;
                            if(null != objectMap && null != objectMap.get("refund_id")){
                                amount1 = (Map<String, Object>) objectMap.get("amount");
                            }else{
                                WxPaymentRefundModel model = new WxPaymentRefundModel();
                                model.setOut_trade_no(chargingOrder.getCode());
                                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                                model.setReason("充电完成退款");
                                model.setNotify_url("/payment/wx/refund/notify");
                                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                                amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                                amount.setTotal(getRefundableThirdPayAmount(chargingOrder).multiply(new BigDecimal(100)).intValue());
                                amount.setCurrency("CNY");
                                model.setAmount(amount);
                                R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
                                if (200 == result.getCode()) {
                                    amount1 = (Map<String, Object>) result.getData().get("amount");
                                }
                            }
                            if (null != amount1) {
                                //手续费
                                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));
                                chargingOrderRefund.setRefundFee(refund_fee);
@@ -3788,7 +3838,7 @@
            if ((tChargingOrder.getRechargeAmount().subtract(tChargingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) {
                tChargingOrder.setStatus(5);
            }
            String refundCode = "CDF" + tChargingOrder.getCode().substring(2);
            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
            chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
            chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -3796,8 +3846,7 @@
            chargingOrderRefund.setPayType(tChargingOrder.getRechargePaymentType());
            chargingOrderRefund.setRefundTime(LocalDateTime.now());
            chargingOrderRefund.setCode(tChargingOrder.getCode());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
            chargingOrderRefund.setRefundCode(refundCode);
            chargingOrderRefund.setRefundTitle("后台退款");
            chargingOrderRefund.setRefundContent("后台退款");
            chargingOrderRefund.setRefundReason("后台退款");
@@ -3824,22 +3873,30 @@
                chargingOrderRefund.setRefundSerialNumber("BALANCE");
                finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
            } else if (1 == tChargingOrder.getRechargePaymentType()) {
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(tChargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setTransaction_id(tChargingOrder.getRechargeSerialNumber());
                model.setReason("取消订单");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                if (200 == orderR.getCode()) {
                Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
                Map<String, Object> amount1 = null;
                if(null != objectMap && null != objectMap.get("refund_id")){
                    amount1 = (Map<String, Object>) objectMap.get("amount");
                }else{
                    WxPaymentRefundModel model = new WxPaymentRefundModel();
                    model.setOut_trade_no(tChargingOrder.getCode());
                    model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                    model.setTransaction_id(tChargingOrder.getRechargeSerialNumber());
                    model.setReason("取消订单");
                    model.setNotify_url("/payment/wx/refund/notify");
                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                    amount.setRefund(thirdRefundAmount.multiply(new BigDecimal(100)).intValue());
                    amount.setTotal(getRefundableThirdPayAmount(tChargingOrder).multiply(new BigDecimal(100)).intValue());
                    amount.setCurrency("CNY");
                    model.setAmount(amount);
                    R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                    if (200 == orderR.getCode()) {
                        amount1 = (Map<String, Object>) orderR.getData().get("amount");
                    }
                }
                if (null != amount1) {
                    finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount);
                    //手续费
                    Map<String, Object> amount1 = (Map<String, Object>) orderR.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));
                    chargingOrderRefund.setRefundFee(refund_fee);
@@ -3893,7 +3950,7 @@
            if ((shoppingOrder.getPaymentAmount().subtract(shoppingOrder.getRefundAmount()).compareTo(payOrderQueryDto.getRefundAmount())) == 0) {
                shoppingOrder.setStatus(5);
            }
            String refundCode = "GWF" + shoppingOrder.getCode().substring(2);
            TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund();
            shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId());
            shoppingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -3902,7 +3959,7 @@
            shoppingOrderRefund.setRefundTime(LocalDateTime.now());
            shoppingOrderRefund.setCode(shoppingOrder.getCode());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            shoppingOrderRefund.setRefundCode("GWF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
            shoppingOrderRefund.setRefundCode(refundCode);
            shoppingOrderRefund.setRefundTitle("后台退款");
            shoppingOrderRefund.setRefundContent("后台退款");
            shoppingOrderRefund.setRefundReason("后台退款");
@@ -3911,25 +3968,33 @@
            shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount());
            if (1 == shoppingOrder.getPaymentType()) {
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(shoppingOrder.getCode());
                model.setOut_refund_no(shoppingOrderRefund.getRefundCode());
                model.setTransaction_id(shoppingOrder.getSerialNumber());
                model.setReason("取消订单");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
                amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                if (200 == orderR.getCode()) {
                Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
                Map<String, Object> amount1 = null;
                if(null != objectMap && null != objectMap.get("refund_id")){
                    amount1 = (Map<String, Object>) objectMap.get("amount");
                }else{
                    WxPaymentRefundModel model = new WxPaymentRefundModel();
                    model.setOut_trade_no(shoppingOrder.getCode());
                    model.setOut_refund_no(shoppingOrderRefund.getRefundCode());
                    model.setTransaction_id(shoppingOrder.getSerialNumber());
                    model.setReason("取消订单");
                    model.setNotify_url("/payment/wx/refund/notify");
                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                    amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setCurrency("CNY");
                    model.setAmount(amount);
                    R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                    if (200 == orderR.getCode()) {
                        amount1 = (Map<String, Object>) orderR.getData().get("amount");
                    }
                }
                if (null != amount1) {
                    shoppingOrder.setRefundStatus(2);
                    shoppingOrder.setRefundAmount((shoppingOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : shoppingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                    shoppingOrderService.updateById(shoppingOrder);
                    shoppingOrderRefundService.save(shoppingOrderRefund);
                    //手续费
                    Map<String, Object> amount1 = (Map<String, Object>) orderR.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));
                    shoppingOrderRefund.setRefundFee(refund_fee);
@@ -3973,6 +4038,7 @@
            if (vipOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount()) == -1) {
                return R.fail("退款金额需小于支付金额");
            }
            String refundCode = "HYF" + vipOrder.getCode().substring(2);
            TVipOrderRefund vipOrderRefund = new TVipOrderRefund();
            vipOrderRefund.setVipOrderId(vipOrder.getId());
            vipOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -3982,8 +4048,7 @@
            vipOrderRefund.setPayType(vipOrder.getPaymentType());
            vipOrderRefund.setRefundTime(LocalDateTime.now());
            vipOrderRefund.setCode(vipOrder.getCode());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            vipOrderRefund.setRefundCode("HYF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
            vipOrderRefund.setRefundCode(refundCode);
            vipOrderRefund.setRefundTitle("后台退款");
            vipOrderRefund.setRefundContent("后台退款");
            vipOrderRefund.setRefundReason("后台退款");
@@ -3992,25 +4057,33 @@
            vipOrderRefund.setPayAmount(vipOrder.getPaymentAmount());
            if (1 == vipOrder.getPaymentType()) {
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(vipOrder.getCode());
                model.setOut_refund_no(vipOrderRefund.getRefundCode());
                model.setTransaction_id(vipOrder.getSerialNumber());
                model.setReason("取消订单");
                model.setNotify_url("/payment/wx/refund/notify");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
                amount.setTotal(vipOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                if (200 == orderR.getCode()) {
                Map<String, Object> objectMap = wxPaymentClient.queryRefund(refundCode).getData();
                Map<String, Object> amount1 = null;
                if(null != objectMap && null != objectMap.get("refund_id")){
                    amount1 = (Map<String, Object>) objectMap.get("amount");
                }else{
                    WxPaymentRefundModel model = new WxPaymentRefundModel();
                    model.setOut_trade_no(vipOrder.getCode());
                    model.setOut_refund_no(vipOrderRefund.getRefundCode());
                    model.setTransaction_id(vipOrder.getSerialNumber());
                    model.setReason("取消订单");
                    model.setNotify_url("/payment/wx/refund/notify");
                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                    amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setTotal(vipOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setCurrency("CNY");
                    model.setAmount(amount);
                    R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
                    if (200 == orderR.getCode()) {
                        amount1 = (Map<String, Object>) orderR.getData().get("amount");
                    }
                }
                if (null != amount1) {
                    vipOrder.setRefundStatus(2);
                    vipOrder.setRefundAmount((vipOrder.getRefundAmount() == null ? BigDecimal.valueOf(0) : vipOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                    vipOrderService.updateById(vipOrder);
                    vipOrderRefundService.save(vipOrderRefund);
                    //手续费
                    Map<String, Object> amount1 = (Map<String, Object>) orderR.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));
                    vipOrderRefund.setRefundFee(refund_fee);
@@ -5356,6 +5429,11 @@
                    throw new ServiceException("退款查询失败");
                }
                log.info("退款查询结果:{}", JSON.toJSONString(data));
                Object status = data.get("status");
                if(null == status){
                    throw new ServiceException("无退款数据");
                }
                Map<String, Object> amount = (Map<String, Object>) data.get("amount");
                TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
@@ -5388,7 +5466,8 @@
            }
            if (2 == chargingOrder.getRechargePaymentType()) {
                QueryRefundReq dto = new QueryRefundReq();
                dto.setOutTradeNo(refund_out_trade_no);
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(refund_out_trade_no);
                QueryRefundResp data = aliPaymentClient.queryRefund(dto).getData();
                if (null == data) {
                    throw new ServiceException("退款查询失败");
@@ -5400,7 +5479,7 @@
                chargingOrderRefund.setRefundStatus(2);
                chargingOrderRefund.setPayType(1);
                chargingOrderRefund.setRefundSerialNumber(data.getOutRequestNo());
                chargingOrderRefund.setRefundTime(LocalDateTime.parse(data.getRefundTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                chargingOrderRefund.setRefundTime(null != chargingOrder.getEndTime() ? chargingOrder.getEndTime() : chargingOrder.getPayTime());
                chargingOrderRefund.setCode(chargingOrder.getCode());
                chargingOrderRefund.setRefundTitle(rechargeAmount.compareTo(chargingOrderRefund.getRefundAmount()) == 0 ? "充电失败" : "充电完成退款");
                chargingOrderRefund.setRefundContent(rechargeAmount.compareTo(chargingOrderRefund.getRefundAmount()) == 0 ? "充电失败" : "充电完成退款");
@@ -5978,4 +6057,17 @@
            e.printStackTrace();
        }
    }
    @Override
    public Map<Integer, BigDecimal> getSiteChargingCapacity(List<Integer> siteIds) {
        List<Map<String, Object>> siteChargingCapacity = this.baseMapper.getSiteChargingCapacity(siteIds);
        Map<Integer, BigDecimal> map = new HashMap<>();
        siteChargingCapacity.forEach(s->{
            Integer key = Integer.parseInt(s.get("siteId").toString());
            BigDecimal value = new BigDecimal(s.get("chargingCapacity").toString());
            map.put(key, value);
        });
        return map;
    }
}