From 46168fbb7c925b0ec04def176095e967720e684a Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期五, 16 一月 2026 15:22:07 +0800
Subject: [PATCH] agv查询修复

---
 src/main/java/com/zy/asrs/task/handler/AgvHandler.java |  122 ++++++++++++++++++++++------------------
 1 files changed, 67 insertions(+), 55 deletions(-)

diff --git a/src/main/java/com/zy/asrs/task/handler/AgvHandler.java b/src/main/java/com/zy/asrs/task/handler/AgvHandler.java
index 458f54b..4349f98 100644
--- a/src/main/java/com/zy/asrs/task/handler/AgvHandler.java
+++ b/src/main/java/com/zy/asrs/task/handler/AgvHandler.java
@@ -322,14 +322,14 @@
             return null;
         }
         
-        // 鎺掗櫎鏈夋鍦ㄦ惉杩愪换鍔$殑绔欑偣锛堢姸鎬�8锛氬凡鍛煎彨AGV锛屾鍦ㄦ惉杩愶級
-        List<BasDevp> availableDevList = new ArrayList<>();
-        Integer taskIoType = task.getIoType();
+        // 鍏堟寜瑙勫垯鎺掑簭锛堝叆搴撲换鍔℃暟鎺掑簭锛�
+        devList.sort(Comparator.comparing(BasDevp::getInQty));
         
+        // 鏍规嵁浠诲姟绫诲瀷纭畾瑕佹鏌ョ殑io_type鍒楄〃
+        Integer taskIoType = task.getIoType();
+        List<Integer> checkIoTypes = null;
+        String taskTypeName = "";
         if (taskIoType != null) {
-            // 鏍规嵁浠诲姟绫诲瀷纭畾瑕佹鏌ョ殑io_type鍒楄〃
-            List<Integer> checkIoTypes;
-            String taskTypeName;
             if (taskIoType < 100) {
                 // 鍏ュ簱浠诲姟锛氬彧妫�鏌ュ叆搴撶被鍨嬶紙1, 10, 53, 57锛�
                 checkIoTypes = Arrays.asList(1, 10, 53, 57);
@@ -339,11 +339,54 @@
                 checkIoTypes = Arrays.asList(101, 110, 103, 107);
                 taskTypeName = "鍑哄簱";
             }
+        }
+        
+        // 绛涢�夊嚭浠诲姟鏁版渶灏戠殑绔欑偣鍒楄〃锛堟寜瑙勫垯鎺掑簭鍚庣殑鍊欓�夌珯鐐癸級
+        int minInQty = devList.get(0).getInQty();
+        List<BasDevp> minTaskSites = devList.stream()
+                .filter(dev -> dev.getInQty() == minInQty)
+                .collect(Collectors.toList());
+        
+        // 鏍规嵁閰嶇疆閫夋嫨鍒嗛厤绛栫暐锛岀‘瀹氫紭鍏堝垎閰嶇殑绔欑偣椤哄簭
+        List<BasDevp> orderedSites = new ArrayList<>();
+        String strategy = agvProperties.getSiteAllocation().getStrategy();
+        boolean enableRoundRobin = agvProperties.getSiteAllocation().isEnableRoundRobin();
+        
+        if (minTaskSites.size() > 1 && enableRoundRobin && "round-robin".equals(strategy)) {
+            // 杞鍒嗛厤锛氬厛鎸夎疆璇㈢瓥鐣ユ帓搴�
+            AtomicInteger counter = siteRoundRobinCounters.computeIfAbsent(groupKey, k -> new AtomicInteger(0));
+            int startIndex = counter.get() % minTaskSites.size();
+            // 灏嗚疆璇㈤�変腑鐨勭珯鐐规斁鍦ㄦ渶鍓嶉潰
+            orderedSites.addAll(minTaskSites.subList(startIndex, minTaskSites.size()));
+            orderedSites.addAll(minTaskSites.subList(0, startIndex));
+            // 娣诲姞鍏朵粬绔欑偣锛堜换鍔℃暟鏇村鐨勶級
+            orderedSites.addAll(devList.stream()
+                    .filter(dev -> dev.getInQty() > minInQty)
+                    .collect(Collectors.toList()));
+            log.debug("浣跨敤杞鍒嗛厤绛栫暐锛岀珯鐐圭粍锛歿}锛岃疆璇㈣捣濮嬬储寮曪細{}", groupKey, startIndex);
+        } else if (minTaskSites.size() > 1 && enableRoundRobin && "random".equals(strategy)) {
+            // 闅忔満鍒嗛厤锛氬厛闅忔満鎺掑簭浠诲姟鏁版渶灏戠殑绔欑偣
+            List<BasDevp> shuffledMinSites = new ArrayList<>(minTaskSites);
+            Collections.shuffle(shuffledMinSites);
+            orderedSites.addAll(shuffledMinSites);
+            // 娣诲姞鍏朵粬绔欑偣锛堜换鍔℃暟鏇村鐨勶級
+            orderedSites.addAll(devList.stream()
+                    .filter(dev -> dev.getInQty() > minInQty)
+                    .collect(Collectors.toList()));
+            log.debug("浣跨敤闅忔満鍒嗛厤绛栫暐");
+        } else {
+            // 榛樿锛氭寜鍏ュ簱浠诲姟鏁版帓搴忥紙宸茬粡鎺掑簭濂戒簡锛�
+            orderedSites = devList;
+        }
+        
+        // 渚濇妫�鏌ユ瘡涓珯鐐规槸鍚﹀湪鎼繍锛屾壘鍒扮涓�涓┖闂茬珯鐐瑰氨鍒嗛厤
+        BasDevp selectedSite = null;
+        for (BasDevp dev : orderedSites) {
+            String staNo = String.valueOf(dev.getDevNo());
             
-            // 妫�鏌ユ瘡涓珯鐐规槸鍚︽湁姝e湪鎼繍鐨勫悓绫诲瀷浠诲姟
-            for (BasDevp dev : devList) {
-                String staNo = String.valueOf(dev.getDevNo());
-                // 鏌ヨ璇ョ珯鐐规槸鍚︽湁鐘舵��8锛堟鍦ㄦ惉杩愶級鐨勫悓绫诲瀷浠诲姟
+            // 濡傛灉浠诲姟绫诲瀷涓嶄负绌猴紝妫�鏌ヨ绔欑偣鏄惁鏈夋鍦ㄦ惉杩愮殑鍚岀被鍨嬩换鍔�
+            boolean isTransporting = false;
+            if (checkIoTypes != null && !checkIoTypes.isEmpty()) {
                 List<Task> transportingTasks = taskService.selectList(
                     new EntityWrapper<Task>()
                         .eq("sta_no", staNo)
@@ -351,61 +394,29 @@
                         .eq("wrk_sts", 8L) // 鍙鏌ユ鍦ㄦ惉杩愮姸鎬佺殑浠诲姟
                         .in("io_type", checkIoTypes)
                 );
+                isTransporting = !transportingTasks.isEmpty();
                 
-                if (transportingTasks.isEmpty()) {
-                    // 璇ョ珯鐐规病鏈夋鍦ㄦ惉杩愮殑浠诲姟锛屽彲浠ュ垎閰�
-                    availableDevList.add(dev);
-                } else {
-                    log.debug("绔欑偣{}鏈墈}涓鍦ㄦ惉杩愮殑{}AGV浠诲姟锛岃烦杩囧垎閰�", 
+                if (isTransporting) {
+                    log.debug("绔欑偣{}鏈墈}涓鍦ㄦ惉杩愮殑{}AGV浠诲姟锛屾鏌ヤ笅涓�涓珯鐐�", 
                         staNo, transportingTasks.size(), taskTypeName);
+                    continue; // 璇ョ珯鐐规鍦ㄦ惉杩愶紝妫�鏌ヤ笅涓�涓珯鐐�
                 }
             }
-        } else {
-            // 濡傛灉ioType涓虹┖锛屼笉杩涜杩囨护锛堜繚鎸佸師鏈夐�昏緫锛�
-            availableDevList = devList;
+            
+            // 鎵惧埌绗竴涓┖闂茬珯鐐癸紝鍒嗛厤
+            selectedSite = dev;
+            log.info("浠诲姟ID锛歿}鎸夎鍒欏簲鍒嗛厤鍒扮珯鐐箋}锛岃绔欑偣绌洪棽锛屽垎閰嶆垚鍔�", task.getId(), staNo);
+            break;
         }
         
         // 濡傛灉鎵�鏈夌珯鐐归兘鍦ㄦ惉杩愶紝鍒欎笉鍒嗛厤绔欑偣
-        if (availableDevList.isEmpty()) {
-            log.warn("浠诲姟ID锛歿}鐨勬墍鏈夊�欓�夌珯鐐归兘鏈夋鍦ㄦ惉杩愮殑{}浠诲姟锛屾殏涓嶅垎閰嶇珯鐐�", 
+        if (selectedSite == null) {
+            log.warn("浠诲姟ID锛歿}鐨勬墍鏈夊�欓�夌珯鐐归兘鏈夋鍦ㄦ惉杩愮殑{}浠诲姟锛屾殏涓嶅垎閰嶇珯鐐癸紝绛夊緟绌洪棽", 
                 task.getId(), taskIoType != null && taskIoType < 100 ? "鍏ュ簱" : "鍑哄簱");
             return null;
         }
         
-        // 鍏ュ簱浠诲姟鏁版帓搴�
-        availableDevList.sort(Comparator.comparing(BasDevp::getInQty));
-        
-        // 閫夋嫨绔欑偣
-        BasDevp basDevp;
-        int minInQty = availableDevList.get(0).getInQty();
-        
-        // 绛涢�夊嚭浠诲姟鏁版渶灏戠殑绔欑偣鍒楄〃
-        List<BasDevp> minTaskSites = availableDevList.stream()
-                .filter(dev -> dev.getInQty() == minInQty)
-                .collect(Collectors.toList());
-        
-        // 鏍规嵁閰嶇疆閫夋嫨鍒嗛厤绛栫暐
-        String strategy = agvProperties.getSiteAllocation().getStrategy();
-        boolean enableRoundRobin = agvProperties.getSiteAllocation().isEnableRoundRobin();
-        
-        if (minTaskSites.size() > 1 && enableRoundRobin && "round-robin".equals(strategy)) {
-            // 杞鍒嗛厤
-            AtomicInteger counter = siteRoundRobinCounters.computeIfAbsent(groupKey, k -> new AtomicInteger(0));
-            int index = counter.getAndIncrement() % minTaskSites.size();
-            basDevp = minTaskSites.get(index);
-            log.info("浣跨敤杞鍒嗛厤绛栫暐锛岀珯鐐圭粍锛歿}锛岃疆璇㈢储寮曪細{}锛岄�変腑绔欑偣锛歿}", groupKey, index, basDevp.getDevNo());
-        } else if (minTaskSites.size() > 1 && enableRoundRobin && "random".equals(strategy)) {
-            // 闅忔満鍒嗛厤
-            Random random = new Random();
-            int index = random.nextInt(minTaskSites.size());
-            basDevp = minTaskSites.get(index);
-            log.info("浣跨敤闅忔満鍒嗛厤绛栫暐锛岄�変腑绔欑偣锛歿}", basDevp.getDevNo());
-        } else {
-            // 榛樿锛氶�夋嫨绗竴涓紙浠诲姟鏈�灏戠殑锛�
-            basDevp = devList.get(0);
-        }
-        
-        Integer endSite = basDevp.getDevNo();
+        Integer endSite = selectedSite.getDevNo();
         
         // 鍏ュ簱鏆傚瓨+1
         basDevpMapper.incrementInQty(endSite);
@@ -445,10 +456,11 @@
     @Transactional(rollbackFor = Exception.class)
     public void moveTaskToHistory(List<Task> taskList) {
 
-        // 鍐欏叆鍘嗗彶琛�
+        // 鍐欏叆鍘嗗彶琛紝淇濇寔ID涓�鑷�
         for (Task task : taskList) {
             TaskLog log = new TaskLog();
             BeanUtils.copyProperties(task, log);
+            // 淇濇寔ID涓�鑷达紝涓嶈缃负null
             taskLogService.insert(log);
         }
 

--
Gitblit v1.9.1