From 1dacf2305187f5c2fb44f03b6b754c46cb73ba25 Mon Sep 17 00:00:00 2001
From: L <L@132>
Date: 星期四, 19 三月 2026 08:53:59 +0800
Subject: [PATCH] *

---
 src/main/java/com/zy/core/thread/RgvThread.java             |   23 ++++++-
 src/main/java/com/zy/asrs/controller/RgvController.java     |   31 ++++++---
 src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java |   84 +++++++++++++++++++++++++--
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java |   19 +++++
 src/main/resources/license.lic                              |    0 
 5 files changed, 132 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/RgvController.java b/src/main/java/com/zy/asrs/controller/RgvController.java
index 81e6b8c..cf6679d 100644
--- a/src/main/java/com/zy/asrs/controller/RgvController.java
+++ b/src/main/java/com/zy/asrs/controller/RgvController.java
@@ -348,22 +348,31 @@
             if (rgvProtocol == null) {
                 continue;
             }
-            RingThroughParam ringThroughParam = new RingThroughParam();
+            try {
+                if (rgvProtocol.getRgvPos() == null || rgvProtocol.getModeType() == null || rgvProtocol.getStatusType() == null) {
+                    log.warn("鐜┛浣嶇疆淇℃伅瀛樺湪绌哄瓧娈碉紝璺宠繃璇GV: rgvNo={}", rgv.getId());
+                    continue;
+                }
+                RingThroughParam ringThroughParam = new RingThroughParam();
 
-            ringThroughParam.setIndex(rgv.getId());
+                ringThroughParam.setIndex(rgv.getId());
 //            ringThroughParam.setIndex(i);
 //            double[] doubles = Utils.RingThroughXY2(perimeter, NumUtils.GetRandomIntInRange(183));
 //            double[] doubles = Utils.RingThroughXYRgv(perimeter, perimeter-rgvProtocol.RgvPos.doubleValue());
-            double[] doubles = Utils.getRgvPosNew(perimeter, rgvProtocol.RgvPos.doubleValue());
+                double[] doubles = Utils.getRgvPosNew(perimeter, rgvProtocol.getRgvPos().doubleValue());
 
-            ringThroughParam.setValueX(doubles[0]);
-            ringThroughParam.setValueY(doubles[1]);
-            ringThroughParam.setModeColor(rgvProtocol.modeType.color);
-            ringThroughParam.setStatusColor(rgvProtocol.statusType.color);
-            if (rgvProtocol.getModeType() == RgvModeType.AUTO){
-                ringThroughParam.setAnimation(2);
+                ringThroughParam.setValueX(doubles[0]);
+                ringThroughParam.setValueY(doubles[1]);
+                ringThroughParam.setModeColor(rgvProtocol.getModeType().color);
+                ringThroughParam.setStatusColor(rgvProtocol.getStatusType().color);
+                if (rgvProtocol.getModeType() == RgvModeType.AUTO){
+                    ringThroughParam.setAnimation(2);
+                }
+                result.add(ringThroughParam);
+            } catch (Exception e) {
+                // 鍗曞彴RGV鏁版嵁寮傚父涓嶅奖鍝嶅叾瀹僐GV缁樺埗
+                log.error("鐜┛浣嶇疆淇℃伅澶勭悊寮傚父锛岃烦杩囪RGV: rgvNo={}", rgv.getId(), e);
             }
-            result.add(ringThroughParam);
         }
         return R.ok().add(result);
     }
@@ -593,4 +602,4 @@
         return R.error("鍒濆鍖栧け璐ワ紒锛侊紒");
     }
 
-}
\ No newline at end of file
+}
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 ccaa0ff..e6e8827 100644
--- a/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -100,7 +100,7 @@
     public synchronized int[][] getStePositionNearby(Integer siteNo) {
         try {
             List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position", true));
-            if (basDevpPositions.isEmpty()) {
+            if (basDevpPositions == null || basDevpPositions.isEmpty()) {
                 log.error("鑾峰彇鎵�鏈夌珯鐐逛俊鎭紓甯�");
                 return null;
             }
@@ -114,8 +114,11 @@
             List<List<Long>> rgvPositionList = new ArrayList<>();
             for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
                 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                if (rgvThread == null) {
+                    continue;
+                }
                 RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-                if (rgvProtocol == null) {
+                if (rgvProtocol == null || rgvProtocol.getRgvNo() == null || rgvProtocol.getRgvPos() == null) {
                     continue;
                 }
                 List<Long> rgvPosition = new ArrayList<>();
@@ -123,17 +126,31 @@
                 rgvPosition.add(rgvProtocol.getRgvPos());
                 rgvPositionList.add(rgvPosition);
             }
+            if (rgvPositionList.isEmpty()) {
+                return null;
+            }
             Integer rgvNo = SortTheExecutionOfTheCarUtil.LatelyAndGreaterThan(rgvPositionList, sitePosition, perimeter);
             if (rgvNo == -1) {
                 log.info("鏇存柊灏忚溅鎺掑簭淇℃伅寮傚父={}", rgvNo);
                 return null;
             }
             List<BasCircularShuttle> basCircularShuttleList = basCircularShuttleService.selectList(new EntityWrapper<BasCircularShuttle>().orderBy("rgv_id", true));
+            if (basCircularShuttleList == null || basCircularShuttleList.isEmpty()) {
+                return null;
+            }
             int[][] ints = new int[basCircularShuttleList.size()][2];
             for (BasCircularShuttle basCircularShuttle : basCircularShuttleList) {
+                if (basCircularShuttle == null || basCircularShuttle.getRgvNo() == null || basCircularShuttle.getRgvId() == null) {
+                    continue;
+                }
+                if (basCircularShuttle.getRgvNo() < 1 || basCircularShuttle.getRgvNo() > basCircularShuttleList.size()) {
+                    continue;
+                }
                 ints[basCircularShuttle.getRgvNo() - 1] = new int[]{basCircularShuttle.getRgvNo(), basCircularShuttle.getRgvId()};
             }
-            if (basCircularShuttleList.get(0).getRgvNo().equals(rgvNo)) {
+            if (basCircularShuttleList.get(0) != null
+                    && basCircularShuttleList.get(0).getRgvNo() != null
+                    && basCircularShuttleList.get(0).getRgvNo().equals(rgvNo)) {
                 return ints;
             }
 //            String[] oldList = new String[ints.length];
@@ -145,7 +162,7 @@
 
 
         } catch (Exception e) {
-            log.error("鑷姩鏇存柊灏忚溅鎺掑簭淇℃伅澶辫触锛屽紓甯革細" + e);
+            log.error("鑷姩鏇存柊灏忚溅鎺掑簭淇℃伅澶辫触(getStePositionNearby), siteNo={}", siteNo, e);
         }
         return null;
 
@@ -159,12 +176,23 @@
             boolean sign = false;
             Integer rgvNo = 0;
             List<BasCircularShuttle> basCircularShuttleList = basCircularShuttleService.selectList(new EntityWrapper<BasCircularShuttle>().orderBy("rgv_id", true));
+            if (basCircularShuttleList == null || basCircularShuttleList.isEmpty()) {
+                return;
+            }
             for (BasCircularShuttle basCircularShuttle : basCircularShuttleList) {
+                if (basCircularShuttle == null || basCircularShuttle.getRgvNo() == null) {
+                    sign = true;
+                    continue;
+                }
                 if (basCircularShuttle.getStatus() != 0){
                     sign = true;
                     continue;
                 }
                 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo());
+                if (rgvThread == null) {
+                    sign = true;
+                    continue;
+                }
                 RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                 if (rgvProtocol == null) {
                     sign = true;
@@ -178,6 +206,12 @@
             if (sign && rgvNo != 0) {
                 int[][] ints = new int[basCircularShuttleList.size()][2];
                 for (BasCircularShuttle basCircularShuttle : basCircularShuttleList) {
+                    if (basCircularShuttle == null || basCircularShuttle.getRgvNo() == null || basCircularShuttle.getRgvId() == null) {
+                        continue;
+                    }
+                    if (basCircularShuttle.getRgvNo() < 1 || basCircularShuttle.getRgvNo() > basCircularShuttleList.size()) {
+                        continue;
+                    }
                     ints[basCircularShuttle.getRgvNo() - 1] = new int[]{basCircularShuttle.getRgvNo(), basCircularShuttle.getRgvId()};
                 }
 //                String[] oldList = new String[ints.length];
@@ -192,14 +226,23 @@
 
 //                log.info("鏇存柊灏忚溅鎺掑簭淇℃伅锛氬師濮嬪皬杞﹀彿rgvNo={},灏忚溅閲嶆柊鎺掑簭淇℃伅={},灏忚溅鍘熷鎺掑簭淇℃伅={}",rgvNo,Arrays.toString(newList),Arrays.toString(oldList));
                 for (BasCircularShuttle basCircularShuttle : basCircularShuttleList) {
+                    if (basCircularShuttle == null || basCircularShuttle.getRgvNo() == null) {
+                        continue;
+                    }
+                    if (basCircularShuttle.getRgvNo() < 1 || basCircularShuttle.getRgvNo() > rgvList.length) {
+                        continue;
+                    }
                     int[] rgv = rgvList[basCircularShuttle.getRgvNo() - 1];
+                    if (rgv == null || rgv.length < 2) {
+                        continue;
+                    }
                     basCircularShuttle.setRgvId(rgv[1]);
                     basCircularShuttleService.updateById(basCircularShuttle);
                 }
             }
 
         } catch (Exception e) {
-            log.error("鑷姩鏇存柊灏忚溅鎺掑簭淇℃伅澶辫触锛屽紓甯革細" + e);
+            log.error("鑷姩鏇存柊灏忚溅鎺掑簭淇℃伅澶辫触(updateStePosition)", e);
         }
     }
 
@@ -219,13 +262,22 @@
             }
 
             BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper<BasCircularShuttle>().eq("rgv_id", 1));
+            if (basCircularShuttle == null || basCircularShuttle.getRgvNo() == null) {
+                return;
+            }
             RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo());
+            if (rgvThread == null) {
+                return;
+            }
             RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-            if (rgvProtocol == null) {
+            if (rgvProtocol == null || rgvProtocol.getRgvPos() == null) {
                 return;
             }
             List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position", true));
             List<BasDevpPosition> basDevpPositionDevRegion = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("dev_region", true));
+            if (basDevpPositions == null || basDevpPositions.isEmpty() || basDevpPositionDevRegion == null || basDevpPositionDevRegion.isEmpty()) {
+                return;
+            }
             Integer devNo = SortTheExecutionOfTheCarUtil.LatelyAndLessThan(basDevpPositions, rgvProtocol.getRgvPos(), perimeter);
             BasDevpPosition[] basDevpPositionsList = SortTheExecutionOfTheCarUtil.devpNoSort(basDevpPositions, devNo);
             BasDevpPosition[] basDevpPositionsListUN = SortTheExecutionOfTheCarUtil.devpNoSortUN(basDevpPositionsList);
@@ -355,14 +407,20 @@
                             }
 
                             BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper<BasCircularShuttle>().eq("rgv_no", rgvNo));
+                            if (basCircularShuttle == null) {
+                                continue;
+                            }
                             if (basCircularShuttle.getStatus() != 0){
                                 continue ;
                             }
                             long rgvId = basCircularShuttle.getRgvId();
 
                             RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, basCircularShuttle.getRgvNo());
+                            if (rgvThread == null) {
+                                continue;
+                            }
                             RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
-                            if (rgvProtocol == null) {
+                            if (rgvProtocol == null || rgvProtocol.getRgvNo() == null || rgvProtocol.getRgvPos() == null) {
                                 continue;
                             }
 
@@ -377,6 +435,9 @@
                                     && rgvProtocol.getRgvPosInt() != 0
                                     && rgvProtocol.getAlarm() == 0) {
                                 BasDevpPosition basDevpPosition = basDevpPositionService.selectOne(new EntityWrapper<BasDevpPosition>().eq("dev_no", wrkMast.getSourceStaNo()));
+                                if (basDevpPosition == null || basDevpPosition.getPlcPosition() == null) {
+                                    continue;
+                                }
                                 if (basDevpPosition.getPlcPosition()>rgvProtocol.getRgvPos()){
                                     if (basDevpPosition.getPlcPosition()-rgvProtocol.getRgvPos()>taskRunPerimeter){
                                         if (!rgvNoM.contains(rgvProtocol.getRgvNo())){
@@ -479,6 +540,9 @@
                     continue;
                 }
                 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvNo);
+                if (rgvThread == null) {
+                    continue;
+                }
                 RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                 if (rgvProtocol == null) {
                     continue;
@@ -507,6 +571,9 @@
         for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
             try {
                 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                if (rgvThread == null) {
+                    continue;
+                }
                 RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                 if (rgvProtocol == null) {
                     continue;
@@ -596,6 +663,9 @@
         for (RgvSlave rgvSlave : slaveProperties.getRgv()) {
             try {
                 RgvThread rgvThread = (RgvThread) SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
+                if (rgvThread == null) {
+                    continue;
+                }
                 RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
                 if (rgvProtocol == null) {
                     continue;
diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index 075ff8b..2d43235 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -76,6 +76,12 @@
             List<WcsRgvListParam> wcsRgvListParamList = new ArrayList<>();
             List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<>());
             List<BasDevpPosition> basDevpPositions = basDevpPositionService.selectList(new EntityWrapper<BasDevpPosition>().orderBy("plc_position",true));
+            if (wrkMastList == null) {
+                wrkMastList = new ArrayList<>();
+            }
+            if (basDevpPositions == null) {
+                basDevpPositions = new ArrayList<>();
+            }
 
             for (WrkMast wrkMast : wrkMastList){
                 WcsTaskListParam wcsTaskListParam = new WcsTaskListParam(wrkMast);
@@ -94,11 +100,19 @@
                 WcsRgvListParam wcsRgvListParam = new WcsRgvListParam();
                 wcsRgvListParam.setRgvNo(rgv.getId().toString());
                 wcsRgvListParam.setTaskNo(Cools.isEmpty(rgvProtocol.getTaskNo1()) ? null:rgvProtocol.getTaskNo1().toString());
+                if (rgvProtocol.getStatusType() == null || rgvProtocol.getStatusType().id == null) {
+                    continue;
+                }
                 wcsRgvListParam.setStatus(rgvProtocol.statusType.id);
                 wcsRgvListParam.setCurrPos(rgvProtocol.RgvPos);
-                wcsRgvListParam.setCurrSta(SortTheExecutionOfTheCarUtil.LatelyAndLessThanWcs(basDevpPositions,rgvProtocol.getRgvPos(),perimeter).toString());
+                if (rgvProtocol.getRgvPos() != null && !basDevpPositions.isEmpty()) {
+                    Integer currSta = SortTheExecutionOfTheCarUtil.LatelyAndLessThanWcs(basDevpPositions, rgvProtocol.getRgvPos(), perimeter);
+                    wcsRgvListParam.setCurrSta(currSta == null ? null : currSta.toString());
+                } else {
+                    wcsRgvListParam.setCurrSta(null);
+                }
                 List<String> arrayList = new ArrayList<>();
-                if (rgvProtocol.getAlarm()!=0){
+                if (rgvProtocol.getAlarm() != null && rgvProtocol.getAlarm()!=0){
                     arrayList.add(rgvProtocol.getAlarm$());
                 }
                 wcsRgvListParam.setError(arrayList);
@@ -109,6 +123,7 @@
             wcsDataSynchronizationParam.setTimestamp(timestamp);
             return R.ok().add(wcsDataSynchronizationParam);
         } catch (Exception e){
+            log.error("wcsTaskStatus鎺ュ彛寮傚父, timestamp={}", timestamp, e);
             return R.error("寮傚父").add("寮傚父淇℃伅锛�"+e);
         }
     }
diff --git a/src/main/java/com/zy/core/thread/RgvThread.java b/src/main/java/com/zy/core/thread/RgvThread.java
index ce27b3f..313db76 100644
--- a/src/main/java/com/zy/core/thread/RgvThread.java
+++ b/src/main/java/com/zy/core/thread/RgvThread.java
@@ -55,7 +55,7 @@
      * 宸ヤ綅2澶嶄綅淇″彿
      */
     private boolean resetFlag2 = false;
-    private boolean connectRgv = false;
+    private volatile boolean connectRgv = false;
     private boolean alarmChangeSign = false;
 
     public RgvThread(RgvSlave slave) {
@@ -65,7 +65,8 @@
     @Override
     @SuppressWarnings("InfiniteLoopStatement")
     public void run() {
-        connectRgv = this.connect();
+        // 绾跨▼鍚姩鍗崇粰鍗忚浣撳畬鏁撮粯璁ゅ��
+        initRgv();
 
         // 鍚姩绾跨▼鑷姩閲嶈繛
         new Thread(this::rgvConnect).start();
@@ -157,6 +158,9 @@
                         // 鏍规嵁瀹炴椂淇℃伅鏇存柊鏁版嵁搴�
                         BasCircularShuttleService basCircularShuttleService = SpringUtils.getBean(BasCircularShuttleService.class);
                         BasCircularShuttle basCircularShuttle = basCircularShuttleService.selectOne(new EntityWrapper<BasCircularShuttle>().eq("rgv_no",  slave.getId()));
+                        if (basCircularShuttle == null) {
+                            continue;
+                        }
                         if (basCircularShuttle.getStatus() != 0){
                             continue;
                         }
@@ -225,6 +229,9 @@
         rgvProtocol.setStatus2((short)-1);
         rgvProtocol.setLoaded2((short)0);
         rgvProtocol.setAlarm((short)0);
+        rgvProtocol.setAlarmList(new ArrayList<>());
+        rgvProtocol.setInstantaneousSpeed(0D);
+        rgvProtocol.setEndStaM((short)0);
         rgvProtocol.setxSpeed((short) 0);
         rgvProtocol.setxDistance((short) 0);
         rgvProtocol.setxDuration((short) 0);
@@ -352,8 +359,11 @@
     private void rgvOpt(RgvCommand command) {
         try{
             BasRgvOptService basRgvOptService = SpringUtils.getBean(BasRgvOptService.class);
-            BasRgvOpt basRgvOpt = new BasRgvOpt(rgvProtocol.getTaskNo1().intValue(), rgvProtocol.getRgvNo(), rgvProtocol.getRgvPosInt(), command);
-            log.info(rgvProtocol.getRgvNo()+"鍙峰皬杞﹀啓鍏ュ懡浠ゅ畾浣嶅�硷細"+rgvProtocol.getRgvPosInt());
+            int taskNo = (rgvProtocol == null || rgvProtocol.getTaskNo1() == null) ? 0 : rgvProtocol.getTaskNo1().intValue();
+            int rgvNo = (rgvProtocol == null || rgvProtocol.getRgvNo() == null) ? slave.getId() : rgvProtocol.getRgvNo();
+            int rgvPos = (rgvProtocol == null) ? 0 : rgvProtocol.getRgvPosInt();
+            BasRgvOpt basRgvOpt = new BasRgvOpt(taskNo, rgvNo, rgvPos, command);
+            log.info(rgvNo+"鍙峰皬杞﹀啓鍏ュ懡浠ゅ畾浣嶅�硷細"+rgvPos);
             basRgvOptService.insert(basRgvOpt);
         }catch (Exception e){
             log.error("RGV鍐欏叆鍛戒护淇濆瓨澶辫触锛侊紒");
@@ -362,7 +372,10 @@
     private void rgvOpt(Long command) {
         try{
             BasRgvOptService basRgvOptService = SpringUtils.getBean(BasRgvOptService.class);
-            BasRgvOpt basRgvOpt = new BasRgvOpt(rgvProtocol.getTaskNo1().intValue(), rgvProtocol.getRgvNo(), rgvProtocol.getRgvPosI(), command);
+            int taskNo = (rgvProtocol == null || rgvProtocol.getTaskNo1() == null) ? 0 : rgvProtocol.getTaskNo1().intValue();
+            int rgvNo = (rgvProtocol == null || rgvProtocol.getRgvNo() == null) ? slave.getId() : rgvProtocol.getRgvNo();
+            int rgvPos = (rgvProtocol == null) ? 0 : rgvProtocol.getRgvPosI();
+            BasRgvOpt basRgvOpt = new BasRgvOpt(taskNo, rgvNo, rgvPos, command);
             basRgvOptService.insert(basRgvOpt);
         }catch (Exception e){
             log.error("RGV鍐欏叆鍛戒护淇濆瓨澶辫触锛侊紒");
diff --git a/src/main/resources/license.lic b/src/main/resources/license.lic
index 216d19e..0ed5d92 100644
--- a/src/main/resources/license.lic
+++ b/src/main/resources/license.lic
Binary files differ

--
Gitblit v1.9.1