puzhibing
2025-01-07 eb5d7885fa9e4bd20c0827eec9b4cdd48c47b509
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -20,10 +20,15 @@
import com.ruoyi.order.model.Order;
import com.ruoyi.order.model.OrderBalancePayment;
import com.ruoyi.order.model.OrderGood;
import com.ruoyi.order.model.RefundPass;
import com.ruoyi.order.service.CommissionService;
import com.ruoyi.order.service.OrderBalancePaymentService;
import com.ruoyi.order.service.OrderService;
import com.ruoyi.order.service.RefundPassService;
import com.ruoyi.order.util.ExpressDeliveryUtil;
import com.ruoyi.order.util.payment.PaymentUtil;
import com.ruoyi.order.util.payment.model.RefundCallbackResult;
import com.ruoyi.order.util.payment.model.RefundResult;
import com.ruoyi.order.util.vo.QueryKD100Vo;
import com.ruoyi.order.vo.*;
import com.ruoyi.other.api.domain.*;
@@ -89,6 +94,9 @@
    
    @Resource
    private GoodsClient goodsClient;
    @Resource
    private RefundPassService refundPassService;
    
    
@@ -230,7 +238,6 @@
        if (!check){
            throw new ServiceException("订单不存在");
        }
        Integer orderType = order.getOrderType();
        // 售后设置
        R<BaseSetting> baseSettingR = baseSettingClient.getBaseSetting(5);
@@ -336,13 +343,15 @@
    @Override
    public R cancelOrder(Long orderId) {
        Order order = this.getById(orderId);
        if(Arrays.asList(4, 5, 6, 7, 8).contains(order.getOrderStatus())){
        if(Arrays.asList(5, 6, 7).contains(order.getOrderStatus())){
            return R.fail("无效的操作");
        }
        order.setOrderStatus(5);
        this.updateById(order);
        refundPayMoney(order);
        return R.ok();
        R r = refundPayMoney(order);
        if(200 == r.getCode()){
            this.updateById(order);
        }
        return r;
    }
    
    
@@ -350,13 +359,20 @@
     * 返回订单支付金额和回退积分和会员等级
     * @param order
     */
    public void refundPayMoney(Order order){
    public R refundPayMoney(Order order){
        //开始退款
        Integer payMethod = order.getPayMethod();
        BigDecimal paymentAmount = order.getPaymentAmount();
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        if(1 == payMethod){
            //微信退款
            RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), paymentAmount.doubleValue(), "/order/order/refundPayMoneyCallback");
            if("100".equals(refund.getRa_Status())){
                order.setRefundStatus(1);
                return R.ok();
            }else{
                return R.fail(refund.getRc_CodeMsg());
            }
        }
        if(2 == payMethod){
            //余额退款
@@ -368,6 +384,13 @@
            }
            appUser.setBalance(balance.add(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
            appUser.setShopAmount(appUser.getShopAmount().subtract(paymentAmount).setScale(2, RoundingMode.HALF_EVEN));
            //查询最后一次的消费订单
            Order order1 = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, order.getAppUserId()).eq(Order::getPayStatus, 2).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(2, 3, 4, 8)).ne(Order::getId, order.getId()).last(" order by create_time desc limit 0, 1"));
            if(null != order1){
                appUser.setLastShopTime(order1.getCreateTime());
            }else{
                appUser.setLastShopTime(LocalDateTime.MIN);
            }
        
            //构建账户余额流水明细
            BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord();
@@ -381,16 +404,19 @@
            balanceChangeRecord.setCreateTime(LocalDateTime.now());
            balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord);
        }
        Integer lavePoint = appUser.getLavePoint();
        if(3 == payMethod){
            //积分退款
            appUser.setLavePoint(appUser.getLavePoint() + order.getPoint());
            //开始运费退款,积分支付,运费是单独进行支付的,所以需要单独退款
            if(null != order.getExpressAmount() && BigDecimal.ZERO.compareTo(order.getExpressAmount()) < 0){
                BigDecimal expressAmount = order.getExpressAmount();
                if(1 == order.getExpressPayMethod()){
                    //微信退款
                    RefundResult refund = PaymentUtil.refund(order.getOrderNumber(), "R" + order.getOrderNumber(), expressAmount.doubleValue(), "/order/order/refundExpressPayMoneyCallback");
                    if("100".equals(refund.getRa_Status())){
                        order.setRefundStatus(1);
                        return R.ok();
                    }else{
                        return R.fail(refund.getRc_CodeMsg());
                    }
                }
                if(2 == order.getExpressPayMethod()){
                    //余额退款
@@ -412,38 +438,209 @@
                    balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord);
                }
            }
            Integer lavePoint = appUser.getLavePoint();
            //积分退款
            appUser.setLavePoint(appUser.getLavePoint() + order.getPoint());
            appUser.setAvailablePoint(appUser.getAvailablePoint() + order.getPoint());
            UserPoint userPoint1 = new UserPoint();
            userPoint1.setType(11);
            userPoint1.setObjectId(order.getId());
            List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
            Integer transferablePoint = order.getPoint();
            if(data.size() > 0){
                UserPoint userPoint = data.get(0);
                transferablePoint = Integer.valueOf(userPoint.getExtention());
            }
            appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint);
            //构建积分流水明细
            UserPoint userPoint = new UserPoint();
            userPoint.setType(11);
            userPoint.setHistoricalPoint(lavePoint);
            userPoint.setVariablePoint(order.getPoint());
            userPoint.setBalance(appUser.getLavePoint());
            userPoint.setCreateTime(LocalDateTime.now());
            userPoint.setAppUserId(order.getAppUserId());
            userPoint.setObjectId(order.getId());
            userPointClient.saveUserPoint(userPoint);
        }
        //退回获得的消费积分
        //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
        Integer lavePoint = appUser.getLavePoint();
        Integer getPoint = order.getGetPoint();
        boolean vipDemotion = vipDemotion(appUser.getShopPoint() - getPoint, appUser.getVipId());
        PointSetting pointSetting = pointSettingClient.getPointSetting(vipDemotion ? appUser.getVipId() - 1 : appUser.getVipId()).getData();
        int earnPoint1 = getPoint;
        int earnPoint1 = 0;
        if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){
            earnPoint1 = getPoint / (100 - pointSetting.getBuyPoint());
            earnPoint1 = new BigDecimal(getPoint).divide(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue();
        }
        appUser.setLavePoint(lavePoint - getPoint);
        appUser.setShopPoint(appUser.getShopPoint() - earnPoint1);
        appUser.setTotalPoint(appUser.getTotalPoint() - earnPoint1);
        appUser.setShopPoint(appUser.getShopPoint() - getPoint);
        appUser.setLavePoint(appUser.getLavePoint() - getPoint);
        appUser.setAvailablePoint(appUser.getAvailablePoint() - earnPoint1);
        appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - earnPoint1);
        if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){
            appUser.setTransferablePoint(appUser.getTransferablePoint() - earnPoint1);
        }
        appUser.setTotalPoint(appUser.getTotalPoint() - getPoint);
        if(vipDemotion){
            appUser.setVipId(appUser.getVipId() - 1);
        }
        //构建积分流水明细
        UserPoint userPoint = new UserPoint();
        userPoint.setType(11);
        userPoint.setType(1);
        userPoint.setHistoricalPoint(lavePoint);
        Integer point = appUser.getLavePoint() - lavePoint;
        userPoint.setVariablePoint(point >= 0 ? point : point * -1);
        userPoint.setVariablePoint(getPoint);
        userPoint.setBalance(appUser.getLavePoint());
        userPoint.setCreateTime(LocalDateTime.now());
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        appUserClient.editAppUserById(appUser);
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        return R.ok();
    }
    /**
     * 取消订单后回调处理
     * @return
     */
    @Override
    public R refundPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
        if(null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6){
            return R.ok();
        }
        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        this.updateById(order);
        //退回获得的消费积分
        //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        Integer lavePoint = appUser.getLavePoint();
        Integer getPoint = order.getGetPoint();
        boolean vipDemotion = vipDemotion(appUser.getShopPoint() - getPoint, appUser.getVipId());
        PointSetting pointSetting = pointSettingClient.getPointSetting(vipDemotion ? appUser.getVipId() - 1 : appUser.getVipId()).getData();
        int earnPoint1 = 0;
        if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){
            earnPoint1 = new BigDecimal(getPoint).divide(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue();
        }
        appUser.setShopPoint(appUser.getShopPoint() - getPoint);
        appUser.setLavePoint(appUser.getLavePoint() - getPoint);
        appUser.setAvailablePoint(appUser.getAvailablePoint() - earnPoint1);
        appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - earnPoint1);
        if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){
            appUser.setTransferablePoint(appUser.getTransferablePoint() - earnPoint1);
        }
        appUser.setTotalPoint(appUser.getTotalPoint() - getPoint);
        if(vipDemotion){
            appUser.setVipId(appUser.getVipId() - 1);
        }
        //构建积分流水明细
        UserPoint userPoint = new UserPoint();
        userPoint.setType(1);
        userPoint.setHistoricalPoint(lavePoint);
        userPoint.setVariablePoint(getPoint);
        userPoint.setBalance(appUser.getLavePoint());
        userPoint.setCreateTime(LocalDateTime.now());
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        appUserClient.editAppUserById(appUser);
        return R.ok();
    }
    /**
     * 取消订单快递费回退
     * @return
     */
    @Override
    public R refundExpressPayMoneyCallback(RefundCallbackResult refundCallbackResult) {
        String code = refundCallbackResult.getR3_RefundOrderNo().substring(1);
        Order order = this.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNumber, code));
        if(null == order || order.getPayStatus() == 1 || order.getOrderStatus() == 6){
            return R.ok();
        }
        order.setRefundCode(refundCallbackResult.getR5_RefundTrxNo());
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        this.updateById(order);
        AppUser appUser = appUserClient.getAppUserById(order.getAppUserId());
        Integer lavePoint = appUser.getLavePoint();
        //积分退款
        appUser.setLavePoint(appUser.getLavePoint() + order.getPoint());
        appUser.setAvailablePoint(appUser.getAvailablePoint() + order.getPoint());
        UserPoint userPoint1 = new UserPoint();
        userPoint1.setType(11);
        userPoint1.setObjectId(order.getId());
        List<UserPoint> data = userPointClient.getUserPointList(userPoint1).getData();
        Integer transferablePoint = order.getPoint();
        if(data.size() > 0){
            UserPoint userPoint = data.get(0);
            transferablePoint = Integer.valueOf(userPoint.getExtention());
        }
        appUser.setTransferablePoint(appUser.getTransferablePoint() + transferablePoint);
        //构建积分流水明细
        UserPoint userPoint = new UserPoint();
        userPoint.setType(11);
        userPoint.setHistoricalPoint(lavePoint);
        userPoint.setVariablePoint(order.getPoint());
        userPoint.setBalance(appUser.getLavePoint());
        userPoint.setCreateTime(LocalDateTime.now());
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        //退回获得的消费积分
        //需要先检查会员等级时候回回退,使用回退后的会员等级查询配置
        lavePoint = appUser.getLavePoint();
        Integer getPoint = order.getGetPoint();
        boolean vipDemotion = vipDemotion(appUser.getShopPoint() - getPoint, appUser.getVipId());
        PointSetting pointSetting = pointSettingClient.getPointSetting(vipDemotion ? appUser.getVipId() - 1 : appUser.getVipId()).getData();
        int earnPoint1 = 0;
        if(null != pointSetting && 1 == pointSetting.getBuyPointOpen()){
            earnPoint1 = new BigDecimal(getPoint).divide(pointSetting.getBuyPoint().divide(new BigDecimal(100))).intValue();
        }
        appUser.setShopPoint(appUser.getShopPoint() - getPoint);
        appUser.setLavePoint(appUser.getLavePoint() - getPoint);
        appUser.setAvailablePoint(appUser.getAvailablePoint() - earnPoint1);
        appUser.setTotalAvailablePoint(appUser.getTotalAvailablePoint() - earnPoint1);
        if(null != pointSetting && 1 == pointSetting.getBuyPointGift()){
            appUser.setTransferablePoint(appUser.getTransferablePoint() - earnPoint1);
        }
        appUser.setTotalPoint(appUser.getTotalPoint() - getPoint);
        if(vipDemotion){
            appUser.setVipId(appUser.getVipId() - 1);
        }
        //构建积分流水明细
        userPoint = new UserPoint();
        userPoint.setType(1);
        userPoint.setHistoricalPoint(lavePoint);
        userPoint.setVariablePoint(getPoint);
        userPoint.setBalance(appUser.getLavePoint());
        userPoint.setCreateTime(LocalDateTime.now());
        userPoint.setAppUserId(order.getAppUserId());
        userPoint.setObjectId(order.getId());
        userPointClient.saveUserPoint(userPoint);
        appUserClient.editAppUserById(appUser);
        order.setRefundStatus(2);
        order.setRefundTime(LocalDateTime.now());
        return null;
    }
    /**
     * 会员降级检测
     */