商家主动退货 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())) { if (StrUtil.isBlank(trade_row.getTrade_title())) {
trade_row.setTrade_title("小发同城线上超市商品"); trade_row.setTrade_title("小发同城线上订单商品");
trade_row.setTrade_desc("小发同城线上超市商品"); trade_row.setTrade_desc("小发同城线上订单商品");
} }
// 设置店铺ID // 设置店铺ID

View File

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