无关风月
2024-12-31 0c51a577db337520452022d9d6a22b720ef858d4
xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java
@@ -2,7 +2,6 @@
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinquan.common.core.constant.Constants;
import com.xinquan.common.core.constant.SecurityConstants;
import com.xinquan.common.core.enums.ChargeTypeEnum;
import com.xinquan.common.core.enums.DisabledEnum;
@@ -10,7 +9,7 @@
import com.xinquan.common.core.enums.PaymentTypeEnum;
import com.xinquan.common.core.exception.ServiceException;
import com.xinquan.common.core.utils.ip.IpUtils;
import com.xinquan.common.security.utils.SecurityUtils;
import com.xinquan.common.security.service.TokenService;
import com.xinquan.course.api.domain.Course;
import com.xinquan.course.api.feign.RemoteCourseService;
import com.xinquan.meditation.api.domain.Meditation;
@@ -21,15 +20,22 @@
import com.xinquan.order.mapper.OrderMapper;
import com.xinquan.order.service.OrderPaymentRecordService;
import com.xinquan.order.service.OrderService;
import com.xinquan.order.utils.JuHeFuUtil;
import com.xinquan.common.core.utils.JuHeFuUtil;
import com.xinquan.order.utils.OrderUtil;
import com.xinquan.user.api.domain.AppUser;
import com.xinquan.system.api.domain.AppUser;
import com.xinquan.system.api.domain.AppUserWalletRecord;
import com.xinquan.system.api.model.LoginUser;
import com.xinquan.user.api.domain.dto.AppUserDTO;
import com.xinquan.user.api.feign.RemoteAppUserService;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -55,7 +61,8 @@
    private  RemoteAppUserService remoteAppUserService;
    @Resource
    private  OrderPaymentRecordService orderPaymentRecordService;
    @Autowired
    private TokenService tokenService;
    /**
     * 创建待支付订单
     *
@@ -69,88 +76,201 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId,
            Integer balanceFlag, Integer payType) throws Exception {
    public ClientPlaceOrderVO placeOrder(Long targetId, Integer orderFrom, Long receiverId, Long orderId,
            Integer balanceFlag, Integer payType,BigDecimal amount,Integer vipType,Integer type) throws Exception {
        // 获取当前登录用户id
        Long userId = SecurityUtils.getUserId();
        LoginUser loginUser = tokenService.getLoginUser();
        if (loginUser==null){
            return new ClientPlaceOrderVO();
        }
        Long userId = loginUser.getUserid();
        if (amount!=null){
            amount = amount.setScale(2, RoundingMode.HALF_DOWN);
        }
        // 获取用户信息
        AppUser appUser = getAppUserById(userId);
        ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO();
        Order order = new Order();
        order.setPayType(payType);
        AppUser data = remoteAppUserService.getAppUserById(userId + "").getData();
        // 购买冥想音频
        if (orderFrom == 1) {
            Meditation meditation = remoteMeditationService.getMeditationById(targetId,
                    SecurityConstants.INNER).getData();
            String meditationTitle = meditation.getMeditationTitle();
            String detailDescription = meditation.getDetailDescription();
            String detailDescription = "购买疗愈音频";
            String wxOpenId = appUser.getWxOpenId();
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("MX");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setBusinessId(meditation.getId());
            order.setAppUserId(userId);
            order.setTotalAmount(meditation.getGeneralPrice());
            this.save(order);
            Long orderId = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId);
            // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣
            if (balanceFlag.equals(1) && meditation.getChargeType()
                    .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser,
                        meditation.getGeneralPrice(),
                        orderId);
            if (orderId==null){
                order.setPayType(payType);
                order.setOrderFrom(orderFrom);
                order.setBizOrderNo(orderNo);
                order.setBusinessId(meditation.getId());
                order.setAppUserId(userId);
                order.setRealPayAmount(type==null?meditation.getGeneralPrice():meditation.getIosPrice());
                order.setTotalAmount(type==null?meditation.getGeneralPrice():meditation.getIosPrice());
                order.setPayType(payType);
                order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                order.setGiveUserId(receiverId);
                this.save(order);
            }else{
                 order = this.getById(orderId);
                 order.setBizOrderNo(orderNo);
                 order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                 this.updateById(order);
            }
            Long orderId9 = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId9);
            // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣
            if (data.getBalance().compareTo(new BigDecimal("0")) > 0 && balanceFlag.equals(1) && meditation.getChargeType().equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser,
                        type==null?meditation.getGeneralPrice():meditation.getIosPrice(),
                        orderId9);
                if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
                    clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode());
                    // 抵扣后金额为0 为余额支付
                    order.setPayType(4);
                    order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                    this.updateById(order);
                    return clientPlaceOrderVO;
                }
                if (payType==1){
                    // 微信+余额
                    order.setPayType(5);
                }else if (payType == 2){
                    // 支付宝+余额
                    order.setPayType(6);
                }
                order.setBuyContent("购买疗愈【"+meditationTitle+"】");
                this.updateById(order);
                // 创建支付订单
                createPayment(payType, orderNo, needPayAmount, meditationTitle, detailDescription,
                        wxOpenId, orderId, clientPlaceOrderVO);
                createPayment(payType, orderNo, needPayAmount, meditationTitle, "购买疗愈",
                        wxOpenId, orderId9, clientPlaceOrderVO);
            } else {
                // 创建支付订单
                createPayment(payType, orderNo, meditation.getGeneralPrice(), meditationTitle,
                        detailDescription, wxOpenId, orderId, clientPlaceOrderVO);
                createPayment(payType, orderNo, type==null?order.getRealPayAmount():order.getRealPayAmount(), meditationTitle,
                        "购买疗愈", wxOpenId, orderId9, clientPlaceOrderVO);
            }
        } else {
        }
        else if (orderFrom == 2){
            // 购买课程
            Course course = remoteCourseService.getCourseById(targetId,
                    SecurityConstants.INNER).getData();
            Course course = remoteCourseService.getCourseById(targetId).getData();
            String courseTitle = course.getCourseTitle();
            String wxOpenId = appUser.getWxOpenId();
            String description = course.getDescription();
            String description = "购买课程";
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("KC");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setBusinessId(course.getId());
            order.setAppUserId(userId);
            order.setTotalAmount(course.getGeneralPrice());
            this.save(order);
            Long orderId = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId);
            if (orderId==null){
                order.setOrderFrom(orderFrom);
                order.setBizOrderNo(orderNo);
                order.setGiveUserId(receiverId);
                order.setBusinessId(course.getId());
            if (balanceFlag.equals(1) && course.getChargeType()
                order.setAppUserId(userId);
                order.setBuyContent("购买课程【"+courseTitle+"】");
                order.setRealPayAmount(type==null?course.getGeneralPrice():course.getIosPrice());
                order.setTotalAmount(type==null?course.getGeneralPrice():course.getIosPrice());
                this.save(order);
            }else{
                order = this.getById(orderId);
                order.setBuyContent("购买课程【"+courseTitle+"】");
                order.setBizOrderNo(orderNo);
                this.updateById(order);
            }
            Long orderId8 = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId8);
            if (data.getBalance().compareTo(new BigDecimal("0")) > 0 && balanceFlag.equals(1) && course.getChargeType()
                    .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser, course.getGeneralPrice(),
                        orderId);
                BigDecimal needPayAmount = handleBalancePayment(appUser, type==null?course.getGeneralPrice():course.getIosPrice(),
                        orderId8);
                if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
                    clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode());
                    // 抵扣后金额为0 为余额支付
                    order.setPayType(4);
                    order.setBuyContent("购买课程【"+courseTitle+"】");
                    this.updateById(order);
                    return clientPlaceOrderVO;
                }
                if (payType==1){
                    // 微信+余额
                    order.setPayType(5);
                }else if (payType == 2){
                    // 支付宝+余额
                    order.setPayType(6);
                }
                order.setBuyContent("购买课程【"+courseTitle+"】");
                this.updateById(order);
                // 创建支付订单
                createPayment(payType, orderNo, needPayAmount, courseTitle, description,
                        wxOpenId, orderId, clientPlaceOrderVO);
                createPayment(payType, orderNo, needPayAmount, courseTitle, "购买课程",
                        wxOpenId, orderId8, clientPlaceOrderVO);
            } else {
                // 创建支付订单
                createPayment(payType, orderNo, course.getGeneralPrice(), courseTitle,
                        description, wxOpenId, orderId, clientPlaceOrderVO);
                createPayment(payType, orderNo, order.getRealPayAmount(), courseTitle,
                        "购买课程", wxOpenId, orderId8, clientPlaceOrderVO);
            }
        }
        else if (orderFrom == 3){
            String wxOpenId = appUser.getWxOpenId();
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("HY");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setAppUserId(userId);
            order.setTotalAmount(amount);
            order.setPayType(payType);
            order.setRealPayAmount(amount);
            String vipType1 ="";
            switch (vipType){
                case 1:
                    vipType1="月会员";
                    break;
                case 2:
                    vipType1="季会员";
                    break;
                case 3:
                    vipType1="年会员";
                    break;
            }
            order.setBuyContent(vipType1);
            this.save(order);
            Long orderId7 = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId7);
            // 创建支付订单
            createPayment(payType, orderNo, amount, "购买会员",
                    vipType1, wxOpenId, orderId7, clientPlaceOrderVO);
        }else {
            // 充值
            String wxOpenId = appUser.getWxOpenId();
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("CZ");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setAppUserId(userId);
            order.setTotalAmount(amount);
            order.setRealPayAmount(amount);
            order.setPayType(payType);
            order.setBuyContent("充值");
            this.save(order);
            Long orderId6 = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId6);
            // 创建支付订单
            createPayment(payType, orderNo, amount, "充值余额",
                    "充值余额", wxOpenId, orderId6, clientPlaceOrderVO);
        }
        return clientPlaceOrderVO;
    }
@@ -169,21 +289,49 @@
        if (appUser.getBalance().compareTo(BigDecimal.ZERO) < 0) {
            throw new ServiceException("用户可用余额不足,请重新选择支付方案");
        }
        // 更新用户余额
        remoteAppUserService.updateAppUser(
                AppUserDTO.builder().balance(
                                appUser.getBalance().subtract(generalPrice))
                        .build(), SecurityConstants.INNER);
        Order one = this.lambdaQuery().eq(Order::getId, orderId).one();
        OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord();
        balancePaymentRecord.setOrderId(orderId);
        balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode());
        balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode());
        orderPaymentRecordService.save(balancePaymentRecord);
        // 如果余额大于通用价格 则实际支付价格为0
        if (appUser.getBalance().compareTo(one.getRealPayAmount())>=0){
            // 更新用户余额
//            remoteAppUserService.updateAppUser(
//                    AppUserDTO.builder().balance(
//                                    appUser.getBalance().subtract(one.getRealPayAmount()))
//                            .build(), SecurityConstants.INNER);
            OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord();
            balancePaymentRecord.setOrderId(orderId);
            balancePaymentRecord.setPayAmount(one.getRealPayAmount());
            balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode());
            balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode());
            List<OrderPaymentRecord> list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId)
                    .eq(OrderPaymentRecord::getPaymentType, 4).list();
            if (list.isEmpty()){
                orderPaymentRecordService.save(balancePaymentRecord);
            }
        // 计算除去余额还需支付的金额
        return generalPrice
                .subtract(appUser.getBalance());
            return new BigDecimal("0");
        }else {
            // 更新用户余额
//            remoteAppUserService.updateAppUser(
//                    AppUserDTO.builder().balance(
//                                    one.getRealPayAmount().subtract(appUser.getBalance()))
//                            .build(), SecurityConstants.INNER);
            OrderPaymentRecord balancePaymentRecord = new OrderPaymentRecord();
            balancePaymentRecord.setOrderId(orderId);
            balancePaymentRecord.setPaymentType(PaymentTypeEnum.BALANCE_PAY.getCode());
            balancePaymentRecord.setPaymentStatus(PaymentStatusEnum.COMPLETED.getCode());
            balancePaymentRecord.setPayAmount(appUser.getBalance());
            List<OrderPaymentRecord> list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId)
                    .eq(OrderPaymentRecord::getPaymentType, 4).list();
            if (list.isEmpty()){
                orderPaymentRecordService.save(balancePaymentRecord);
            }
            // 计算除去余额还需支付的金额
            return one.getRealPayAmount()
                    .subtract(appUser.getBalance());
        }
    }
    /**
@@ -193,9 +341,7 @@
     * @return AppUser
     */
    private AppUser getAppUserById(Long userId) {
        return remoteAppUserService.getUserByCondition(
                AppUserDTO.builder().id(userId).build(),
                SecurityConstants.INNER).getData();
        return remoteAppUserService.getAppUserById(userId+"").getData();
    }
    /**
@@ -214,28 +360,76 @@
    private void createPayment(Integer payType, String orderNo, BigDecimal needPayAmount,
            String goodsTitle, String goodsDesc, String wxOpenId, Long orderId,
            ClientPlaceOrderVO clientPlaceOrderVO) throws Exception {
        // 截取前42个字符 商品描述信息,微信小程序和微信公众号该字段,最大长度 42 个字符
        goodsDesc = goodsDesc.substring(0, 42);
        // 调用第三方支付获取支付信息
        JSONObject payInfo = JuHeFuUtil.createPayment(orderNo, payType,
                needPayAmount.toString(), goodsTitle, goodsDesc,
                IpUtils.getIpAddr(), wxOpenId, Constants.PAYMENT_NOTIFY_URL);
        // 第三方支付记录
        OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
        paymentRecord.setOrderId(orderId);
        if (payType == 1) {
            clientPlaceOrderVO.setPayInfo(payInfo.getString("pay_info"));
        if (payType == 1){
            // 微信托管支付
            // 截取前42个字符 商品描述信息,微信小程序和微信公众号该字段,最大长度 42 个字符
            // 调用第三方支付获取支付信息
            JSONObject payInfo = JuHeFuUtil.createPayment1(orderNo, payType,
                    needPayAmount.toString(), goodsTitle, goodsDesc,
                    IpUtils.getIpAddr(), wxOpenId,
                                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
//                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
            );
            // 第三方支付记录
            OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
            paymentRecord.setOrderId(orderId);
            Order byId = this.getById(orderId);
            this.updateById(byId);
            clientPlaceOrderVO.setPayAmt(payInfo.getString("pay_amt"));
            clientPlaceOrderVO.setPath(payInfo.getJSONObject("expend").getString("path"));
            clientPlaceOrderVO.setPayInfo(payInfo.getJSONObject("expend").getString("pay_info"));
            clientPlaceOrderVO.setOrgId(payInfo.getJSONObject("expend").getString("orgId"));
            clientPlaceOrderVO.setAppId(payInfo.getJSONObject("expend").getString("appId"));
            paymentRecord.setPaymentType(PaymentTypeEnum.WECHAT_PAY.getCode());
        } else {
            clientPlaceOrderVO.setQrcodeUrl(payInfo.getString("qrcode_url"));
            paymentRecord.setPayOrderNo(payInfo.getString("id"));
            clientPlaceOrderVO.setOrderId(payInfo.getString("id"));
            paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
            paymentRecord.setPayAmount(needPayAmount);
            OrderPaymentRecord list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId)
                    .ne(OrderPaymentRecord::getPaymentType, 4).one();
            if (list==null){
                orderPaymentRecordService.save(paymentRecord);
            }else{
                list.setPayOrderNo(payInfo.getString("id"));
                orderPaymentRecordService.updateById(list);
            }
            // 设置订单是否需要支付标识
            clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode());
        }else{
            // 调用第三方支付获取支付信息
            JSONObject payInfo = JuHeFuUtil.createPayment(orderNo, payType,
                    needPayAmount.toString(), goodsTitle, goodsDesc,
                    IpUtils.getIpAddr(), wxOpenId,
                                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
//                    "https://xq.xqzhihui.com/api/order/client/order/order/base/callback"
            );
            // 第三方支付记录
            OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
            paymentRecord.setOrderId(orderId);
            paymentRecord.setPayAmount(needPayAmount);
            Order byId = this.getById(orderId);
            this.updateById(byId);
            JSONObject expend = payInfo.getJSONObject("expend");
            String string = expend.getString("qrcode_url");
            clientPlaceOrderVO.setQrcodeUrl(string);
            paymentRecord.setPaymentType(PaymentTypeEnum.ALI_PAY.getCode());
            paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
            paymentRecord.setPayOrderNo(payInfo.getString("id"));
            OrderPaymentRecord list = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, orderId)
                    .ne(OrderPaymentRecord::getPaymentType, 4).one();
            if (list==null){
                orderPaymentRecordService.save(paymentRecord);
            }else{
                list.setPayOrderNo(payInfo.getString("id"));
                orderPaymentRecordService.updateById(list);
            }
            clientPlaceOrderVO.setPayAmt(payInfo.getString("pay_amt"));
            clientPlaceOrderVO.setOrderId(payInfo.getString("id"));
            // 设置订单是否需要支付标识
            clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode());
        }
        paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
        orderPaymentRecordService.save(paymentRecord);
        // 设置订单是否需要支付标识
        clientPlaceOrderVO.setZeroFlag(DisabledEnum.NO.getCode());
    }
    /**
@@ -250,4 +444,324 @@
        return this.lambdaQuery().eq(Order::getAppUserId, userId).eq(Order::getOrderFrom, orderFrom)
                .eq(Order::getPaymentStatus, PaymentStatusEnum.COMPLETED.getCode()).list();
    }
    @Override
    public String placeOrderApple(Long targetId, Integer orderFrom,
                                  Long receiverId, Integer balanceFlag,
                                  BigDecimal amount, Integer vipType, String transactionIdentifier) {
        // 获取当前登录用户id
        Long userId = tokenService.getLoginUser().getUserid();
        // 获取用户信息
        AppUser appUser = getAppUserById(userId);
        ClientPlaceOrderVO clientPlaceOrderVO = new ClientPlaceOrderVO();
        Order order = new Order();
        // 购买冥想音频
        if (orderFrom == 1) {
            Meditation meditation = remoteMeditationService.getMeditationById(targetId,
                    SecurityConstants.INNER).getData();
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("MX");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setBusinessId(meditation.getId());
            order.setAppUserId(userId);
            order.setTotalAmount(meditation.getIosPrice());
            order.setPayType(3);
            order.setBuyContent("购买疗愈");
            this.save(order);
            Long orderId = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId);
            // 如果冥想音频价格设定为单独收费,且需要使用余额抵扣
            if (balanceFlag.equals(1) && meditation.getChargeType().equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser,
                        meditation.getIosPrice(),
                        orderId);
                if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
                    clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode());
                    // 抵扣后金额为0 为余额支付
                    order.setPayType(4);
                    order.setRealPayAmount(meditation.getIosPrice());
                    this.updateById(order);
                    return order.getId().toString();
                }else{
                    order.setPayType(7);
                    this.updateById(order);
                    // 创建支付订单
                    OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
                    paymentRecord.setPayAmount(meditation.getIosPrice());
                    paymentRecord.setPayOrderNo(transactionIdentifier);
                    paymentRecord.setOrderId(orderId);
                    paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode());
                    paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
                    orderPaymentRecordService.save(paymentRecord);
                }
            } else {
                order.setPayType(3);
                this.updateById(order);
                // 纯内购支付
                OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
                paymentRecord.setPayAmount(meditation.getIosPrice());
                paymentRecord.setPayOrderNo(transactionIdentifier);
                paymentRecord.setOrderId(orderId);
                paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode());
                paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
                orderPaymentRecordService.save(paymentRecord);
            }
        }
        else if (orderFrom == 2){
            // 购买课程
            Course course = remoteCourseService.getCourseById(targetId).getData();
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("KC");
            order.setOrderFrom(orderFrom);
            order.setBuyContent("购买课程");
            order.setBizOrderNo(orderNo);
            order.setPayOrderNo(transactionIdentifier);
            order.setGiveUserId(receiverId);
            order.setBusinessId(course.getId());
            order.setAppUserId(userId);
            order.setTotalAmount(course.getIosPrice());
            this.save(order);
            Long orderId = order.getId();
            clientPlaceOrderVO.setOrderNo(orderNo);
            clientPlaceOrderVO.setId(orderId);
            if (balanceFlag.equals(1) && course.getChargeType()
                    .equals(ChargeTypeEnum.SEPARATE_CHARGE.getCode())) {
                BigDecimal needPayAmount = handleBalancePayment(appUser, course.getGeneralPrice(),
                        orderId);
                if (needPayAmount.compareTo(BigDecimal.ZERO) <= 0) {
                    clientPlaceOrderVO.setZeroFlag(DisabledEnum.YES.getCode());
                    // 抵扣后金额为0 为余额支付
                    order.setPayType(4);
                    order.setRealPayAmount(course.getGeneralPrice());
                    this.updateById(order);
                    return order.getId()+"";
                }else{
                    order.setPayType(7);
                    this.updateById(order);
                    // 创建支付订单
                    OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
                    paymentRecord.setPayAmount(course.getIosPrice());
                    paymentRecord.setPayOrderNo(transactionIdentifier);
                    paymentRecord.setOrderId(orderId);
                    paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode());
                    paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
                    orderPaymentRecordService.save(paymentRecord);
                }
            } else {
                order.setPayType(3);
                this.updateById(order);
                // 创建支付订单
                OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
                paymentRecord.setPayAmount(course.getIosPrice());
                paymentRecord.setPayOrderNo(transactionIdentifier);
                paymentRecord.setOrderId(orderId);
                paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode());
                paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
                orderPaymentRecordService.save(paymentRecord);
            }
        }
        else if (orderFrom == 3){
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("HY");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setAppUserId(userId);
            order.setTotalAmount(amount);
            order.setRealPayAmount(amount);
            String vipType1 ="";
            switch (vipType){
                case 1:
                    vipType1="月会员";
                    break;
                case 2:
                    vipType1="季会员";
                    break;
                case 3:
                    vipType1="年会员";
                    break;
            }
            order.setBuyContent(vipType1);
            this.save(order);
            Long orderId = order.getId();
            order.setPayType(3);
            this.updateById(order);
            // 创建支付订单
            OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
            paymentRecord.setPayAmount(amount);
            paymentRecord.setPayOrderNo(transactionIdentifier);
            paymentRecord.setOrderId(orderId);
            paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode());
            paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
            orderPaymentRecordService.save(paymentRecord);
        }else {
            // 充值
            String wxOpenId = appUser.getWxOpenId();
            // 创建订单
            String orderNo = OrderUtil.getOrderNoForPrefix("CZ");
            order.setOrderFrom(orderFrom);
            order.setBizOrderNo(orderNo);
            order.setAppUserId(userId);
            order.setTotalAmount(amount);
            order.setRealPayAmount(amount);
            order.setBuyContent("充值");
            this.save(order);
            Long orderId = order.getId();
            order.setPayType(3);
            this.updateById(order);
            // 创建支付订单
            OrderPaymentRecord paymentRecord = new OrderPaymentRecord();
            paymentRecord.setPayAmount(amount);
            paymentRecord.setPayOrderNo(transactionIdentifier);
            paymentRecord.setOrderId(orderId);
            paymentRecord.setPaymentType(PaymentTypeEnum.IOS_PAY.getCode());
            paymentRecord.setPaymentStatus(PaymentStatusEnum.TO_BE_PAID.getCode());
            orderPaymentRecordService.save(paymentRecord);
        }
        return order.getId()+"";
    }
    @Override
    public String refund(Long uid) throws Exception {
        Order byId = this.getById(uid);
        OrderPaymentRecord two = orderPaymentRecordService.lambdaQuery()
                .eq(OrderPaymentRecord::getPaymentType,4)
                .eq(OrderPaymentRecord::getOrderId, uid)
                .one();
        if (byId.getPayType() == 4){
            // 纯余额支付 直接退还余额
            // 回退余额记录
            AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
            appUserWalletRecord.setAppUserId(byId.getAppUserId());
            appUserWalletRecord.setChangeType(1);
            appUserWalletRecord.setReason("后台退款");
            appUserWalletRecord.setOrderId(byId.getId());
            appUserWalletRecord.setAmount(two.getPayAmount());
            remoteAppUserService.addBalanceRecord(appUserWalletRecord);
            remoteAppUserService.addBalance(byId.getAppUserId(),two.getPayAmount());
            byId.setRefundStatus(3);
            byId.setRefundRemark("后台退款");
            byId.setRefundTime(LocalDateTime.now());
            byId.setPaymentStatus(3);
            byId.setCancelTime(LocalDateTime.now());
            two.setPaymentStatus(3);
            this.updateById(byId);
            orderPaymentRecordService.updateById(two);
            switch (byId.getOrderFrom()){
                case 1:
                    // 冥想订单 删除
                    break;
                case 2:
                    // 删除用户与课程的关系表
                    remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId());
                    break;
                case 3:
                    // 会员订单 将用户会员到期时间回退
                    if (byId.getBuyContent().contains("月")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1);
                    }else if (byId.getBuyContent().contains("季")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2);
                    }else if (byId.getBuyContent().contains("年")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3);
                    }
                    break;
            }
            return "success";
        }else if (byId.getPayType() == 5 || byId.getPayType() == 6 || byId.getPayType() == 7){
            OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery()
                    .eq(OrderPaymentRecord::getOrderId, uid)
                    .ne(OrderPaymentRecord::getPaymentType, 4)
                    .ne(OrderPaymentRecord::getPaymentType, 3)
                    .one();
            JSONObject refund = JuHeFuUtil.refund(one.getPayOrderNo(), byId.getBizOrderNo());
            if (refund.getString("error_msg")!=null){
                return refund.getString("error_msg");
            }
            // 回退余额记录
            AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord();
            appUserWalletRecord.setAppUserId(byId.getAppUserId());
            appUserWalletRecord.setChangeType(1);
            appUserWalletRecord.setReason("后台退款");
            appUserWalletRecord.setOrderId(byId.getId());
            appUserWalletRecord.setAmount(two.getPayAmount());
            remoteAppUserService.addBalanceRecord(appUserWalletRecord);
            remoteAppUserService.addBalance(byId.getAppUserId(),two.getPayAmount());
            byId.setRefundStatus(3);
            byId.setRefundRemark("后台退款");
            byId.setRefundTime(LocalDateTime.now());
            byId.setPaymentStatus(3);
            byId.setCancelTime(LocalDateTime.now());
            two.setPaymentStatus(3);
            this.updateById(byId);
            orderPaymentRecordService.updateById(two);
            switch (byId.getOrderFrom()){
                case 1:
                    // 冥想订单 删除
                    break;
                case 2:
                    // 删除用户与课程的关系表
                    remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId());
                    break;
                case 3:
                    // 会员订单 将用户会员到期时间回退
                    if (byId.getBuyContent().contains("月")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1);
                    }else if (byId.getBuyContent().contains("季")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2);
                    }else if (byId.getBuyContent().contains("年")){
                        remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3);
                    }
                    break;
            }
            return "success";
        }
        OrderPaymentRecord one = orderPaymentRecordService.lambdaQuery()
                .eq(OrderPaymentRecord::getOrderId, uid)
                .ne(OrderPaymentRecord::getPaymentType, 4)
                .ne(OrderPaymentRecord::getPaymentType, 3)
                .one();
        JSONObject refund = JuHeFuUtil.refund(one.getPayOrderNo(), byId.getBizOrderNo());
        if (refund.getString("error_msg")!=null){
            return refund.getString("error_msg");
        }
        one.setPaymentStatus(3);
        orderPaymentRecordService.updateById(one);
        String string = refund.getString("payment_id");
        if (string!=null){
            byId.setRefundCode(string);
        }
        byId.setRefundTime(LocalDateTime.now());
        byId.setRefundStatus(3);
        byId.setRefundRemark("后台退款");
        this.updateById(byId);
        switch (byId.getOrderFrom()){
            case 1:
                // 冥想订单 删除
                break;
            case 2:
                // 删除用户与课程的关系表
                remoteAppUserService.deleteAppUserCourse(byId.getBusinessId(),byId.getAppUserId());
                break;
            case 3:
                // 会员订单 将用户会员到期时间回退
                if (byId.getBuyContent().contains("月")){
                    remoteAppUserService.subVipExpireTime(byId.getAppUserId(),1);
                }else if (byId.getBuyContent().contains("季")){
                    remoteAppUserService.subVipExpireTime(byId.getAppUserId(),2);
                }else if (byId.getBuyContent().contains("年")){
                    remoteAppUserService.subVipExpireTime(byId.getAppUserId(),3);
                }
                break;
        }
        return "success";
    }
}