From 5d818f39c862884b7087488d588fef5b7ce47386 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 28 十月 2026 18:33:55 +0800
Subject: [PATCH] feat(mes): 增加销售退货单与出库单关联功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedQualityServiceImpl.java |   37 +++++++++++++++++++++++++++++--------
 1 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedQualityServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedQualityServiceImpl.java
index 45248cf..67f0fc5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedQualityServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/seedquality/MesQcSeedQualityServiceImpl.java
@@ -193,6 +193,8 @@
         if (qualifiedWarehouse == null) throw exception(WM_WAREHOUSE_NOT_EXISTS);
         if (!MesWmWarehouseTypeEnum.QUALIFIED.getType().equals(qualifiedWarehouse.getType()))
             throw exception(WM_WAREHOUSE_TYPE_NOT_QUALIFIED);
+        // 鎻愬墠鏍¢獙鍚堟牸搴撳凡閰嶇疆搴撳尯/搴撲綅锛岄伩鍏嶅妫�瀹℃牳鏀捐鏃舵墠澶辫触
+        resolveQualifiedLocation(qualifiedWarehouse);
 
         LocalDateTime now = LocalDateTime.now();
         Long operatorId = getLoginUserId();
@@ -252,6 +254,8 @@
         if (!MesWmWarehouseTypeEnum.QUALIFIED.getType().equals(qualifiedWarehouse.getType())) {
             throw exception(WM_WAREHOUSE_TYPE_NOT_QUALIFIED);
         }
+        // 鎻愬墠鏍¢獙鍚堟牸搴撳凡閰嶇疆搴撳尯/搴撲綅锛岄伩鍏嶅妫�瀹℃牳鏀捐鏃舵墠澶辫触
+        resolveQualifiedLocation(qualifiedWarehouse);
         Set<String> codes = new HashSet<>();
         boolean passed = true;
         MesQcSeedQualityDO quality = MesQcSeedQualityDO.builder().code(bag.getCode()).itemId(batch.getItemId())
@@ -296,12 +300,10 @@
         Long qualifiedLocationId = null;
         Long qualifiedAreaId = null;
         if (passed) {
-            List<MesWmWarehouseLocationDO> locations = warehouseLocationService.getWarehouseLocationList(qualifiedWarehouse.getId());
-            if (CollUtil.isNotEmpty(locations)) {
-                qualifiedLocationId = locations.get(0).getId();
-                List<MesWmWarehouseAreaDO> areas = warehouseAreaService.getWarehouseAreaList(qualifiedLocationId);
-                if (CollUtil.isNotEmpty(areas)) qualifiedAreaId = areas.get(0).getId();
-            }
+            // 搴撳瓨浜嬪姟蹇呴』钀藉埌搴撳尯銆佸簱浣嶏紝鍚堟牸搴撶己灏戦厤缃椂鎻愬墠缁欏嚭鍙搷浣滅殑鎻愮ず
+            Long[] target = resolveQualifiedLocation(qualifiedWarehouse);
+            qualifiedLocationId = target[0];
+            qualifiedAreaId = target[1];
         }
         // 鎸夎鐮佺矑搴︽祦杞簱瀛橈細閿佸畾璇ヨ鍦ㄦ殏瀛樺簱涓殑娲诲姩鏄庣粏锛岀姝㈡寜鎵规浠绘剰鎵e噺
         MesWmMaterialStockBagDO stockBag = materialStockBagMapper.selectActiveByBagCode(bag.getCode());
@@ -688,8 +690,8 @@
      *
      * @param tempStock            浠庢殏瀛樺簱鎵e噺鍚庤繑鍥炵殑鏆傚瓨璁板綍锛堟惡甯� item/batch/vendor 缁村害锛�
      * @param qualifiedWarehouseId 鐩爣鍚堟牸搴撲粨搴撶紪鍙�
-     * @param qualifiedLocationId  鐩爣鍚堟牸搴撳簱鍖虹紪鍙凤紙鏈厤缃垯涓� null锛�
-     * @param qualifiedAreaId      鐩爣鍚堟牸搴撳簱浣嶇紪鍙凤紙鏈厤缃垯涓� null锛�
+     * @param qualifiedLocationId  鐩爣鍚堟牸搴撳簱鍖虹紪鍙�
+     * @param qualifiedAreaId      鐩爣鍚堟牸搴撳簱浣嶇紪鍙�
      */
     private MesWmMaterialStockBagDO getOrCreateStockBag(MesProBagCodeDO bag, MesWmMaterialStockDO tempStock) {
         MesWmMaterialStockBagDO stockBag = materialStockBagMapper.selectByBagCode(bag.getCode());
@@ -706,6 +708,25 @@
         return stockBag;
     }
 
+    /**
+     * 瑙f瀽鍚堟牸搴撶殑榛樿鍏ュ簱搴撳尯涓庡簱浣嶏細鍙栫涓�涓悓鏃堕厤缃簡搴撲綅鐨勯潪鍐荤粨搴撳尯銆�
+     *
+     * 璐ㄦ鎸変粨搴撶淮搴﹂�夋嫨鍏ュ簱鐩爣锛屽簱鍖�/搴撲綅鐢辩郴缁熻嚜鍔ㄨ惤鐐癸紱鍚堟牸搴撶己灏戝彲鐢ㄥ簱鍖烘垨搴撲綅鏃讹紝
+     * 搴撳瓨浜嬪姟鏃犳硶鍐欏叆锛岀洿鎺ユ彁绀虹鐞嗗憳瀹屽杽浠撳簱閰嶇疆銆�
+     */
+    private Long[] resolveQualifiedLocation(MesWmWarehouseDO qualifiedWarehouse) {
+        List<MesWmWarehouseLocationDO> locations = warehouseLocationService.getWarehouseLocationList(qualifiedWarehouse.getId())
+                .stream().filter(location -> !Boolean.TRUE.equals(location.getFrozen())).toList();
+        if (CollUtil.isEmpty(locations))
+            throw new IllegalArgumentException("鍚堟牸搴撱��" + qualifiedWarehouse.getName() + "銆嶆湭閰嶇疆鍙敤搴撳尯锛岃鍏堝湪浠撳簱绠$悊涓畬鍠勫簱鍖轰笌搴撲綅");
+        for (MesWmWarehouseLocationDO location : locations) {
+            List<MesWmWarehouseAreaDO> areas = warehouseAreaService.getWarehouseAreaList(location.getId())
+                    .stream().filter(area -> !Boolean.TRUE.equals(area.getFrozen())).toList();
+            if (CollUtil.isNotEmpty(areas)) return new Long[]{location.getId(), areas.get(0).getId()};
+        }
+        throw new IllegalArgumentException("鍚堟牸搴撱��" + qualifiedWarehouse.getName() + "銆嶆湭閰嶇疆鍙敤搴撲綅锛岃鍏堝湪浠撳簱绠$悊涓畬鍠勫簱鍖轰笌搴撲綅");
+    }
+
     private MesWmMaterialStockDO getOrCreateQualifiedStock(MesWmMaterialStockDO tempStock, Long qualifiedWarehouseId,
                                          Long qualifiedLocationId, Long qualifiedAreaId) {
         MesWmMaterialStockDO qualified = materialStockMapper.selectQualifiedByCompositeKey(

--
Gitblit v1.9.3