javacodeadmin/PayBeforeUtil整合示例.md

12 KiB
Raw Permalink Blame History

PayBeforeUtil 整合 BenefitPointsUtil 示例

整合说明

本文档展示如何在 PayBeforeUtil.createPayBefore 方法中整合 BenefitPointsUtil 的抵扣计算功能,简化原有的复杂逻辑。

原有代码分析

原有 PayBeforeUtil.createPayBefore 中的抵扣逻辑

// 原有代码片段
try {
    SiteConfig configQuery = new SiteConfig();
    configQuery.setName("config_one");
    List<SiteConfig> configList = siteConfigService.selectSiteConfigList(configQuery);
    if (configList != null && !configList.isEmpty()) {
        String configValue = configList.get(0).getValue();
        if (configValue != null && !configValue.trim().isEmpty()) {
            com.alibaba.fastjson2.JSONObject configJson = com.alibaba.fastjson2.JSONObject.parseObject(configValue);
            
            // 服务金抵扣
            if (servicetype != null && servicetype == 1) {
                Integer serviceFee = configJson.getInteger("servicefee");
                if (serviceFee != null && serviceFee > 0) {
                    Users userDb = usersService.selectUsersById(user.getId());
                    if (userDb != null && userDb.getServicefee() != null && userDb.getServicefee().compareTo(BigDecimal.ZERO) > 0) {
                        BigDecimal serviceRate = BigDecimal.valueOf(serviceFee).divide(BigDecimal.valueOf(100), 4, BigDecimal.ROUND_HALF_UP);
                        serviceMoney = userDb.getServicefee().multiply(serviceRate);
                    }
                }
            }
            
            // 购物金抵扣
            if (servicetype != null && servicetype == 2) {
                Integer consumption = configJson.getInteger("consumption");
                if (consumption != null && consumption > 0) {
                    Users userDb = usersService.selectUsersById(user.getId());
                    if (userDb != null && userDb.getConsumption() != null && userDb.getConsumption().compareTo(BigDecimal.ZERO) > 0) {
                        BigDecimal consumptionRate = BigDecimal.valueOf(consumption).divide(BigDecimal.valueOf(100), 4, BigDecimal.ROUND_HALF_UP);
                        shopMoney = userDb.getConsumption().multiply(consumptionRate);
                    }
                }
            }
        }
    }
} catch (Exception e) {
    // 异常处理
}

整合后的代码

使用 BenefitPointsUtil 简化后的代码

// 整合后的代码
try {
    // 使用 BenefitPointsUtil 进行抵扣计算
    BenefitPointsUtil.BenefitDeductionResult deductionResult = 
        BenefitPointsUtil.getBenefitDeduction(user, amount, servicetype);
    
    if (deductionResult.isSuccess()) {
        serviceMoney = deductionResult.getServiceMoney();  // 服务金抵扣金额
        shopMoney = deductionResult.getShopMoney();       // 消费金抵扣金额
        BigDecimal finalAmount = deductionResult.getFinalAmount(); // 最终支付金额
        
        log.info("【抵扣计算】用户ID: {}, 原金额: {}, 服务金抵扣: {}, 消费金抵扣: {}, 最终金额: {}", 
                user.getId(), amount, serviceMoney, shopMoney, finalAmount);
    } else {
        log.warn("【抵扣计算失败】用户ID: {}, 错误: {}", user.getId(), deductionResult.getMessage());
        serviceMoney = BigDecimal.ZERO;
        shopMoney = BigDecimal.ZERO;
    }
} catch (Exception e) {
    log.error("【抵扣计算异常】用户ID: {}, 异常: {}", user.getId(), e.getMessage(), e);
    serviceMoney = BigDecimal.ZERO;
    shopMoney = BigDecimal.ZERO;
}

完整的 PayBeforeUtil 整合示例

package com.ruoyi.system.ControllerUtil;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SiteConfig;
import com.ruoyi.system.domain.Users;
import com.ruoyi.system.domain.UsersPayBefor;
import com.ruoyi.system.service.IUsersPayBeforService;
import com.ruoyi.system.service.ISiteConfigService;
import com.ruoyi.system.service.IUsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import com.ruoyi.system.domain.OrderLog;

/**
 * 预支付工具类(整合版本)
 *
 * @author ruoyi
 * @date 2025-07-17
 */
@Component
public class PayBeforeUtil {

    private static final IUsersPayBeforService usersPayBeforService = SpringUtils.getBean(IUsersPayBeforService.class);
    private static final ISiteConfigService siteConfigService = SpringUtils.getBean(ISiteConfigService.class);
    private static final IUsersService usersService = SpringUtils.getBean(IUsersService.class);

    /**
     * 创建预支付记录(整合版本)
     *
     * @param user 用户信息
     * @param amount 支付金额
     * @param orderId 订单号
     * @param oid 订单ID
     * @param serviceId 服务ID
     * @param orderType 订单类型
     * @param sku SKU规格信息
     * @param grouporderid 拼团订单ID
     * @param addressid 地址ID
     * @param maketime 预约时间
     * @param attachments 附件信息
     * @param servicetype 服务类型1=服务金抵扣2=消费金抵扣
     * @param baojiaid 报价ID
     * @param lastorderid 上一个订单ID
     * @return 预支付记录ID失败返回null
     */
    public String createPayBefore(Users user, BigDecimal amount, String orderId, Long oid,
                               Long serviceId, Long orderType, String sku, String grouporderid,
                               Long addressid, String maketime, String attachments, Long servicetype, 
                               Long baojiaid, String lastorderid) {
        try {
            // 计算会员优惠和服务金抵扣
            BigDecimal memberMoney = BigDecimal.ZERO;
            BigDecimal serviceMoney = BigDecimal.ZERO;
            BigDecimal shopMoney = BigDecimal.ZERO;
            
            // 使用 BenefitPointsUtil 进行抵扣计算
            try {
                BenefitPointsUtil.BenefitDeductionResult deductionResult = 
                    BenefitPointsUtil.getBenefitDeduction(user, amount, servicetype);
                
                if (deductionResult.isSuccess()) {
                    serviceMoney = deductionResult.getServiceMoney();  // 服务金抵扣金额
                    shopMoney = deductionResult.getShopMoney();       // 消费金抵扣金额
                    
                    System.out.println("【抵扣计算成功】用户ID: " + user.getId() + 
                                     ", 服务金抵扣: " + serviceMoney + 
                                     ", 消费金抵扣: " + shopMoney);
                } else {
                    System.out.println("【抵扣计算失败】用户ID: " + user.getId() + 
                                     ", 错误: " + deductionResult.getMessage());
                }
            } catch (Exception e) {
                System.out.println("【抵扣计算异常】用户ID: " + user.getId() + ", 异常: " + e.getMessage());
                serviceMoney = BigDecimal.ZERO;
                shopMoney = BigDecimal.ZERO;
            }
            
            // 会员优惠计算(保持原有逻辑)
            try {
                SiteConfig configQuery = new SiteConfig();
                configQuery.setName("config_one");
                List<SiteConfig> configList = siteConfigService.selectSiteConfigList(configQuery);
                if (configList != null && !configList.isEmpty()) {
                    String configValue = configList.get(0).getValue();
                    if (configValue != null && !configValue.trim().isEmpty()) {
                        JSONObject configJson = JSONObject.parseObject(configValue);
                        
                        // 会员优惠
                        if (user.getIsmember() != null && user.getIsmember() == 1) {
                            Integer memberDiscount = configJson.getInteger("member_discount");
                            if (memberDiscount != null && memberDiscount > 0) {
                                BigDecimal discountRate = BigDecimal.valueOf(memberDiscount)
                                    .divide(BigDecimal.valueOf(100), 4, BigDecimal.ROUND_HALF_UP);
                                memberMoney = amount.multiply(discountRate);
                            }
                        }
                    }
                }
            } catch (Exception e) {
                memberMoney = BigDecimal.ZERO;
                System.out.println("【会员优惠计算异常】用户ID: " + user.getId() + ", 异常: " + e.getMessage());
            }
            
            // 计算最终支付金额
            BigDecimal finalAmount = amount.subtract(memberMoney).subtract(serviceMoney).subtract(shopMoney);
            if (finalAmount.compareTo(BigDecimal.ZERO) < 0) {
                finalAmount = BigDecimal.ZERO;
            }
            
            System.out.println("【最终计算】用户ID: " + user.getId() + 
                             ", 原金额: " + amount + 
                             ", 会员优惠: " + memberMoney + 
                             ", 服务金抵扣: " + serviceMoney + 
                             ", 消费金抵扣: " + shopMoney + 
                             ", 最终金额: " + finalAmount);
            
            // 创建预支付记录
            UsersPayBefor payBefore = new UsersPayBefor();
            payBefore.setUid(user.getId());
            payBefore.setAmount(finalAmount);
            payBefore.setOrderId(orderId);
            payBefore.setOid(oid);
            payBefore.setServiceId(serviceId);
            payBefore.setOrderType(orderType);
            payBefore.setSku(sku);
            payBefore.setGrouporderid(grouporderid);
            payBefore.setAddressid(addressid);
            payBefore.setMaketime(maketime);
            payBefore.setAttachments(attachments);
            payBefore.setServicetype(servicetype);
            payBefore.setBaojiaid(baojiaid);
            payBefore.setLastorderid(lastorderid);
            payBefore.setStatus(1L); // 待支付状态
            payBefore.setCreatedAt(new Date());
            payBefore.setUpdatedAt(new Date());
            
            int insertResult = usersPayBeforService.insertUsersPayBefor(payBefore);
            if (insertResult > 0) {
                System.out.println("【预支付创建成功】用户ID: " + user.getId() + ", 预支付ID: " + payBefore.getId());
                return payBefore.getId().toString();
            } else {
                System.out.println("【预支付创建失败】用户ID: " + user.getId());
                return null;
            }
            
        } catch (Exception e) {
            System.out.println("【预支付创建异常】用户ID: " + user.getId() + ", 异常: " + e.getMessage());
            return null;
        }
    }
    
    // 其他方法保持不变...
}

整合优势

1. 代码简化

  • 原有代码:约 50 行复杂的配置解析和抵扣计算逻辑
  • 整合后代码:约 10 行简洁的调用逻辑

2. 功能增强

  • 统一配置管理:所有抵扣相关配置统一在 BenefitPointsUtil 中处理
  • 错误处理完善:提供详细的错误信息和日志记录
  • 类型安全:使用 BigDecimal 确保金额计算精度

3. 维护性提升

  • 逻辑集中:抵扣计算逻辑集中在 BenefitPointsUtil
  • 易于测试:提供专门的测试接口
  • 易于扩展:可以轻松添加新的抵扣类型

4. 性能优化

  • 减少重复查询:避免重复查询用户信息和配置信息
  • 缓存友好:为后续添加配置缓存奠定基础

使用建议

  1. 逐步迁移:建议先在测试环境中验证整合效果
  2. 保留原有逻辑:在完全验证前,可以保留原有逻辑作为备选
  3. 监控日志:密切关注抵扣计算的日志输出
  4. 性能监控:对比整合前后的性能表现

测试验证

可以使用以下测试接口验证整合效果:

# 测试抵扣计算
POST /system/benefit/test/deduction
Content-Type: application/x-www-form-urlencoded

userId=123&amount=100.00&serviceType=1

# 测试余额查询
GET /system/benefit/test/balance/123

通过这种整合方式,可以大大简化 PayBeforeUtil 中的抵扣计算逻辑,提高代码的可维护性和可读性。