商家主动退货 fix bug

This commit is contained in:
Jack 2025-07-31 22:12:39 +08:00
parent a6c9fc0dba
commit f8e923606a
2 changed files with 37 additions and 20 deletions

View File

@ -285,8 +285,8 @@ public class PayUserPayServiceImpl extends BaseServiceImpl<PayUserPayMapper, Pay
// }
if (StrUtil.isBlank(trade_row.getTrade_title())) {
trade_row.setTrade_title("小发同城线上超市商品");
trade_row.setTrade_desc("小发同城线上超市商品");
trade_row.setTrade_title("小发同城线上订单商品");
trade_row.setTrade_desc("小发同城线上订单商品");
}
// 设置店铺ID

View File

@ -2259,6 +2259,7 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
*/
@Override
public CommonResult doRefundForMch(JSONObject requestParams) {
log.debug("##########商家主动退款##########");
try {
// === 1. 参数校验 ===
if (requestParams == null || StrUtil.isBlank(requestParams.getStr("order_id"))) {
@ -2278,13 +2279,17 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
}
if (orderInfo.getOrder_state_id() != null && orderInfo.getOrder_state_id() >= StateCode.ORDER_STATE_SHIPPED) {
return CommonResult.failed("订单状态,无法退款");
return CommonResult.failed("该订单(状态)无法退款");
}
if (orderInfo.getStore_id() != null && !orderInfo.getStore_id().equals(Convert.toInt(currentUser.getStore_id()))) {
return CommonResult.failed("无权处理其他店铺订单");
}
List<ShopOrderItem> orderItems = shopOrderItemService.find(new QueryWrapper<ShopOrderItem>().eq("order_id", orderId));
if (CollectionUtil.isEmpty(orderItems)) return CommonResult.failed("订单没有可退货的商品");
// === 3. 检查退货单 ===
ShopOrderReturn refundOrder = findOne(new QueryWrapper<ShopOrderReturn>()
.eq("order_id", orderId)
@ -2292,48 +2297,60 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl<ShopOrderReturnM
.orderByDesc("return_id"));
// === 4. 处理退款商品 ===
OrderReturnInputVo partialRefund = null;
OrderReturnInputVo orderReturnInputVo = null;
// 是否部分退款
boolean isPartialRefund = false;
int partialRefundItemCnt = 0;
// 退款商品种类的数量
// int partialRefundItemCnt = 0;
// 退款商品数量
BigDecimal refundGoodsAmount = BigDecimal.ZERO;
// 订单商品总金额
BigDecimal orderGoodsAmount = orderItems.stream().map(ShopOrderItem::getOrder_item_amount).reduce(BigDecimal.ZERO, BigDecimal::add);
if (StrUtil.isNotBlank(requestParams.getStr("order_return_vo"))) {
partialRefund = JSONUtil.toBean(requestParams.getStr("order_return_vo"), OrderReturnInputVo.class);
isPartialRefund = partialRefund != null && CollectionUtil.isNotEmpty(partialRefund.getReturn_items());
partialRefundItemCnt = isPartialRefund ? partialRefund.getReturn_items().size() : 0;
orderReturnInputVo = JSONUtil.toBean(requestParams.getStr("order_return_vo"), OrderReturnInputVo.class);
// 传入参数商品种类数量>0的
isPartialRefund = orderReturnInputVo != null && CollectionUtil.isNotEmpty(orderReturnInputVo.getReturn_items());
}
List<ShopOrderItem> orderItems = shopOrderItemService.find(new QueryWrapper<ShopOrderItem>().eq("order_id", orderId));
if (CollectionUtil.isEmpty(orderItems)) return CommonResult.failed("订单没有可退货的商品");
isPartialRefund = isPartialRefund && orderItems.size() != partialRefundItemCnt;
String reason = StrUtil.isBlank(requestParams.getStr("reason")) ?
(isPartialRefund ? "商家部分商品退款" : "商家整单退款") :
requestParams.getStr("reason");
String reason = requestParams.getStr("reason");
// === 5. 创建新退货单如不存在 ===
if (refundOrder == null) {
OrderReturnInputVo refundRequest = new OrderReturnInputVo();
refundRequest.setOrder_id(orderId);
refundRequest.setReturn_buyer_message(reason);
refundRequest.setUser_id(orderInfo.getBuyer_user_id());
if (isPartialRefund) {
// 单个订单退款
List<Long> validItemIds = orderItems.stream().map(ShopOrderItem::getOrder_item_id).collect(Collectors.toList());
if (!partialRefund.getReturn_items().stream()
orderReturnInputVo.getReturn_items().stream()
.allMatch(item -> validItemIds.contains(item.getOrder_item_id())
&& item.getReturn_refund_amount().compareTo(BigDecimal.ZERO) > 0
&& item.getReturn_item_num() > 0)) {
return CommonResult.failed("退货商品或金额无效");
&& item.getReturn_item_num() > 0);
List<OrderReturnItemInputVo> orderReturnItems = orderReturnInputVo.getReturn_items();
refundGoodsAmount = orderReturnItems.stream().map(OrderReturnItemInputVo::getReturn_refund_amount).reduce(BigDecimal.ZERO, BigDecimal::add);
if (refundGoodsAmount.compareTo(orderGoodsAmount) > 0) {
return CommonResult.failed("退款金额有误!");
}
refundRequest.setReturn_items(partialRefund.getReturn_items());
refundRequest.setReturn_buyer_message(StrUtil.isBlank(reason) ? "订单部分商品退款" : reason);
refundRequest.setReturn_items(orderReturnInputVo.getReturn_items());
} else {
// 整单退款
String finalReason = reason;
orderItems.forEach(item -> {
OrderReturnItemInputVo itemVo = new OrderReturnItemInputVo();
itemVo.setOrder_item_id(item.getOrder_item_id());
itemVo.setReturn_item_num(item.getOrder_item_quantity());
itemVo.setReturn_refund_amount(item.getOrder_item_payment_amount());
refundRequest.setReturn_buyer_message(StrUtil.isBlank(finalReason) ? "订单部分商品退款" : finalReason);
refundRequest.getReturn_items().add(itemVo);
});
}