From 8740b1c94ffd20b54b95962df886e43f722911c5 Mon Sep 17 00:00:00 2001
From: lsh <lsh@163.com>
Date: 星期四, 24 四月 2025 17:31:12 +0800
Subject: [PATCH] *

---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |  326 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 292 insertions(+), 34 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
index c1c4edb..1fbc07a 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -13,25 +13,24 @@
 import com.zy.asrs.mapper.*;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.CommandUtils;
+import com.zy.asrs.utils.RouteUtils;
+import com.zy.asrs.utils.TrackRangeUtils;
 import com.zy.asrs.utils.Utils;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.HttpHandler;
 import com.zy.core.CrnThread;
 import com.zy.core.DevpThread;
-import com.zy.core.cache.MessageQueue;
-import com.zy.core.cache.RgvStatusCache;
-import com.zy.core.cache.SlaveConnection;
+import com.zy.core.cache.*;
 import com.zy.core.enums.*;
 import com.zy.core.model.CrnSlave;
 import com.zy.core.model.DevpSlave;
 import com.zy.core.model.RgvSlave;
 import com.zy.core.model.Task;
 import com.zy.core.model.command.CrnCommand;
-import com.zy.core.model.protocol.CrnProtocol;
-import com.zy.core.model.protocol.RgvProtocol;
-import com.zy.core.model.protocol.StaProtocol;
+import com.zy.core.model.protocol.*;
 import com.zy.core.properties.SlaveProperties;
 import com.zy.core.thread.BarcodeThread;
+import com.zy.core.thread.RgvThread;
 import com.zy.core.thread.SiemensDevpThread;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,6 +41,7 @@
 
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * 绔嬩綋浠撳簱WCS绯荤粺涓绘祦绋嬩笟鍔�
@@ -80,6 +80,8 @@
     private CommonService commonService;
     @Autowired
     private CrnController crnController;
+    @Autowired
+    private BasDevpPositionService basDevpPositionService;
 
     @Value("${wms.url}")
     private String wmsUrl;
@@ -99,6 +101,9 @@
 
     @Value("${constant-parameters.trackProportion}")
     private Long trackProportion;
+
+    @Value("${constant-parameters.avoidDistance}")
+    private Long avoidDistance;
 
     public void generateStoreWrkFile() {
         try {
@@ -1106,25 +1111,63 @@
         return taskWrk;
     }
 
-    public boolean deviceDetection(RgvSlave slave){
+    public String rgvOtherTaskWrk(RgvSlave slave){
+
+        RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, slave.getOtherId());
+        TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+        ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+        if (!allTaskProtocol.isEmpty()){
+            for (TaskProtocol taskProtocol : allTaskProtocol.values()){
+                if (taskProtocol.getTaskNo() != 0 ){
+                    return taskProtocol.getTaskNo().toString();
+                }
+            }
+        }
+        return "鏃�";
+
+    }
+    public boolean rgvDetection(RgvSlave slave){
         RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(slave.getId());
-        if (rgvProtocol == null) {
+        RgvTaskProtocol rgvTaskProtocol = RgvTaskCache.getRgvStatus(slave.getId());
+
+        if (rgvProtocol == null || rgvTaskProtocol ==null) {
             return false;
         }
-        if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L)
+        if (!rgvProtocol.getModeType().equals(RgvModeType.AUTO) || rgvProtocol.getRgvPos().equals(0L) || rgvTaskProtocol.getAvoid() == -1 || rgvProtocol.getRgvPosDestination() == 0L
                 || (!rgvProtocol.getStatusType().equals(RgvStatusType.IDLE) && !rgvProtocol.getStatusType().equals(RgvStatusType.ROAM))) {
             return false;
         }
         RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(slave.getOtherId());
+        RgvTaskProtocol rgvTaskProtocolOther = RgvTaskCache.getRgvStatus(slave.getOtherId());
+
         if (rgvProtocolOther == null) {
             return false;
         }
         if (rgvProtocolOther.statusEnable){
-            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) {
+            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L) || rgvTaskProtocolOther.getAvoid() == -1  || rgvProtocolOther.getRgvPosDestination() == 0L) {
                 return false;
             }
         }
         return true;
+    }
+
+    public TaskWrk deviceDetection(RgvSlave.RgvStn inSta){
+
+        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, inSta.getDevpPlcId());
+        StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
+        if (staProtocol == null){
+            return null;
+        }
+        // 鍒ゆ柇鏄惁婊¤冻鍙栬揣鏉′欢
+        if (staProtocol.isAutoing()
+//                && staProtocol.isLoading()
+                && staProtocol.getWorkNo()!=0) {
+            TaskWrk taskWrk = taskWrkService.selectByTaskNo(staProtocol.getWorkNo().toString());
+            if (taskWrk!=null){
+                return taskWrk;
+            }
+        }
+        return null;
     }
 
     public boolean rgvOtherStatusEnable(RgvSlave slave){
@@ -1134,42 +1177,257 @@
         }
         if (rgvProtocolOther.statusEnable){
 //            if (!rgvProtocolOther.getModeType().equals(RgvModeType.AUTO) || rgvProtocolOther.getRgvPos().equals(0L)) {
-                return true;
+            return true;
 //            }
         }
         return false;
     }
 
-
-    private void sc(){
-
-
-        // 鏍规嵁杈撻�佺嚎plc閬嶅巻
+    public synchronized void taskStart() {
         for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
-            if (!deviceDetection(rgvSlave)){
-                continue;
-            }
-            RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId());
+            try{
+                if (rgvDetection(rgvSlave)){
+                    String taskNoNow = rgvOtherTaskWrk(rgvSlave);
+                    List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("PLC_POSITION", true));
+                    boolean itSmall = new TrackRangeUtils().IsItSmall(rgvSlave);
+                    if (basDevpPositions.isEmpty()) {
+                        log.error("鑾峰彇鎵�鏈夌珯鐐逛俊鎭紓甯�");
+                        continue;
+                    }
+                    List<TaskWrk> taskWrkList = new ArrayList<>();
+                    List<Integer> staList = new ArrayList<>();
+                    for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSta()){
+                        TaskWrk taskWrk = deviceDetection(inSta);
+                        if (taskWrk!=null){
+                            if (taskWrk.getTaskNo().equals(taskNoNow)) continue;
+                            taskWrkList.add(taskWrk);
+                            staList.add(inSta.getStaNo());
+                        }
+                    }
 
-            RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId());
+                    if (taskWrkList.isEmpty() || staList.isEmpty()) continue;
 
-            //姹傚嚭褰撳墠杞﹀彲杩愯鑼冨洿
-            Long[] farthestPoint = new Long[]{0L,0L};
-            if (!rgvProtocolOther.statusEnable){
-                farthestPoint = new Long[]{0L,0L};
-            } else {
-                if (rgvProtocolOther.getStatusType().equals(RgvStatusType.IDLE)){
+                    boolean sign = false;
 
+                    if (rgvOtherStatusEnable(rgvSlave)){
+                        //鍒嗘垚涓婁笅涓ら儴鍒嗕换鍔�
+                        List<Integer>[] avoidRange = RouteUtils.gradeRange(staList, basDevpPositions);
+                        List<Integer> rangeListSou = avoidRange[itSmall ? 0 : 1];
+                        List<Integer> rangeListSouOther = avoidRange[itSmall ? 1 : 0];
+                        //灏辫繎鎺掑簭
+                        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId());
+                        List<Integer> rangeList = RouteUtils.SortNearby(rangeListSou, rgvProtocol.RgvPos, basDevpPositions);
+                        List<Integer> rangeListOther = RouteUtils.SortNearby(rangeListSouOther, rgvProtocol.RgvPos, basDevpPositions);
+
+                        //鎵�灞為儴鍒嗗氨杩涘彇璐�
+
+                        //绛涢�夎寖鍥村唴浠诲姟
+                        //灏辫繎鎺掑簭
+                        RgvProtocol rgvProtocolOther = RgvStatusCache.getRgvStatus(rgvSlave.getOtherId());
+                        //绛涢�夊湪鑼冨洿浠诲姟
+                        List<Integer> belongToRange = RouteUtils.belongToRange(rangeList, rgvProtocolOther.getRgvPosDestination(), basDevpPositions);
+                        for (Integer staNoNow : belongToRange){
+                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+                                if (rgvStn.getStaNo().equals(staNoNow)){
+                                    TaskWrk taskWrk = deviceDetection(rgvStn);
+                                    if (taskWrk!=null){
+                                        if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
+                                            sign = taskGenerate(rgvSlave,rgvStn,0);
+                                        }
+                                    }
+                                    break;
+                                }
+                            }
+                            if (sign){
+                                break;
+                            }
+                        }
+                        if (!sign){
+                            //  绛涢�夎寖鍥村唴鍙栬揣浠诲姟
+                            for (Integer staNoNow : belongToRange){
+                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+                                    if (rgvStn.getStaNo().equals(staNoNow)){
+                                        sign = taskGenerate(rgvSlave,rgvStn,0);
+                                        break;
+                                    }
+                                }
+                                if (sign){
+                                    break;
+                                }
+                            }
+                        }
+
+                        if (!sign){
+                            for (Integer staNoNow : rangeList){
+                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+                                    if (rgvStn.getStaNo().equals(staNoNow)){
+                                        TaskWrk taskWrk = deviceDetection(rgvStn);
+                                        if (taskWrk!=null){
+                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
+                                                sign = taskGenerate(rgvSlave,rgvStn,0);
+                                            }
+                                        }
+                                        break;
+                                    }
+                                }
+                                if (sign){
+                                    break;
+                                }
+                            }
+                        }
+                        if (!sign){
+                            //  鍗婅竟鍖哄煙鍐呭彇璐т换鍔�
+                            for (Integer staNoNow : rangeList){
+                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+                                    if (rgvStn.getStaNo().equals(staNoNow)){
+                                        sign = taskGenerate(rgvSlave,rgvStn,0);
+                                        break;
+                                    }
+                                }
+                                if (sign){
+                                    break;
+                                }
+                            }
+                        }
+                        if (!sign){
+                            //  鍗婅竟鍖哄煙鍐呮斁璐т换鍔�
+                            for (Integer staNoNow : rangeListOther){
+                                for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+                                    if (rgvStn.getStaNo().equals(staNoNow)){
+                                        TaskWrk taskWrk = deviceDetection(rgvStn);
+                                        if (taskWrk!=null){
+                                            if (RouteUtils.CheckIfItIsWithinTheRange(rangeList,taskWrk.getTargetPointConvert(),basDevpPositions)){
+                                                sign = taskGenerate(rgvSlave,rgvStn,0);
+                                            }
+                                        }
+                                        break;
+                                    }
+                                }
+                                if (sign){
+                                    break;
+                                }
+                            }
+                        }
+                    } else {
+                        //鍙敤鍖哄煙灏辫繎鍙栬揣
+                        //灏辫繎鎺掑簭
+                        RgvProtocol rgvProtocol = RgvStatusCache.getRgvStatus(rgvSlave.getId());
+                        List<Integer> rangeList = RouteUtils.SortNearby(staList, rgvProtocol.RgvPos, basDevpPositions);
+                        //  鍗婅竟鍖哄煙鍐呭彇璐т换鍔�
+                        for (Integer staNoNow : rangeList){
+                            for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+                                if (rgvStn.getStaNo().equals(staNoNow)){
+                                    sign = taskGenerate(rgvSlave,rgvStn,0);
+                                    break;
+                                }
+                            }
+                            if (sign){
+                                break;
+                            }
+                        }
+                    }
                 }
-            }
-
-
-            // 閬嶅巻鍏ュ簱鍙�
-            for (RgvSlave.RgvStn inSta : rgvSlave.getRgvInSStn()) {
-
+            } catch (Exception e){
+                log.error("浠诲姟鐢熸垚澶辫触===銆嬪紓甯镐俊鎭細{}",e.getMessage());
             }
         }
-
     }
+    //鑾峰彇璧风偣涓庣粓鐐瑰璞�
+    public RgvSlave.RgvStn getRgvStnNow(RgvSlave rgvSlave,Integer staNo) {
+        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+            if (rgvStn.getStaNo().equals(staNo)){
+                return rgvStn;
+            }
+        }
+        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()){
+            if (rgvStn.getStaNo().equals(staNo)){
+                return rgvStn;
+            }
+        }
+        return null;
+    }
+
+    //鑾峰彇璧风偣涓庣粓鐐瑰璞�
+    public RgvSlave.RgvStn[] getRgvStnAll(RgvSlave rgvSlave,Integer souSta,Integer endSta) {
+        RgvSlave.RgvStn[] rgvStns = new RgvSlave.RgvStn[2];
+        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvInSta()){
+            if (rgvStn.getStaNo().equals(souSta)){
+                rgvStns[0] = rgvStn;
+            }
+        }
+        for (RgvSlave.RgvStn rgvStn : rgvSlave.getRgvOutSta()){
+            if (rgvStn.getStaNo().equals(endSta)){
+                rgvStns[1] = rgvStn;
+            }
+        }
+        return rgvStns;
+    }
+
+    public boolean taskGenerate(RgvSlave rgvSlave,RgvSlave.RgvStn rgvStn,Integer sign) {
+        try{
+            RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+            TaskProtocolCache taskProtocolCache = rgvThread.getTaskProtocolCache();
+
+            TaskProtocol issuedTake = new TaskProtocol();
+            TaskProtocol issuedPut = new TaskProtocol();
+            try{
+                ConcurrentHashMap<String, TaskProtocol> allTaskProtocol = taskProtocolCache.getAllTaskProtocol();
+                if (allTaskProtocol.size() > 0){
+                    return false;
+                }
+                TaskWrk taskWrk = deviceDetection(rgvStn);
+                if (taskWrk == null){
+                    return false;
+                }
+                Integer targetPointConvert = taskWrk.getTargetPointConvert();
+                if (targetPointConvert == null){
+                    return false;
+                }
+                RgvSlave.RgvStn rgvStnEnd = getRgvStnNow(rgvSlave, targetPointConvert);
+                if (rgvStnEnd == null){
+                    return false;
+                }
+
+                BasDevpPosition basDevpPositionSou = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", rgvStn.getStaNo()));
+                BasDevpPosition basDevpPositionEnd = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("DEV_NO", targetPointConvert));
+                //鎵ц
+                issuedTake.setTaskNo(Long.valueOf(taskWrk.getTaskNo()));
+                issuedTake.setTaskStatus(1);
+                issuedTake.setTaskNoDirection(issuedTake.gettaskNoDirection$(issuedTake.getTaskNo(),issuedTake.getTaskStatus()));
+                issuedTake.setTargetPosition(basDevpPositionSou.getPlcPosition());
+                issuedTake.setIsRunning(1);
+                issuedTake.setDirection(rgvStn.isDirection());
+
+
+                issuedPut.setTaskNo(Long.valueOf(taskWrk.getTaskNo()));
+                issuedPut.setTaskStatus(2);
+                issuedPut.setTaskNoDirection(issuedPut.gettaskNoDirection$(issuedPut.getTaskNo(),issuedPut.getTaskStatus()));
+                issuedPut.setTargetPosition(basDevpPositionEnd.getPlcPosition());
+                issuedPut.setIsRunning(1);
+                issuedPut.setDirection(rgvStnEnd.isDirection());
+            }catch (Exception e){
+                log.error("浠诲姟鐢熸垚澶辫触issued1===銆嬪紓甯镐俊鎭細{}",e.getMessage());
+                return false;
+            }
+
+            switch (sign){
+                case 1:
+                    taskProtocolCache.updateTaskProtocol(issuedTake);
+                    break;
+                case 2:
+                    taskProtocolCache.updateTaskProtocol(issuedPut);
+                    break;
+                default:
+                    taskProtocolCache.updateTaskProtocol(issuedTake);
+                    taskProtocolCache.updateTaskProtocol(issuedPut);
+                    break;
+            }
+        } catch (Exception e){
+            log.error("浠诲姟鐢熸垚澶辫触issued2===銆嬪紓甯镐俊鎭細{}",e.getMessage());
+        }
+        return true;
+    }
+
+
 
 }

--
Gitblit v1.9.1