diff --git a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java index 5eed110f..5eaa6e7a 100644 --- a/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java +++ b/mall-pay/src/main/java/com/suisung/mall/pay/service/impl/PayUserPayServiceImpl.java @@ -285,8 +285,8 @@ public class PayUserPayServiceImpl extends BaseServiceImpl= 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 orderItems = shopOrderItemService.find(new QueryWrapper().eq("order_id", orderId)); + if (CollectionUtil.isEmpty(orderItems)) return CommonResult.failed("订单没有可退货的商品"); + + // === 3. 检查退货单 === ShopOrderReturn refundOrder = findOne(new QueryWrapper() .eq("order_id", orderId) @@ -2292,48 +2297,60 @@ public class ShopOrderReturnServiceImpl extends BaseServiceImpl0的 + isPartialRefund = orderReturnInputVo != null && CollectionUtil.isNotEmpty(orderReturnInputVo.getReturn_items()); } - List orderItems = shopOrderItemService.find(new QueryWrapper().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 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 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); }); }