From d835d1b51f832889929cdf69010034a30ef44d02 Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期四, 17 十月 2024 13:57:29 +0800
Subject: [PATCH] #

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java |  112 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 87 insertions(+), 25 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
index 1226aa3..820c458 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java
@@ -9,17 +9,16 @@
 import com.zy.asrs.wcs.core.entity.*;
 import com.zy.asrs.wcs.core.kernel.AnalyzeService;
 import com.zy.asrs.wcs.core.model.NavigateNode;
-import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
-import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
-import com.zy.asrs.wcs.core.model.enums.TaskCtgType;
-import com.zy.asrs.wcs.core.model.enums.TaskStsType;
+import com.zy.asrs.wcs.core.model.enums.*;
 import com.zy.asrs.wcs.core.service.*;
 import com.zy.asrs.wcs.rcs.News;
 import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
 import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.rcs.model.enums.ShuttleProtocolStatusType;
 import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
 import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
 import com.zy.asrs.wcs.rcs.service.DeviceService;
+import com.zy.asrs.wcs.rcs.thread.LiftThread;
 import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import com.zy.asrs.wcs.system.entity.Dict;
 import com.zy.asrs.wcs.system.service.DictService;
@@ -126,10 +125,12 @@
                     continue;
                 }
 
-                Device recentTransferLift = Utils.getRecentTransferLift(locNo, Integer.parseInt(device.getDeviceNo()));
-                if (recentTransferLift == null) {
+                //鑾峰彇璺濈鐩爣浣嶇疆鏈�杩戠殑绌洪棽鍙崲灞傛彁鍗囨満
+                LiftThread liftThread = liftDispatcher.searchIdleLift(locNo, task.getHostId(), true);
+                if (liftThread == null) {
                     continue;
                 }
+                Device recentTransferLift = liftThread.getDevice();
 
                 //鑾峰彇灏忚溅妤煎眰鎻愬崌鏈哄緟鏈轰綅
                 ShuttleStandby shuttleStandby = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
@@ -158,7 +159,7 @@
             }
 
             // 鎸傝浇浠诲姟鏉冮噸
-            List<Task> tasks = taskService.selectWorkingByShuttle(Integer.valueOf(device.getDeviceNo()));
+            List<Task> tasks = taskService.selectWorkingByShuttle(Integer.valueOf(device.getDeviceNo()), null);
             if (!Cools.isEmpty(tasks)) {
                 currDistance += tasks.size() * WEIGHT;
             }
@@ -283,9 +284,9 @@
     }
 
     /**
-     * 鎼滅储閬胯搴撲綅锛岄�氳繃灏忚溅鍙峰拰鐩爣搴撲綅
+     * 鎼滅储鍙敤搴撲綅锛岄�氳繃灏忚溅鍙峰拰鐩爣搴撲綅
      */
-    public String searchStandByLocNo(Integer shuttleNo, Long hostId, String locNo) {
+    public String searchAvailableLocNo(Integer shuttleNo, Long hostId, String currentLocNo, List<String> locNos) {
         BasShuttle basShuttle = basShuttleService.getOne(new LambdaQueryWrapper<BasShuttle>()
                 .eq(BasShuttle::getShuttleNo, shuttleNo)
                 .eq(BasShuttle::getHostId, hostId));
@@ -293,29 +294,18 @@
             throw new CoolException("灏忚溅鍩虹鏁版嵁涓嶅瓨鍦�");
         }
 
-        String idleLoc = basShuttle.getIdleLoc();
-        if (Cools.isEmpty(idleLoc)) {
-            throw new CoolException("灏忚溅閬胯鏁版嵁涓嶅瓨鍦�");
+        if (locNos.isEmpty()) {
+            throw new CoolException("褰撳墠灞傛棤閬胯浣嶇疆");
         }
 
-        int lev = Utils.getLev(locNo);//褰撳墠妤煎眰
-        JSONArray standbyLoc = JSON.parseArray(idleLoc);
-        if (lev > standbyLoc.size()) {
-            throw new CoolException("閬胯鏁版嵁寮傚父");
-        }
-
-        Object object = standbyLoc.get(lev - 1);
-        List<String> locs = JSON.parseArray(object.toString(), String.class);
-        if (locs.isEmpty()) {
-            throw new CoolException("閬胯鏁版嵁涓虹┖");
-        }
+        int lev = Utils.getLev(currentLocNo);
 
         Integer finalDistance = ShuttleDispatcher.INF;
         String recentLoc = null;
-        for (String loc : locs) {
+        for (String loc : locNos) {
             //褰撳墠绌挎杞﹀埌閬胯浣嶈绠�
             List<NavigateNode> currentShuttlePath = NavigateUtils.calc(
-                    locNo
+                    currentLocNo
                     , loc
                     , NavigationMapType.NORMAL.id
                     , Utils.getShuttlePoints(shuttleNo, lev)
@@ -366,6 +356,18 @@
                 continue;
             }
 
+            if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE)) {
+                continue;
+            }
+
+            if(!shuttleThread.isDeviceIdle()) {
+                continue;
+            }
+
+            if(shuttleProtocol.getCurrentLocNo() == null) {
+                continue;
+            }
+
             if (Utils.getLev(shuttleProtocol.getCurrentLocNo()) == lev) {
                 if (shuttleProtocol.getHasCharge()) {
                     continue;//鍏呯數涓�
@@ -395,8 +397,68 @@
 
         }
 
+        //鎼滅储鏄惁瀛樺湪鍓嶅線鐩爣妤煎眰鐨勫皬杞﹀伐浣滄。
+        for (Task task : taskService.list(new LambdaQueryWrapper<Task>()
+                .in(Task::getTaskSts, TaskStsType.NEW_INBOUND.sts, TaskStsType.ANALYZE_INBOUND.sts, TaskStsType.EXECUTE_INBOUND.sts, TaskStsType.COMPLETE_INBOUND.sts
+                        , TaskStsType.NEW_OUTBOUND.sts, TaskStsType.ANALYZE_OUTBOUND.sts, TaskStsType.EXECUTE_OUTBOUND.sts, TaskStsType.COMPLETE_OUTBOUND.sts))) {
+
+            List<Motion> motions = motionService.list(new LambdaQueryWrapper<Motion>()
+                    .eq(Motion::getTaskNo, task.getTaskNo())
+                    .in(Motion::getMotionCtg, MotionCtgType.SHUTTLE_MOVE
+                            , MotionCtgType.SHUTTLE_MOVE_LIFT_PALLET
+                            , MotionCtgType.SHUTTLE_MOVE_DOWN_PALLET
+                            , MotionCtgType.SHUTTLE_MOVE_FROM_LIFT
+                            , MotionCtgType.SHUTTLE_MOVE_TO_LIFT
+                            , MotionCtgType.SHUTTLE_MOVE_FROM_CONVEYOR
+                            , MotionCtgType.SHUTTLE_MOVE_TO_CONVEYOR
+                            , MotionCtgType.SHUTTLE_MOVE_FROM_LIFT_TO_CONVEYOR
+                    ));
+
+            boolean isUpdateLev = false;
+            for (Motion motion : motions) {
+                if (motion.getOrigin() == null || motion.getTarget() == null) {
+                    continue;
+                }
+
+                int sourceLev = Utils.getLev(motion.getOrigin());//鍔ㄤ綔婧愭ゼ灞�
+                int targetLev = Utils.getLev(motion.getTarget());//鍔ㄤ綔鐩爣妤煎眰
+                if (sourceLev != targetLev) {
+                    isUpdateLev = true;
+                    break;
+                }
+            }
+
+            if(isUpdateLev) {
+                levCount++;//宸ヤ綔妗e睘浜庤法灞備换鍔★紝灏忚溅褰掑睘浜庣洰鏍囨ゼ灞�
+                continue;
+            }
+
+        }
+
+
         return levCount < Integer.parseInt(dict.getValue());
     }
 
+    //鍒嗘瀽鍑哄簱璺緞寰呮満搴撲綅
+    public String analyzeOutPathWaitLoc(String startLoc, String targetLoc, Device shuttleDevice) {
+        //璁$畻璺緞骞跺垎瑙f垚涓ゆ鍔ㄤ綔
+        List<NavigateNode> nodeList = NavigateUtils.calc(startLoc, targetLoc, NavigationMapType.DFX.id, Utils.getShuttlePoints(Integer.parseInt(shuttleDevice.getDeviceNo()), Utils.getLev(startLoc)));
+        if (nodeList == null) {
+            News.error("{} dash {} can't find navigate path!", startLoc, targetLoc);
+            return null;
+        }
+        //鑾峰彇鍒嗘璺緞
+        ArrayList<ArrayList<NavigateNode>> data = NavigateUtils.getSectionPath(nodeList);
+        if (data.size() <= 1) {
+            return null;//涓ょ偣涔嬮棿鍙湁涓�娈佃矾寰�
+        }
+
+        //鍙栧嚭鍊掓暟绗簩娈佃矾寰�
+        ArrayList<NavigateNode> navigateNodes = data.get(data.size() - 2);
+        NavigateNode startNode = navigateNodes.get(0);
+        String lastPathStartLoc = Utils.getLocNo(startNode.getX(), startNode.getY(), startNode.getZ());
+        return lastPathStartLoc;
+    }
+
 
 }

--
Gitblit v1.9.1