javacodeadmin/PayBeforeUtil整合示例.md

287 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PayBeforeUtil 整合 BenefitPointsUtil 示例
## 整合说明
本文档展示如何在 `PayBeforeUtil.createPayBefore` 方法中整合 `BenefitPointsUtil` 的抵扣计算功能,简化原有的复杂逻辑。
## 原有代码分析
### 原有 PayBeforeUtil.createPayBefore 中的抵扣逻辑
```java
// 原有代码片段
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 简化后的代码
```java
// 整合后的代码
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 整合示例
```java
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. **性能监控**:对比整合前后的性能表现
## 测试验证
可以使用以下测试接口验证整合效果:
```http
# 测试抵扣计算
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` 中的抵扣计算逻辑,提高代码的可维护性和可读性。