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