用户勾选多个商品退款接口开发,整单取消逻辑修改

This commit is contained in:
Jack 2025-12-09 00:26:05 +08:00
parent 8bd8c49f38
commit fe5c884427

View File

@ -74,7 +74,6 @@ import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -3300,116 +3299,5 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
return "商品不支持退货";
}
/**
* 校验退款商品数量和金额是否有效
*
* @param shopOrderItem 订单商品项
* @param requestReturnNum 请求退款数量
* @param requestRefundAmount 请求退款金额
* @param autoCorrect 是否自动纠正(false:超出时抛出异常, true:超出时自动调整为最大可退数量/金额)
* @return 校验后的有效退款信息数组[0]为数量[1]为金额
* @throws ApiException 当autoCorrect为false且请求数量或金额超出可退范围时抛出异常
*/
private BigDecimal[] validateReturnInfo(ShopOrderItem shopOrderItem, Integer requestReturnNum, BigDecimal requestRefundAmount, boolean autoCorrect) {
// 校验请求参数有效性
if (requestReturnNum <= 0) {
throw new ApiException("退款数量必须大于0请检查商品 " + shopOrderItem.getItem_name() + " 的退款数量");
}
if (requestRefundAmount == null || requestRefundAmount.compareTo(BigDecimal.ZERO) <= 0) {
throw new ApiException("退款金额必须大于0请检查商品 " + shopOrderItem.getItem_name() + " 的退款金额");
}
// 计算可退数量和金额
Integer orderItemQuantity = shopOrderItem.getOrder_item_quantity();
Integer orderItemReturnAgreeNum = ObjectUtil.defaultIfNull(shopOrderItem.getOrder_item_return_agree_num(), 0);
Integer availableReturnNum = orderItemQuantity - orderItemReturnAgreeNum;
BigDecimal orderItemPaymentAmount = shopOrderItem.getOrder_item_payment_amount();
BigDecimal orderItemReturnAgreeAmount = ObjectUtil.defaultIfNull(shopOrderItem.getOrder_item_return_agree_amount(), BigDecimal.ZERO);
BigDecimal availableReturnAmount = orderItemPaymentAmount.subtract(orderItemReturnAgreeAmount);
// 检查是否还有可退数量
if (availableReturnNum <= 0) {
if (autoCorrect) {
return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO};
}
throw new ApiException(String.format("商品 %s 已无可退数量,无法申请退款", shopOrderItem.getItem_name()));
}
// 检查是否还有可退金额
if (availableReturnAmount.compareTo(BigDecimal.ZERO) <= 0) {
if (autoCorrect) {
return new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO};
}
throw new ApiException(String.format("商品 %s 已无可退款金额,无法申请退款", shopOrderItem.getItem_name()));
}
// 校验并处理请求退款数量是否超过可退数量
if (requestReturnNum > availableReturnNum) {
if (!autoCorrect) {
throw new ApiException(String.format("商品 %s 的退款数量超过可退数量,最多可退 %d 件",
shopOrderItem.getItem_name(), availableReturnNum));
}
// 按比例调整退款金额
BigDecimal ratio = BigDecimal.valueOf(availableReturnNum)
.divide(BigDecimal.valueOf(requestReturnNum), 6, RoundingMode.HALF_UP);
BigDecimal correctedAmount = requestRefundAmount.multiply(ratio);
return new BigDecimal[]{BigDecimal.valueOf(availableReturnNum), correctedAmount};
}
// 校验并处理请求退款金额是否超过可退金额
if (requestRefundAmount.compareTo(availableReturnAmount) > 0) {
if (!autoCorrect) {
throw new ApiException(String.format("商品 %s 的退款金额超过可退金额,最多可退 %.2f 元",
shopOrderItem.getItem_name(), availableReturnAmount));
}
return new BigDecimal[]{BigDecimal.valueOf(requestReturnNum), availableReturnAmount};
}
return new BigDecimal[]{BigDecimal.valueOf(requestReturnNum), requestRefundAmount};
}
/**
* 校验退款商品数量是否有效专用于仅校验数量的场景
*
* @param shopOrderItem 订单商品项
* @param requestReturnNum 请求退款数量
* @param autoCorrect 是否自动纠正数量(false:超出时抛出异常, true:超出时自动调整为最大可退数量)
* @return 校验后的有效退款数量
* @throws ApiException 当autoCorrect为false且请求数量超出可退数量时抛出异常
*/
private Integer validateReturnQuantity(ShopOrderItem shopOrderItem, Integer requestReturnNum, boolean autoCorrect) {
// 校验请求参数有效性
if (requestReturnNum <= 0) {
throw new ApiException("退款数量必须大于0请检查商品 " + shopOrderItem.getItem_name() + " 的退款数量");
}
// 计算可退数量
Integer orderItemQuantity = shopOrderItem.getOrder_item_quantity();
Integer orderItemReturnAgreeNum = ObjectUtil.defaultIfNull(shopOrderItem.getOrder_item_return_agree_num(), 0);
Integer availableReturnNum = orderItemQuantity - orderItemReturnAgreeNum;
// 检查是否还有可退数量
if (availableReturnNum <= 0) {
if (autoCorrect) {
return 0;
}
throw new ApiException(String.format("商品 %s 已无可退数量,无法申请退款", shopOrderItem.getItem_name()));
}
// 校验并处理请求退款数量是否超过可退数量
if (requestReturnNum > availableReturnNum) {
if (!autoCorrect) {
throw new ApiException(String.format("商品 %s 的退款数量超过可退数量,最多可退 %d 件",
shopOrderItem.getItem_name(), availableReturnNum));
}
return availableReturnNum;
}
return requestReturnNum;
}
}