用户勾选多个商品退款接口开发,整单取消逻辑修改
This commit is contained in:
parent
8bd8c49f38
commit
fe5c884427
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user