Pu Zhibing
2024-10-14 36405acdd0faae9155502fd9de36f6134dd18834
修改bug
1个文件已添加
6个文件已修改
476 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 390 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -153,6 +153,11 @@
            public void terminateSuccessfulResponse(PlatformStopChargingReplyVO platformStopChargingReply) {
                log.error("停止充电应答处理失败:" + throwable.getMessage());
            }
            @Override
            public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
                log.error("停止充电返回账单后计算费用处理失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -199,4 +199,11 @@
     */
    @PostMapping("/t-charging-order/terminateSuccessfulResponse")
    void terminateSuccessfulResponse(@RequestBody PlatformStopChargingReplyVO platformStopChargingReply);
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    @PostMapping("/t-charging-order/endChargeBillingCharge")
    void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TransactionRecordMessageVO.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.order.api.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 交易记录
 **/
@Data
public class TransactionRecordMessageVO {
    private String transaction_serial_number;// 交易流水号
    private String charging_pile_code;// 桩编码
    private String charging_gun_code;// 抢号
    private String start_time;// 开始时间
    private String end_time;// 结束时间
    private BigDecimal sharp_peak_unit_price;// 尖单价
    private BigDecimal sharp_peak_charge;// 尖电量
    private BigDecimal loss_sharp_peak_charge;// 计损尖电量
    private BigDecimal sharp_peak_amount;// 尖金额
    private BigDecimal peak_unit_price;// 峰单价
    private BigDecimal peak_charge;// 峰电量
    private BigDecimal loss_peak_charge;// 计损峰电量
    private BigDecimal peak_amount;// 峰金额
    private BigDecimal flat_peak_unit_price;// 平单价
    private BigDecimal flat_peak_charge;// 平电量
    private BigDecimal loss_flat_peak_charge;// 计损平电量
    private BigDecimal flat_peak_amount;// 平金额
    private BigDecimal low_peak_unit_price;// 谷单价
    private BigDecimal low_peak_charge;// 谷电量
    private BigDecimal loss_low_peak_charge;// 计损谷电量
    private BigDecimal low_peak_amount;// 谷金额
    private BigDecimal total_initial_value;// 电表总起值
    private BigDecimal total_stop_value;// 电表总止值
    private BigDecimal total_electricity;// 总电量
    private BigDecimal loss_total_electricity;// 计损总电量
    private BigDecimal payment_amount;// 消费金额
    private String vin;// 电动汽车唯一标识
    private Integer start_method;// 交易标识(1:app 启动,2:卡启动,4:离线卡启动,5: vin 码启动充电)
    private String trade_date;// 交易日期、时间
    private Integer stop_reason;// 停止原因
    private String physical_card_number;// 物理卡号
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -22,6 +22,7 @@
import com.ruoyi.order.api.vo.PlatformStartChargingReplyMessageVO;
import com.ruoyi.order.api.vo.PlatformStopChargingReplyVO;
import com.ruoyi.order.api.vo.SecurityDetectionVO;
import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@@ -365,6 +366,10 @@
                    chargingOrderRecord.setTotalElectricity(transactionRecordMessage.getTotal_electricity());
                    chargingOrderClient.updateChargingOrder(chargingOrderRecord);
                }
                //计算费用
                TransactionRecordMessageVO vo = new TransactionRecordMessageVO();
                BeanUtils.copyProperties(transactionRecordMessage,vo);
                chargingOrderClient.endChargeBillingCharge(vo);
                break;
            case SendTagConstant.UPDATE_BALANCE_REPLY:
                UpdateBalanceReplyMessage updateBalanceReplyMessage = message.getUpdateBalanceReplyMessage();
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -579,6 +579,17 @@
    }
    
    
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    @PostMapping("/endChargeBillingCharge")
    public void endChargeBillingCharge(@RequestBody TransactionRecordMessageVO vo){
        log.error("-------------------停止充电返回账单后计算费用-------------------:" + vo);
        chargingOrderService.endChargeBillingCharge(vo);
    }
    
    @ResponseBody
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -170,7 +170,14 @@
     * @param code
     */
    void endCharge(String code, Integer endMode);
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    void endChargeBillingCharge(TransactionRecordMessageVO vo);
    /**
     * 异常结束充电处理逻辑
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -532,9 +532,9 @@
    @GlobalTransactional(rollbackFor = Exception.class)
    public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
//        if(chargingOrder.getRechargePaymentStatus() == 2){
//            return AjaxResult.success();
//        }
        if(chargingOrder.getRechargePaymentStatus() == 2){
            return AjaxResult.success();
        }
        chargingOrder.setRechargePaymentStatus(2);
        chargingOrder.setRechargeSerialNumber(transaction_id);
        chargingOrder.setStatus(2);
@@ -911,7 +911,7 @@
    public ChargingDetails getChargingDetails(Integer id) {
        Long userId = tokenService.getLoginUserApplet().getUserId();
        TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
                .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getEndTime).last(" limit 0, 1"));
                .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1"));
        if(null == one){
            return null;
        }
@@ -1043,8 +1043,6 @@
                editUserTag(chargingOrder);
                //用户推荐奖励
                referralReward(chargingOrder);
                //计算费用,处理退款
                endCharge(chargingOrder);
                // 将枪状态重置为空闲
                chargingGun.setStatus(2);
                chargingGunClient.updateChargingGunById(chargingGun);
@@ -1221,8 +1219,6 @@
            editUserTag(order);
            //用户推荐奖励
            referralReward(order);
            //计算费用,处理退款
            endCharge(order);
            // 将枪状态重置为空闲
            chargingGun.setStatus(2);
            chargingGunClient.updateChargingGunById(chargingGun);
@@ -1230,193 +1226,6 @@
    }
    
    
    /**
     * 手动结束后的费用计算和退款逻辑
     */
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endCharge(TChargingOrder chargingOrder){
        //如果使用优惠券需要判断优惠券是否满足使用条件
        //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
        //退款金额=优惠券金额+剩余充电金额
        List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
        BigDecimal periodServicePrice_total = BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
            BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
            periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
            periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
            total = total.add(periodElectricPrice).add(periodServicePrice);
        }
        //原金额
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
        //总金额(充值金额+会员折扣金额)
        BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
        //退款金额(已经计算了折扣优惠部分)
        BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
        BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
        BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
        //折扣金额
        BigDecimal discountAmount = BigDecimal.ZERO;
        if(null != chargingOrder.getVipDiscount()){
            //服务费折扣
            discountAmount = periodServicePrice_total.multiply((new BigDecimal(10).subtract(chargingOrder.getVipDiscount())).divide(new BigDecimal(10)));
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            if(null != appUser.getVipId()){
                //判断会员是否还有充电优惠次数
                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
                getAppUserVipDetail.setVipId(appUser.getVipId());
                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
                if(null != data && data.getChargeNum() > 0){
                    data.setChargeNum(data.getChargeNum() - 1);
                    appUserVipDetailClient.updateAppUserVipDetail(data);
                }
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                BigDecimal maximumDeduction = vip.getMaximumDeduction();
                //普通会员有最高优惠限制
                if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
                    discountAmount = maximumDeduction;
                }
            }
            payAmount = payAmount.subtract(discountAmount);
        }
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setOrderAmount(orderAmount);
        chargingOrder.setVipDiscountAmount(discountAmount);
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
            //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
            TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
            String couponJson = appCoupon.getCouponJson();
            TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
            Integer preferentialMode = tCoupon.getPreferentialMode();
            if(1 == preferentialMode){
                //满减
                if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
                    chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
                    payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
            if(2 == preferentialMode){
                //抵扣
                if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    //折扣金额
                    BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                    divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                    refundAmount = refundAmount.add(divide);
                    chargingOrder.setCouponDiscountAmount(divide);
                    payAmount = payAmount.subtract(divide);
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
        }
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //添加积分
        TIntegralRule integralRule = integralRuleClient.getSet().getData();
        if(null != integralRule){
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
            Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
            if(null != appUser.getVipId()){
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    integral *= 2;
                }
            }
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            appUserIntegralChange.setAppUserId(appUser.getId());
            appUserIntegralChange.setChangeType(2);
            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
            appUser.setPoints(appUser.getPoints() + integral);
            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
            appUserClient.updateAppUser(appUser);
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
        }
        //开始构建退款费用
        if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            //构建退款明细
            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(refundAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(rechargePaymentType);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setCode(chargingOrder.getCode());
            chargingOrderRefund.setRefundTitle("充电完成退款");
            chargingOrderRefund.setRefundContent("充电完成退款");
            chargingOrderRefund.setRefundReason("充电完成退款");
            chargingOrderRefund.setRefundRemark("充电完成退款");
            chargingOrderRefund.setRefundTotalAmount(refundAmount);
            chargingOrderRefund.setPayAmount(rechargeAmount);
            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(refundAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<String> orderR = wxPaymentClient.refundOrderR(model);
                if(200 == orderR.getCode()){
                    chargingOrderRefundService.save(chargingOrderRefund);
                }
            }
            if(2 == rechargePaymentType){
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(rechargeAmount.toString());
                dto.setRefundReason("充电完成退款");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if(null != resp){
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                    AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
                    if(success.isSuccess()){
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
            }
        }
    }
@@ -2017,8 +1826,6 @@
        editUserTag(chargingOrder);
        //用户推荐奖励
        referralReward(chargingOrder);
        //计算费用,处理退款
        endCharge(chargingOrder);
    }
    /**
@@ -2029,7 +1836,194 @@
    public void excelEndCharge(String orderCode) {
        endCharge(orderCode, 0);
    }
    /**
     * 停止充电返回账单后计算费用
     * @param vo
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void endChargeBillingCharge(TransactionRecordMessageVO vo) {
        //如果使用优惠券需要判断优惠券是否满足使用条件
        //根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
        //退款金额=优惠券金额+剩余充电金额
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
        List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
        BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
        BigDecimal periodServicePrice_total = BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
            BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
            periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
            periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
            total = total.add(periodElectricPrice).add(periodServicePrice);
        }
        //原金额
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
        //总金额(充值金额+会员折扣金额)
        BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
        //退款金额(已经计算了折扣优惠部分)
        BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
        BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
        BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
        //折扣金额
        BigDecimal discountAmount = BigDecimal.ZERO;
        if(null != chargingOrder.getVipDiscount()){
            //服务费折扣
            discountAmount = periodServicePrice_total.multiply((new BigDecimal(10).subtract(chargingOrder.getVipDiscount())).divide(new BigDecimal(10)));
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            if(null != appUser.getVipId()){
                //判断会员是否还有充电优惠次数
                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
                getAppUserVipDetail.setVipId(appUser.getVipId());
                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
                if(null != data && data.getChargeNum() > 0){
                    data.setChargeNum(data.getChargeNum() - 1);
                    appUserVipDetailClient.updateAppUserVipDetail(data);
                }
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                BigDecimal maximumDeduction = vip.getMaximumDeduction();
                //普通会员有最高优惠限制
                if(vip.getType() == 1 && discountAmount.compareTo(maximumDeduction) > 0){
                    discountAmount = maximumDeduction;
                }
            }
            payAmount = payAmount.subtract(discountAmount);
        }
        if(chargingOrder.getEndMode() == 2){
            chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
        }
        chargingOrder.setStatus(5);
        chargingOrder.setOrderAmount(orderAmount);
        chargingOrder.setVipDiscountAmount(discountAmount);
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
            //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
            TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
            String couponJson = appCoupon.getCouponJson();
            TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
            Integer preferentialMode = tCoupon.getPreferentialMode();
            if(1 == preferentialMode){
                //满减
                if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
                    chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
                    payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
            if(2 == preferentialMode){
                //抵扣
                if(payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0){
                    //折扣金额
                    BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
                    divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
                    refundAmount = refundAmount.add(divide);
                    chargingOrder.setCouponDiscountAmount(divide);
                    payAmount = payAmount.subtract(divide);
                }else{
                    chargingOrder.setAppCouponId(null);
                    chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
                    appCouponClient.refund(chargingOrder.getAppCouponId().toString());
                }
            }
        }
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //添加积分
        TIntegralRule integralRule = integralRuleClient.getSet().getData();
        if(null != integralRule){
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
            Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
            if(null != appUser.getVipId()){
                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    integral *= 2;
                }
            }
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            appUserIntegralChange.setAppUserId(appUser.getId());
            appUserIntegralChange.setChangeType(2);
            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
            appUser.setPoints(appUser.getPoints() + integral);
            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
            appUserClient.updateAppUser(appUser);
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
        }
        //开始构建退款费用
        if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            //构建退款明细
            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(refundAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(rechargePaymentType);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setCode(chargingOrder.getCode());
            chargingOrderRefund.setRefundTitle("充电完成退款");
            chargingOrderRefund.setRefundContent("充电完成退款");
            chargingOrderRefund.setRefundReason("充电完成退款");
            chargingOrderRefund.setRefundRemark("充电完成退款");
            chargingOrderRefund.setRefundTotalAmount(refundAmount);
            chargingOrderRefund.setPayAmount(rechargeAmount);
            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(refundAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<String> orderR = wxPaymentClient.refundOrderR(model);
                if(200 == orderR.getCode()){
                    chargingOrderRefundService.save(chargingOrderRefund);
                }
            }
            if(2 == rechargePaymentType){
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(rechargeAmount.toString());
                dto.setRefundReason("充电完成退款");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if(null != resp){
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                    AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
                    if(success.isSuccess()){
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
            }
        }
    }
    @Override
    public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
        return this.baseMapper.getByDate(chargingOrderIds);