From 7f9435bb4a074b4964f290c4d6905e0e233a19ec Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 21 十一月 2025 12:56:18 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java |   98 +++++++++++++++++++
 src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java     |   38 ++++++-
 src/main/webapp/views/watch/console.html                         |   60 +++++++++--
 src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java    |   10 ++
 src/main/java/com/zy/common/utils/NavigateUtils.java             |   34 ++++++
 src/main/java/com/zy/asrs/controller/BasMapController.java       |   30 +++--
 src/main/java/com/zy/asrs/service/BasMapService.java             |    5 +
 src/main/java/com/zy/common/utils/NavigateSolution.java          |    8 
 8 files changed, 246 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/BasMapController.java b/src/main/java/com/zy/asrs/controller/BasMapController.java
index 2c91165..f6d7573 100644
--- a/src/main/java/com/zy/asrs/controller/BasMapController.java
+++ b/src/main/java/com/zy/asrs/controller/BasMapController.java
@@ -140,6 +140,13 @@
         return R.ok().add(basMap.getData());
     }
 
+    @GetMapping("/basMap/getLevList")
+    @ManagerAuth
+    public R getLevList() {
+        List<Integer> levList = basMapService.getLevList();
+        return R.ok().add(levList);
+    }
+
     @Autowired
     private MapExcelUtils mapExcelUtils;
 
@@ -151,9 +158,9 @@
 
         HashMap<Integer, List<List<HashMap<String, Object>>>> dataMap = mapExcelUtils.readExcel(filePath);
 
-        List<List<HashMap<String, Object>>> dataList = new ArrayList<>();
         for (Map.Entry<Integer, List<List<HashMap<String, Object>>>> entry : dataMap.entrySet()) {
-            Integer key = entry.getKey();
+            Integer lev = entry.getKey();
+            List<List<HashMap<String, Object>>> dataList = new ArrayList<>();
             List<List<HashMap<String, Object>>> list = entry.getValue();
 
             for (int i = 0; i < list.size(); i++) {
@@ -195,17 +202,18 @@
                 }
                 dataList.add(arrayList);
             }
-        }
 
-        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", 1));
-        if (basMap == null){
-            basMap = new BasMap();
+            BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", lev));
+            if (basMap == null){
+                basMap = new BasMap();
+            }
+            basMap.setData(JSON.toJSONString(dataList));
+            basMap.setOriginData(JSON.toJSONString(dataList));
+            basMap.setCreateTime(new Date());
+            basMap.setUpdateTime(new Date());
+            basMap.setLev(lev);
+            basMapService.insertOrUpdate(basMap);
         }
-        basMap.setData(JSON.toJSONString(dataList));
-        basMap.setOriginData(JSON.toJSONString(dataList));
-        basMap.setCreateTime(new Date());
-        basMap.setUpdateTime(new Date());
-        basMapService.insertOrUpdate(basMap);
         return R.ok();
     }
 
diff --git a/src/main/java/com/zy/asrs/service/BasMapService.java b/src/main/java/com/zy/asrs/service/BasMapService.java
index 56b0095..ce57132 100644
--- a/src/main/java/com/zy/asrs/service/BasMapService.java
+++ b/src/main/java/com/zy/asrs/service/BasMapService.java
@@ -1,6 +1,9 @@
 package com.zy.asrs.service;
 
 import com.zy.asrs.entity.BasMap;
+
+import java.util.List;
+
 import com.baomidou.mybatisplus.service.IService;
 
 public interface BasMapService extends IService<BasMap> {
@@ -9,4 +12,6 @@
 
     boolean deleteByLev(Integer lev);//鍒犻櫎鎸囧畾妤煎眰鍦板浘
 
+    List<Integer> getLevList();//鑾峰彇鎵�鏈夋ゼ灞傚湴鍥�
+
 }
diff --git a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
index 19abcca..a9e4d53 100644
--- a/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/BasMapServiceImpl.java
@@ -3,7 +3,12 @@
 import com.zy.asrs.mapper.BasMapMapper;
 import com.zy.asrs.entity.BasMap;
 import com.zy.asrs.service.BasMapService;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.springframework.stereotype.Service;
 
 @Service("basMapService")
@@ -19,4 +24,9 @@
         return this.baseMapper.deleteByLev(lev);
     }
 
+    @Override
+    public List<Integer> getLevList() {
+        return this.baseMapper.selectList(new EntityWrapper<>()).stream().map(BasMap::getLev).collect(Collectors.toList());
+    }
+
 }
diff --git a/src/main/java/com/zy/common/utils/NavigateSolution.java b/src/main/java/com/zy/common/utils/NavigateSolution.java
index 0cd7bed..e6cb942 100644
--- a/src/main/java/com/zy/common/utils/NavigateSolution.java
+++ b/src/main/java/com/zy/common/utils/NavigateSolution.java
@@ -23,9 +23,9 @@
     //鐢ㄦ潵瀛樻斁宸茬粡鍑虹幇杩囩殑缁撶偣銆�
     Map<String, Integer> bestGMap = new HashMap<>();
 
-    public List<List<NavigateNode>> getStationMap() {
+    public List<List<NavigateNode>> getStationMap(int lev) {
         BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
-        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", 1));
+        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", lev));
         if (basMap == null) {
             throw new CoolException("鍦板浘涓嶅瓨鍦�");
         }
@@ -63,9 +63,9 @@
         return navigateNodeList;
     }
 
-    public List<List<NavigateNode>> getRgvTrackMap() {
+    public List<List<NavigateNode>> getRgvTrackMap(int lev) {
         BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
-        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", 1));
+        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", lev));
         if (basMap == null) {
             throw new CoolException("鍦板浘涓嶅瓨鍦�");
         }
diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java
index e324def..4528427 100644
--- a/src/main/java/com/zy/common/utils/NavigateUtils.java
+++ b/src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -14,9 +14,9 @@
 @Component
 public class NavigateUtils {
 
-    public synchronized List<NavigateNode> calcByStationId(Integer startStationId, Integer endStationId) {
+    public synchronized List<NavigateNode> calcByStationId(int lev, Integer startStationId, Integer endStationId) {
         NavigateSolution navigateSolution = new NavigateSolution();
-        List<List<NavigateNode>> stationMap = navigateSolution.getStationMap();
+        List<List<NavigateNode>> stationMap = navigateSolution.getStationMap(lev);
 
         NavigateNode startNode = navigateSolution.findStationNavigateNode(stationMap, startStationId);
         if (startNode == null){
@@ -66,9 +66,9 @@
         return fitlerList;
     }
 
-    public synchronized List<NavigateNode> calcByTrackSiteNo(Integer startTrackSiteNo, Integer endTrackSiteNo) {
+    public synchronized List<NavigateNode> calcByTrackSiteNo(int lev, Integer startTrackSiteNo, Integer endTrackSiteNo) {
         NavigateSolution navigateSolution = new NavigateSolution();
-        List<List<NavigateNode>> rgvTrackMap = navigateSolution.getRgvTrackMap();
+        List<List<NavigateNode>> rgvTrackMap = navigateSolution.getRgvTrackMap(lev);
 
         NavigateNode startNode = navigateSolution.findTrackSiteNoNavigateNode(rgvTrackMap, startTrackSiteNo);
         if (startNode == null){
@@ -118,4 +118,30 @@
         return fitlerList;
     }
 
+    public synchronized List<NavigateNode> findLiftStationList(int lev) {
+        NavigateSolution navigateSolution = new NavigateSolution();
+        List<List<NavigateNode>> stationMap = navigateSolution.getStationMap(lev);
+
+        List<NavigateNode> liftStationList = new ArrayList<>();
+        for (List<NavigateNode> navigateNodes : stationMap) {
+            for (NavigateNode navigateNode : navigateNodes) {
+                String nodeType = navigateNode.getNodeType();
+                if(nodeType == null){
+                    continue;
+                }
+                if(!nodeType.equals("devp")){
+                    continue;
+                }
+                JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue());
+                if(valuObject == null){
+                    continue;
+                }
+                if (valuObject.containsKey("liftNo")) {
+                    liftStationList.add(navigateNode);
+                }
+            }
+        }
+
+        return liftStationList;
+    }
 }
diff --git a/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java
index eca22e9..5f959b0 100644
--- a/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyRgvFakeConnect.java
@@ -4,16 +4,15 @@
 import com.alibaba.fastjson.JSONObject;
 import com.core.common.SpringUtils;
 import com.zy.asrs.entity.DeviceConfig;
+import com.zy.asrs.service.BasMapService;
 import com.zy.common.model.NavigateNode;
 import com.zy.common.utils.NavigateUtils;
-import com.zy.core.enums.RgvModeType;
 import com.zy.core.enums.RgvStatusType;
 import com.zy.core.enums.RgvTaskModeType;
 import com.zy.core.model.CommandResponse;
 import com.zy.core.model.command.RgvCommand;
 import com.zy.core.network.api.ZyRgvConnectApi;
 import com.zy.core.network.entity.ZyRgvStatusEntity;
-import com.zy.core.network.entity.ZyStationStatusEntity;
 
 import java.util.List;
 import java.util.concurrent.ExecutorService;
@@ -73,9 +72,21 @@
             return;
         }
 
+        BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
+        if (basMapService == null) {
+            return;
+        }
+
+        List<Integer> levList = basMapService.getLevList();
+
         List<NavigateNode> navigateNodes = null;
         try {
-            navigateNodes = navigateUtils.calcByTrackSiteNo(status.getRgvPos(), sourcePos);
+            for (Integer lev : levList) {
+                navigateNodes = navigateUtils.calcByTrackSiteNo(lev, status.getRgvPos(), sourcePos);
+                if (navigateNodes != null) {
+                    break;
+                }
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -86,7 +97,12 @@
 
         List<NavigateNode> targetNavigateNodes = null;
         try {
-            targetNavigateNodes = navigateUtils.calcByTrackSiteNo(sourcePos, targetPos);
+            for (Integer lev : levList) {
+                targetNavigateNodes = navigateUtils.calcByTrackSiteNo(lev, sourcePos, targetPos);
+                if (targetNavigateNodes != null) {
+                    break;
+                }
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -133,9 +149,21 @@
             return;
         }
 
+        BasMapService basMapService = SpringUtils.getBean(BasMapService.class);
+        if (basMapService == null) {
+            return;
+        }
+
+        List<Integer> levList = basMapService.getLevList();
+
         List<NavigateNode> navigateNodes = null;
         try {
-            navigateNodes = navigateUtils.calcByTrackSiteNo(status.getRgvPos(), targetPos);
+            for (Integer lev : levList) {
+                navigateNodes = navigateUtils.calcByTrackSiteNo(lev, status.getRgvPos(), targetPos);
+                if (navigateNodes != null) {
+                    break;
+                }
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
diff --git a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
index 2425a7f..b1281e2 100644
--- a/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
+++ b/src/main/java/com/zy/core/network/fake/ZyStationFakeConnect.java
@@ -77,6 +77,20 @@
     }
 
     private void handleCommand(StationCommand command) {
+        Integer stationId = command.getStationId();
+        Integer targetStationId = command.getTargetStaNo();
+
+        String startLev = String.valueOf(stationId).substring(0, 1);
+        String endLev = String.valueOf(targetStationId).substring(0, 1);
+
+        if (startLev.equals(endLev)) {
+            currentLevCommand(command);
+        }else {
+            diffLevCommand(command);
+        }
+    }
+
+    private void currentLevCommand(StationCommand command) {
         NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
         if (navigateUtils == null) {
             return;
@@ -86,10 +100,12 @@
         Integer stationId = command.getStationId();
         Integer targetStationId = command.getTargetStaNo();
 
+        String startLev = String.valueOf(stationId).substring(0, 1);
+
         List<NavigateNode> navigateNodes = null;
 
         try {
-            navigateNodes = navigateUtils.calcByStationId(stationId, targetStationId);
+            navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), stationId, targetStationId);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -98,6 +114,86 @@
             return;
         }
 
+        stationMove(navigateNodes, taskNo, targetStationId);
+    }
+
+    private void diffLevCommand(StationCommand command) {
+        NavigateUtils navigateUtils = SpringUtils.getBean(NavigateUtils.class);
+        if (navigateUtils == null) {
+            return;
+        }
+
+        Integer taskNo = command.getTaskNo();
+        Integer stationId = command.getStationId();
+        Integer targetStationId = command.getTargetStaNo();
+
+        String startLev = String.valueOf(stationId).substring(0, 1);
+        String endLev = String.valueOf(targetStationId).substring(0, 1);
+        
+        List<NavigateNode> navigateNodes = null;
+        List<NavigateNode> targetNavigateNodes = null;
+
+        try {
+            List<NavigateNode> liftStationList = navigateUtils.findLiftStationList(Integer.parseInt(startLev));
+            if(liftStationList.isEmpty()){
+                //鏈壘鍒版彁鍗囨満鑺傜偣
+                return;
+            }
+
+            List<NavigateNode> targetLiftStationList = navigateUtils.findLiftStationList(Integer.parseInt(endLev));
+            if(targetLiftStationList.isEmpty()){
+                //鏈壘鍒版彁鍗囨満鑺傜偣
+                return;
+            }
+            for (NavigateNode liftStation : liftStationList) {
+                JSONObject valuObject = JSON.parseObject(liftStation.getNodeValue());
+                if(valuObject == null){
+                    continue;
+                }
+                Integer liftStationId = valuObject.getInteger("stationId");
+                Integer liftNo = valuObject.getInteger("liftNo");
+
+                Integer targetLiftStationId = null;
+                for (NavigateNode targetLiftStation : targetLiftStationList) {
+                    JSONObject targetValuObject = JSON.parseObject(targetLiftStation.getNodeValue());
+                    if(targetValuObject == null){
+                        continue;
+                    }
+                    Integer targetLiftNo = targetValuObject.getInteger("liftNo");
+                    if(liftNo.equals(targetLiftNo)){
+                        targetLiftStationId = targetValuObject.getInteger("stationId");
+                        break;
+                    }
+                }
+
+                if(targetLiftStationId == null){
+                    continue;
+                }
+
+                navigateNodes = navigateUtils.calcByStationId(Integer.parseInt(startLev), stationId, liftStationId);
+                if(navigateNodes == null){
+                    continue;
+                }
+
+                //璁$畻鎻愬崌鏈哄埌鐩爣绔欑殑璺緞
+                targetNavigateNodes = navigateUtils.calcByStationId(Integer.parseInt(endLev), targetLiftStationId, targetStationId);
+                if(targetNavigateNodes == null) {
+                    continue;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        if (navigateNodes == null || targetNavigateNodes == null) {
+            return;
+        }
+
+        stationMove(navigateNodes, taskNo, stationId);
+        stationMove(targetNavigateNodes, taskNo, targetStationId);
+    }
+
+    private void stationMove(List<NavigateNode> navigateNodes, Integer taskNo, Integer targetStationId) {
         Integer lastStationId = null;
         for (int i = 0; i < navigateNodes.size(); i++) {
             NavigateNode navigateNode = navigateNodes.get(i);
diff --git a/src/main/webapp/views/watch/console.html b/src/main/webapp/views/watch/console.html
index 1108d29..8dda836 100644
--- a/src/main/webapp/views/watch/console.html
+++ b/src/main/webapp/views/watch/console.html
@@ -32,7 +32,14 @@
 						</el-tab-pane>
 					</el-tabs>
 				</div>
-				<div id="mapDataId" style="position: relative;" :style="{zoom: mapSettingParam.zoom / 100}">
+
+				<div style="position: absolute;top: 15px;left: 50%;display: flex;">
+					<div v-if="levList.length > 1" v-for="(lev,index) in levList" :key="index" style="margin-right: 10px;">
+						<el-button :type="currentLev == lev ? 'primary' : ''" @click="switchLev(lev)" size="mini">{{ lev }}F</el-button>
+					</div>
+				</div>
+
+				<div id="mapDataId" style="position: relative;margin-top: 50px;" :style="{zoom: mapSettingParam.zoom / 100}">
 					<table class="excel-table">
 						<tr v-for="(row,index) in map" :key="index">
 							<td
@@ -63,10 +70,6 @@
 								</div>
 							</td>
 
-<!--							<td>-->
-<!--								&lt;!&ndash; 鏄剧ず琛屽彿 &ndash;&gt;-->
-<!--								<div class="item" style="background: none;color: #000;">#{{index+1}}</div>-->
-<!--							</td>-->
 						</tr>
 					</table>
 				</div>
@@ -83,7 +86,8 @@
 				el: '#app',
 				data: {
 					map: [],//鍦板浘鏁版嵁
-					crnList: [], //鍫嗗灈鏈洪泦鍚�
+					levList: [],
+					currentLev: 1,
 					systemStatus: true,//绯荤粺杩愯鐘舵��
 					consoleInterval: null,//瀹氭椂鍣ㄥ瓨鍌ㄥ彉閲�
 					crnInitPosition: [],
@@ -112,6 +116,7 @@
 					init() {
 						this.getMap()
 						this.getSystemRunningStatus() //鑾峰彇绯荤粺杩愯鐘舵��
+						this.getLevList() //鑾峰彇鍦板浘灞傜骇鍒楄〃
 
 						this.consoleInterval = setInterval(() => {
 							this.getCrnInfo() //鑾峰彇鍫嗗灈鏈烘暟鎹�
@@ -119,13 +124,28 @@
 							this.getRgvInfo() //鑾峰彇RGV鏁版嵁
 						}, 1000)
 					},
+					getLevList() {
+						let that = this;
+						$.ajax({
+							url: baseUrl + "/basMap/getLevList",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							method: "get",
+							success: (res) => {
+								let data = res.data;
+								that.levList = data;
+							}
+						})
+					},
 					//鑾峰彇鍦板浘鏁版嵁
 					getMap() {
+						let that = this
 						let rowPx = 35;
 						let colPx = 35;
 
 						$.ajax({
-							url: baseUrl + "/basMap/lev/1/auth",
+							url: baseUrl + "/basMap/lev/" + this.currentLev + "/auth",
 							headers: {
 								'token': localStorage.getItem('token')
 							},
@@ -147,9 +167,13 @@
 										col.width = (col.cellWidth / 30) + "px";
 									})
 								})
-								this.map = mapData;
+								that.map = mapData;
 							}
 						})
+					},
+					switchLev(lev) {
+						this.currentLev = lev;
+						this.getMap()
 					},
 					openCrn(id) {
 						this.crnParam.crnNo = id;
@@ -204,6 +228,9 @@
 										let position = []
 										for (var i = 0; i < crns.length; i++) {
 											var crnEl = $("#crn-" + crns[i].crnId);
+											if(crnEl.offset() == undefined) {
+												continue;
+											}
 											position.push({
 												id: crns[i].crnId,
 												left: crnEl.offset().left + crnEl.width()
@@ -241,8 +268,6 @@
 											crnStatus: crns[i].crnStatus
 										})
 									}
-									that.crnList = crnList;
-
 								} else if (res.code === 403) {
 									parent.location.href = baseUrl + "/login";
 								} else {
@@ -266,6 +291,9 @@
 										let position = []
 										for (var i = 0; i < rgvs.length; i++) {
 											var rgvEl = $("#rgv-" + rgvs[i].rgvNo);
+											if(rgvEl.offset() == undefined) {
+												continue;
+											}
 											position.push({
 												id: rgvs[i].rgvNo,
 												trackSiteNo: rgvs[i].trackSiteNo,
@@ -278,15 +306,23 @@
 
 									for (var i = 0; i < rgvs.length; i++) {
 										var rgvEl = $("#rgv-" + rgvs[i].rgvNo);
-										if (rgvs[i].rgvStatus == 'IDLE') {
+										if (rgvs[i].rgvStatus == 'idle') {
 											rgvEl.attr("class", "rgv-item");
-										}else if (rgvs[i].rgvStatus == 'WORKING') {
+										}else if (rgvs[i].rgvStatus == 'working') {
 											rgvEl.attr("class", "rgv-item machine-working");
+										}else if (rgvs[i].rgvStatus == 'waiting') {
+											rgvEl.attr("class", "rgv-item machine-working");
+										}else {
+											rgvEl.attr("class", "rgv-item machine-un-auto");
 										}
 
 										let trackSiteNo = rgvs[i].trackSiteNo;
 										let trackSiteEl = $("#rgvTrackSiteNo-" + trackSiteNo);
 
+										if(rgvEl.offsetParent().offset() == undefined) {
+											continue;
+										}
+										
 										let parentLeft = rgvEl.offsetParent().offset().left;
 										let targetPosition = trackSiteEl.parent().parent().offset().left - parentLeft;
 										let rgvPosition = rgvEl.position().left;

--
Gitblit v1.9.1