12 KiB
12 KiB
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. 性能优化
- 减少重复查询:避免重复查询用户信息和配置信息
- 缓存友好:为后续添加配置缓存奠定基础
使用建议
- 逐步迁移:建议先在测试环境中验证整合效果
- 保留原有逻辑:在完全验证前,可以保留原有逻辑作为备选
- 监控日志:密切关注抵扣计算的日志输出
- 性能监控:对比整合前后的性能表现
测试验证
可以使用以下测试接口验证整合效果:
# 测试抵扣计算
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 中的抵扣计算逻辑,提高代码的可维护性和可读性。