From 31d515a97818bccf5e01a46f55b98204988541be Mon Sep 17 00:00:00 2001
From: vincentlu <t1341870251@gmail.com>
Date: 星期三, 31 十二月 2025 10:24:07 +0800
Subject: [PATCH] #

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/AllocateService.java |   71 +++++++++++++++++++++--------------
 1 files changed, 42 insertions(+), 29 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 88ab574..c5ed4b9 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
@@ -92,35 +92,50 @@
     }
 
     public synchronized Agv execute(Task task) {
+        // inbound roller station
         Sta rollerOriSta = getInboundRollerSta(task);
-        if (rollerOriSta != null) {
-            List<String> availableAgvNos = this.getAvailableAgvNos(agvAreaDispatcher.getAgvNosByTask(task), true);
-            FilterLaneDto filterLaneDto = this.filterThroughLane(task, availableAgvNos);
-            if (null != filterLaneDto) {
-                String agvNo = this.checkoutAgvForInboundRoller(task, rollerOriSta, filterLaneDto.getActualAvailableAgvNos());
-                if (!Cools.isEmpty(agvNo)) {
-                    task.setOriLaneHash(filterLaneDto.getOriginLane().getHashCode());
-                    task.setDestLaneHash(filterLaneDto.getDestinationLane().getHashCode());
-                    return agvService.selectByUuid(agvNo);
-                }
-            }
+        Agv inboundAgv = tryAllocateForRoller(task, rollerOriSta, true);
+        if (inboundAgv != null) {
+            return inboundAgv;
         }
 
+        // outbound roller station
         Sta rollerDestSta = getOutboundRollerSta(task);
-        if (rollerDestSta != null) {
-            List<String> availableAgvNos = this.getAvailableAgvNos(agvAreaDispatcher.getAgvNosByTask(task), true);
-            FilterLaneDto filterLaneDto = this.filterThroughLane(task, availableAgvNos);
-            if (null != filterLaneDto) {
-                String agvNo = this.checkoutAgvForOutboundRoller(task, rollerDestSta, filterLaneDto.getActualAvailableAgvNos());
-                if (!Cools.isEmpty(agvNo)) {
-                    task.setOriLaneHash(filterLaneDto.getOriginLane().getHashCode());
-                    task.setDestLaneHash(filterLaneDto.getDestinationLane().getHashCode());
-                    return agvService.selectByUuid(agvNo);
-                }
-            }
+        Agv outboundAgv = tryAllocateForRoller(task, rollerDestSta, false);
+        if (outboundAgv != null) {
+            return outboundAgv;
         }
 
         return this.normalExecute(task);
+    }
+
+    private Agv tryAllocateForRoller(Task task, Sta rollerSta, boolean inbound) {
+        if (rollerSta == null) {
+            return null;
+        }
+
+        List<String> availableAgvNos = this.getAvailableAgvNos(agvAreaDispatcher.getAgvNosByTask(task), true);
+        FilterLaneDto filterLaneDto = this.filterThroughLane(task, availableAgvNos);
+        if (filterLaneDto == null) {
+            return null;
+        }
+
+        String agvNo = inbound
+                ? this.checkoutAgvForInboundRoller(task, rollerSta, filterLaneDto.getActualAvailableAgvNos())
+                : this.checkoutAgvForOutboundRoller(task, rollerSta, filterLaneDto.getActualAvailableAgvNos());
+        if (Cools.isEmpty(agvNo)) {
+            return null;
+        }
+
+        // record lane hash for later dispatch/traffic-control logic
+        if (filterLaneDto.getOriginLane() != null) {
+            task.setOriLaneHash(filterLaneDto.getOriginLane().getHashCode());
+        }
+        if (filterLaneDto.getDestinationLane() != null) {
+            task.setDestLaneHash(filterLaneDto.getDestinationLane().getHashCode());
+        }
+
+        return agvService.selectByUuid(agvNo);
     }
 
     /**
@@ -148,14 +163,12 @@
         Lane originLane = filterLaneDto.getOriginLane();
         Lane destinationLane = filterLaneDto.getDestinationLane();
         List<String> actualAvailableAgvNos = filterLaneDto.getActualAvailableAgvNos();
+        if (Cools.isEmpty(actualAvailableAgvNos)) {
+            return null;
+        }
 
         // choose min number of running task
-        actualAvailableAgvNos.sort(new Comparator<String>() {
-            @Override
-            public int compare(String agvNo1, String agvNo2) {
-                return calcAllocateWeight(agvNo1, task) - calcAllocateWeight(agvNo2, task);
-            }
-        });
+        actualAvailableAgvNos.sort(Comparator.comparingInt(agvNo -> calcAllocateWeight(agvNo, task)));
 
         if (null != originLane) {
             task.setOriLaneHash(originLane.getHashCode());
@@ -164,7 +177,7 @@
             task.setDestLaneHash(destinationLane.getHashCode());
         }
 
-        return agvService.selectByUuid(actualAvailableAgvNos.stream().findFirst().orElse(null));
+        return agvService.selectByUuid(actualAvailableAgvNos.get(0));
     }
 
     private String checkoutAgvForInboundRoller(Task task, Sta sta, List<String> availableAgvNos) {

--
Gitblit v1.9.1