Browse Source

fix: 【mall】兼容纯积分订单的退款逻辑

YunaiV 6 months ago
parent
commit
887594ec2e

+ 13 - 4
yudao-module-mall/yudao-module-trade/src/main/java/cn/iocoder/yudao/module/trade/service/aftersale/AfterSaleServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.trade.service.aftersale;
 
 import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -352,12 +353,20 @@ public class AfterSaleServiceImpl implements AfterSaleService {
             throw exception(AFTER_SALE_REFUND_FAIL_STATUS_NOT_WAIT_REFUND);
         }
 
-        // 发起退款单。注意,需要在事务提交后,再进行发起,避免重复发起
-        createPayRefund(userIp, afterSale);
+        Integer newStatus;
+        if (ObjUtil.equals(afterSale.getRefundPrice(), 0)) {
+            // 特殊:退款为 0 的订单,直接标记为完成(积分商城)。关联案例:https://t.zsxq.com/AQEvL
+            updateAfterSaleStatus(afterSale.getId(), AfterSaleStatusEnum.WAIT_REFUND.getStatus(), new AfterSaleDO()
+                    .setStatus(AfterSaleStatusEnum.COMPLETE.getStatus()).setRefundTime(LocalDateTime.now()));
+            newStatus = AfterSaleStatusEnum.COMPLETE.getStatus();
+        } else {
+            // 发起退款单。注意,需要在事务提交后,再进行发起,避免重复发起
+            createPayRefund(userIp, afterSale);
+            newStatus = afterSale.getStatus();  // 特殊:这里状态不变,而是最终 updateAfterSaleRefunded 处理!!!
+        }
 
         // 记录售后日志
-        AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(),
-                afterSale.getStatus()); // 特殊:这里状态不变,而是最终 updateAfterSaleRefunded 处理!!!
+        AfterSaleLogUtils.setAfterSaleInfo(afterSale.getId(), afterSale.getStatus(), newStatus);
     }
 
     private void createPayRefund(String userIp, AfterSaleDO afterSale) {