From f02d0df2f1dfc7a8b775cf50d45375e57628a5ef Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 10 十一月 2026 11:26:22 +0800
Subject: [PATCH] feat(ncr): 完善NCR处置联动逻辑与关闭校验

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java |   41 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 38 insertions(+), 3 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 c80507d..e8663fc 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
@@ -4,7 +4,11 @@
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
+import cn.iocoder.yudao.module.aftersales.api.AfterSaleTicketApi;
+import cn.iocoder.yudao.module.aftersales.api.dto.AfterSaleWarehouseReturnStageReqDTO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO;
 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
@@ -42,6 +46,9 @@
 @Service
 @Validated
 public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineService {
+
+    @Resource
+    private AfterSaleTicketApi afterSaleTicketApi;
 
     @Resource
     private MesWmReturnSalesLineMapper returnSalesLineMapper;
@@ -113,6 +120,12 @@
                     MesWmProductSalesStatusEnum.FINISHED.getStatus()) == 0) {
                 throw exception(WM_RETURN_SALES_BATCH_NOT_SHIPPED);
             }
+            // 鎵嬪伐鍏ュ簱鎵规鍙兘娌℃湁瀹㈡埛锛涗粎鍦ㄨ鍗曠洏鍙峰強宸插畬鎴愬嚭搴撻兘宸查獙璇佸悗鍏佽閫�璐с��
+            if (batch != null && (batch.getClientId() != null || reelNumbers.isEmpty())) {
+                batchService.validateBatchExists(batch.getId(), reqVO.getItemId(), returnSales.getClientId(), null);
+            }
+        } else if (batch != null) {
+            batchService.validateBatchExists(batch.getId(), reqVO.getItemId(), returnSales.getClientId(), null);
         }
     }
 
@@ -179,7 +192,7 @@
     /**
      * 鏍¢獙鐗╂枡鎵规绠$悊
      *
-     * @param returnId 閫�璐у崟ID
+     * @param returnSales 閫�璐у崟
      * @param itemId   鐗╂枡ID
      * @param batchId  鎵规ID
      */
@@ -191,10 +204,24 @@
         }
         // 鏍¢獙鎵规瀛樺湪涓斿睘浜庡綋鍓嶇墿鏂欏拰瀹㈡埛
         if (batchId != null) {
-            // 浠庣埗鍗曡幏鍙栧鎴稩D锛屾牎楠屾壒娆″綊灞�
-            return batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
+            return batchService.validateBatchExists(batchId, itemId);
         }
         return null;
+    }
+
+    @Override
+    public void bindRqcForFinish(Long lineId, Long returnId, Long rqcId, Long itemId, BigDecimal checkQuantity) {
+        MesWmReturnSalesLineDO line = returnSalesLineMapper.selectOne(new LambdaQueryWrapperX<MesWmReturnSalesLineDO>()
+                .eq(MesWmReturnSalesLineDO::getId, lineId).last("FOR UPDATE"));
+        if (line == null || !Objects.equals(line.getReturnId(), returnId)
+                || !Objects.equals(line.getItemId(), itemId)
+                || !Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus())
+                || (line.getRqcId() != null && !Objects.equals(line.getRqcId(), rqcId))
+                || line.getQuantity() == null || checkQuantity == null
+                || line.getQuantity().compareTo(checkQuantity) != 0) {
+            throw new ServiceException(400, "閫�璐ф楠岄』瀵瑰簲鍞竴寰呮閫�璐ц锛岀墿鏂欏拰妫�楠屾暟閲忓繀椤讳笌閫�璐ц涓�鑷�");
+        }
+        returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO().setId(lineId).setRqcId(rqcId));
     }
 
     @Override
@@ -241,6 +268,14 @@
                     line -> Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.PENDING.getStatus()));
             if (allInspected) {
                 returnSalesService.updateReturnSalesStatus(sourceDocId, MesWmReturnSalesStatusEnum.APPROVING.getStatus());
+                MesWmReturnSalesDO returnSales = returnSalesService.getReturnSales(sourceDocId);
+                if (returnSales != null && returnSales.getSaleOrderId() != null) {
+                    afterSaleTicketApi.onWarehouseReturnQualityFinished(new AfterSaleWarehouseReturnStageReqDTO()
+                            .setSaleOrderId(returnSales.getSaleOrderId())
+                            .setReturnSalesId(returnSales.getId())
+                            .setReturnSalesCode(returnSales.getCode())
+                            .setQualityResult("鍏ㄩ儴寰呮琛屽凡瀹屾垚妫�楠�"));
+                }
             }
         }
     }

--
Gitblit v1.9.3