From 2816415f539ef54839e331657edae7055c243ad8 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期六, 17 一月 2026 19:27:45 +0800
Subject: [PATCH] agv缓存库位清空和标记功能

---
 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java |  195 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 184 insertions(+), 11 deletions(-)

diff --git a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
index 4a28523..399614d 100644
--- a/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -781,15 +781,9 @@
         }
         
         // 鍒嗛厤缂撳瓨搴撲綅锛氬彧鏌ユ壘WA寮�澶寸殑搴撲綅锛圕A寮�澶村彧鍋氬叆搴擄紝WA寮�澶存墠浼氳鍑哄簱鍒嗛厤缂撳瓨鍖猴級
+        // 浣跨敤鏂扮殑鍒嗛厤閫昏緫锛氭寜鍒椾紭鍏堢骇锛堢涓夊垪鈫掔浜屽垪鈫掔涓�鍒楋級鍒嗛厤
         String cacheAreaPrefix = agvProperties.getLocationPrefix().getCacheArea();
-        LocCache cacheLoc = locCacheService.selectOne(new EntityWrapper<LocCache>()
-                .eq("whs_type", targetWhsType) // 鏍规嵁鍑哄簱绔欑偣鍒ゆ柇鐨剋hs_type
-                .like("loc_no", cacheAreaPrefix + "%") // 鍙煡鎵網A寮�澶寸殑搴撲綅锛堜粠閰嶇疆璇诲彇锛�
-                .eq("frozen", 0)
-                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type) // O.闂茬疆
-                .ne("full_plt", isEmptyPallet ? "Y" : "N") // 绌烘墭涓嶉�夋弧鏉垮簱浣嶏紝婊℃墭涓嶉�夌┖鏉垮簱浣�
-                .orderAsc(Arrays.asList("row1", "bay1", "lev1"))
-                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
+        LocCache cacheLoc = allocateCacheLocationByPriority(targetWhsType, cacheAreaPrefix, isEmptyPallet);
         
         if (cacheLoc == null) {
             log.warn("{}渚ф病鏈夊彲鐢ㄧ殑{}缂撳瓨搴撲綅锛屼笉鐢熸垚{}AGV浠诲姟锛屼换鍔D锛歿}", 
@@ -905,6 +899,167 @@
     }
     
     /**
+     * 鎸変紭鍏堢骇鍒嗛厤缂撳瓨搴撲綅
+     * 浼樺厛绾ц鍒欙細
+     * 1. 浼樺厛鍒嗛厤绗笁鍒楋紙bay1=3锛夛紝涓旇鎺掔殑1銆�2銆�3鍒楅兘鏄┖鐨�
+     * 2. 濡傛灉鎵�鏈夌涓夊垪閮芥湁璐э紝鍒欏垎閰嶇浜屽垪锛坆ay1=2锛夛紝涓旇鎺掔殑1銆�2鍒楅兘鏄┖鐨�
+     * 3. 濡傛灉鎵�鏈夋帓鐨勭浜岀涓夊垪閮芥弧浜嗭紝鍒欏垎閰嶇涓�鍒楋紙bay1=1锛�
+     * 4. 濡傛灉鎵�鏈夌涓�鍒楅兘婊′簡锛屽啀妫�鏌ョ浜屽垪鍜岀涓夊垪
+     * 5. 灞傦紙lev1锛変粠绗竴灞傚紑濮�
+     * 
+     * @param whsType 搴撳尯绫诲瀷
+     * @param cacheAreaPrefix 缂撳瓨鍖哄簱浣嶅墠缂�锛堝"WA"锛�
+     * @param isEmptyPallet 鏄惁绌烘墭
+     * @return 鍒嗛厤鐨勭紦瀛樺簱浣嶏紝濡傛灉鏃犳硶鍒嗛厤鍒欒繑鍥瀗ull
+     */
+    private LocCache allocateCacheLocationByPriority(Long whsType, String cacheAreaPrefix, boolean isEmptyPallet) {
+        // 鏌ヨ鎵�鏈夌鍚堟潯浠剁殑绌哄簱浣�
+        List<LocCache> allLocations = locCacheService.selectList(new EntityWrapper<LocCache>()
+                .eq("whs_type", whsType)
+                .like("loc_no", cacheAreaPrefix + "%")
+                .eq("frozen", 0)
+                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type) // O.闂茬疆
+                .ne("full_plt", isEmptyPallet ? "Y" : "N") // 绌烘墭涓嶉�夋弧鏉垮簱浣嶏紝婊℃墭涓嶉�夌┖鏉垮簱浣�
+        );
+        
+        if (allLocations == null || allLocations.isEmpty()) {
+            return null;
+        }
+        
+        // 鎸塺ow1鍒嗙粍
+        Map<Integer, List<LocCache>> locationsByRow = allLocations.stream()
+                .filter(loc -> loc.getRow1() != null)
+                .collect(Collectors.groupingBy(LocCache::getRow1));
+        
+        if (locationsByRow.isEmpty()) {
+            return null;
+        }
+        
+        // 瀵规瘡涓帓锛屾鏌�1銆�2銆�3鍒楃殑鐘舵��
+        // 鍒楃姸鎬侊細true琛ㄧず璇ュ垪鏈夌┖搴撲綅锛宖alse琛ㄧず璇ュ垪宸叉弧
+        Map<Integer, Map<Integer, Boolean>> rowColumnStatus = new HashMap<>();
+        for (Map.Entry<Integer, List<LocCache>> entry : locationsByRow.entrySet()) {
+            Integer row = entry.getKey();
+            List<LocCache> rowLocs = entry.getValue();
+            
+            Map<Integer, Boolean> columnStatus = new HashMap<>();
+            // 妫�鏌ョ1銆�2銆�3鍒楁槸鍚︽湁绌哄簱浣�
+            for (int bay = 1; bay <= 3; bay++) {
+                final int bayFinal = bay;  // 鍒涘缓final鍓湰渚沴ambda浣跨敤
+                boolean hasEmpty = rowLocs.stream()
+                        .anyMatch(loc -> loc.getBay1() != null && loc.getBay1() == bayFinal);
+                columnStatus.put(bay, hasEmpty);
+            }
+            rowColumnStatus.put(row, columnStatus);
+        }
+        
+        // 浼樺厛绾�1锛氬垎閰嶇涓夊垪锛坆ay1=3锛夛紝涓旇鎺掔殑1銆�2銆�3鍒楅兘鏄┖鐨�
+        for (Map.Entry<Integer, List<LocCache>> entry : locationsByRow.entrySet()) {
+            Integer row = entry.getKey();
+            Map<Integer, Boolean> columnStatus = rowColumnStatus.get(row);
+            
+            // 妫�鏌ヨ鎺掔殑1銆�2銆�3鍒楁槸鍚﹂兘鏄┖鐨�
+            if (Boolean.TRUE.equals(columnStatus.get(1)) && 
+                Boolean.TRUE.equals(columnStatus.get(2)) && 
+                Boolean.TRUE.equals(columnStatus.get(3))) {
+                // 鍒嗛厤璇ユ帓鐨勭涓夊垪锛屼粠绗竴灞傚紑濮�
+                List<LocCache> bay3Locs = entry.getValue().stream()
+                        .filter(loc -> loc.getBay1() != null && loc.getBay1() == 3)
+                        .sorted(Comparator.comparing(loc -> loc.getLev1() != null ? loc.getLev1() : 0))
+                        .collect(Collectors.toList());
+                
+                if (!bay3Locs.isEmpty()) {
+                    log.debug("浼樺厛绾�1锛氬垎閰嶆帓{}鐨勭涓夊垪锛屽簱浣嶏細{}", row, bay3Locs.get(0).getLocNo());
+                    return bay3Locs.get(0);
+                }
+            }
+        }
+        
+        // 浼樺厛绾�2锛氬垎閰嶇浜屽垪锛坆ay1=2锛夛紝涓旇鎺掔殑1銆�2鍒楅兘鏄┖鐨勶紙绗笁鍒楀彲鑳藉凡婊★級
+        for (Map.Entry<Integer, List<LocCache>> entry : locationsByRow.entrySet()) {
+            Integer row = entry.getKey();
+            Map<Integer, Boolean> columnStatus = rowColumnStatus.get(row);
+            
+            // 妫�鏌ヨ鎺掔殑1銆�2鍒楁槸鍚﹂兘鏄┖鐨�
+            if (Boolean.TRUE.equals(columnStatus.get(1)) && 
+                Boolean.TRUE.equals(columnStatus.get(2))) {
+                // 鍒嗛厤璇ユ帓鐨勭浜屽垪锛屼粠绗竴灞傚紑濮�
+                List<LocCache> bay2Locs = entry.getValue().stream()
+                        .filter(loc -> loc.getBay1() != null && loc.getBay1() == 2)
+                        .sorted(Comparator.comparing(loc -> loc.getLev1() != null ? loc.getLev1() : 0))
+                        .collect(Collectors.toList());
+                
+                if (!bay2Locs.isEmpty()) {
+                    log.debug("浼樺厛绾�2锛氬垎閰嶆帓{}鐨勭浜屽垪锛屽簱浣嶏細{}", row, bay2Locs.get(0).getLocNo());
+                    return bay2Locs.get(0);
+                }
+            }
+        }
+        
+        // 浼樺厛绾�3锛氬垎閰嶇涓�鍒楋紙bay1=1锛夛紝鎵�鏈夋帓鐨勭浜岀涓夊垪閮芥弧浜�
+        for (Map.Entry<Integer, List<LocCache>> entry : locationsByRow.entrySet()) {
+            Integer row = entry.getKey();
+            Map<Integer, Boolean> columnStatus = rowColumnStatus.get(row);
+            
+            // 妫�鏌ヨ鎺掔殑绗竴鍒楁槸鍚︽湁绌哄簱浣�
+            if (Boolean.TRUE.equals(columnStatus.get(1))) {
+                // 鍒嗛厤璇ユ帓鐨勭涓�鍒楋紝浠庣涓�灞傚紑濮�
+                List<LocCache> bay1Locs = entry.getValue().stream()
+                        .filter(loc -> loc.getBay1() != null && loc.getBay1() == 1)
+                        .sorted(Comparator.comparing(loc -> loc.getLev1() != null ? loc.getLev1() : 0))
+                        .collect(Collectors.toList());
+                
+                if (!bay1Locs.isEmpty()) {
+                    log.debug("浼樺厛绾�3锛氬垎閰嶆帓{}鐨勭涓�鍒楋紝搴撲綅锛歿}", row, bay1Locs.get(0).getLocNo());
+                    return bay1Locs.get(0);
+                }
+            }
+        }
+        
+        // 浼樺厛绾�4锛氬鏋滄墍鏈夌涓�鍒楅兘婊′簡锛屽啀妫�鏌ョ浜屽垪鍜岀涓夊垪锛堜笉瑕佹眰璇ユ帓鐨�1銆�2鍒楅兘鏄┖鐨勶級
+        // 鍏堟鏌ョ浜屽垪
+        for (Map.Entry<Integer, List<LocCache>> entry : locationsByRow.entrySet()) {
+            Integer row = entry.getKey();
+            Map<Integer, Boolean> columnStatus = rowColumnStatus.get(row);
+            
+            // 妫�鏌ヨ鎺掔殑绗簩鍒楁槸鍚︽湁绌哄簱浣�
+            if (Boolean.TRUE.equals(columnStatus.get(2))) {
+                List<LocCache> bay2Locs = entry.getValue().stream()
+                        .filter(loc -> loc.getBay1() != null && loc.getBay1() == 2)
+                        .sorted(Comparator.comparing(loc -> loc.getLev1() != null ? loc.getLev1() : 0))
+                        .collect(Collectors.toList());
+                
+                if (!bay2Locs.isEmpty()) {
+                    log.debug("浼樺厛绾�4锛氬垎閰嶆帓{}鐨勭浜屽垪锛屽簱浣嶏細{}", row, bay2Locs.get(0).getLocNo());
+                    return bay2Locs.get(0);
+                }
+            }
+        }
+        
+        // 浼樺厛绾�5锛氭渶鍚庢鏌ョ涓夊垪锛堜笉瑕佹眰璇ユ帓鐨�1銆�2銆�3鍒楅兘鏄┖鐨勶級
+        for (Map.Entry<Integer, List<LocCache>> entry : locationsByRow.entrySet()) {
+            Integer row = entry.getKey();
+            Map<Integer, Boolean> columnStatus = rowColumnStatus.get(row);
+            
+            // 妫�鏌ヨ鎺掔殑绗笁鍒楁槸鍚︽湁绌哄簱浣�
+            if (Boolean.TRUE.equals(columnStatus.get(3))) {
+                List<LocCache> bay3Locs = entry.getValue().stream()
+                        .filter(loc -> loc.getBay1() != null && loc.getBay1() == 3)
+                        .sorted(Comparator.comparing(loc -> loc.getLev1() != null ? loc.getLev1() : 0))
+                        .collect(Collectors.toList());
+                
+                if (!bay3Locs.isEmpty()) {
+                    log.debug("浼樺厛绾�5锛氬垎閰嶆帓{}鐨勭涓夊垪锛屽簱浣嶏細{}", row, bay3Locs.get(0).getLocNo());
+                    return bay3Locs.get(0);
+                }
+            }
+        }
+        
+        // 濡傛灉鎵�鏈夊垪閮芥弧浜嗭紝杩斿洖null
+        return null;
+    }
+    
+    /**
      * 涓哄嚭搴撳埌缂撳瓨鍖虹殑浠诲姟鍒嗛厤绔欑偣锛堜娇鐢ㄥ拰鍏ュ簱涓�鏍风殑鍒嗛厤绛栫暐锛�
      * @param cacheStations 缂撳瓨鍖虹珯鐐瑰垪琛�
      * @param ioType 浠诲姟绫诲瀷锛�101=鍏ㄦ澘鍑哄簱锛�110=绌烘澘鍑哄簱锛�
@@ -1006,7 +1161,7 @@
         
         // 濡傛灉鎵�鏈夌珯鐐归兘鍦ㄦ惉杩愶紝鍒欎笉鍒嗛厤绔欑偣
         if (selectedSite == null) {
-            log.warn("鎵�鏈夌紦瀛樺尯绔欑偣閮芥湁姝e湪鎼繍鐨勫嚭搴撲换鍔★紝鏆備笉鍒嗛厤绔欑偣锛岀瓑寰呯┖闂�");
+//            log.warn("鎵�鏈夌紦瀛樺尯绔欑偣閮芥湁姝e湪鎼繍鐨勫嚭搴撲换鍔★紝鏆備笉鍒嗛厤绔欑偣锛岀瓑寰呯┖闂�");
             return null;
         }
         
@@ -1058,14 +1213,32 @@
                     }
                 });
 
-                locCache.setLocSts(LocStsType.LOC_STS_TYPE_F.type);
+                // 鏍规嵁fullPlt璁剧疆搴撲綅鐘舵�侊細婊℃墭璁剧疆涓�"F"锛堝湪搴擄級锛岀┖鎵樿缃负"D"锛堢┖妗�/绌烘爤鏉匡級
+                boolean isFullPlt = wrkMast.getFullPlt() != null && wrkMast.getFullPlt().equals("Y");
+                locCache.setLocSts(isFullPlt ? LocStsType.LOC_STS_TYPE_F.type : LocStsType.LOC_STS_TYPE_D.type);
+                locCache.setFullPlt(isFullPlt ? "Y" : "N");
                 locCache.setModiTime(new Date());
                 locCache.setBarcode(wrkMast.getBarcode());
-                locCache.setModiTime(new Date());
                 locCache.setIoTime(new Date());
                 if (!locCacheService.updateById(locCache)) {
                     throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒");
                 }
+            } else if (ioType == 10 || ioType == 53 || ioType == 57) {
+                // 绌烘墭鍏ュ簱鎴栧叾浠栧叆搴撶被鍨嬶紝涔熼渶瑕佹洿鏂扮紦瀛樺簱浣嶇姸鎬�
+                LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", wrkMast.getLocNo()));
+                if (locCache != null) {
+                    // 鏍规嵁fullPlt璁剧疆搴撲綅鐘舵�侊細婊℃墭璁剧疆涓�"F"锛堝湪搴擄級锛岀┖鎵樿缃负"D"锛堢┖妗�/绌烘爤鏉匡級
+                    // ioType == 10 鏄┖鎵樺叆搴擄紝榛樿璁剧疆涓�"D"
+                    boolean isFullPlt = (ioType != 10) && (wrkMast.getFullPlt() != null && wrkMast.getFullPlt().equals("Y"));
+                    locCache.setLocSts(isFullPlt ? LocStsType.LOC_STS_TYPE_F.type : LocStsType.LOC_STS_TYPE_D.type);
+                    locCache.setFullPlt(isFullPlt ? "Y" : "N");
+                    locCache.setModiTime(new Date());
+                    locCache.setBarcode(wrkMast.getBarcode());
+                    locCache.setIoTime(new Date());
+                    if (!locCacheService.updateById(locCache)) {
+                        throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒");
+                    }
+                }
             }
             
             // 鏇存柊浠诲姟鐘舵�佷负5锛堝簱瀛樻洿鏂板畬鎴愶級

--
Gitblit v1.9.1