From 6d077ee150e66d50f56c61670f97d2baaa1b61a2 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期二, 05 八月 2025 16:59:53 +0800
Subject: [PATCH] #许可证2.0

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

diff --git a/src/main/java/com/zy/common/service/CommonService.java b/src/main/java/com/zy/common/service/CommonService.java
index 8bede90..f6d0189 100644
--- a/src/main/java/com/zy/common/service/CommonService.java
+++ b/src/main/java/com/zy/common/service/CommonService.java
@@ -26,6 +26,7 @@
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * 璐ф灦鏍稿績鍔熻兘
@@ -157,6 +158,39 @@
     }
 
 
+    private Optional<CrnRowInfo> findAvailableCrnAndNearRow(RowLastno rowLastno, int curRow, int crnNumber, int times,
+                                                            FindLocNoAttributeVo findLocNoAttributeVo, LocTypeDto locTypeDto,
+                                                            RowLastnoType rowLastnoType) {
+        int attempt = times;
+        while (attempt < crnNumber * 2) {
+            int[] params = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber);
+            curRow = params[1];
+            int crnNo = params[2];
+            if (!basCrnpService.checkSiteError(crnNo, true)) {
+                attempt++;
+                continue;
+            }
+            int rowCount = params[0];
+            int nearRow = params[3];
+
+            // 鍙彇鏁伴噺鍒ゆ柇锛岄伩鍏嶆媺鏁� list
+            int availableLocCount = locMastService.selectCount(new EntityWrapper<LocMast>()
+                    .eq("row1", nearRow)
+                    .eq("loc_sts", "O")
+                    .eq("whs_type", rowLastnoType.getType().longValue()));
+            int crnCountO = wrkMastService.selectCount(new EntityWrapper<WrkMast>()
+                    .eq("crn_no", crnNo).le("io_type", 100));
+            if (availableLocCount - crnCountO <= 2) { // 鍙互鎻愭垚甯搁噺锛屾瘮濡� MIN_SPARE_SLOTS = 2
+                log.error("{}鍙峰爢鍨涙満娌℃湁绌哄簱浣嶏紒锛侊紒 灏哄瑙勬牸锛� {}锛� 杞娆℃暟锛歿}", crnNo, JSON.toJSONString(locTypeDto), attempt);
+                attempt++;
+                continue;
+            }
+            return Optional.of(new CrnRowInfo(crnNo, nearRow, curRow, rowCount, attempt));
+        }
+        return Optional.empty();
+    }
+
+
 
     /**
      * 妫�绱㈠簱浣嶅彿
@@ -207,30 +241,17 @@
         }
 
         //姝ょ▼搴忕敤浜庝紭鍖栧爢鍨涙満寮傚父鏃剁殑杩愯鏃堕棿
-        for (int i = times; i < crnNumber * 2; i++) {
-            int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber);
-            curRow = locNecessaryParameters[1];
-            crnNo = locNecessaryParameters[2];
-            if (basCrnpService.checkSiteError(crnNo, true)) {
-                rowCount = locNecessaryParameters[0];
-                nearRow = locNecessaryParameters[3];
-                List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
-                        .eq("row1", nearRow).eq("loc_sts", "O").eq("whs_type", rowLastnoType.getType().longValue()));
-                int crnCountO = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnNo).le("io_type", 100));
-                if (locMasts.size() - crnCountO <= 2) {
-                    log.error(crnNo + "鍙峰爢鍨涙満娌℃湁绌哄簱浣嶏紒锛侊紒 灏哄瑙勬牸锛� {}锛� 杞娆℃暟锛歿}", JSON.toJSONString(locTypeDto), times);
-                    nearRow = 0;
-                    times++;
-                    continue;
-                }
-                break;
-            } else {
-                times++;
-            }
-        }
-        if (nearRow == 0) {
+        Optional<CrnRowInfo> infoOpt = findAvailableCrnAndNearRow(rowLastno, curRow, crnNumber, times, findLocNoAttributeVo, locTypeDto, rowLastnoType);
+        if (!infoOpt.isPresent()) {
             throw new CoolException("鏃犲彲鐢ㄥ爢鍨涙満");
         }
+        CrnRowInfo info = infoOpt.get();
+        crnNo = info.getCrnNo();
+        nearRow = info.getNearRow();
+        curRow = info.getCurRow();
+        rowCount = info.getRowCount();
+        times = info.getTimes();
+
 
         boolean signRule1 = false;
         boolean signRule2 = false;

--
Gitblit v1.9.1