From defe1e1c3ade87de0a7990f565f08f93aeb2decc Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 08 十一月 2026 19:31:46 +0800
Subject: [PATCH] fix(bpm): 统一审批标题单号并收紧各模块提交校验

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java |   64 ++++++++++++++++++++++++++++----
 1 files changed, 56 insertions(+), 8 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 ed787a3..3841671 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
@@ -2,16 +2,23 @@
 
 import cn.hutool.core.collection.CollUtil;
 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.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;
 import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
+import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
+import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
 import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
 import jakarta.annotation.Resource;
@@ -26,15 +33,20 @@
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 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;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_REEL_MISMATCH;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_BATCH_NOT_SHIPPED;
 
 /**
  * MES 閿�鍞��璐у崟琛� Service 瀹炵幇绫�
  *
- * @author 鑺嬮亾婧愮爜
+ * @author 瓒呯骇绠$悊鍛�
  */
 @Service
 @Validated
 public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineService {
+
+    @Resource
+    private AfterSaleTicketApi afterSaleTicketApi;
 
     @Resource
     private MesWmReturnSalesLineMapper returnSalesLineMapper;
@@ -46,6 +58,10 @@
     private MesMdmItemService mdmItemService;
     @Resource
     private MesWmBatchService batchService;
+    @Resource
+    private ErpSaleOrderApi saleOrderApi;
+    @Resource
+    private MesWmProductSalesDetailMapper productSalesDetailMapper;
     @Resource
     @Lazy
     private MesWmReturnSalesDetailService returnSalesDetailService;
@@ -82,9 +98,33 @@
      */
     private void validateLineSaveData(MesWmReturnSalesLineSaveReqVO reqVO) {
         // 鏍¢獙閫�璐у崟瀛樺湪 + 鑽夌鐘舵��
-        returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId());
+        MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId());
         // 鏍¢獙鐗╂枡瀛樺湪 + 鎵规绠$悊
-        validateItemBatchManagement(reqVO.getReturnId(), reqVO.getItemId(), reqVO.getBatchId());
+        MesWmBatchDO batch = validateItemBatchManagement(returnSales, reqVO.getItemId(), reqVO.getBatchId());
+        if (batch != null) {
+            reqVO.setBatchCode(batch.getCode());
+        }
+        if (returnSales.getSaleOrderId() != null) {
+            var items = saleOrderApi.getSaleOrderItemList(returnSales.getSaleOrderId()).getCheckedData();
+            var reelNumbers = items.stream().filter(item -> Objects.equals(reqVO.getItemId(), item.getProductId()))
+                    .map(item -> item.getReelNo()).filter(StrUtil::isNotBlank).toList();
+            if (!reelNumbers.isEmpty() && (batch == null || !reelNumbers.contains(batch.getReelNo())
+                    || (StrUtil.isNotBlank(batch.getSalesOrderCode())
+                    && !Objects.equals(returnSales.getSalesOrderCode(), batch.getSalesOrderCode())))) {
+                throw exception(WM_RETURN_SALES_REEL_MISMATCH);
+            }
+            if (!reelNumbers.isEmpty() && productSalesDetailMapper.countFinishedSaleBatch(
+                    returnSales.getSaleOrderId(), reqVO.getItemId(), batch.getId(),
+                    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);
+        }
     }
 
     @Override
@@ -150,11 +190,11 @@
     /**
      * 鏍¢獙鐗╂枡鎵规绠$悊
      *
-     * @param returnId 閫�璐у崟ID
+     * @param returnSales 閫�璐у崟
      * @param itemId   鐗╂枡ID
      * @param batchId  鎵规ID
      */
-    private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) {
+    private MesWmBatchDO validateItemBatchManagement(MesWmReturnSalesDO returnSales, Long itemId, Long batchId) {
         MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(itemId);
         // 濡傛灉鐗╂枡鍚敤浜嗘壒娆$鐞嗭紝鍒欏繀椤婚�夋嫨鎵规
         if (Boolean.TRUE.equals(item.getIsBatchManaged()) && batchId == null) {
@@ -162,10 +202,9 @@
         }
         // 鏍¢獙鎵规瀛樺湪涓斿睘浜庡綋鍓嶇墿鏂欏拰瀹㈡埛
         if (batchId != null) {
-            // 浠庣埗鍗曡幏鍙栧鎴稩D锛屾牎楠屾壒娆″綊灞�
-            MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId);
-            batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
+            return batchService.validateBatchExists(batchId, itemId);
         }
+        return null;
     }
 
     @Override
@@ -192,6 +231,7 @@
                     .setItemId(sourceLine.getItemId())
                     .setQuantity(unqualifiedQuantity)
                     .setBatchId(sourceLine.getBatchId())
+                    .setBatchCode(sourceLine.getBatchCode())
                     .setRqcId(sourceLine.getRqcId())
                     .setRqcCheckFlag(sourceLine.getRqcCheckFlag())
                     .setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus())
@@ -211,6 +251,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