From 5a9828d9466e0ae7d57c255b6c5f4dfe4999ddcc Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 28 十月 2024 15:29:41 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java |   71 ++++++++++++++++++++++-------------
 1 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
index 93f3c33..8401b2d 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java
@@ -69,7 +69,13 @@
     }
 
     /**
-     * it can break the limit of the number of agv backpack
+     * 1.   鍒ゆ柇task鐨勮捣濮嬬偣鍜岀洰鐨勭偣鎵�鍦ㄧ殑宸烽亾鎵胯浇浠诲姟鏁伴噺锛�
+     *      濡傛灉鏁伴噺宸茬粡杈惧埌璐熻浇锛屽垯鍒ゆ柇璐熻浇浠诲姟鐨凙GV鏄惁杩樻湁绌鸿儗绡擄紝濡傛灉鏈夊垯浼樺厛娲惧彂缁欏畠锛�
+     *      濡傛灉娌℃湁浜嗭紝閭d箞鍒欓樆濉炰换鍔★紝鐩村埌璇ュ贩閬撻噴鏀�
+     * 2.   杞绌洪棽灏忚溅锛岀洰鏍囨槸璁╂瘡鍙板皬杞﹂兘鍔ㄨ捣鏉�
+     *      鍒ゆ柇閫昏緫锛氳儗绡撴暟閲忔渶灏戠殑灏忚溅杞鐨勬椂鍊欙紝浼樺厛绾ф渶楂�
+     *
+     *      it can break the limit of the number of agv backpack
      */
     public synchronized Agv execute(Task task) {
         List<Agv> availableAgvList = getAvailableAgv();
@@ -93,13 +99,10 @@
             if (!Cools.isEmpty(agvNosByOriLane) && agvNosByOriLane.size() >= maxAgvCountInLane) {
 
                 availableAgvNosByOriLane = Cools.getIntersection(agvNosByOriLane, availableAgvNos);
-                availableAgvNosByOriLane = availableAgvNosByOriLane.stream().filter(agvNo -> {
-                    Agv agv = agvService.selectByUuid(agvNo);
-
-                    return agv.getStatus() == 1;
-                }).collect(Collectors.toList());
             }
         }
+        // valid backpack limit
+        availableAgvNosByOriLane = this.validBackpackLimit(availableAgvNosByOriLane);
 
 
         // allocate about destination
@@ -109,13 +112,9 @@
             if (!Cools.isEmpty(agvNosByDestLane) && agvNosByDestLane.size() >= maxAgvCountInLane) {
 
                 availableAgvNosByDestLane = Cools.getIntersection(agvNosByDestLane, availableAgvNos);
-                availableAgvNosByDestLane = availableAgvNosByDestLane.stream().filter(agvNo -> {
-                    Agv agv = agvService.selectByUuid(agvNo);
-
-                    return agv.getStatus() == 1;
-                }).collect(Collectors.toList());
             }
         }
+        availableAgvNosByDestLane = this.validBackpackLimit(availableAgvNosByDestLane);
 
         // valid
         if (Cools.isEmpty(availableAgvNosByOriLane)) {
@@ -133,29 +132,23 @@
             return null;
         }
 
+        // choose min number of running task
         actualAvailableAgvNos.sort(new Comparator<String>() {
             @Override
-            public int compare(String o1, String o2) {
-                return 0;
+            public int compare(String agvNo1, String agvNo2) {
+                return calcAllocateWeight(agvNo2, task) - calcAllocateWeight(agvNo1, task);
             }
         });
 
-        String s = actualAvailableAgvNos.stream().findFirst().orElse(null);
 
+        if (null != originLane) {
+            task.setOriLaneHash(originLane.getHashCode());
+        }
+        if (null != destinationLane) {
+            task.setDestLaneHash(destinationLane.getHashCode());
+        }
 
-        /**
-         * 1.   鍒ゆ柇task鐨勮捣濮嬬偣鍜岀洰鐨勭偣鎵�鍦ㄧ殑宸烽亾鎵胯浇浠诲姟鏁伴噺锛�
-         *      濡傛灉鏁伴噺宸茬粡杈惧埌璐熻浇锛屽垯鍒ゆ柇璐熻浇浠诲姟鐨凙GV鏄惁杩樻湁绌鸿儗绡擄紝濡傛灉鏈夊垯浼樺厛娲惧彂缁欏畠锛�
-         *      濡傛灉娌℃湁浜嗭紝閭d箞鍒欓樆濉炰换鍔★紝鐩村埌璇ュ贩閬撻噴鏀�
-         *
-         * 2.   杞绌洪棽灏忚溅锛岀洰鏍囨槸璁╂瘡鍙板皬杞﹂兘鍔ㄨ捣鏉�
-         *      鍒ゆ柇閫昏緫锛氳儗绡撴暟閲忔渶灏戠殑灏忚溅杞鐨勬椂鍊欙紝浼樺厛绾ф渶楂�
-         */
-
-        task.setOriLaneHash(originLane.getHashCode());
-        task.setDestLaneHash(destinationLane.getHashCode());
-
-        return null;
+        return agvService.selectByUuid(actualAvailableAgvNos.stream().findFirst().orElse(null));
     }
 
     private List<String> findAgvNosByLane(Lane lane) {
@@ -171,6 +164,30 @@
         }).distinct().collect(Collectors.toList());
     }
 
+    // calculate wight
+    private int calcAllocateWeight(String agvNo, Task task) {
+        int weight = 0;
+        Agv agv = agvService.selectByUuid(agvNo);
+        List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId());
+        if (!Cools.isEmpty(runningTasks)) {
+            weight = weight + runningTasks.size() * 10;
+        }
+
+        return weight;
+    }
+
+    private List<String> validBackpackLimit(List<String> agvNoList) {
+        if (Cools.isEmpty(agvNoList)) {
+            return new ArrayList<>();
+        }
+        return agvNoList.stream().filter(agvNo -> {
+            Agv agv = agvService.selectByUuid(agvNo);
+            AgvModel agvModel = agvModelService.getById(agv.getAgvModel());
+            List<Task> runningTasks = taskService.findRunningTasksByAgv(agv.getId());
+            return runningTasks.size() < agvModel.getBackpack();
+        }).collect(Collectors.toList());
+    }
+
     public synchronized Agv execute(Task task, Map<String, List<Long>> taskAllot, List<Long> taskIds) {
         String oriLocNo = task.getOriLoc$();
         int oriLocRow = LocUtils.getRow(oriLocNo);

--
Gitblit v1.9.1