From 14c80fbd16a51a355138345ecf69df9ca37746bf Mon Sep 17 00:00:00 2001
From: xiaoyi <908147524@qq.com>
Date: 星期五, 06 十一月 2026 09:18:32 +0800
Subject: [PATCH] 完善售后退货联动和订单作废保护

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java |   22 ++++++++++++++++++++--
 1 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
index d56b908..1d77b1a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
@@ -14,16 +14,20 @@
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
 import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
+import cn.iocoder.yudao.module.aftersales.api.AfterSaleTicketApi;
 import jakarta.annotation.Resource;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_BATCH_REQUIRED;
 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_LINE_NOT_EXISTS;
 
@@ -49,6 +53,8 @@
     @Resource
     @Lazy
     private MesWmReturnSalesDetailService returnSalesDetailService;
+    @Resource
+    private ObjectProvider<AfterSaleTicketApi> afterSaleTicketApiProvider;
 
     @Override
     public Long createReturnSalesLine(MesWmReturnSalesLineSaveReqVO createReqVO) {
@@ -169,6 +175,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updateReturnSalesLineWhenRqcFinish(Long sourceLineId, Long sourceDocId, Integer checkResult,
                                                     BigDecimal qualifiedQuantity, BigDecimal unqualifiedQuantity) {
         MesWmReturnSalesLineDO sourceLine = validateReturnSalesLineExists(sourceLineId);
@@ -207,10 +214,21 @@
         // 2. 妫�鏌ラ��璐у崟涓嬫槸鍚﹁繕鏈夊緟妫�楠岀殑琛岋紝鑻ュ叏妫�瀹屽垯灏嗛��璐у崟鐘舵�佽涓�"寰呬笂鏋�"
         if (sourceDocId != null) {
             List<MesWmReturnSalesLineDO> allLines = returnSalesLineMapper.selectListByReturnId(sourceDocId);
-            boolean allInspected = !CollUtil.contains(allLines,
-                    line -> Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus()));
+            boolean allInspected = CollUtil.isNotEmpty(allLines) && allLines.stream().allMatch(line ->
+                    Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PASS.getStatus())
+                    || Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.FAIL.getStatus()));
             if (allInspected) {
                 returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVING.getStatus());
+                MesWmReturnSalesDO source = returnSalesService.validateReturnSalesExists(sourceDocId);
+                if (source.getAfterSaleReturnId() != null) {
+                    AfterSaleTicketApi api = afterSaleTicketApiProvider.getIfAvailable();
+                    if (api == null) throw invalidParamException("鍞悗鏈嶅姟涓嶅彲鐢紝鏃犳硶鍚屾閫�璐ф楠岀粨鏋�");
+                    boolean hasFailed = allLines.stream().anyMatch(line ->
+                            Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.FAIL.getStatus()));
+                    var response = api.onReturnQualityFinished(source.getAfterSaleReturnId(), hasFailed ? "瀛樺湪涓嶅悎鏍�" : "鍚堟牸", null);
+                    if (response == null || !Boolean.TRUE.equals(response.getCheckedData()))
+                        throw invalidParamException("鍞悗閫�璐ф楠岀粨鏋滃悓姝ュけ璐�");
+                }
             }
         }
     }

--
Gitblit v1.9.3