From d2fd7cfc1a426baabe4fac47f88b4db03432e22b Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 31 十月 2023 12:32:32 +0800
Subject: [PATCH] #websocket

---
 src/main/java/com/zy/common/config/WebSocketConfig.java     |   24 
 src/main/webapp/views/shuttle2.html                         |  207 ++++---
 src/main/java/com/zy/common/model/WebSocketMessage.java     |   12 
 src/main/java/com/zy/asrs/controller/ShuttleController.java |    7 
 src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java          |  168 ++++++
 src/main/java/com/zy/asrs/ws/ShuttleWebSocket.java          |  152 ++++++
 src/main/webapp/views/console.html                          |  199 ++++---
 pom.xml                                                     |    4 
 src/main/webapp/views/console3.html                         |  688 +++++++++++++++++++++++++++
 9 files changed, 1,278 insertions(+), 183 deletions(-)

diff --git a/pom.xml b/pom.xml
index 40d90dd..fafefd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -103,6 +103,10 @@
             <artifactId>okhttp</artifactId>
             <version>3.10.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
 
         <!-- led sdk -->
         <dependency>
diff --git a/src/main/java/com/zy/asrs/controller/ShuttleController.java b/src/main/java/com/zy/asrs/controller/ShuttleController.java
index 7ed35f3..d2f0e51 100644
--- a/src/main/java/com/zy/asrs/controller/ShuttleController.java
+++ b/src/main/java/com/zy/asrs/controller/ShuttleController.java
@@ -7,6 +7,7 @@
 import com.core.common.BaseRes;
 import com.core.common.Cools;
 import com.core.common.R;
+import com.core.common.SpringUtils;
 import com.core.exception.CoolException;
 import com.zy.asrs.domain.param.ShuttleOperatorParam;
 import com.zy.asrs.domain.vo.*;
@@ -100,6 +101,12 @@
                 }
             }
 
+            Integer chargeLine = basShuttleService.selectById(slave.getId()).getChargeLine();
+            String lowerPower = "N";
+            if (chargeLine != null && shuttleProtocol.getPowerPercent() != null) {
+                lowerPower = shuttleProtocol.getPowerPercent() <= chargeLine ? "Y" : "N";
+            }
+            shuttleData.put("lowerPower", lowerPower);//鏄惁浣庣數閲�
             baseObj.putAll(shuttleData);
         }
         return R.ok().add(list);
diff --git a/src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java b/src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java
new file mode 100644
index 0000000..75c45e1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/ws/ConsoleWebSocket.java
@@ -0,0 +1,168 @@
+package com.zy.asrs.ws;
+
+import com.alibaba.fastjson.JSON;
+import com.core.common.R;
+import com.core.common.SpringUtils;
+import com.zy.asrs.controller.ConsoleController;
+import com.zy.asrs.controller.LiftController;
+import com.zy.asrs.controller.ShuttleController;
+import com.zy.common.model.WebSocketMessage;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@Component
+@Slf4j
+@Service
+@ServerEndpoint("/console/websocket")
+@Data
+public class ConsoleWebSocket {
+
+    //瀹㈡埛绔湪绾夸汉鏁�
+    private static int onlineClient = 0;
+
+    //瀹㈡埛绔睜
+    private static CopyOnWriteArraySet<ConsoleWebSocket> webSocketServers = new CopyOnWriteArraySet<>();
+
+    private Session session;
+
+    //鏄惁閴存潈锛岄粯璁ゆ湭閴存潈
+    private boolean auth = false;
+
+    //鏄惁涓虹鐞嗗憳
+    private boolean isAdmin = false;
+
+    //绠¢亾ID
+    private String sessionId;
+
+    @OnOpen
+    public void onOpen(Session session) {
+        this.session = session;
+        this.sessionId = session.getId();
+
+        //灏唚ebsocket瀵硅薄杩涜淇濆瓨
+        webSocketServers.add(this);
+        //娣诲姞鍦ㄧ嚎浜烘暟
+        addOnlineClient();
+        log.info("鏈夋柊绐楀彛寮�濮嬬洃鍚�:" + session.getId() + ",褰撳墠鍦ㄧ嚎浜烘暟涓�:" + getOnlineClient());
+    }
+
+    /**
+     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     */
+    @OnClose
+    public void onClose() {
+        webSocketServers.remove(this);  //浠巗et涓垹闄�
+        subOnlineClient();           //鍦ㄧ嚎鏁板噺1
+        log.info("鍏抽棴鐨勮繛鎺ワ細" + sessionId);
+        log.info("鏈変竴杩炴帴鍏抽棴锛佸綋鍓嶅湪绾夸汉鏁颁负" + getOnlineClient());
+    }
+
+    /**
+     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
+     * @ Param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) throws IOException {
+        ShuttleController shuttleController = SpringUtils.getBean(ShuttleController.class);
+        LiftController liftController = SpringUtils.getBean(LiftController.class);
+        ConsoleController consoleController = SpringUtils.getBean(ConsoleController.class);
+        WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class);
+        if (socketMessage.getUrl().equals("/shuttle/table/shuttle/state")) {
+            R result = shuttleController.shuttleStateTable();
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/lift/table/lift/state")) {
+            R result = liftController.liftStateTable();
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/console/latest/data/site")) {
+            R result = consoleController.siteLatestData();
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/console/map/auth")) {
+            R result = consoleController.getMapFromRedis(Integer.parseInt(socketMessage.getData()));
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/console/barcode/output/site")) {
+            R result = consoleController.crnOutput();
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        }
+//        log.info("鏀跺埌鏉ヨ嚜杩炴帴锛�" + sessionId + "鐨勪俊鎭�:" + message);
+    }
+
+    /**
+     * @ Param session
+     * @ Param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("鍙戠敓閿欒");
+        error.printStackTrace();
+    }
+
+    /**
+     * 瀹炵幇鏈嶅姟鍣ㄤ富鍔ㄦ帹閫�
+     */
+    public void sendMessage(String message) throws IOException {
+        this.session.getBasicRemote().sendText(message);
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佺粰鎸囧畾鐢ㄦ埛
+     */
+    public void sendMessage(String message, String account) throws IOException {
+        for (ConsoleWebSocket item : webSocketServers) {
+            item.sendMessage(message);
+        }
+    }
+
+    public void sendMessage(String message, int userId) throws IOException {
+        for (ConsoleWebSocket item : webSocketServers) {
+            item.sendMessage(message);
+        }
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佺粰鎸囧畾鐢ㄦ埛
+     */
+    public static boolean sendMessageGlobal(String message, String account) throws IOException {
+        boolean tag = false;
+        for (ConsoleWebSocket item : webSocketServers) {
+            tag = true;
+            item.sendMessage(message);
+        }
+        return tag;
+    }
+
+    public static boolean sendMessageGlobal(String message, int userId) throws IOException {
+        boolean tag = false;
+        for (ConsoleWebSocket item : webSocketServers) {
+            tag = true;
+            item.sendMessage(message);
+        }
+        return tag;
+    }
+
+    public static synchronized int getOnlineClient() {
+        return onlineClient;
+    }
+
+    public static synchronized void addOnlineClient() {
+        ConsoleWebSocket.onlineClient++;
+    }
+
+    public static synchronized void subOnlineClient() {
+        if (ConsoleWebSocket.onlineClient > 0) {
+            ConsoleWebSocket.onlineClient--;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/asrs/ws/ShuttleWebSocket.java b/src/main/java/com/zy/asrs/ws/ShuttleWebSocket.java
new file mode 100644
index 0000000..e8ba1d1
--- /dev/null
+++ b/src/main/java/com/zy/asrs/ws/ShuttleWebSocket.java
@@ -0,0 +1,152 @@
+package com.zy.asrs.ws;
+
+import com.alibaba.fastjson.JSON;
+import com.core.common.R;
+import com.core.common.SpringUtils;
+import com.zy.asrs.controller.ShuttleController;
+import com.zy.common.model.WebSocketMessage;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.websocket.*;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@Component
+@Slf4j
+@Service
+@ServerEndpoint("/shuttle/websocket")
+@Data
+public class ShuttleWebSocket {
+
+    //瀹㈡埛绔湪绾夸汉鏁�
+    private static int onlineClient = 0;
+
+    //瀹㈡埛绔睜
+    private static CopyOnWriteArraySet<ShuttleWebSocket> webSocketServers = new CopyOnWriteArraySet<>();
+
+    private Session session;
+
+    //鏄惁閴存潈锛岄粯璁ゆ湭閴存潈
+    private boolean auth = false;
+
+    //鏄惁涓虹鐞嗗憳
+    private boolean isAdmin = false;
+
+    //绠¢亾ID
+    private String sessionId;
+
+    @OnOpen
+    public void onOpen(Session session) {
+        this.session = session;
+        this.sessionId = session.getId();
+
+        //灏唚ebsocket瀵硅薄杩涜淇濆瓨
+        webSocketServers.add(this);
+        //娣诲姞鍦ㄧ嚎浜烘暟
+        addOnlineClient();
+        log.info("鏈夋柊绐楀彛寮�濮嬬洃鍚�:" + session.getId() + ",褰撳墠鍦ㄧ嚎浜烘暟涓�:" + getOnlineClient());
+    }
+
+    /**
+     * 杩炴帴鍏抽棴璋冪敤鐨勬柟娉�
+     */
+    @OnClose
+    public void onClose() {
+        webSocketServers.remove(this);  //浠巗et涓垹闄�
+        subOnlineClient();           //鍦ㄧ嚎鏁板噺1
+        log.info("鍏抽棴鐨勮繛鎺ワ細" + sessionId);
+        log.info("鏈変竴杩炴帴鍏抽棴锛佸綋鍓嶅湪绾夸汉鏁颁负" + getOnlineClient());
+    }
+
+    /**
+     * 鏀跺埌瀹㈡埛绔秷鎭悗璋冪敤鐨勬柟娉�
+     * @ Param message 瀹㈡埛绔彂閫佽繃鏉ョ殑娑堟伅
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) throws IOException {
+        ShuttleController shuttleController = SpringUtils.getBean(ShuttleController.class);
+        WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class);
+        if (socketMessage.getUrl().equals("/shuttle/table/shuttle/state")) {
+            R result = shuttleController.shuttleStateTable();
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/shuttle/output/shuttle")) {
+            R result = shuttleController.steOutput();
+            socketMessage.setData(JSON.toJSONString(result));
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        }
+//        log.info("鏀跺埌鏉ヨ嚜杩炴帴锛�" + sessionId + "鐨勪俊鎭�:" + message);
+    }
+
+    /**
+     * @ Param session
+     * @ Param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error) {
+        log.error("鍙戠敓閿欒");
+        error.printStackTrace();
+    }
+
+    /**
+     * 瀹炵幇鏈嶅姟鍣ㄤ富鍔ㄦ帹閫�
+     */
+    public void sendMessage(String message) throws IOException {
+        this.session.getBasicRemote().sendText(message);
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佺粰鎸囧畾鐢ㄦ埛
+     */
+    public void sendMessage(String message, String account) throws IOException {
+        for (ShuttleWebSocket item : webSocketServers) {
+            item.sendMessage(message);
+        }
+    }
+
+    public void sendMessage(String message, int userId) throws IOException {
+        for (ShuttleWebSocket item : webSocketServers) {
+            item.sendMessage(message);
+        }
+    }
+
+    /**
+     * 鏈嶅姟鍣ㄤ富鍔ㄦ帹閫佺粰鎸囧畾鐢ㄦ埛
+     */
+    public static boolean sendMessageGlobal(String message, String account) throws IOException {
+        boolean tag = false;
+        for (ShuttleWebSocket item : webSocketServers) {
+            tag = true;
+            item.sendMessage(message);
+        }
+        return tag;
+    }
+
+    public static boolean sendMessageGlobal(String message, int userId) throws IOException {
+        boolean tag = false;
+        for (ShuttleWebSocket item : webSocketServers) {
+            tag = true;
+            item.sendMessage(message);
+        }
+        return tag;
+    }
+
+    public static synchronized int getOnlineClient() {
+        return onlineClient;
+    }
+
+    public static synchronized void addOnlineClient() {
+        ShuttleWebSocket.onlineClient++;
+    }
+
+    public static synchronized void subOnlineClient() {
+        if (ShuttleWebSocket.onlineClient > 0) {
+            ShuttleWebSocket.onlineClient--;
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/common/config/WebSocketConfig.java b/src/main/java/com/zy/common/config/WebSocketConfig.java
new file mode 100644
index 0000000..32c1bd6
--- /dev/null
+++ b/src/main/java/com/zy/common/config/WebSocketConfig.java
@@ -0,0 +1,24 @@
+package com.zy.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+@Configuration
+@EnableWebSocketMessageBroker
+public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+    @Override
+    public void registerStompEndpoints(StompEndpointRegistry registry) {
+        registry.addEndpoint("/api/socket");
+    }
+}
+
diff --git a/src/main/java/com/zy/common/model/WebSocketMessage.java b/src/main/java/com/zy/common/model/WebSocketMessage.java
new file mode 100644
index 0000000..647c72b
--- /dev/null
+++ b/src/main/java/com/zy/common/model/WebSocketMessage.java
@@ -0,0 +1,12 @@
+package com.zy.common.model;
+
+import lombok.Data;
+
+@Data
+public class WebSocketMessage {
+
+    private String url;
+
+    private String data;
+
+}
diff --git a/src/main/webapp/views/console.html b/src/main/webapp/views/console.html
index a77e633..f23fd86 100644
--- a/src/main/webapp/views/console.html
+++ b/src/main/webapp/views/console.html
@@ -342,6 +342,7 @@
 					consoleInterval: null,//瀹氭椂鍣ㄥ瓨鍌ㄥ彉閲�
 					codeList1: [],//鏉$爜List
 					codeList2: [],//鏉$爜List
+					ws: null,
 				},
 				created() {
 					this.init()
@@ -351,6 +352,12 @@
 				},
 				methods: {
 					init() {
+						this.ws = new WebSocket("ws://" + window.location.host + baseUrl + "/console/websocket");
+						this.ws.onopen = this.webSocketOnOpen
+						this.ws.onerror = this.webSocketOnError
+						this.ws.onmessage = this.webSocketOnMessage
+						this.ws.onclose = this.webSocketClose
+
 						this.getMap(this.currentLev)
 						this.getSystemRunningStatus() //鑾峰彇绯荤粺杩愯鐘舵��
 
@@ -364,22 +371,20 @@
 					},
 					//鑾峰彇鍦板浘鏁版嵁
 					getMap(lev) {
-						$.ajax({
-							type: "get",
-							url: baseUrl + "/console/map/" + lev + "/auth",
-							headers: {
-								'token': localStorage.getItem('token')
-							},
-							success: (res) => {
-								let data = res.data
-								let tmp = []
-								for (let i = 1; i < data.length - 1; i++) {
-									tmp.push(data[i])
-								}
-								// console.log(tmp)
-								this.map = tmp
-							}
-						})
+						this.sendWs(JSON.stringify({
+							"url": "/console/map/auth",
+							"data": lev
+						}))
+					},
+					setMap(res) {
+						//鑾峰彇鍦板浘鏁版嵁
+						let data = res.data
+						let tmp = []
+						for (let i = 1; i < data.length - 1; i++) {
+							tmp.push(data[i])
+						}
+						// console.log(tmp)
+						this.map = tmp
 					},
 					openSite(id) {
 						this.siteWindow = true; //鎵撳紑绔欑偣淇℃伅寮圭獥
@@ -409,29 +414,26 @@
 					},
 					getSiteInfo() {
 						//鑾峰彇杈撻�佺珯鐐规暟鎹�
-						$.ajax({
-							url: baseUrl+ "/console/latest/data/site",
-							headers: {'token': localStorage.getItem('token')},
-							method: 'POST',
-							success: function (res) {
-								if (res.code === 200){
-									var sites = res.data;
-									for (var i = 0; i < sites.length; i++){
-										var siteEl = $("#site-"+sites[i].siteId);
-										siteEl.attr("class", "site " + sites[i].siteStatus);
-										if (sites[i].workNo != null && sites[i].workNo>0) {
-											siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
-										} else {
-											siteEl.html(sites[i].siteId);
-										}
-									}
-								} else if (res.code === 403){
-									parent.location.href = baseUrl+"/login";
-								}  else {
-									console.log(res.msg);
+						this.sendWs("{\"url\":\"/console/latest/data/site\",\"data\":{}}")
+					},
+					setSiteInfo(res) {
+						//鑾峰彇杈撻�佺珯鐐规暟鎹�
+						if (res.code === 200){
+							var sites = res.data;
+							for (var i = 0; i < sites.length; i++){
+								var siteEl = $("#site-"+sites[i].siteId);
+								siteEl.attr("class", "site " + sites[i].siteStatus);
+								if (sites[i].workNo != null && sites[i].workNo>0) {
+									siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
+								} else {
+									siteEl.html(sites[i].siteId);
 								}
 							}
-						});
+						} else if (res.code === 403){
+							parent.location.href = baseUrl+"/login";
+						}  else {
+							console.log(res.msg);
+						}
 					},
 					changFloor(lev) {
 						this.currentLev = lev
@@ -439,53 +441,41 @@
 						this.getMap(lev)
 					},
 					getShuttleStateInfo() {
+						this.sendWs("{\"url\":\"/shuttle/table/shuttle/state\",\"data\":{}}")
+					},
+					setShuttleStateInfo(res) {
 						// 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇
 						let that = this
-						$.ajax({
-							url: baseUrl + "/shuttle/table/shuttle/state",
-							headers: {
-								'token': localStorage.getItem('token')
-							},
-							method: 'POST',
-							success: function(res) {
-								if (res.code == 200) {
-									let currentLevShuttle = []//褰撳墠妤煎眰灏忚溅闆嗗悎
-									res.data.forEach((item,idx) => {
-										if (item != null && item.point != undefined && item.point != null) {
-											if (item.point.z == that.currentLev) {
-												currentLevShuttle.push(item);
-											}
-										}
-									})
-									that.currentLevShuttleList = currentLevShuttle
-									that.shuttleList = res.data
-
-									if (that.shuttleColorList.length == 0) {
-										let colorList = []//闅忔満灏忚溅棰滆壊
-										res.data.forEach((item,idx) => {
-											colorList[item.shuttleNo] = that.colorRGB()
-										})
-										that.shuttleColorList = colorList
+						if (res.code == 200) {
+							let currentLevShuttle = []//褰撳墠妤煎眰灏忚溅闆嗗悎
+							res.data.forEach((item,idx) => {
+								if (item != null && item.point != undefined && item.point != null) {
+									if (item.point.z == that.currentLev) {
+										currentLevShuttle.push(item);
 									}
 								}
+							})
+							that.currentLevShuttleList = currentLevShuttle
+							that.shuttleList = res.data
+
+							if (that.shuttleColorList.length == 0) {
+								let colorList = []//闅忔満灏忚溅棰滆壊
+								res.data.forEach((item,idx) => {
+									colorList[item.shuttleNo] = that.colorRGB()
+								})
+								that.shuttleColorList = colorList
 							}
-						});
+						}
 					},
 					getLiftStateInfo() {
 						// 鎻愬崌鏈轰俊鎭〃鑾峰彇
-						let that = this
-						$.ajax({
-							url: baseUrl + "/lift/table/lift/state",
-							headers: {
-								'token': localStorage.getItem('token')
-							},
-							method: 'POST',
-							success: function(res) {
-								if (res.code == 200) {
-									that.liftList = res.data
-								}
-							}
-						});
+						this.sendWs("{\"url\":\"/lift/table/lift/state\",\"data\":{}}")
+					},
+					setLiftStateInfo(res) {
+						// 鎻愬崌鏈轰俊鎭〃鑾峰彇
+						if (res.code == 200) {
+							this.liftList = res.data
+						}
 					},
 					systemSwitch() {
 						// 绯荤粺寮�鍏�
@@ -664,22 +654,49 @@
 						})
 					},
 					getCodeData(){
-						let that = this
-						$.ajax({
-							url:baseUrl +'/console/barcode/output/site',
-							method:'GET',
-							success:function (res) {
-								if(res.code === 200){
-									let data = JSON.parse(res.data)
-									if (data.length <= 5) {
-										that.codeList1 = data;
-									} else {
-										that.codeList1 = data.slice(0, 5);
-										that.codeList2 = data.splice(5, 10);
-									}
-								}
+						this.sendWs(JSON.stringify({
+							"url": "/console/barcode/output/site",
+							"data": {}
+						}))
+					},
+					setCodeData(res) {
+						if(res.code === 200){
+							let data = JSON.parse(res.data)
+							if (data.length <= 5) {
+								this.codeList1 = data;
+							} else {
+								this.codeList1 = data.slice(0, 5);
+								this.codeList2 = data.splice(5, 10);
 							}
-						})
+						}
+					},
+					webSocketOnOpen(e) {
+						console.log("open");
+					},
+					webSocketOnError(e) {
+						console.log(e);
+					},
+					webSocketOnMessage(e) {
+						const result = JSON.parse(e.data);
+						if (result.url == "/shuttle/table/shuttle/state") {
+							this.setShuttleStateInfo(JSON.parse(result.data))
+						}else if (result.url == "/lift/table/lift/state") {
+							this.setLiftStateInfo(JSON.parse(result.data))
+						}else if (result.url == "/console/latest/data/site") {
+							this.setSiteInfo(JSON.parse(result.data))
+						}else if (result.url == "/console/map/auth") {
+							this.setMap(JSON.parse(result.data))
+						}else if (result.url == "/console/barcode/output/site") {
+							this.setCodeData(JSON.parse(result.data))
+						}
+					},
+					webSocketClose(e) {
+						console.log("close");
+					},
+					sendWs(message) {
+						if (this.ws.readyState == WebSocket.OPEN) {
+							this.ws.send(message)
+						}
 					}
 				}
 			})
diff --git a/src/main/webapp/views/console3.html b/src/main/webapp/views/console3.html
new file mode 100644
index 0000000..a77e633
--- /dev/null
+++ b/src/main/webapp/views/console3.html
@@ -0,0 +1,688 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="UTF-8">
+		<title>WCS鎺у埗涓績</title>
+		<link rel="stylesheet" href="../static/css/animate.min.css">
+		<link rel="stylesheet" href="../static/vue/element/element.css">
+		<link rel="stylesheet" href="../static/css/console_vue.css">
+		<link rel="stylesheet" href="../static/css/toggle-switch.css">
+		<script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script>
+		<script type="text/javascript" src="../static/layui/layui.js"></script>
+		<script type="text/javascript" src="../static/js/handlebars/handlebars-v4.5.3.js"></script>
+		<script type="text/javascript" src="../static/js/common.js"></script>
+		<script type="text/javascript" src="../static/vue/js/vue.min.js"></script>
+		<script type="text/javascript" src="../static/vue/element/element.js"></script>
+	</head>
+	<body>
+		<div id="app">
+			<div style="display: flex;justify-content: center;align-items: center;width: 100%;margin-top: 150px;">
+				<div id="mapDataId" style="zoom: 0.7;position: relative;">
+					<div class="pointContainer" v-for="(row,index) in map" :key="index">
+						<div v-for="(col,idx) in row" :key="idx">
+							<div v-if="col.value == 0">
+								<!-- 瀛愯建閬� 璺緞涓虹┛姊溅棰勮璺緞鍒欐樉绀虹┛姊溅棰滆壊鍜岀┛姊溅鍙� -->
+								<div :style="{background: checkAdvancePath(index,idx).length == 0 ? '':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item" v-if="col.data.length > 0">{{col.data}}</div>
+								<div :style="{background: checkAdvancePath(index,idx).length == 0 ? '':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item" v-else>{{checkAdvancePath(index,idx).length == 0 ? idx:checkAdvancePath(index,idx)}}</div>
+							</div>
+							<div v-else-if="col.value == 3">
+								<!-- 姣嶈建閬� 璺緞涓虹┛姊溅棰勮璺緞鍒欐樉绀虹┛姊溅棰滆壊鍜岀┛姊溅鍙� -->
+								<div :style="{background: checkAdvancePath(index,idx).length == 0 ? '#5af':shuttleColorList[checkAdvancePath(index,idx)[0]]}" class="item">{{checkAdvancePath(index,idx).length == 0 ? '&#x21c5;&#x21c4;':checkAdvancePath(index,idx)}}</div>
+							</div>
+							<div v-else-if="col.value == 4">
+								<!-- 绔欑偣 -->
+								<div class="site" :id="'site-' + col.data" @click="openSite(col.data)">{{col.data}}</div>
+							</div>
+							<div v-else-if="col.value == 5">
+								<!-- 鍏呯數妗� -->
+								<div class="item" style="font-size: 24px">&#9889;</div>
+							</div>
+							<div v-else-if="col.value == -999">
+								<!-- 璺緞鍗犵敤鍖哄煙 -->
+								<div class="item" style="background:#f83333;color: #fff;">{{idx}}</div>
+							</div>
+							<div v-else-if="col.value < 0">
+								<!-- 绂佹鏄剧ず鍖哄煙 -->
+								<div class="item" style="visibility: hidden">{{idx}}</div>
+							</div>
+							<div v-else>
+								<div class="item" v-if="col.data.length > 0">{{col.data}}</div>
+								<div class="item" v-else>{{idx}}-{{col.value}}</div>
+							</div>
+						</div>
+
+						<div>
+							<!-- 鏄剧ず琛屽彿 -->
+							<div class="item" style="background: none;color: #000;">#{{index+1}}</div>
+						</div>
+					</div>
+
+					<!--杈撳嚭灏忚溅-->
+					<div v-for="(car,idx) in currentLevShuttleList"
+						 :style="{
+						 left: getCarPosition(car.wcsPoint.x,car.wcsPoint.y)[1]
+						 ,top: getCarPosition(car.wcsPoint.x,car.wcsPoint.y)[0]
+						 ,color: shuttleColorList[car.shuttleNo]
+						 }"
+						 class="sxcar" :id="'sxcar-' + car.shuttleNo">
+						{{car.shuttleNo}}
+					</div>
+
+				</div>
+
+				<!--杈撳嚭妤煎眰-->
+				<div style="height: 100%;">
+					<div class="floorBtnBox" v-for="(lev,idx) in floorList">
+						<el-button :style="{background:currentLev === lev ? '#7DCDFF':''}" @click="changFloor(lev)">{{lev}}F</el-button>
+					</div>
+					<div>
+						<el-button @click="testMove()">娴嬭瘯绉诲姩杞�</el-button>
+						<el-button @click="resetMap()">閲嶇疆鍦板浘</el-button>
+					</div>
+				</div>
+			</div>
+
+			<div class="footer">
+				<!-- 鎬诲紑鍏� -->
+				<div class="line-status">
+					<div class="body-head">鎬诲紑鍏�</div>
+					<div class="switch" @click="systemSwitch">
+						<label id="system-toggle" class="toggle-switch" style="margin-left: 20px;">
+							<input id="system-toggle-checked" disabled type="checkbox">
+							<div class="button">
+								<div class="light"></div>
+								<div class="dots"></div>
+								<div class="characters"></div>
+								<div class="shine"></div>
+								<div class="shadow"></div>
+							</div>
+						</label>
+
+						<div class="switch_r">
+							<p>绯荤粺鐘舵��</p>
+							<p id="system-run-desc">绯荤粺杩愯涓�</p>
+						</div>
+					</div>
+				</div>
+				<!-- 鍥涘悜绌挎杞︾姸鎬� -->
+				<div class="line-status">
+					<div class="body-head">绌挎杞︾姸鎬�</div>
+					<div class="shuttle-status-box">
+						<div v-for="(item,idx) in shuttleList" class="state">
+							<span :style="{color: shuttleColorList[item.shuttleNo]}">鍥涘悜绌挎杞� {{item.shuttleNo}}</span>
+							<span v-if="item.protocolStatus == 1"
+								class="state-ss shuttle-idle">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 2"
+								class="state-ss shuttle-working">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 3"
+								class="state-ss shuttle-waiting">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 4"
+								class="state-ss shuttle-charging">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 5"
+								class="state-ss shuttle-charging-waiting">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 6"
+								class="state-ss shuttle-fixing">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 7"
+								class="state-ss shuttle-offline">{{item.protocolStatus$}}</span>
+							<span v-else class="state-ss shuttle-offline">{{item.protocolStatus$}}</span>
+						</div>
+					</div>
+					<div class="allStatus"><span>鎵�鏈夌姸鎬�</span></div>
+					<div class="allStatus item-group">
+						<span class="shuttle-idle">绌洪棽</span>
+						<span class="shuttle-working">浣滀笟涓�</span>
+						<span class="shuttle-waiting">绛夊緟纭</span>
+						<span class="shuttle-charging">鍏呯數涓�</span>
+						<span class="shuttle-charging-waiting">鍏呯數浠诲姟绛夊緟纭</span>
+						<span class="shuttle-fixing">鏁呴殰淇涓�</span>
+						<span class="shuttle-offline">绂荤嚎</span>
+					</div>
+				</div>
+				<!-- 鎻愬崌鏈虹姸鎬� -->
+				<div class="line-status">
+					<div class="body-head">鎻愬崌鏈虹姸鎬�</div>
+					<div class="lift-status-box">
+						<div v-for="(item,idx) in liftList" class="state states">
+							<span>鎻愬崌鏈� {{item.liftNo}}</span>
+							<span v-if="item.protocolStatus == 1"
+								class="state-ss lift-idle">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 2"
+								class="state-ss lift-working">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 3"
+								class="state-ss lift-waiting">{{item.protocolStatus$}}</span>
+							<span v-else-if="item.protocolStatus == 4"
+								class="state-ss lift-offline">{{item.protocolStatus$}}</span>
+							<span v-else class="state-ss lift-offline">{{item.protocolStatus$}}</span>
+						</div>
+					</div>
+					<div class="allStatus"><span>鎵�鏈夌姸鎬�</span></div>
+					<div class="allStatus item-group">
+						<span class="lift-idle">绌洪棽</span>
+						<span class="lift-working">浣滀笟涓�</span>
+						<span class="lift-waiting">绛夊緟纭</span>
+						<span class="lift-offline">绂荤嚎</span>
+					</div>
+				</div>
+				<!-- 杈撻�佺嚎鐘舵�� -->
+				<div class="line-status">
+					<div class="body-head">杈撻�佺嚎鐘舵��</div>
+					<div class="state states">
+						<span>杩愯緭绾挎�绘暟</span>
+						<span class="line-ss">9</span>
+					</div>
+					<div class="allStatus"><span>鎵�鏈夌姸鎬�</span></div>
+					<div class="allStatus item-group">
+						<span class="site-auto-run-id">鑷姩+鏈夌墿+ID</span>
+						<span class="site-auto-run">鑷姩+鏈夌墿</span>
+						<span class="site-auto-id">鑷姩+ID</span>
+						<span class="site-auto">鑷姩</span>
+						<span class="site-unauto">闈炶嚜鍔�/鎵嬪姩</span>
+					</div>
+				</div>
+				<!-- 鏉$爜琛ㄦ牸 -->
+				<div class="bar-code">
+					<div class="body-head" id="code">鏉$爜鎵弿鍣�</div>
+					<div class="tablebox">
+						<div class="table-head">
+							<li><span>鏉$爜鍚嶇О</span><span class="right">鎵爜鏃堕棿</span></li>
+						</div>
+						<div id="barcode1" class="table-body">
+							<li v-for="(item,index) in codeList1" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>
+						</div>
+					</div>
+					<div class="tablebox">
+						<div class="table-head">
+							<li><span>鏉$爜鍚嶇О</span><span class="right">鎵爜鏃堕棿</span></li>
+						</div>
+						<div id="barcode2" class="table-body">
+							<li v-for="(item,index) in codeList2" :key="index"><span>{{item.barcode}}</span><span class="right">{{item.time}}</span></li>
+						</div>
+					</div>
+				</div>
+			</div>
+
+			<!-- 杈撻�佽澶囧脊绐� -->
+			<div id="siteWindow" :style="{display:siteWindow?'block':'none'}" class="animate__animated animate__fadeIn">
+				<!-- 琛ㄥご -->
+				<div id="siteWindow-head">
+					<div class="detailed"></div>
+					<button @click="siteWindow = false"></button>
+				</div>
+				<!-- 琛ㄥ唴瀹� -->
+				<div class="siteWindow-body">
+					<form>
+						<!-- 璁惧鍙� -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>璁惧鍙凤細</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="siteId" value="">
+							</div>
+						</div>
+						<!-- 宸ヤ綔鍙� -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>宸ヤ綔鍙凤細</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="workNo" value="">
+							</div>
+						</div>
+						<!-- 宸ヤ綔鐘舵�� -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>宸ヤ綔鐘舵�侊細</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="wrkSts" value="">
+							</div>
+						</div>
+						<div class="form-item">
+							<!-- 鑷姩 -->
+							<div class="form-item-checkbox">
+								<div class="form-item-label-checkbox">
+									<span>鑷姩</span>
+								</div>
+								<div class="form-item-input-checkbox">
+									<input type="checkbox" name="autoing">
+								</div>
+							</div>
+							<!-- 鏈夌墿 -->
+							<div class="form-item-checkbox">
+								<div class="form-item-label-checkbox">
+									<span>鏈夌墿</span>
+								</div>
+								<div class="form-item-input-checkbox">
+									<input type="checkbox" name="loading">
+								</div>
+							</div>
+							<!-- 鑳藉叆 -->
+							<div class="form-item-checkbox">
+								<div class="form-item-label-checkbox">
+									<span>鑳藉叆</span>
+								</div>
+								<div class="form-item-input-checkbox">
+									<input type="checkbox" name="canining">
+								</div>
+							</div>
+							<!-- 鑳藉嚭 -->
+							<div class="form-item-checkbox">
+								<div class="form-item-label-checkbox">
+									<span>鑳藉嚭</span>
+								</div>
+								<div class="form-item-input-checkbox">
+									<input type="checkbox" name="canouting">
+								</div>
+							</div>
+						</div>
+						<!-- 鍑哄叆绫诲瀷 -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>鍑哄叆绫诲瀷锛�</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="ioType" value="">
+							</div>
+						</div>
+						<!-- 婧愮珯 -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>婧愮珯锛�</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="sourceStaNo" value="">
+							</div>
+						</div>
+						<!-- 鐩爣绔� -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>鐩爣绔欙細</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="staNo" value="">
+							</div>
+						</div>
+						<!-- 婧愬簱浣� -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>婧愬簱浣嶏細</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="sourceLocNo" value="">
+							</div>
+						</div>
+						<!-- 鐩爣搴撲綅 -->
+						<div class="form-item">
+							<div class="form-item-label">
+								<span>鐩爣搴撲綅锛�</span>
+							</div>
+							<div class="form-item-input">
+								<input type="text" name="locNo" value="">
+							</div>
+						</div>
+					</form>
+				</div>
+			</div>
+
+		</div>
+		<script>
+			var app = new Vue({
+				el: '#app',
+				data: {
+					map: [],//鍦板浘鏁版嵁
+					currentLev: 1,//鍦板浘褰撳墠妤煎眰
+					siteWindow: false, //绔欑偣寮圭獥鏄剧ず榛樿涓嶆樉绀�
+					floorList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], //褰撳墠椤圭洰妤煎眰
+					shuttleList: [], //鍥涘悜绌挎杞﹂泦鍚�
+					currentLevShuttleList: [],//褰撳墠妤煎眰鍥涘悜绌挎杞﹂泦鍚�
+					shuttleColorList: [],//鍥涘悜绌挎杞﹂鑹查泦鍚�
+					liftList: [], //鎻愬崌鏈洪泦鍚�
+					systemStatus: true,//绯荤粺杩愯鐘舵��
+					consoleInterval: null,//瀹氭椂鍣ㄥ瓨鍌ㄥ彉閲�
+					codeList1: [],//鏉$爜List
+					codeList2: [],//鏉$爜List
+				},
+				created() {
+					this.init()
+				},
+				watch: {
+
+				},
+				methods: {
+					init() {
+						this.getMap(this.currentLev)
+						this.getSystemRunningStatus() //鑾峰彇绯荤粺杩愯鐘舵��
+
+						this.consoleInterval = setInterval(() => {
+							this.getShuttleStateInfo() //鑾峰彇鍥涘悜绌挎杞︿俊鎭�
+							this.getLiftStateInfo() //鑾峰彇鎻愬崌鏈轰俊鎭�
+							this.getSiteInfo() //鑾峰彇杈撻�佺珯鐐规暟鎹�
+							this.getMap(this.currentLev) //鑾峰彇瀹炴椂鍦板浘鏁版嵁
+							this.getCodeData()//鑾峰彇鏉$爜
+						}, 1000)
+					},
+					//鑾峰彇鍦板浘鏁版嵁
+					getMap(lev) {
+						$.ajax({
+							type: "get",
+							url: baseUrl + "/console/map/" + lev + "/auth",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							success: (res) => {
+								let data = res.data
+								let tmp = []
+								for (let i = 1; i < data.length - 1; i++) {
+									tmp.push(data[i])
+								}
+								// console.log(tmp)
+								this.map = tmp
+							}
+						})
+					},
+					openSite(id) {
+						this.siteWindow = true; //鎵撳紑绔欑偣淇℃伅寮圭獥
+						$(".detailed").empty();
+						$('.detailed').append(id + '绔欑偣璇︾粏淇℃伅');
+						$.ajax({
+							url: baseUrl + "/console/site/detail",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: {
+								siteId: id
+							},
+							method: 'post',
+							success: function(res) {
+								for (var val in res.data) {
+									var find = $("#siteWindow").find(":input[name='" + val + "']");
+									if (find[0].type === 'text') {
+										find.val(res.data[val]);
+									} else if (find[0].type === 'checkbox') {
+										find.attr("checked", res.data[val] === 'Y');
+									}
+								}
+							}
+
+						})
+					},
+					getSiteInfo() {
+						//鑾峰彇杈撻�佺珯鐐规暟鎹�
+						$.ajax({
+							url: baseUrl+ "/console/latest/data/site",
+							headers: {'token': localStorage.getItem('token')},
+							method: 'POST',
+							success: function (res) {
+								if (res.code === 200){
+									var sites = res.data;
+									for (var i = 0; i < sites.length; i++){
+										var siteEl = $("#site-"+sites[i].siteId);
+										siteEl.attr("class", "site " + sites[i].siteStatus);
+										if (sites[i].workNo != null && sites[i].workNo>0) {
+											siteEl.html(sites[i].siteId + "[" + sites[i].workNo + "]");
+										} else {
+											siteEl.html(sites[i].siteId);
+										}
+									}
+								} else if (res.code === 403){
+									parent.location.href = baseUrl+"/login";
+								}  else {
+									console.log(res.msg);
+								}
+							}
+						});
+					},
+					changFloor(lev) {
+						this.currentLev = lev
+						this.currentLevShuttleList = []
+						this.getMap(lev)
+					},
+					getShuttleStateInfo() {
+						// 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇
+						let that = this
+						$.ajax({
+							url: baseUrl + "/shuttle/table/shuttle/state",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							method: 'POST',
+							success: function(res) {
+								if (res.code == 200) {
+									let currentLevShuttle = []//褰撳墠妤煎眰灏忚溅闆嗗悎
+									res.data.forEach((item,idx) => {
+										if (item != null && item.point != undefined && item.point != null) {
+											if (item.point.z == that.currentLev) {
+												currentLevShuttle.push(item);
+											}
+										}
+									})
+									that.currentLevShuttleList = currentLevShuttle
+									that.shuttleList = res.data
+
+									if (that.shuttleColorList.length == 0) {
+										let colorList = []//闅忔満灏忚溅棰滆壊
+										res.data.forEach((item,idx) => {
+											colorList[item.shuttleNo] = that.colorRGB()
+										})
+										that.shuttleColorList = colorList
+									}
+								}
+							}
+						});
+					},
+					getLiftStateInfo() {
+						// 鎻愬崌鏈轰俊鎭〃鑾峰彇
+						let that = this
+						$.ajax({
+							url: baseUrl + "/lift/table/lift/state",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							method: 'POST',
+							success: function(res) {
+								if (res.code == 200) {
+									that.liftList = res.data
+								}
+							}
+						});
+					},
+					systemSwitch() {
+						// 绯荤粺寮�鍏�
+						let that = this
+						if (this.systemStatus) {
+							this.$prompt('璇疯緭鍏ュ彛浠わ紝骞跺仠姝CS绯荤粺', '鎻愮ず', {
+								confirmButtonText: '纭畾',
+								cancelButtonText: '鍙栨秷',
+							}).then(({
+								value
+							}) => {
+								that.doSwitch(0, value)
+							}).catch(() => {
+
+							});
+						} else {
+							this.doSwitch(1)
+						}
+					},
+					doSwitch(operatorType, password) {
+						let that = this
+						$.ajax({
+							url: baseUrl + "/console/system/switch",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							data: {
+								operatorType: operatorType,
+								password: password
+							},
+							method: 'POST',
+							success: function(res) {
+								if (res.code === 200) {
+									if (res.data.status) {
+										$('#system-toggle-checked').attr("checked", true);
+										$('#system-run-desc').html("绯荤粺杩愯涓�...");
+										that.systemStatus = true;
+										parent.systemRunning = true;
+									} else {
+										$('#system-toggle-checked').attr("checked", false);
+										$('#system-run-desc').html("绯荤粺宸插仠姝�!");
+										that.systemStatus = false;
+										parent.systemRunning = false;
+									}
+								} else if (res.code === 403) {
+									parent.location.href = baseUrl + "/login";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
+					getSystemRunningStatus() {
+						// 鑾峰彇wcs绯荤粺杩愯鐘舵��
+						let that = this
+						$.ajax({
+							url: baseUrl + "/console/system/running/status",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							method: 'POST',
+							success: function(res) {
+								if (res.code === 200) {
+									if (res.data.status) {
+										$('#system-toggle-checked').attr("checked", true);
+										$('#system-run-desc').html("绯荤粺杩愯涓�...");
+										that.systemStatus = true;
+										parent.systemRunning = true;
+									} else {
+										$('#system-toggle-checked').attr("checked", false);
+										$('#system-run-desc').html("绯荤粺宸插仠姝�!");
+										that.systemStatus = false;
+										parent.systemRunning = false;
+									}
+								} else if (res.code === 403) {
+									parent.location.href = baseUrl + "/login";
+								} else {
+									that.$message({
+										message: res.msg,
+										type: 'error'
+									});
+								}
+							}
+						});
+					},
+					getCarPosition(x,y) {
+						//璁$畻鍥涘悜绌挎杞﹀浘鏍囦綅缃�
+						let top = (x * 35 - 35) + "px" //闇�瑕佸噺鍘诲皬杞﹁嚜宸辨墍鍗犻珮搴�
+						let left = (y * 35) + "px" //闇�瑕佸噺鍘诲皬杞﹁嚜宸辨墍鍗犲搴�
+						return [top,left];
+					},
+					testMove() {
+						let that = this
+						clearInterval(this.consoleInterval)//娓呯悊瀹氭椂鍣�
+
+						let shuttleList = this.currentLevShuttleList
+						$.ajax({
+							url: baseUrl + "/static/testMoveData.json",
+							headers: {
+								'token': localStorage.getItem('token')
+							},
+							method: 'GET',
+							success: function(res) {
+								shuttleList[0].moveAdvancePath = res
+								that.currentLevShuttleList = shuttleList
+
+								let index = 0
+								let tmp = null
+								tmp = setInterval(() => {
+									if (index < res.length) {
+										that.currentLevShuttleList[0].wcsPoint.y = res[index].y
+										that.currentLevShuttleList[0].wcsPoint.x = res[index].x
+										index++
+									}else {
+										clearInterval(tmp)
+										that.init()
+									}
+								},1000)
+							}
+						});
+					},
+					colorRGB(){
+						//闅忔満棰滆壊
+						const r = Math.floor(Math.random()*256);
+						const g = Math.floor(Math.random()*256);
+						const b = Math.floor(Math.random()*256);
+						return `rgb(${r},${g},${b})`;
+					},
+					checkAdvancePath(x,y) {
+						//妫�娴嬭矾寰勬槸鍚︿负绌挎杞﹂璁¤矾寰勶紝濡倄鍜寉璺緞鏄┛姊溅棰勮璺緞锛屽垯杩斿洖灏忚溅鍙�
+						this.currentLevShuttleList.forEach((item,idx) => {
+							if (item.moveAdvancePath != null) {
+								item.moveAdvancePath.forEach((path,index) => {
+									if (path.x === x && path.y === y) {
+										return item.shuttleNo;
+									}
+								})
+							}
+						})
+						let data = []
+						let shuttleList = this.currentLevShuttleList;
+						for (var i = 0; i < shuttleList.length; i++) {
+							let shuttle = shuttleList[i]
+							let moveAdvancePath = shuttle.moveAdvancePath
+							if (moveAdvancePath != null) {
+								for (var j = 0; j < moveAdvancePath.length; j++) {
+									let path = moveAdvancePath[j]
+									if (path.x-1 === x && path.y === y) {//璺緞绗﹀悎
+										data.push(shuttle.shuttleNo)
+										continue;
+									}
+								}
+							}
+						}
+						return data;//杩斿洖灏忚溅鍙烽泦鍚�
+					},
+					resetMap() {
+						//閲嶇疆鍦板浘
+						let that = this
+						$.ajax({
+							url:baseUrl+"/console/map/resetMap/auth",
+							headers:{
+								'token': localStorage.getItem('token')
+							},
+							data:{},
+							method:'get',
+							success:function (res) {
+								that.$message({
+									message: '閲嶇疆瀹屾垚',
+									type: 'success'
+								});
+							}
+						})
+					},
+					getCodeData(){
+						let that = this
+						$.ajax({
+							url:baseUrl +'/console/barcode/output/site',
+							method:'GET',
+							success:function (res) {
+								if(res.code === 200){
+									let data = JSON.parse(res.data)
+									if (data.length <= 5) {
+										that.codeList1 = data;
+									} else {
+										that.codeList1 = data.slice(0, 5);
+										that.codeList2 = data.splice(5, 10);
+									}
+								}
+							}
+						})
+					}
+				}
+			})
+		</script>
+	</body>
+</html>
diff --git a/src/main/webapp/views/shuttle2.html b/src/main/webapp/views/shuttle2.html
index 7ca9591..c1cdc91 100644
--- a/src/main/webapp/views/shuttle2.html
+++ b/src/main/webapp/views/shuttle2.html
@@ -48,6 +48,7 @@
                                 <th>鏁呴殰鐘舵��</th>
                                 <th>鏁呴殰鐮�</th>
                                 <th>绠″埗鐘舵��</th>
+                                <th>浣庣數閲�</th>
                             </tr>
                         </thead>
                         <tbody>
@@ -229,18 +230,46 @@
     var shuttleMsgTableFullRows = 0;
     // 鍒濆鍖�
     var shuttleOutputDom = document.getElementById("shuttle-output");
+
+    var ws = new WebSocket("ws://" + window.location.host + baseUrl + "/shuttle/websocket");
+
+    //褰揥ebSocket鍒涘缓鎴愬姛鏃讹紝瑙﹀彂onopen浜嬩欢
+    ws.onopen = function(){
+        console.log("open");
+    }
+
+    //褰撳鎴风鏀跺埌鏈嶅姟绔彂鏉ョ殑娑堟伅鏃讹紝瑙﹀彂onmessage浜嬩欢
+    ws.onmessage = function(e){
+        const result = JSON.parse(e.data);
+        if (result.url == "/shuttle/table/shuttle/state") {
+            setShuttleStateInfo(JSON.parse(result.data))
+            setShuttleMsgInfo(JSON.parse(result.data))
+        }else if (result.url == "/shuttle/output/shuttle") {
+            setShuttleOutput(JSON.parse(result.data))
+        }
+        // console.log(e.data,result);
+    }
+
+    //褰撳鎴风鏀跺埌鏈嶅姟绔彂閫佺殑鍏抽棴杩炴帴璇锋眰鏃讹紝瑙﹀彂onclose浜嬩欢
+    ws.onclose = function(e){
+        console.log("close");
+    }
+
+    //濡傛灉鍑虹幇杩炴帴銆佸鐞嗐�佹帴鏀躲�佸彂閫佹暟鎹け璐ョ殑鏃跺�欒Е鍙憃nerror浜嬩欢
+    ws.onerror = function(e) {
+        console.log(error);
+    }
+
     $(document).ready(function() {
         initShuttleStateTable();
         getShuttleStateInfo();
         initShuttleMsgTable();
-        getShuttleMsgInfo();
         operatorBlockShow();
         setShuttleRadio();
     });
 
     setInterval(function () {
-        getShuttleStateInfo()
-        getShuttleMsgInfo();
+        getShuttleStateInfo();
     },1000)
     setInterval(function () {
         getShuttleOutput();
@@ -318,107 +347,96 @@
 
     // 鍥涘悜绌挎杞︿俊鎭〃鑾峰彇 ---- 琛ㄤ竴
     function getShuttleStateInfo() {
+        sendWs("{\"url\":\"/shuttle/table/shuttle/state\",\"data\":{}}")
+    }
+
+    // 鍥涘悜绌挎杞︿俊鎭〃璁剧疆 ---- 琛ㄤ竴
+    function setShuttleStateInfo(res) {
         let tableEl = $('#shuttle-state-table');
-        $.ajax({
-            url: baseUrl+ "/shuttle/table/shuttle/state",
-            headers: {'token': localStorage.getItem('token')},
-            method: 'POST',
-            success: function (res) {
-                if (res.code === 200){
-                    let table = res.data;
-                    if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) {
-                        initShuttleStateTable(table.length-shuttleStateTableBlankRows);
-                        shuttleStateTableFullRows = table.length;
-                    }
-                    for (let i=1;i<=table.length;i++){
-                        // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満');
-                        let tr = tableEl.find("tr").eq(i);
-                        setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
-                        setVal(tr.children("td").eq(1), table[i-1].protocolStatus$);
-                        setVal(tr.children("td").eq(2), table[i-1].free$);
-                        setVal(tr.children("td").eq(3), table[i-1].workingMode$);
-                        setVal(tr.children("td").eq(4), table[i-1].point$);
-                        setVal(tr.children("td").eq(5), table[i-1].point$$);
-                        setVal(tr.children("td").eq(6), table[i-1].powerPercent$);
-                        setVal(tr.children("td").eq(7), table[i-1].speed);
-                        setVal(tr.children("td").eq(8), table[i-1].loadState$);
-                        setVal(tr.children("td").eq(9), table[i-1].liftPosition$);
-                        setVal(tr.children("td").eq(10), table[i-1].runDir$);
-                        setVal(tr.children("td").eq(11), table[i-1].runDir2$);
-                        setVal(tr.children("td").eq(12), table[i-1].chargState$);
-                        setVal(tr.children("td").eq(13), table[i-1].errState$);
-                        setVal(tr.children("td").eq(14), table[i-1].errCode$);
-                        setVal(tr.children("td").eq(15), table[i-1].suspendState$);
-                    }
-                } else if (res.code === 403){
-                    window.location.href = baseUrl+"/login";
-                }  else {
-                    console.log(res.msg);
-                }
+        if (res.code === 200){
+            let table = res.data;
+            if (table.length > shuttleStateTableBlankRows && table.length !== shuttleStateTableFullRows) {
+                initShuttleStateTable(table.length-shuttleStateTableBlankRows);
+                shuttleStateTableFullRows = table.length;
             }
-        });
+            for (let i=1;i<=table.length;i++){
+                // $("#mode-"+table[i-1].shuttleNo).html(table[i-1].statusVal===0?'鑱旀満':'鑴辨満');
+                let tr = tableEl.find("tr").eq(i);
+                setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
+                setVal(tr.children("td").eq(1), table[i-1].protocolStatus$);
+                setVal(tr.children("td").eq(2), table[i-1].free$);
+                setVal(tr.children("td").eq(3), table[i-1].workingMode$);
+                setVal(tr.children("td").eq(4), table[i-1].point$);
+                setVal(tr.children("td").eq(5), table[i-1].point$$);
+                setVal(tr.children("td").eq(6), table[i-1].powerPercent$);
+                setVal(tr.children("td").eq(7), table[i-1].speed);
+                setVal(tr.children("td").eq(8), table[i-1].loadState$);
+                setVal(tr.children("td").eq(9), table[i-1].liftPosition$);
+                setVal(tr.children("td").eq(10), table[i-1].runDir$);
+                setVal(tr.children("td").eq(11), table[i-1].runDir2$);
+                setVal(tr.children("td").eq(12), table[i-1].chargState$);
+                setVal(tr.children("td").eq(13), table[i-1].errState$);
+                setVal(tr.children("td").eq(14), table[i-1].errCode$);
+                setVal(tr.children("td").eq(15), table[i-1].suspendState$);
+                setVal(tr.children("td").eq(16), table[i-1].lowerPower);
+            }
+        } else if (res.code === 403){
+            window.location.href = baseUrl+"/login";
+        }  else {
+            console.log(res.msg);
+        }
     }
 
     // 鍥涘悜绌挎杞︽暟鎹〃鑾峰彇 ---- 琛ㄤ簩
-    function getShuttleMsgInfo() {
+    function setShuttleMsgInfo(res) {
         let tableEl = $('#shuttle-msg-table');
-        $.ajax({
-            url: baseUrl+ "/shuttle/table/shuttle/state",
-            headers: {'token': localStorage.getItem('token')},
-            method: 'POST',
-            success: function (res) {
-                if (res.code === 200){
-                    var table = res.data;
-                    if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) {
-                        initShuttleMsgTable(table.length-shuttleMsgTableBlankRows);
-                        shuttleMsgTableFullRows = table.length;
-                    }
-                    for (var i=1;i<=table.length;i++){
-                        var tr = tableEl.find("tr").eq(i);
-                        setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
-                        setVal(tr.children("td").eq(1), table[i-1].taskNo);
-                        setVal(tr.children("td").eq(2), table[i-1].sourceLocNo);
-                        setVal(tr.children("td").eq(3), table[i-1].locNo);
-                        setVal(tr.children("td").eq(4), table[i-1].maxCellVoltage$);
-                        setVal(tr.children("td").eq(5), table[i-1].minCellVoltage$);
-                        setVal(tr.children("td").eq(6), table[i-1].voltage$);
-                        setVal(tr.children("td").eq(7), table[i-1].chargeCycleTimes);
-                        setVal(tr.children("td").eq(8), table[i-1].surplusQuantity);
-                        setVal(tr.children("td").eq(9), table[i-1].countQuantity);
-                        setVal(tr.children("td").eq(10), table[i-1].statusSum ? table[i - 1].statusSum.mileage : '');
-                        setVal(tr.children("td").eq(11), table[i-1].pakMk$);
-                        setVal(tr.children("td").eq(12), table[i-1].currentLocNo);
-                        setVal(tr.children("td").eq(13), table[i-1].token);
-                        if (table[i-1].shuttleNo == parseInt($('input[name="shuttleSelect"]:checked').val())) {
-                            $("#runSpeedText").text(table[i-1].runSpeed)
-                            $("#chargeLineText").text(table[i-1].chargeLine + "%")
-                        }
-                    }
-                } else if (res.code === 403){
-                    window.location.href = baseUrl+"/login";
-                }  else {
-                    console.log(res.msg);
+        if (res.code === 200){
+            var table = res.data;
+            if (table.length > shuttleMsgTableBlankRows && table.length !== shuttleMsgTableFullRows) {
+                initShuttleMsgTable(table.length-shuttleMsgTableBlankRows);
+                shuttleMsgTableFullRows = table.length;
+            }
+            for (var i=1;i<=table.length;i++){
+                var tr = tableEl.find("tr").eq(i);
+                setVal(tr.children("td").eq(0), table[i-1].shuttleNo);
+                setVal(tr.children("td").eq(1), table[i-1].taskNo);
+                setVal(tr.children("td").eq(2), table[i-1].sourceLocNo);
+                setVal(tr.children("td").eq(3), table[i-1].locNo);
+                setVal(tr.children("td").eq(4), table[i-1].maxCellVoltage$);
+                setVal(tr.children("td").eq(5), table[i-1].minCellVoltage$);
+                setVal(tr.children("td").eq(6), table[i-1].voltage$);
+                setVal(tr.children("td").eq(7), table[i-1].chargeCycleTimes);
+                setVal(tr.children("td").eq(8), table[i-1].surplusQuantity);
+                setVal(tr.children("td").eq(9), table[i-1].countQuantity);
+                setVal(tr.children("td").eq(10), table[i-1].statusSum ? table[i - 1].statusSum.mileage : '');
+                setVal(tr.children("td").eq(11), table[i-1].pakMk$);
+                setVal(tr.children("td").eq(12), table[i-1].currentLocNo);
+                setVal(tr.children("td").eq(13), table[i-1].token);
+                if (table[i-1].shuttleNo == parseInt($('input[name="shuttleSelect"]:checked').val())) {
+                    $("#runSpeedText").text(table[i-1].runSpeed)
+                    $("#chargeLineText").text(table[i-1].chargeLine + "%")
                 }
             }
-        });
+        } else if (res.code === 403){
+            window.location.href = baseUrl+"/login";
+        }  else {
+            console.log(res.msg);
+        }
     }
 
     // 绌挎杞︽棩蹇楄緭鍑� -----------------------------------------------------------------------
     function getShuttleOutput() {
-        $.ajax({
-            url: baseUrl + "/shuttle/output/shuttle",
-            headers: {'token': localStorage.getItem('token')},
-            method: 'POST',
-            success: function (res) {
-                if (res.code === 200) {
-                    shuttleOutput(res.data);
-                } else if (res.code === 403) {
-                    window.location.href = baseUrl + "/login";
-                } else {
-                    console.log(res.msg);
-                }
-            }
-        })
+        sendWs("{\"url\":\"/shuttle/output/shuttle\",\"data\":{}}")
+    }
+
+    function setShuttleOutput(res) {
+        if (res.code === 200) {
+            shuttleOutput(res.data);
+        } else if (res.code === 403) {
+            window.location.href = baseUrl + "/login";
+        } else {
+            console.log(res.msg);
+        }
     }
 
     // 浠诲姟鎸囦护涓嬪彂
@@ -622,5 +640,10 @@
         layer.close(layerDetl);
     })
 
+    function sendWs(message) {
+        if (ws.readyState == WebSocket.OPEN) {
+            ws.send(message)
+        }
+    }
 
 </script>

--
Gitblit v1.9.1