From ac88fa85ea2b39f9c94f080a95406739e64fd7f2 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期六, 21 三月 2026 18:01:18 +0800
Subject: [PATCH] 优化找库位规则

---
 src/main/java/com/zy/common/service/CommonService.java |  151 +++++++++++++++++++++----------------------------
 1 files changed, 65 insertions(+), 86 deletions(-)

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 6aa6b8c..5627380 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -538,6 +538,30 @@
         return orderedCrnNos;
     }
 
+    /**
+     * 浼樺厛鎸� s_crn_no/e_crn_no 鍙嶆帹鐪熷疄鍫嗗灈鏈烘暟閲忋��
+     *
+     * 涔嬪墠鏈夐�昏緫閿欒鎶� asr_row_lastno.crn_qty 褰撴垚杞娓告爣鍐欏洖锛�
+     * 瀵艰嚧鈥滃爢鍨涙満鏁伴噺鈥濆瓧娈佃姹℃煋銆傚悗缁壘浣嶄笉鑳藉啀鐩存帴淇′换 crn_qty锛�
+     * 鍚﹀垯浼氬皯鎵爢鍨涙満锛岃〃鐜板嚭鏉ュ氨鏄换鍔¢暱鏈熷亸鍚戞煇鍑犲彴鍫嗗灈鏈恒��
+     */
+    private int resolveCrnCount(RowLastno rowLastno) {
+        if (rowLastno == null) {
+            return 0;
+        }
+        if (rowLastno.getsCrnNo() != null && rowLastno.geteCrnNo() != null && rowLastno.geteCrnNo() >= rowLastno.getsCrnNo()) {
+            return rowLastno.geteCrnNo() - rowLastno.getsCrnNo() + 1;
+        }
+        if (rowLastno.getCrnQty() != null && rowLastno.getCrnQty() > 0) {
+            return rowLastno.getCrnQty();
+        }
+        Integer rowSpan = getCrnRowSpan(rowLastno.getTypeId());
+        if (rowSpan != null && rowSpan > 0 && rowLastno.getsRow() != null && rowLastno.geteRow() != null && rowLastno.geteRow() >= rowLastno.getsRow()) {
+            return (rowLastno.geteRow() - rowLastno.getsRow() + 1 + rowSpan - 1) / rowSpan;
+        }
+        return 0;
+    }
+
     private Integer getCrnStartRow(RowLastno rowLastno, Integer crnNo) {
         if (rowLastno == null || crnNo == null) {
             return null;
@@ -725,29 +749,6 @@
     }
 
     /**
-     * 鏅�� run2 鐨勬帹鑽愭帓浼樺厛闃舵銆�
-     *
-     * 鎺ㄨ崘鎺掑彧瀵规櫘閫氱墿鏂欑敓鏁堬紝绌烘墭鐩樺凡缁忓垏鎹㈡垚鈥滄寜搴撳尯杞鍫嗗灈鏈衡�濈殑瑙勫垯锛�
-     * 鍥犳杩欓噷浼氱洿鎺ヨ烦杩囩┖鎵樼洏璇锋眰锛岄伩鍏� row 鍙傛暟鎶婄┖鎵樼洏閲嶆柊甯﹀洖鏃ч�昏緫銆�
-     */
-    private LocMast findRun2RecommendLoc(RowLastno rowLastno, RowLastnoType rowLastnoType, boolean emptyPalletRequest,
-                                         List<Integer> recommendRows, LocTypeDto locTypeDto, Integer staDescId,
-                                         Integer sourceStaNo, StartupDto startupDto, Integer preferredArea,
-                                         List<Integer> triedCrnNos) {
-        if (emptyPalletRequest) {
-            return null;
-        }
-        List<Integer> recommendCrnNos = mapRowsToCrnNos(rowLastno, recommendRows);
-        if (Cools.isEmpty(recommendCrnNos)) {
-            return null;
-        }
-        LocMast locMast = findRun2EmptyLocByCrnNos(rowLastno, rowLastnoType, recommendCrnNos, locTypeDto,
-                staDescId, sourceStaNo, startupDto, preferredArea, "recommend");
-        triedCrnNos.addAll(recommendCrnNos);
-        return locMast;
-    }
-
-    /**
      * 鏅�氱墿鏂� run2 鎵句綅涓绘祦绋嬨��
      *
      * 鎵ц椤哄簭锛�
@@ -764,8 +765,13 @@
                 locTypeDto == null || locTypeDto.getLocType1() == null ? null : locTypeDto.getLocType1().intValue(),
                 findLocNoAttributeVo == null ? null : findLocNoAttributeVo.getMatnr());
         if (!Cools.isEmpty(stationCrnLocTypes)) {
-            return findRun2EmptyLocByCrnLocTypeEntries(rowLastno, rowLastnoType, stationCrnLocTypes,
+            // 绔欑偣浼樺厛绾у彧鏄�滀紭鍏堝皾璇曗�濓紝娌℃湁鍛戒腑鏃跺繀椤荤户缁蛋榛樿/搴撳尯鍥為��锛�
+            // 鍚﹀垯浼氭妸鈥滀紭鍏堝�欓�夋棤浣嶁�濊鍒ゆ垚鈥滄暣浠撴棤浣嶁�濄��
+            LocMast locMast = findRun2EmptyLocByCrnLocTypeEntries(rowLastno, rowLastnoType, stationCrnLocTypes,
                     locTypeDto, staDescId, sourceStaNo, startupDto, preferredArea, "station-priority");
+            if (!Cools.isEmpty(locMast)) {
+                return locMast;
+            }
         }
         if (preferredArea == null) {
             List<Integer> defaultCrnNos = new ArrayList<>(orderedCrnNos);
@@ -791,11 +797,25 @@
      * 鏅�氱墿鏂欏懡涓簱浣嶅悗锛屾部鐢� run2 鍘熸湁鐨勫叏浠撹疆璇㈡父鏍囨帹杩涙柟寮忋��
      */
     private void advanceNormalRun2Cursor(RowLastno rowLastno, int curRow) {
+        advanceNormalRun2Cursor(rowLastno, curRow, null, null);
+    }
+
+    /**
+     * 鏅�氱墿鏂欐父鏍囦紭鍏堟寜鈥滄湰娆$湡姝e彲鐢ㄧ殑鍫嗗灈鏈洪泦鍚堚�濇帹杩涖��
+     *
+     * 杩欐牱鍗充娇搴撳尯瀹氫箟閲屽瓨鍦ㄤ笉瀛樺湪鐨勫爢鍨涙満锛屾垨鑰呰矾寰勪富鏁版嵁鍙鐩栭儴鍒嗗爢鍨涙満锛�
+     * 婊℃澘浠诲姟涔熶細鍦ㄧ湡瀹炲彲浣滀笟鐨勫爢鍨涙満涔嬮棿杞锛屼笉浼氬洜涓虹悊璁哄爢鍨涙満鍙风殑绌烘礊鑰岄暱鏈熷洖钀藉埌鍚屼竴鍙般��
+     */
+    private void advanceNormalRun2Cursor(RowLastno rowLastno, int curRow, List<Integer> runnableCrnNos, Integer selectedCrnNo) {
         if (rowLastno == null) {
             return;
         }
         int updateCurRow = curRow == 0 ? (rowLastno.getsRow() == null ? 1 : rowLastno.getsRow()) : curRow;
-        updateCurRow = getNextRun2CurrentRow(rowLastno, updateCurRow);
+        if (!Cools.isEmpty(runnableCrnNos) && selectedCrnNo != null) {
+            updateCurRow = getNextRun2CurrentRow(rowLastno, runnableCrnNos, selectedCrnNo, updateCurRow);
+        } else {
+            updateCurRow = getNextRun2CurrentRow(rowLastno, updateCurRow);
+        }
         rowLastno.setCurrentRow(updateCurRow);
         rowLastnoService.updateById(rowLastno);
     }
@@ -826,33 +846,6 @@
                 }
             }
         }
-        return result;
-    }
-
-    private List<Integer> mapRowsToCrnNos(RowLastno rowLastno, List<Integer> rows) {
-        List<Integer> result = new ArrayList<>();
-        if (rowLastno == null || Cools.isEmpty(rows)) {
-            return result;
-        }
-        LinkedHashSet<Integer> orderedCrnNos = new LinkedHashSet<>();
-        Integer rowSpan = getCrnRowSpan(rowLastno.getTypeId());
-        if (rowSpan == null || rowSpan <= 0) {
-            rowSpan = 2;
-        }
-        int startCrnNo = rowLastno.getsCrnNo() == null ? 1 : rowLastno.getsCrnNo();
-        int endCrnNo = rowLastno.geteCrnNo() == null ? startCrnNo + rowLastno.getCrnQty() - 1 : rowLastno.geteCrnNo();
-        int startRow = rowLastno.getsRow() == null ? 1 : rowLastno.getsRow();
-        int endRow = rowLastno.geteRow() == null ? Integer.MAX_VALUE : rowLastno.geteRow();
-        for (Integer row : rows) {
-            if (row == null || row < startRow || row > endRow) {
-                continue;
-            }
-            int crnNo = startCrnNo + (row - startRow) / rowSpan;
-            if (crnNo >= startCrnNo && crnNo <= endCrnNo) {
-                orderedCrnNos.add(crnNo);
-            }
-        }
-        result.addAll(orderedCrnNos);
         return result;
     }
 
@@ -1471,7 +1464,7 @@
         }
         int sRow = rowLastno.getsRow();
         int eRow = rowLastno.geteRow();
-        int crnNumber = rowLastno.getCrnQty();
+        int crnNumber = resolveCrnCount(rowLastno);
 
 
         // ===============>>>> 寮�濮嬫墽琛�
@@ -1669,9 +1662,11 @@
      * run2 鍏ュ簱鎵句綅涓绘祦绋嬨��
      *
      * 褰撳墠鏂规硶鍙繚鐣欌�滅粍缁囨祦绋嬧�濆拰鈥滅粺涓�鏀跺彛鈥濈殑鑱岃矗锛屽叿浣撶瓥鐣ユ媶鎴愮嫭绔嬫柟娉曪細
-     * 1. 鏅�氱墿鏂欙細鎺ㄨ崘鎺掍紭鍏� -> 绔欑偣浼樺厛搴撳尯/鍫嗗灈鏈� -> 鍏跺畠搴撳尯銆�
+     * 1. 鏅�氱墿鏂欙細鎸� row_lastno 鑷韩杞椤哄簭 -> 绔欑偣浼樺厛搴撳尯/鍫嗗灈鏈� -> 鍏跺畠搴撳尯銆�
      * 2. 绌烘墭鐩橈細浼樺厛搴撳尯 loc_type2=1 -> 鍏跺畠搴撳尯 loc_type2=1 -> loc_type1=2 鍏煎銆�
      * 3. 鍛戒腑搴撲綅鍚庡垎鍒洖鍐欐櫘閫氱墿鏂欐父鏍囨垨绌烘墭鐩樺簱鍖烘父鏍囥��
+     *
+     * WCS 浼犲叆鐨勬帹鑽愭帓涓嶅啀鍙備笌 run2 閫変綅锛岄伩鍏嶄笂娓� row 鍙傛暟鎶婁换鍔¢噸鏂扮粦鍥炲浐瀹氬爢鍨涙満銆�
      */
     public StartupDto getLocNoRun2(Integer whsType, Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, Integer moveCrnNo, LocTypeDto locTypeDto, List<Integer> recommendRows, int times) {
 
@@ -1691,7 +1686,7 @@
         if (Cools.isEmpty(rowLastnoType)) {
             throw new CoolException("鏁版嵁寮傚父锛岃鑱旂郴绠$悊鍛�===銆嬪簱浣嶈鍒欑被鍨嬫湭鐭�");
         }
-        int crnNumber = rowLastno.getCrnQty();
+        int crnNumber = resolveCrnCount(rowLastno);
         rowCount = crnNumber;
 
         curRow = rowLastno.getCurrentRow();
@@ -1701,23 +1696,20 @@
         Run2AreaSearchResult emptyPalletAreaSearchResult = null;
 
         List<Integer> orderedCrnNos = getOrderedCrnNos(rowLastno, crnNo);
+        List<Integer> orderedRunnableCrnNos = getOrderedRunnableRun2CrnNos(rowLastno, staDescId, sourceStaNo, orderedCrnNos);
         List<Integer> triedCrnNos = new ArrayList<>();
-        locMast = findRun2RecommendLoc(rowLastno, rowLastnoType, emptyPalletRequest, recommendRows, locTypeDto,
-                staDescId, sourceStaNo, startupDto, preferredArea, triedCrnNos);
-        if (Cools.isEmpty(locMast)) {
-            if (emptyPalletRequest) {
-                // 绌烘墭鐩樺崟鐙寜搴撳尯杞锛�
-                // 1. 褰撳墠搴撳尯鍏堟壘 loc_type2=1
-                // 2. 褰撳墠搴撳尯娌℃湁锛屽啀鎵惧叾浠栧簱鍖� loc_type2=1
-                // 3. 鍏ㄩ儴 narrow 閮芥病鏈夋椂锛屽啀閫�鍒� loc_type1=2
-                emptyPalletAreaSearchResult = findEmptyPalletRun2AreaLoc(rowLastno, staDescId, sourceStaNo, startupDto, preferredArea, locTypeDto);
-                if (!Cools.isEmpty(emptyPalletAreaSearchResult)) {
-                    locMast = emptyPalletAreaSearchResult.locMast;
-                }
-            } else {
-                locMast = findNormalRun2Loc(rowLastno, rowLastnoType, sourceStaNo, staDescId, findLocNoAttributeVo,
-                        locTypeDto, startupDto, preferredArea, orderedCrnNos, triedCrnNos);
+        if (emptyPalletRequest) {
+            // 绌烘墭鐩樺崟鐙寜搴撳尯杞锛�
+            // 1. 褰撳墠搴撳尯鍏堟壘 loc_type2=1
+            // 2. 褰撳墠搴撳尯娌℃湁锛屽啀鎵惧叾浠栧簱鍖� loc_type2=1
+            // 3. 鍏ㄩ儴 narrow 閮芥病鏈夋椂锛屽啀閫�鍒� loc_type1=2
+            emptyPalletAreaSearchResult = findEmptyPalletRun2AreaLoc(rowLastno, staDescId, sourceStaNo, startupDto, preferredArea, locTypeDto);
+            if (!Cools.isEmpty(emptyPalletAreaSearchResult)) {
+                locMast = emptyPalletAreaSearchResult.locMast;
             }
+        } else {
+            locMast = findNormalRun2Loc(rowLastno, rowLastnoType, sourceStaNo, staDescId, findLocNoAttributeVo,
+                    locTypeDto, startupDto, preferredArea, orderedCrnNos, triedCrnNos);
         }
 
         if (!Cools.isEmpty(locMast)) {
@@ -1727,7 +1719,7 @@
         if (emptyPalletRequest) {
             advanceEmptyPalletRun2Cursor(emptyPalletAreaSearchResult, locMast);
         } else {
-            advanceNormalRun2Cursor(rowLastno, curRow);
+            advanceNormalRun2Cursor(rowLastno, curRow, orderedRunnableCrnNos, locMast == null ? null : locMast.getCrnNo());
         }
 
         if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
@@ -1789,7 +1781,7 @@
         }
         int sRow = rowLastno.getsRow();
         int eRow = rowLastno.geteRow();
-        int crnNumber = rowLastno.getCrnQty();
+        int crnNumber = resolveCrnCount(rowLastno);
 
         // ===============>>>> 寮�濮嬫墽琛�
         curRow = rowLastno.getCurrentRow();
@@ -2220,6 +2212,7 @@
     }
 
     public StartupDto getLocNoRun5(Integer whsType, Integer staDescId, Integer sourceStaNo, FindLocNoAttributeVo findLocNoAttributeVo, Integer moveCrnNo, LocTypeDto locTypeDto, List<Integer> recommendRows, int times) {
+        // WCS 浼犲叆鐨勬帹鑽愭帓涓嶅啀鍙備笌 AGV/骞冲簱閫変綅锛岀粺涓�鎸夊簱浣嶆帓鍙疯嚜韬疆璇㈤�昏緫鎵句綅銆�
 
         // 鍒濆鍖栧弬鏁�
         int crnNo = 0;      //鍫嗗灈鏈哄彿
@@ -2289,20 +2282,6 @@
         }
 
         // 寮�濮嬫煡鎵惧簱浣� ==============================>>
-
-        if (Cools.isEmpty(locMast) && !Cools.isEmpty(recommendRows)) {
-            for (Integer recommendRow : recommendRows) {
-                if (Cools.isEmpty(recommendRow)) {
-                    continue;
-                }
-                LocMast recommendLoc = locMastService.queryFreeLocMast(recommendRow, locTypeDto.getLocType1(), rowLastnoType.getType().longValue());
-                if (!Cools.isEmpty(recommendLoc) && VersionUtils.locMoveCheckLocTypeComplete(recommendLoc, locTypeDto)) {
-                    locMast = recommendLoc;
-                    crnNo = recommendLoc.getCrnNo();
-                    break;
-                }
-            }
-        }
 
         Integer preferredArea = findLocNoAttributeVo.getOutArea();
 

--
Gitblit v1.9.1