From e45a2aafabf9e76bf6556922c90104ea69ecae5a Mon Sep 17 00:00:00 2001
From: Junjie <xjj@123>
Date: 星期二, 23 四月 2024 13:16:56 +0800
Subject: [PATCH] #

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/ShuttleDispatcher.java |  157 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 91 insertions(+), 66 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 cac25e6..b56b3ff 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
@@ -6,27 +6,24 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.SnowflakeIdWorker;
 import com.zy.asrs.framework.exception.CoolException;
-import com.zy.asrs.wcs.core.entity.BasShuttle;
-import com.zy.asrs.wcs.core.entity.Task;
+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.LiftCodeType;
+import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
 import com.zy.asrs.wcs.core.model.enums.NavigationMapType;
-import com.zy.asrs.wcs.core.service.BasShuttleService;
-import com.zy.asrs.wcs.core.service.TaskService;
+import com.zy.asrs.wcs.core.model.enums.TaskStsType;
+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.entity.DeviceType;
 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.service.DeviceTypeService;
-import com.zy.asrs.wcs.core.service.MotionService;
 import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import java.util.*;
 
 /**
  * Created by vincent on 2023/10/12
@@ -43,8 +40,6 @@
     private LiftDispatcher liftDispatcher;
     @Autowired
     private SnowflakeIdWorker snowflakeIdWorker;
-//    @Autowired
-//    private CommonService commonService;
     @Autowired
     private AnalyzeService analyzeService;
     @Autowired
@@ -52,25 +47,19 @@
     @Autowired
     private DeviceService deviceService;
     @Autowired
-    private DeviceTypeService deviceTypeService;
-    @Autowired
     private BasShuttleService basShuttleService;
+    @Autowired
+    private TaskCtgService taskCtgService;
+    @Autowired
+    private ShuttleStandbyService shuttleStandbyService;
 
-    public ShuttleThread queryShuttleWhichConvenient(Task task, Integer liftNo) {
+    public synchronized ShuttleThread searchIdleShuttle(Task task) {
         String locNo = taskService.judgeInbound(task) ? task.getDestLoc() : task.getOriginLoc();
         ShuttleThread resThread = null;
         Integer finalDistance = ShuttleDispatcher.INF;
 
-        DeviceType deviceType = deviceTypeService.getOne(new LambdaQueryWrapper<DeviceType>()
-                .eq(DeviceType::getHostId, task.getHostId())
-                .eq(DeviceType::getStatus, 1)
-                .eq(DeviceType::getFlag, String.valueOf(SlaveType.Shuttle)));
-        if (deviceType == null) {
-            throw new CoolException("璁惧绫诲瀷涓嶅瓨鍦�");
-        }
-
         List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
-                .eq(Device::getDeviceType, deviceType.getId())
+                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
                 .eq(Device::getHostId, task.getHostId())
                 .eq(Device::getStatus, 1));
 
@@ -89,11 +78,11 @@
                 continue;
             }
 
-//            //妫�娴嬫槸鍚﹀瓨鍦ㄥ厖鐢典换鍔�
-//            WrkCharge wrkCharge = wrkChargeService.selectWorking(shuttle.getId());
-//            if (wrkCharge != null) {
-//                continue;
-//            }
+            //妫�娴嬫槸鍚﹀瓨鍦ㄥ厖鐢典换鍔�
+            Task taskCharge = taskService.selectChargeWorking(Integer.valueOf(device.getDeviceNo()));
+            if (taskCharge != null) {
+                continue;
+            }
 
             // 鏈夋病鏈夎鍏朵粬浠诲姟璋冨害
             int currentLev = Utils.getLev(shuttleProtocol.getCurrentLocNo());//灏忚溅褰撳墠灞傞珮
@@ -104,10 +93,22 @@
                 break;
             }
 
-            String targetLocNo = LiftCodeType.getStandbyLocNo(liftNo, currentLev);//榛樿鍒版彁鍗囨満寰呮満浣�
+            String targetLocNo = null;//榛樿鍒版彁鍗囨満寰呮満浣�
             // 鍚屾ゼ灞傜洿鎺ヨ绠楀埌鐩爣搴撲綅
             if (currentLev == Utils.getLev(locNo)) {
                 targetLocNo = locNo;
+            }else {
+                Device recentTransferLift = Utils.getRecentTransferLift(locNo, Integer.parseInt(device.getDeviceNo()));
+                if (recentTransferLift == null) {
+                    continue;
+                }
+
+                //鑾峰彇灏忚溅妤煎眰鎻愬崌鏈哄緟鏈轰綅
+                ShuttleStandby shuttleStandby = shuttleStandbyService.getOne(new LambdaQueryWrapper<ShuttleStandby>()
+                        .eq(ShuttleStandby::getDeviceId, recentTransferLift.getId())
+                        .eq(ShuttleStandby::getDeviceLev, currentLev)
+                        .eq(ShuttleStandby::getStatus, 1));
+                targetLocNo = shuttleStandby.getDeviceLoc();
             }
 
             //褰撳墠绌挎杞︾嚎绋嬪埌褰撳墠杞﹀瓙鎵�鍦ㄦゼ灞傜殑鎻愬崌鏈哄彛璺濈
@@ -128,11 +129,11 @@
                 currDistance += WEIGHT;
             }
 
-//            // 鎸傝浇浠诲姟鏉冮噸
-//            List<Task> tasks = taskService.selectWorkingByShuttle(shuttle.getId());
-//            if (!Cools.isEmpty(tasks)) {
-//                currDistance += tasks.size() * WEIGHT;
-//            }
+            // 鎸傝浇浠诲姟鏉冮噸
+            List<Task> tasks = taskService.selectWorkingByShuttle(Integer.valueOf(device.getDeviceNo()));
+            if (!Cools.isEmpty(tasks)) {
+                currDistance += tasks.size() * WEIGHT;
+            }
 
             if (currDistance < finalDistance) {
                 finalDistance = currDistance;
@@ -143,38 +144,62 @@
         return resThread;
     }
 
-//    /**
-//     * 鐢熸垚绌挎杞﹁縼绉讳换鍔�
-//     */
-//    public WrkCharge generateShuttleChargeWrkComplete(Integer shuttleNo, String locNo) {
-//        WrkCharge wrkCharge = new WrkCharge();
-//        wrkCharge.setShuttleNo(shuttleNo);
-//        wrkCharge.setWrkNo(commonService.getChargeWorkNo(4));
-//        wrkCharge.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
-//        wrkCharge.setWrkSts(WrkMastStsType.NEW_MOVE.sts);   // 杩佺Щ浠诲姟
-//        wrkCharge.setIoType(WrkIoTypeType.MOVE.sts);
-//        wrkCharge.setIoPri((double) 10);
-//        wrkCharge.setLocNo(locNo);
-//        wrkCharge.setMemo("reset");
-//        wrkCharge.setAppeTime(new Date());
-//
-//        // generate motion list
-//        List<Motion> motionList = analyzeService.generateShuttleChargeWrkComplete(wrkCharge);
-//        if (Cools.isEmpty(motionList)) {
-//            News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅杩佺Щ浠诲姟澶辫触!!!", shuttleNo);
-//            return null;
-//        }
-//        motionService.batchInsert(motionList, wrkCharge.getUuid(), wrkCharge.getWrkNo());
-//
-//        wrkCharge.setWrkSts(WrkMastStsType.ANALYZE_MOVE.sts);
-//
-//        if (!wrkChargeService.insert(wrkCharge)) {
-//            News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅杩佺Щ浠诲姟澶辫触!!!", shuttleNo);
-//            return null;
-//        }
-//
-//        return wrkCharge;
-//    }
+    //鐢熸垚杩佺Щ浠诲姟
+    public synchronized Task generateMoveTask(Device device, String locNo) {
+        // 宸叉湁杩佺Щ浠诲姟
+        if (taskService.selectMoveWorking(Integer.valueOf(device.getDeviceNo())) != null) {
+            return null;
+        }
+
+        //鑾峰彇杩佺Щ浠诲姟绫诲瀷
+        TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
+                .eq(TaskCtg::getFlag, "MOVE")
+                .eq(TaskCtg::getStatus, 1));
+        if (taskCtg == null) {
+            return null;
+        }
+
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
+        if (shuttleThread == null) {
+            return null;
+        }
+
+        //鑾峰彇閬胯浣嶇疆
+        String standByLocNo = this.searchStandByLocNo(Integer.valueOf(device.getDeviceNo()), device.getHostId(), shuttleThread.getStatus().getCurrentLocNo());
+
+        Task task = new Task();
+        task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+        task.setTaskNo(String.valueOf(Utils.getTaskNo("MOVE")));
+        task.setTaskSts(TaskStsType.NEW_MOVE.sts);
+        task.setTaskCtg(taskCtg.getId());
+        task.setPriority(10);
+        task.setOriginSite(null);
+        task.setOriginLoc(null);
+        task.setDestSite(null);
+        task.setDestLoc(standByLocNo); // 閬胯浣嶇疆
+        task.setIoTime(new Date());
+        task.setStartTime(new Date());
+        task.setHostId(device.getHostId());
+        task.setStatus(1);
+        task.setShuttleNo(Integer.valueOf(device.getDeviceNo()));
+
+        // generate motion list
+        List<Motion> motionList = analyzeService.generateShuttleMoveMotion(task);
+        if (Cools.isEmpty(motionList)) {
+            News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅杩佺Щ浠诲姟澶辫触!!!", device.getDeviceNo());
+            return null;
+        }
+        motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()));
+
+        task.setTaskSts(TaskStsType.ANALYZE_MOVE.sts);
+
+        if (!taskService.save(task)) {
+            News.error("淇濆瓨{}鍙峰洓鍚戠┛姊溅杩佺Щ浠诲姟澶辫触!!!", device.getDeviceNo());
+            return null;
+        }
+
+        return task;
+    }
 
     /**
      * 鎼滅储閬胯搴撲綅锛岄�氳繃灏忚溅鍙峰拰鐩爣搴撲綅

--
Gitblit v1.9.1