From ad4fb70a79a07d494de4b3183ff6cf00d94aab08 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期二, 28 四月 2026 20:23:44 +0800
Subject: [PATCH] 数字孪生库区完善

---
 src/main/java/com/zy/common/service/CommonService.java |  456 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 390 insertions(+), 66 deletions(-)

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index b0132dd..2f2aae0 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -28,6 +28,7 @@
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -168,7 +169,10 @@
     }
 
     /**
-     * 妫�绱㈠簱浣嶅彿
+     * 鍏ュ簱鎵惧簱浣嶇粺涓�鍏ュ彛銆�
+     *
+     * 绌烘墭鐩樺叆搴撲篃浠庤繖閲岃繘鍏ワ紝鍏堢敱 {@link #normalizeLocTypeDto(Integer, FindLocNoAttributeVo, LocTypeDto)}
+     * 缁熶竴璇嗗埆绌烘墭鐩樺拰鏁寸悊搴撲綅瑙勬牸锛屽啀鎸� row_lastno_type 鍒嗘祦鍒颁笉鍚屽簱鍨嬬殑鎵句綅瀹炵幇銆�
      *
      * @param staDescId            璺緞ID
      * @param sourceStaNo          婧愮珯
@@ -201,9 +205,9 @@
             switch (rowLastnoType.getType()) {
                 case 1:
                 case 2:
-                    return getLocNoRun2(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, recommendRows, 0);
                 case 3:
-                    return getLocNoRun(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, 0);
+                    return getLocNoRun2(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 0, locTypeDto, recommendRows, 0);
+
                 case 4:
                     return getLocNoRun4(whsType, staDescId, sourceStaNo, findLocNoAttributeVo, 4, locTypeDto, 0);
                 case 5:
@@ -221,12 +225,32 @@
     }
 
     /**
-     * 渚� 6.15 閲嶅垎閰嶆帴鍙e鐢細鎸夊閮ㄦ寚瀹氱殑鍫嗗灈鏈洪『搴忥紝鍦ㄦ寚瀹氬簱鍖哄唴鎵炬柊鐨勫叆搴撲綅銆�
+     * 渚涢噸鍒嗛厤鎺ュ彛澶嶇敤锛氭寜澶栭儴鎸囧畾鐨勫爢鍨涙満椤哄簭鎵炬柊鐨勫叆搴撲綅銆�
      *
      * 杩欓噷涓嶆帹杩� row_lastno 娓告爣锛屽彧璐熻矗涓�娆℃�х殑璺緞鏍¢獙 + 璁惧鏍¢獙 + 绌哄簱浣嶆悳绱€��
      */
+    public StartupDto findRun2InboundLocByCandidateCrnNos(Integer sourceStaNo, Integer staDescId,
+                                                          List<Integer> candidateCrnNos, LocTypeDto locTypeDto) {
+        return findRun2InboundLocByCandidateCrnNos(sourceStaNo, staDescId, null, candidateCrnNos, locTypeDto, null);
+    }
+
+    public StartupDto findRun2InboundLocByCandidateCrnNos(Integer sourceStaNo, Integer staDescId,
+                                                          List<Integer> candidateCrnNos, LocTypeDto locTypeDto,
+                                                          Integer targetLev) {
+        return findRun2InboundLocByCandidateCrnNos(sourceStaNo, staDescId, null, candidateCrnNos, locTypeDto, targetLev);
+    }
+
+    /**
+     * 鍏煎鏃ц皟鐢細鎸夊閮ㄦ寚瀹氱殑鍫嗗灈鏈洪『搴忥紝鍦ㄦ寚瀹氬簱鍖哄唴鎵炬柊鐨勫叆搴撲綅銆�
+     */
     public StartupDto findRun2InboundLocByCandidateCrnNos(Integer sourceStaNo, Integer staDescId, Integer preferredArea,
                                                           List<Integer> candidateCrnNos, LocTypeDto locTypeDto) {
+        return findRun2InboundLocByCandidateCrnNos(sourceStaNo, staDescId, preferredArea, candidateCrnNos, locTypeDto, null);
+    }
+
+    private StartupDto findRun2InboundLocByCandidateCrnNos(Integer sourceStaNo, Integer staDescId, Integer preferredArea,
+                                                           List<Integer> candidateCrnNos, LocTypeDto locTypeDto,
+                                                           Integer targetLev) {
         if (sourceStaNo == null) {
             throw new CoolException("婧愮珯涓嶈兘涓虹┖");
         }
@@ -250,12 +274,9 @@
         if (Cools.isEmpty(rowLastnoType)) {
             throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===銆嬪簱浣嶈鍒欑被鍨嬫湭鐭�");
         }
-        if (rowLastnoType.getType() != 1 && rowLastnoType.getType() != 2) {
-            throw new CoolException("褰撳墠浠撳簱涓嶆敮鎸侀噸鏂板垎閰嶅叆搴撲綅");
-        }
         StartupDto startupDto = new StartupDto();
         LocMast locMast = findRun2EmptyLocByCrnNos(searchRowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
-                staDescId, sourceStaNo, startupDto, preferredArea, null, "reassign-inbound");
+                staDescId, sourceStaNo, startupDto, preferredArea, null, "reassign-inbound", targetLev);
         if (Cools.isEmpty(locMast) || !"O".equals(locMast.getLocSts())) {
             return null;
         }
@@ -281,8 +302,8 @@
      * 缁熶竴鏁寸悊鍏ュ簱瑙勬牸锛岄伩鍏嶄笉鍚屽叆鍙d紶鍏ョ殑 locType 涓嶄竴鑷淬��
      *
      * 绌烘墭鐩樼殑搴撲綅绛栫暐鏈変袱娈碉細
-     * 1. 棣栬疆鍙檺鍒� loc_type2=1锛岃〃绀轰紭鍏堟壘绐勫簱浣嶃��
-     * 2. loc_type1 楂樺害淇℃伅蹇呴』淇濈暀锛屽悗缁啀鎸変綆浣嶅悜楂樹綅鍏煎銆�
+     * 1. 鍏堥檺鍒� loc_type2=1锛岃〃绀轰紭鍏堟壘绐勫簱浣嶏紝骞朵繚鐣� loc_type1 楂樺害鍏煎銆�
+     * 2. 绐勫簱浣嶆病鏈夌粨鏋滃悗锛屾妸 loc_type1 鏀逛负 3 鍐嶆壘搴撲綅銆�
      *
      * 闈炵┖鎵樼洏鍙繚鐣� loc_type1锛屾弧鎵樻壘浣嶄笉鍐嶄娇鐢� loc_type2/loc_type3 杩囨护銆�
      */
@@ -313,11 +334,10 @@
     }
 
     /**
-     * 绌烘墭鐩樺浐瀹氭寜 4 娈靛紡鎵句綅锛�
+     * 绌烘墭鐩樺浐瀹氭寜绐勫簱浣嶄紭鍏堟壘浣嶏細
      * 1. 涓ユ牸楂樺害 + narrow
      * 2. 鍚戜笂鍏煎楂樺害 + narrow
-     * 3. 涓ユ牸楂樺害 + open
-     * 4. 鍚戜笂鍏煎楂樺害 + open
+     * 3. loc_type1=3 + open
      */
     private List<LocTypeDto> buildEmptyPalletSearchLocTypes(LocTypeDto locTypeDto) {
         List<LocTypeDto> searchLocTypes = new ArrayList<LocTypeDto>();
@@ -336,19 +356,23 @@
             searchLocTypes.add(narrowCompatibleLocType);
         }
 
-        LocTypeDto openStrictLocType = copyLocTypeDto(baseLocTypeDto);
-        openStrictLocType.setLocType2((short) 0);
-        searchLocTypes.add(openStrictLocType);
-
-        LocTypeDto openCompatibleLocType = buildUpwardCompatibleLocTypeDto(openStrictLocType);
-        if (openCompatibleLocType != null) {
-            openCompatibleLocType.setLocType2((short) 0);
-            searchLocTypes.add(openCompatibleLocType);
-        }
+        LocTypeDto emptyPalletFallbackLocType = copyLocTypeDto(baseLocTypeDto);
+        emptyPalletFallbackLocType.setLocType1((short) 3);
+        emptyPalletFallbackLocType.setLocType2((short) 0);
+        searchLocTypes.add(emptyPalletFallbackLocType);
         return searchLocTypes;
     }
 
+    /**
+     * 缁欑┖鎵樼洏鎵句綅闃舵鐢熸垚鏃ュ織鏍囪瘑锛屼究浜庢帓鏌ュ埌搴曞崱鍦ㄧ獎搴撲綅銆侀珮搴﹀吋瀹硅繕鏄� loc_type1=3 鍏滃簳闃舵銆�
+     */
     private String buildEmptyPalletStageCode(LocTypeDto baseLocTypeDto, LocTypeDto stageLocTypeDto) {
+        boolean emptyPalletType3Fallback = stageLocTypeDto != null
+                && stageLocTypeDto.getLocType1() != null
+                && stageLocTypeDto.getLocType1() == 3;
+        if (emptyPalletType3Fallback) {
+            return "empty-pallet-locType1-3";
+        }
         boolean compatibleHeight = baseLocTypeDto != null
                 && baseLocTypeDto.getLocType1() != null
                 && stageLocTypeDto != null
@@ -373,6 +397,9 @@
 
     /**
      * 鎶� locType 鏉′欢杩藉姞鍒板簱浣嶆煡璇㈡潯浠堕噷銆�
+     *
+     * 绌烘墭鐩樹細鏄惧紡浼� loc_type2锛氱涓�杞� loc_type2=1 浼樺厛绐勫簱浣嶏紝鍏滃簳闃舵 loc_type2=0 琛ㄧず涓嶅啀闄愬埗瀹界獎銆�
+     * 婊℃墭鐩樻暣鐞嗗悗娌℃湁 loc_type2/loc_type3锛屾澶勪細鎺掗櫎 loc_type2=1锛岄伩鍏嶆弧鎵樺崰鐢ㄧ┖鎵樼洏绐勫簱浣嶃��
      */
     private Wrapper<LocMast> applyLocTypeFilters(Wrapper<LocMast> wrapper, LocTypeDto locTypeDto, boolean includeLocType1) {
         if (wrapper == null || locTypeDto == null) {
@@ -993,7 +1020,12 @@
     }
 
     /**
-     * 鎸夌涓�浼樺厛姹� -> 绗簩浼樺厛姹犵殑椤哄簭鏌ユ壘鍙敤搴撲綅銆�
+     * run2 绔欑偣浼樺厛姹犳壘浣嶅叆鍙c��
+     *
+     * 绌烘墭鐩樿鍒欙細
+     * 1. 鍏堟壘绔欑偣绗竴浼樺厛姹狅紝鍐嶆壘绗簩浼樺厛姹狅紱绗簩姹犱細鎺掗櫎绗竴姹犲凡閰嶇疆鐨勫爢鍨涙満銆�
+     * 2. 姣忎釜浼樺厛姹犲唴鍏堟壘绐勫簱浣嶏紝鍐嶅仛楂樺害鍚戜笂鍏煎锛屾渶鍚庢妸 loc_type1 鏀逛负 3 鍏滃簳銆�
+     * 3. 鍙湁鍛戒腑搴撲綅鐨勬睜浼氭帹杩涜嚜宸辩殑 currentNo 娓告爣锛屾湭鍛戒腑鐨勬睜涓嶆敼鍙樿疆璇㈢姸鎬併��
      */
     private LocMast findRun2PriorityLocInPools(BasDevp station, RowLastno rowLastno, RowLastnoType rowLastnoType,
                                                 Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo,
@@ -1033,6 +1065,13 @@
 
     /**
      * 鍦ㄥ崟涓紭鍏堟睜鍐呮寜杞浆椤哄簭鎵句綅銆�
+     *
+     * 姹犲唴瑙勫垯锛�
+     * 1. 浠� currentNo 鐨勪笅涓�鍙板爢鍨涙満寮�濮嬭疆杞紝淇濊瘉鍚屼竴浼樺厛姹犲唴鍧囧垎銆�
+     * 2. 璺宠繃涓嶅彲鍏ャ�佹晠闅滄垨婧愮珯鍒扮洰鏍囧爢鍨涙満鏃犲叆搴撹矾寰勭殑鍫嗗灈鏈恒��
+     * 3. 姣忓彴鍫嗗灈鏈哄唴閮ㄤ氦缁� {@link #findConfiguredEmptyLocForCrn(RowLastno, RowLastnoType, Integer, Integer, LocTypeDto, FindLocNoAttributeVo, boolean)}
+     *    鎸夋繁娴呮帓鐢诲儚閫夋嫨绗竴涓彲鍒嗛厤搴撲綅銆�
+     * 4. 鍛戒腑鍚庡洖鍐欒浼樺厛姹犳父鏍囷紝骞舵妸鐩爣绔欏啓鍏� startupDto銆�
      */
     private LocMast findRun2PriorityLocInPool(RowLastno rowLastno, RowLastnoType rowLastnoType, BasDevp station,
                                               List<Integer> crnNos, Integer currentCrnNo, int poolNo, LocTypeDto locTypeDto,
@@ -1079,7 +1118,10 @@
     }
 
     /**
-     * 鍦ㄥ崟涓紭鍏堟睜鍐呭厛鎸夊綋鍓嶈鏍兼壘浣嶏紝澶辫触鍚庡啀鍋氫竴娆� locType1 鍚戜笂鍏煎銆�
+     * 鏅�氭墭鐩樼殑浼樺厛姹犺鏍煎吋瀹瑰叆鍙c��
+     *
+     * 绌烘墭鐩樹笉璧拌繖涓柟娉曪紝鍥犱负绌烘墭鐩樺凡缁忓湪 {@link #buildEmptyPalletSearchLocTypes(LocTypeDto)}
+     * 涓浐瀹氬睍寮�浜嗏�滅獎搴撲綅浼樺厛 + 楂樺害鍚戜笂鍏煎 + loc_type1=3 鍏滃簳鈥濈殑椤哄簭銆�
      */
     private LocMast findRun2PriorityLocInPoolWithCompatibility(RowLastno rowLastno, RowLastnoType rowLastnoType,
                                                                 BasDevp station, List<Integer> crnNos, Integer currentCrnNo,
@@ -1323,10 +1365,13 @@
     }
 
     /**
-     * 绌烘墭鐩� run2 涓撶敤鎼滅储閾捐矾銆�
+     * 淇濈暀鐨勭┖鎵樼洏 run2 鎸夊簱鍖鸿疆璇㈡悳绱㈤摼璺��
+     *
+     * 褰撳墠 getLocNoRun2 鐨勭┖鎵樼洏瀹為檯鍏ュ彛璧� {@link #findRun2PriorityLocInPools(BasDevp, RowLastno, RowLastnoType, Integer, Integer, FindLocNoAttributeVo, LocTypeDto, StartupDto, boolean)}
+     * 鐨勭珯鐐逛紭鍏堟睜瑙勫垯锛涘鏋滃悗缁渶瑕佹仮澶嶁�滃綋鍓嶅簱鍖� -> 鍏跺畠搴撳尯鈥濈殑鍏滃簳锛屽彲浠ヤ粠杩欓噷鎺ュ洖銆�
      *
      * 鎵ц椤哄簭锛�
-     * 1. 鍏堟寜鍥哄畾瑙勬牸闃舵鏋勯�� 4 娈靛紡 locType 鍥為��椤哄簭銆�
+     * 1. 鍏堟寜鍥哄畾瑙勬牸闃舵鏋勯�犫�滅獎搴撲綅浼樺厛 + loc_type1=3 鍏滃簳鈥濈殑 locType 鍥為��椤哄簭銆�
      * 2. 姣忎釜瑙勬牸闃舵閮芥寜鈥滃綋鍓嶅簱鍖� -> 鍏跺畠搴撳尯鈥濈殑椤哄簭鎼滅储銆�
      * 3. 姣忎釜搴撳尯鍐呴儴閮芥寜璇ュ簱鍖鸿嚜宸辩殑 rowLastno/currentRow 鍋氳疆璇㈠潎鍒嗐��
      *
@@ -1347,6 +1392,12 @@
         return null;
     }
 
+    /**
+     * 淇濈暀閾捐矾锛氬湪鏌愪釜绌烘墭鐩樿鏍奸樁娈靛唴鎸夊簱鍖洪『搴忔悳绱€��
+     *
+     * 搴撳尯椤哄簭鐢� {@link #buildAreaSearchOrder(List, Integer)} 鐢熸垚锛氱珯鐐圭粦瀹氬簱鍖轰紭鍏堬紝鍏舵鎺ュ彛璇锋眰搴撳尯锛�
+     * 鏈�鍚庤ˉ榻� 1/2/3 鍏ㄥ簱鍖恒�傛瘡涓簱鍖轰娇鐢ㄨ嚜宸辩殑 row_lastno 娓告爣锛屽苟涓旇法搴撳尯鏃朵笉寮哄埗 sta_desc 璺緞鏍¢獙銆�
+     */
     private Run2AreaSearchResult findEmptyPalletRun2AreaLoc(RowLastno defaultRowLastno, Integer staDescId, Integer sourceStaNo,
                                                             StartupDto startupDto, FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto,
                                                             String stageCode) {
@@ -1490,7 +1541,7 @@
                 .eq("stn_no", sourceStaNo)
                 .eq("crn_no", crnNo));
         if (Cools.isEmpty(staDesc)) {
-            log.error("type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
+            log.error("娌℃湁鍏ュ簱璺緞type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
             return null;
         }
         BasDevp staNo = basDevpService.selectById(staDesc.getCrnStn());
@@ -1536,6 +1587,22 @@
     private LocMast findRun2EmptyLocByCrnNos(RowLastno rowLastno, RowLastnoType rowLastnoType, List<Integer> candidateCrnNos,
                                              LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo, StartupDto startupDto,
                                              Integer preferredArea, FindLocNoAttributeVo findLocNoAttributeVo, String stage, boolean routeRequired) {
+        return findRun2EmptyLocByCrnNos(rowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
+                staDescId, sourceStaNo, startupDto, preferredArea, findLocNoAttributeVo, stage, routeRequired, null);
+    }
+
+    private LocMast findRun2EmptyLocByCrnNos(RowLastno rowLastno, RowLastnoType rowLastnoType, List<Integer> candidateCrnNos,
+                                             LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo, StartupDto startupDto,
+                                             Integer preferredArea, FindLocNoAttributeVo findLocNoAttributeVo, String stage,
+                                             Integer targetLev) {
+        return findRun2EmptyLocByCrnNos(rowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
+                staDescId, sourceStaNo, startupDto, preferredArea, findLocNoAttributeVo, stage, true, targetLev);
+    }
+
+    private LocMast findRun2EmptyLocByCrnNos(RowLastno rowLastno, RowLastnoType rowLastnoType, List<Integer> candidateCrnNos,
+                                             LocTypeDto locTypeDto, Integer staDescId, Integer sourceStaNo, StartupDto startupDto,
+                                             Integer preferredArea, FindLocNoAttributeVo findLocNoAttributeVo, String stage,
+                                             boolean routeRequired, Integer targetLev) {
         if (Cools.isEmpty(candidateCrnNos)) {
             log.warn("run2 skip empty candidate list. stage={}, sourceStaNo={}, preferredArea={}, spec={}",
                     stage, sourceStaNo, preferredArea, JSON.toJSONString(locTypeDto));
@@ -1547,7 +1614,7 @@
         List<Integer> locTypeBlockedCrns = new ArrayList<>();
         return findRun2EmptyLocByCrnNosRecursively(rowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
                 staDescId, sourceStaNo, startupDto, preferredArea, findLocNoAttributeVo, stage, routeRequired, 0,
-                crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns);
+                crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns, targetLev);
     }
 
     private LocMast findRun2EmptyLocByCrnNosRecursively(RowLastno rowLastno, RowLastnoType rowLastnoType,
@@ -1556,7 +1623,8 @@
                                                         Integer preferredArea, FindLocNoAttributeVo findLocNoAttributeVo,
                                                         String stage, boolean routeRequired, int index,
                                                         List<Integer> crnErrorCrns, List<Integer> routeBlockedCrns,
-                                                        List<Integer> noEmptyCrns, List<Integer> locTypeBlockedCrns) {
+                                                        List<Integer> noEmptyCrns, List<Integer> locTypeBlockedCrns,
+                                                        Integer targetLev) {
         if (index >= candidateCrnNos.size()) {
             logRun2NoMatch(stage, sourceStaNo, preferredArea, candidateCrnNos, locTypeDto,
                     crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns);
@@ -1567,18 +1635,18 @@
             crnErrorCrns.add(candidateCrnNo);
             return findRun2EmptyLocByCrnNosRecursively(rowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
                     staDescId, sourceStaNo, startupDto, preferredArea, findLocNoAttributeVo, stage, routeRequired, index + 1,
-                    crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns);
+                    crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns, targetLev);
         }
         Integer targetStaNo = routeRequired ? resolveTargetStaNo(rowLastno, staDescId, sourceStaNo, candidateCrnNo) : null;
         if (routeRequired && Utils.BooleanWhsTypeSta(rowLastno, staDescId) && targetStaNo == null) {
             routeBlockedCrns.add(candidateCrnNo);
             return findRun2EmptyLocByCrnNosRecursively(rowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
                     staDescId, sourceStaNo, startupDto, preferredArea, findLocNoAttributeVo, stage, routeRequired, index + 1,
-                    crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns);
+                    crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns, targetLev);
         }
         Integer preferredNearRow = getCrnStartRow(rowLastno, candidateCrnNo);
         LocMast candidateLoc = findConfiguredEmptyLocForCrn(rowLastno, rowLastnoType, candidateCrnNo,
-                preferredNearRow, locTypeDto, findLocNoAttributeVo);
+                preferredNearRow, locTypeDto, findLocNoAttributeVo, targetLev);
         if (Cools.isEmpty(candidateLoc)) {
             int availableLocCount = countAssignableLocForCrn(rowLastno, rowLastnoType, candidateCrnNo,
                     preferredNearRow == null ? 0 : preferredNearRow, locTypeDto);
@@ -1589,7 +1657,7 @@
             }
             return findRun2EmptyLocByCrnNosRecursively(rowLastno, rowLastnoType, candidateCrnNos, locTypeDto,
                     staDescId, sourceStaNo, startupDto, preferredArea, findLocNoAttributeVo, stage, routeRequired, index + 1,
-                    crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns);
+                    crnErrorCrns, routeBlockedCrns, noEmptyCrns, locTypeBlockedCrns, targetLev);
         }
         if (targetStaNo != null) {
             startupDto.setStaNo(targetStaNo);
@@ -1874,6 +1942,10 @@
         return locTypeDto == null || VersionUtils.locMoveCheckLocTypeComplete(locMast, locTypeDto);
     }
 
+    private boolean matchesTargetLev(LocMast locMast, Integer targetLev) {
+        return targetLev == null || targetLev <= 0 || (locMast != null && Objects.equals(locMast.getLev1(), targetLev));
+    }
+
     /**
      * 鏌ヨ鏌愪竴鎺掍笂鐨勬墍鏈夌┖搴撲綅锛屽苟鎸夊崟浼�/鍙屼几绛栫暐涓庨娆℃帓搴忋��
      */
@@ -1891,6 +1963,13 @@
     private List<LocMast> findOpenLocsByRow(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer row,
                                             Integer crnNo, LocTypeDto locTypeDto, FindLocNoAttributeVo findLocNoAttributeVo,
                                             boolean singleExtension, boolean ignoreFreqType) {
+        return findOpenLocsByRow(rowLastno, rowLastnoType, row, crnNo, locTypeDto, findLocNoAttributeVo,
+                singleExtension, ignoreFreqType, null);
+    }
+
+    private List<LocMast> findOpenLocsByRow(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer row,
+                                            Integer crnNo, LocTypeDto locTypeDto, FindLocNoAttributeVo findLocNoAttributeVo,
+                                            boolean singleExtension, boolean ignoreFreqType, Integer targetLev) {
         List<LocMast> result = new ArrayList<LocMast>();
         if (row == null) {
             return result;
@@ -1900,11 +1979,14 @@
         if (crnNo != null) {
             wrapper.eq("crn_no", crnNo);
         }
+        if (targetLev != null && targetLev > 0) {
+            wrapper.eq("lev1", targetLev);
+        }
         applyLocTypeFilters(wrapper, locTypeDto, true);
         List<LocMast> locMasts = locMastService.selectList(wrapper);
         List<LocMast> sortedLocMasts = sortLocCandidates(locMasts, findLocNoAttributeVo, ignoreFreqType);
         for (LocMast locMast : sortedLocMasts) {
-            if (matchesLocType(locMast, locTypeDto)) {
+            if (matchesLocType(locMast, locTypeDto) && matchesTargetLev(locMast, targetLev)) {
                 result.add(locMast);
             }
         }
@@ -2012,7 +2094,210 @@
     }
 
     /**
+     * 鍙屼几鍫嗗灈鏈哄悓璐т紭鍏堬細
+     * 鍏堟壘娣卞簱浣嶄腑鍚岃揣涓旂姸鎬佷负 F 鐨勮揣浣嶏紝鍐嶆鏌ュ叾瀵瑰簲娴呭簱浣嶆槸鍚︿负绌恒��
+     * 绌烘墭鐩樿姹傚垯鎸� matnr=emptyPallet 璇嗗埆锛屾繁浣嶅凡鏈夌┖鎵樼洏鏃朵紭鍏堣繑鍥炲搴旀祬浣嶃��
+     */
+    private LocMast findDoubleExtensionSameGoodsPreferredLoc(RowLastno rowLastno, RowLastnoType rowLastnoType,
+                                                             Integer crnNo, CrnDepthRuleProfile profile,
+                                                             LocTypeDto locTypeDto, FindLocNoAttributeVo findLocNoAttributeVo) {
+        if (profile == null || !profile.isDoubleExtension() || findLocNoAttributeVo == null) {
+            return null;
+        }
+        boolean emptyPalletRequest = "emptyPallet".equalsIgnoreCase(findLocNoAttributeVo.getMatnr());
+        String standby1 = findLocNoAttributeVo.getStandby1();
+        if (!emptyPalletRequest && Cools.isEmpty(standby1)) {
+            return null;
+        }
+        List<Integer> orderedShallowRows = orderDoubleExtensionShallowRows(rowLastno, rowLastnoType, crnNo, profile);
+        for (Integer shallowRow : orderedShallowRows) {
+            Integer deepRow = profile.getPairedDeepRow(shallowRow);
+            if (deepRow == null) {
+                continue;
+            }
+            List<LocMast> deepLocs = findOccupiedLocsByRow(deepRow, crnNo, findLocNoAttributeVo);
+            if (Cools.isEmpty(deepLocs)) {
+                continue;
+            }
+            List<String> deepLocNos = new ArrayList<String>();
+            for (LocMast deepLoc : deepLocs) {
+                if (deepLoc == null || Cools.isEmpty(deepLoc.getLocNo())) {
+                    continue;
+                }
+                deepLocNos.add(deepLoc.getLocNo());
+            }
+            if (Cools.isEmpty(deepLocNos)) {
+                continue;
+            }
+            EntityWrapper<LocDetl> detlWrapper = new EntityWrapper<LocDetl>();
+            detlWrapper.in("loc_no", deepLocNos);
+            if (emptyPalletRequest) {
+                detlWrapper.eq("matnr", findLocNoAttributeVo.getMatnr());
+            } else {
+                detlWrapper.eq("standby1", standby1);
+            }
+            List<LocDetl> sameGoodsLocDetls = locDetlService.selectList(detlWrapper);
+            if (Cools.isEmpty(sameGoodsLocDetls)) {
+                continue;
+            }
+            LinkedHashSet<String> sameGoodsLocNos = new LinkedHashSet<String>();
+            for (LocDetl locDetl : sameGoodsLocDetls) {
+                if (locDetl == null || Cools.isEmpty(locDetl.getLocNo())) {
+                    continue;
+                }
+                sameGoodsLocNos.add(locDetl.getLocNo());
+            }
+            if (Cools.isEmpty(sameGoodsLocNos)) {
+                continue;
+            }
+            for (LocMast deepLoc : deepLocs) {
+                if (deepLoc == null || !sameGoodsLocNos.contains(deepLoc.getLocNo())) {
+                    continue;
+                }
+                LocMast shallowLoc = findLocByPosition(rowLastno, rowLastnoType, crnNo, shallowRow,
+                        deepLoc.getBay1(), deepLoc.getLev1(), "O");
+                if (!Cools.isEmpty(shallowLoc) && matchesLocType(shallowLoc, locTypeDto)) {
+                    return shallowLoc;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鍙屼几鍫嗗灈鏈烘寜褰撳墠涓や晶璐熻浇鎺掑簭娴呬綅鎼滅储椤哄簭銆�
+     *
+     * 璐熻浇瓒婁綆鐨勬祬/娣遍厤瀵硅秺浼樺厛锛岄伩鍏嶉暱鏈熷彧鍛戒腑鍚屼竴渚с��
+     */
+    private List<Integer> orderDoubleExtensionShallowRows(RowLastno rowLastno, RowLastnoType rowLastnoType,
+                                                          Integer crnNo, CrnDepthRuleProfile profile) {
+        List<Integer> orderedShallowRows = new ArrayList<Integer>();
+        if (profile == null || !profile.isDoubleExtension() || Cools.isEmpty(profile.getShallowRows())) {
+            return orderedShallowRows;
+        }
+        orderedShallowRows.addAll(profile.getShallowRows());
+        final Map<Integer, Integer> originalOrder = new HashMap<Integer, Integer>();
+        for (int index = 0; index < orderedShallowRows.size(); index++) {
+            originalOrder.put(orderedShallowRows.get(index), index);
+        }
+        final Map<Integer, Integer> pairLoadCache = new HashMap<Integer, Integer>();
+        for (Integer shallowRow : orderedShallowRows) {
+            pairLoadCache.put(shallowRow, countDoubleExtensionPairLoad(rowLastno, rowLastnoType, crnNo, profile, shallowRow));
+        }
+        orderedShallowRows.sort(Comparator
+                .comparingInt((Integer row) -> pairLoadCache.getOrDefault(row, Integer.MAX_VALUE))
+                .thenComparingInt(row -> originalOrder.getOrDefault(row, Integer.MAX_VALUE)));
+        return rotateEqualLoadGroupsByCurrentRow(orderedShallowRows, rowLastno, pairLoadCache);
+    }
+
+    /**
+     * 绛夎浇鏃讹紝鎸夊綋鍓嶆帓娓告爣鏃嬭浆缁勫唴椤哄簭锛岄伩鍏嶉暱鏈熷浐瀹氬懡涓悓涓�渚ф繁搴撲綅銆�
+     */
+    private List<Integer> rotateEqualLoadGroupsByCurrentRow(List<Integer> orderedRows, RowLastno rowLastno,
+                                                            Map<Integer, Integer> pairLoadCache) {
+        if (Cools.isEmpty(orderedRows) || rowLastno == null) {
+            return orderedRows;
+        }
+        Integer currentRow = rowLastno.getCurrentRow();
+        if (currentRow == null || currentRow <= 0) {
+            return orderedRows;
+        }
+        List<Integer> rotatedRows = new ArrayList<Integer>(orderedRows.size());
+        int index = 0;
+        while (index < orderedRows.size()) {
+            Integer currentLoad = pairLoadCache.get(orderedRows.get(index));
+            int groupStart = index;
+            while (index < orderedRows.size() && Objects.equals(pairLoadCache.get(orderedRows.get(index)), currentLoad)) {
+                index++;
+            }
+            List<Integer> sameLoadRows = new ArrayList<Integer>(orderedRows.subList(groupStart, index));
+            rotateShallowRowsByCurrentRow(sameLoadRows, currentRow);
+            rotatedRows.addAll(sameLoadRows);
+        }
+        return rotatedRows;
+    }
+
+    private void rotateShallowRowsByCurrentRow(List<Integer> shallowRows, Integer currentRow) {
+        if (Cools.isEmpty(shallowRows) || shallowRows.size() <= 1 || currentRow == null) {
+            return;
+        }
+        int pivotIndex = -1;
+        for (int i = 0; i < shallowRows.size(); i++) {
+            Integer row = shallowRows.get(i);
+            if (row != null && row > currentRow) {
+                pivotIndex = i;
+                break;
+            }
+        }
+        if (pivotIndex <= 0) {
+            return;
+        }
+        List<Integer> rotated = new ArrayList<Integer>(shallowRows.size());
+        rotated.addAll(shallowRows.subList(pivotIndex, shallowRows.size()));
+        rotated.addAll(shallowRows.subList(0, pivotIndex));
+        shallowRows.clear();
+        shallowRows.addAll(rotated);
+    }
+
+    /**
+     * 缁熻鍙屼几娴�/娣遍厤瀵圭殑褰撳墠宸插崰鐢ㄥ簱浣嶆暟閲忋��
+     */
+    private int countDoubleExtensionPairLoad(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
+                                             CrnDepthRuleProfile profile, Integer shallowRow) {
+        if (profile == null || shallowRow == null) {
+            return Integer.MAX_VALUE;
+        }
+        int count = countOccupiedLocsByRow(rowLastno, rowLastnoType, shallowRow, crnNo);
+        Integer deepRow = profile.getPairedDeepRow(shallowRow);
+        if (deepRow != null) {
+            count += countOccupiedLocsByRow(rowLastno, rowLastnoType, deepRow, crnNo);
+        }
+        return count;
+    }
+
+    /**
+     * 缁熻鏌愪竴鎺掑綋鍓嶅凡鍗犵敤/棰勭害鐨勫簱瀛樻暟閲忋��
+     *
+     * 杩欓噷鎶� S/R/P/Q/D/X 閮界畻浣滆礋杞斤紝閬垮厤鎵归噺鍏ュ簱鏃跺彧鐪� F 瀵艰嚧鍒氶绾﹀嚭鍘荤殑搴撲綅涓嶅弬涓庡潎琛°��
+     */
+    private int countOccupiedLocsByRow(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer row, Integer crnNo) {
+        if (row == null) {
+            return Integer.MAX_VALUE;
+        }
+        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>()
+                .eq("row1", row)
+                .in("loc_sts", Arrays.asList("F", "S", "R", "P", "Q", "D", "X"));
+        if (crnNo != null) {
+            wrapper.eq("crn_no", crnNo);
+        }
+        return locMastService.selectCount(wrapper);
+    }
+
+    /**
+     * 鏌ヨ鏌愪竴鎺掍笂鐘舵�佷负 F 鐨勫簱浣嶏紝骞舵寜褰撳墠棰戞/鍓嶅嚑鍒楃瓥鐣ユ帓搴忋��
+     */
+    private List<LocMast> findOccupiedLocsByRow(Integer row, Integer crnNo, FindLocNoAttributeVo findLocNoAttributeVo) {
+        List<LocMast> result = new ArrayList<LocMast>();
+        if (row == null) {
+            return result;
+        }
+        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>()
+                .eq("row1", row)
+                .eq("loc_sts", "F");
+        if (crnNo != null) {
+            wrapper.eq("crn_no", crnNo);
+        }
+        List<LocMast> locMasts = locMastService.selectList(wrapper);
+        return sortLocCandidates(locMasts, findLocNoAttributeVo, false);
+    }
+
+    /**
      * 鍦ㄤ竴瀵规祬鎺�/娣辨帓涔嬮棿閫夋嫨鐪熸鍙姇鏀剧殑鐩爣搴撲綅銆�
+     *
+     * 鍙屼几浣嶈鍒欙細
+     * 1. 娴呬綅鍜屾繁浣嶅悓鍒楀悓灞傞兘涓虹┖鏃讹紝浼樺厛杩斿洖娣变綅锛岄伩鍏嶆祬浣嶅厛鍗犱綇鍚庢尅浣忔繁浣嶃��
+     * 2. 娣变綅宸叉湁璐ф椂锛屽厑璁歌繑鍥炲搴旀祬浣嶃��
+     * 3. 娣变綅涓虹┖浣嗚鏍间笉鍖归厤鏃讹紝涓嶆妸娴呬綅浣滀负鍙姇鏀剧粨鏋滐紝缁х画鎵句笅涓�缁勫悓鍒楀悓灞備綅缃��
      */
     private LocMast findPairAssignableLoc(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
                                           Integer shallowRow, Integer deepRow, LocTypeDto locTypeDto) {
@@ -2022,7 +2307,13 @@
     private LocMast findPairAssignableLoc(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
                                           Integer shallowRow, Integer deepRow, LocTypeDto locTypeDto,
                                           FindLocNoAttributeVo findLocNoAttributeVo) {
-        List<LocMast> shallowOpenLocs = findOpenLocsByRow(rowLastno, rowLastnoType, shallowRow, crnNo, locTypeDto, findLocNoAttributeVo, false);
+        return findPairAssignableLoc(rowLastno, rowLastnoType, crnNo, shallowRow, deepRow, locTypeDto, findLocNoAttributeVo, null);
+    }
+
+    private LocMast findPairAssignableLoc(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
+                                          Integer shallowRow, Integer deepRow, LocTypeDto locTypeDto,
+                                          FindLocNoAttributeVo findLocNoAttributeVo, Integer targetLev) {
+        List<LocMast> shallowOpenLocs = findOpenLocsByRow(rowLastno, rowLastnoType, shallowRow, crnNo, locTypeDto, findLocNoAttributeVo, false, false, targetLev);
         if (Cools.isEmpty(shallowOpenLocs)) {
             return null;
         }
@@ -2036,11 +2327,8 @@
             }
         }
         for (LocMast shallowLoc : shallowOpenLocs) {
-            LocMast deepBlockingLoc = findLocByPosition(rowLastno, rowLastnoType, crnNo, deepRow, shallowLoc.getBay1(), shallowLoc.getLev1(), "F", "D");
-            if (!Cools.isEmpty(deepBlockingLoc)) {
-                return shallowLoc;
-            }
-            if (findLocByPosition(rowLastno, rowLastnoType, crnNo, deepRow, shallowLoc.getBay1(), shallowLoc.getLev1()) == null) {
+            LocMast deepInStockLoc = findLocByPosition(rowLastno, rowLastnoType, crnNo, deepRow, shallowLoc.getBay1(), shallowLoc.getLev1(), "F");
+            if (!Cools.isEmpty(deepInStockLoc)) {
                 return shallowLoc;
             }
         }
@@ -2049,6 +2337,12 @@
 
     /**
      * 鎸夋煇鍙板爢鍨涙満鐨勬繁娴呮帓鐢诲儚鎼滅储绗竴涓彲鍒嗛厤绌哄簱浣嶃��
+     *
+     * 杩欐槸绌烘墭鐩樻渶缁堣惤搴撲綅鐨勬牳蹇冮�夋嫨鏂规硶锛�
+     * 1. 鍏堣鍙栧爢鍨涙満娣辨祬搴撲綅瑙勫垯鐢诲儚锛屽緱鍒拌鍫嗗灈鏈烘湰娆″簲鎵弿鐨勬帓椤哄簭銆�
+     * 2. 鍙屼几鍫嗗灈鏈哄厛灏濊瘯鍚岃揣浼樺厛瑙勫垯锛屽啀鎸夋祬鎺�/娣辨帓鎴愬鍒ゆ柇鍙姇鏀句綅缃��
+     * 3. 鍗曚几鍫嗗灈鏈虹洿鎺ユ寜鎺掑唴鎺掑簭鍚庣殑绌哄簱浣嶈繑鍥炵涓�涓尮閰嶉」銆�
+     * 4. 鎺掑唴鎺掑簭浼氱户缁彈棰戞銆佸墠鍑犲垪绛栫暐鍜� locType 杩囨护褰卞搷銆�
      */
     private LocMast findConfiguredEmptyLocForCrn(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
                                                   Integer preferredNearRow, LocTypeDto locTypeDto) {
@@ -2062,7 +2356,21 @@
 
     private LocMast findConfiguredEmptyLocForCrn(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
                                                  Integer preferredNearRow, LocTypeDto locTypeDto, FindLocNoAttributeVo findLocNoAttributeVo,
+                                                 Integer targetLev) {
+        return findConfiguredEmptyLocForCrn(rowLastno, rowLastnoType, crnNo, preferredNearRow, locTypeDto, findLocNoAttributeVo,
+                false, targetLev);
+    }
+
+    private LocMast findConfiguredEmptyLocForCrn(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
+                                                 Integer preferredNearRow, LocTypeDto locTypeDto, FindLocNoAttributeVo findLocNoAttributeVo,
                                                  boolean ignoreFreqType) {
+        return findConfiguredEmptyLocForCrn(rowLastno, rowLastnoType, crnNo, preferredNearRow, locTypeDto, findLocNoAttributeVo,
+                ignoreFreqType, null);
+    }
+
+    private LocMast findConfiguredEmptyLocForCrn(RowLastno rowLastno, RowLastnoType rowLastnoType, Integer crnNo,
+                                                 Integer preferredNearRow, LocTypeDto locTypeDto, FindLocNoAttributeVo findLocNoAttributeVo,
+                                                 boolean ignoreFreqType, Integer targetLev) {
         if (rowLastno == null || crnNo == null) {
             return null;
         }
@@ -2070,40 +2378,57 @@
         if (profile == null || Cools.isEmpty(profile.getSearchRows())) {
             return null;
         }
-        LinkedHashSet<Integer> processedShallowRows = new LinkedHashSet<Integer>();
+        LocMast sameGoodsPreferredLoc = findDoubleExtensionSameGoodsPreferredLoc(rowLastno, rowLastnoType, crnNo,
+                profile, locTypeDto, findLocNoAttributeVo);
+        if (!Cools.isEmpty(sameGoodsPreferredLoc) && matchesTargetLev(sameGoodsPreferredLoc, targetLev)) {
+            return sameGoodsPreferredLoc;
+        }
         boolean singleExtension = profile.isSingleExtension();
+        if (!singleExtension) {
+            List<Integer> orderedShallowRows = orderDoubleExtensionShallowRows(rowLastno, rowLastnoType, crnNo, profile);
+            for (Integer shallowRow : orderedShallowRows) {
+                if (shallowRow == null) {
+                    continue;
+                }
+                LocMast candidateLoc = findPairAssignableLoc(rowLastno, rowLastnoType, crnNo, shallowRow,
+                        profile.getPairedDeepRow(shallowRow), locTypeDto, findLocNoAttributeVo, targetLev);
+                if (!Cools.isEmpty(candidateLoc)) {
+                    return candidateLoc;
+                }
+            }
+            return null;
+        }
+        LinkedHashSet<Integer> processedShallowRows = new LinkedHashSet<Integer>();
         for (Integer searchRow : profile.getSearchRows()) {
             if (searchRow == null) {
                 continue;
             }
-            if (!singleExtension) {
-                if (profile.isShallowRow(searchRow)) {
-                    if (!processedShallowRows.add(searchRow)) {
+            if (profile.isShallowRow(searchRow)) {
+                if (!processedShallowRows.add(searchRow)) {
+                    continue;
+                }
+                LocMast candidateLoc = findPairAssignableLoc(rowLastno, rowLastnoType, crnNo, searchRow,
+                        profile.getPairedDeepRow(searchRow), locTypeDto, findLocNoAttributeVo, targetLev);
+                if (!Cools.isEmpty(candidateLoc)) {
+                    return candidateLoc;
+                }
+                continue;
+            }
+            if (profile.isDeepRow(searchRow)) {
+                Integer shallowRow = profile.getPairedShallowRow(searchRow);
+                if (shallowRow != null) {
+                    if (!processedShallowRows.add(shallowRow)) {
                         continue;
                     }
-                    LocMast candidateLoc = findPairAssignableLoc(rowLastno, rowLastnoType, crnNo, searchRow,
-                            profile.getPairedDeepRow(searchRow), locTypeDto, findLocNoAttributeVo);
+                    LocMast candidateLoc = findPairAssignableLoc(rowLastno, rowLastnoType, crnNo, shallowRow,
+                            searchRow, locTypeDto, findLocNoAttributeVo, targetLev);
                     if (!Cools.isEmpty(candidateLoc)) {
                         return candidateLoc;
                     }
                     continue;
                 }
-                if (profile.isDeepRow(searchRow)) {
-                    Integer shallowRow = profile.getPairedShallowRow(searchRow);
-                    if (shallowRow != null) {
-                        if (!processedShallowRows.add(shallowRow)) {
-                            continue;
-                        }
-                        LocMast candidateLoc = findPairAssignableLoc(rowLastno, rowLastnoType, crnNo, shallowRow,
-                                searchRow, locTypeDto, findLocNoAttributeVo);
-                        if (!Cools.isEmpty(candidateLoc)) {
-                            return candidateLoc;
-                        }
-                        continue;
-                    }
-                }
             }
-            List<LocMast> locMasts = findOpenLocsByRow(rowLastno, rowLastnoType, searchRow, crnNo, locTypeDto, findLocNoAttributeVo, singleExtension, ignoreFreqType);
+            List<LocMast> locMasts = findOpenLocsByRow(rowLastno, rowLastnoType, searchRow, crnNo, locTypeDto, findLocNoAttributeVo, singleExtension, ignoreFreqType, targetLev);
             if (!Cools.isEmpty(locMasts)) {
                 return locMasts.get(0);
             }
@@ -2170,9 +2495,8 @@
                 count++;
                 continue;
             }
-            LocMast deepBlockingLoc = findLocByPosition(rowLastno, rowLastnoType, crnNo, deepRow, shallowLoc.getBay1(), shallowLoc.getLev1(), "F", "D");
-            if (!Cools.isEmpty(deepBlockingLoc) ||
-                    findLocByPosition(rowLastno, rowLastnoType, crnNo, deepRow, shallowLoc.getBay1(), shallowLoc.getLev1()) == null) {
+            LocMast deepInStockLoc = findLocByPosition(rowLastno, rowLastnoType, crnNo, deepRow, shallowLoc.getBay1(), shallowLoc.getLev1(), "F");
+            if (!Cools.isEmpty(deepInStockLoc)) {
                 count++;
             }
         }
@@ -2569,8 +2893,8 @@
      * 褰撳墠鏂规硶鍙繚鐣欌�滅粍缁囨祦绋嬧�濆拰鈥滅粺涓�鏀跺彛鈥濈殑鑱岃矗锛屽叿浣撶瓥鐣ユ媶鎴愮嫭绔嬫柟娉曪細
      * 1. 鍏堟寜绔欑偣绗竴浼樺厛姹犳壘浣嶏紝鍐嶆壘绗簩浼樺厛姹犮��
      * 2. 姹犲唴鎸� current_no 杞浆锛屼粠涓嬩竴鍙板爢鍨涙満寮�濮嬪钩鍧囧垎閰嶃��
-     * 3. 绌烘墭鐩樺厛鎸� loc_type2=1 鎼滅储锛屽悓姹犳棤缁撴灉鍐嶅厑璁稿叾瀹冨簱浣嶃��
-     * 4. 浣庡簱浣嶅彲鍚戜笂鍏煎锛屽吋瀹归噸璇曚粛淇濇寔涓ゅ眰浼樺厛姹犻『搴忋��
+     * 3. 绌烘墭鐩樼敱 matnr=emptyPallet 鎴� staDescId=10 璇嗗埆锛屽厛鎵剧獎搴撲綅锛屽け璐ュ悗鐢� loc_type1=3 鍏滃簳銆�
+     * 4. 鏅�氭墭鐩樺彧鍋� loc_type1 鍚戜笂鍏煎锛屽苟鎺掗櫎绌烘墭鐩樹笓鐢ㄧ獎搴撲綅銆�
      */
     @Transactional
     public StartupDto getLocNoRun2(Integer whsType, Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, Integer moveCrnNo, LocTypeDto locTypeDto, List<Integer> recommendRows, int times) {

--
Gitblit v1.9.1