From 80e5ee8049eefe7039d77048f43e6e0566a07953 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 25 三月 2024 09:10:43 +0800
Subject: [PATCH] Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java      |    3 
 zy-asrs-wcs/pom.xml                                                                |    5 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java       |   22 ++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java |   51 ++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java          |   11 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java             |  170 ++++++++++++++++++++++++++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java       |   12 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java    |   22 ---
 8 files changed, 277 insertions(+), 19 deletions(-)

diff --git a/zy-asrs-wcs/pom.xml b/zy-asrs-wcs/pom.xml
index 93571b5..ae111f0 100644
--- a/zy-asrs-wcs/pom.xml
+++ b/zy-asrs-wcs/pom.xml
@@ -67,6 +67,11 @@
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java
new file mode 100644
index 0000000..2df1e87
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java
@@ -0,0 +1,22 @@
+package com.zy.asrs.wcs.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.*;
+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/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java
index e25ef31..50cd64c 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java
@@ -41,7 +41,8 @@
             "/webjars/**",
             "/v2/api-docs",
             "/v3/api-docs",
-            "/swagger-ui/**"
+            "/swagger-ui/**",
+            "/ws/**"
     };
 
     @Resource
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java
index f7e64ab..a01dbf9 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java
@@ -9,6 +9,7 @@
 import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
 import com.zy.asrs.wcs.rcs.service.DeviceService;
 import com.zy.asrs.wcs.rcs.service.DeviceTypeService;
+import com.zy.asrs.wcs.rcs.service.ShuttleService;
 import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
 import com.zy.asrs.wcs.system.controller.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,27 +26,12 @@
     private DeviceService deviceService;
     @Autowired
     private DeviceTypeService deviceTypeService;
+    @Autowired
+    private ShuttleService shuttleService;
 
     @GetMapping("/shuttle/status/list")
     public R getShuttleStatusList() {
-        DeviceType deviceType = deviceTypeService.getOne(new LambdaQueryWrapper<DeviceType>()
-                .eq(DeviceType::getHostId, getHostId())
-                .eq(DeviceType::getStatus, 1)
-                .eq(DeviceType::getFlag, String.valueOf(SlaveType.Shuttle)));
-        if (deviceType == null) {
-            return R.error("璁惧绫诲瀷涓嶅瓨鍦�");
-        }
-
-        ArrayList<ShuttleProtocol> data = new ArrayList<>();
-        List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
-                .eq(Device::getHostId, getHostId())
-                .eq(Device::getStatus, 1)
-                .eq(Device::getDeviceType, deviceType.getId()));
-        for (Device device : list) {
-            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
-            ShuttleProtocol status = shuttleThread.getStatus();
-            data.add(status);
-        }
+        List<ShuttleProtocol> data = shuttleService.getShuttleStatusList(getHostId());
         return R.ok().add(data);
     }
 
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java
new file mode 100644
index 0000000..6be54ad
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java
@@ -0,0 +1,11 @@
+package com.zy.asrs.wcs.rcs.service;
+
+import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
+
+import java.util.List;
+
+public interface ShuttleService {
+
+    List<ShuttleProtocol> getShuttleStatusList(Long hostId);
+
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java
new file mode 100644
index 0000000..1680bb6
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java
@@ -0,0 +1,51 @@
+package com.zy.asrs.wcs.rcs.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wcs.rcs.cache.SlaveConnection;
+import com.zy.asrs.wcs.rcs.entity.Device;
+import com.zy.asrs.wcs.rcs.entity.DeviceType;
+import com.zy.asrs.wcs.rcs.model.enums.SlaveType;
+import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
+import com.zy.asrs.wcs.rcs.service.DeviceService;
+import com.zy.asrs.wcs.rcs.service.DeviceTypeService;
+import com.zy.asrs.wcs.rcs.service.ShuttleService;
+import com.zy.asrs.wcs.rcs.thread.ShuttleThread;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service("ShuttleService")
+public class ShuttleServiceImpl implements ShuttleService {
+
+    @Autowired
+    private DeviceService deviceService;
+    @Autowired
+    private DeviceTypeService deviceTypeService;
+
+    @Override
+    public List<ShuttleProtocol> getShuttleStatusList(Long hostId) {
+        DeviceType deviceType = deviceTypeService.getOne(new LambdaQueryWrapper<DeviceType>()
+                .eq(DeviceType::getHostId, hostId)
+                .eq(DeviceType::getStatus, 1)
+                .eq(DeviceType::getFlag, String.valueOf(SlaveType.Shuttle)));
+        if (deviceType == null) {
+            throw new CoolException("璁惧绫诲瀷涓嶅瓨鍦�");
+        }
+
+        ArrayList<ShuttleProtocol> data = new ArrayList<>();
+        List<Device> list = deviceService.list(new LambdaQueryWrapper<Device>()
+                .eq(Device::getHostId, hostId)
+                .eq(Device::getStatus, 1)
+                .eq(Device::getDeviceType, deviceType.getId()));
+        for (Device device : list) {
+            ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, device.getId().intValue());
+            ShuttleProtocol status = shuttleThread.getStatus();
+            data.add(status);
+        }
+        return data;
+    }
+}
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java
new file mode 100644
index 0000000..b17a131
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java
@@ -0,0 +1,170 @@
+package com.zy.asrs.wcs.rcs.ws;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.zy.asrs.framework.common.R;
+import com.zy.asrs.framework.common.SpringUtils;
+import com.zy.asrs.wcs.common.config.ConfigProperties;
+import com.zy.asrs.wcs.common.security.JwtSubject;
+import com.zy.asrs.wcs.rcs.model.protocol.ShuttleProtocol;
+import com.zy.asrs.wcs.rcs.service.ShuttleService;
+import com.zy.asrs.wcs.rcs.ws.model.WebSocketMessage;
+import com.zy.asrs.wcs.utils.JwtUtil;
+import io.jsonwebtoken.Claims;
+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.List;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+@Component
+@Slf4j
+@Service
+@ServerEndpoint("/ws/shuttle/websocket")
+@Data
+public class ShuttleWebSocket {
+
+    //瀹㈡埛绔湪绾夸汉鏁�
+    private static int onlineClient = 0;
+
+    //瀹㈡埛绔睜
+    private static CopyOnWriteArraySet<ShuttleWebSocket> webSocketServers = new CopyOnWriteArraySet<>();
+
+    private Session session;
+
+    private String username;
+
+    private Long hostId;
+
+    //绠¢亾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 {
+        ShuttleService shuttleService = SpringUtils.getBean(ShuttleService.class);
+        WebSocketMessage socketMessage = JSON.parseObject(message, WebSocketMessage.class);
+        if (socketMessage.getUrl().equals("login")) {
+            try {
+                // 瑙f瀽token
+                ConfigProperties configProperties = SpringUtils.getBean(ConfigProperties.class);
+                JSONObject data = JSON.parseObject(socketMessage.getData());
+                Claims claims = JwtUtil.parseToken(data.getString("token"), configProperties.getTokenKey());
+                JwtSubject jwtSubject = JwtUtil.getJwtSubject(claims);
+                this.username = jwtSubject.getUsername();
+                this.hostId = jwtSubject.getHostId();
+                socketMessage.setData(JSON.toJSONString(R.ok("auth success")));
+            } catch (Exception e) {
+                e.printStackTrace();
+                socketMessage.setData(JSON.toJSONString(R.error("auth fail")));
+            }
+            this.sendMessage(JSON.toJSONString(socketMessage));
+        } else if (socketMessage.getUrl().equals("/shuttle/status/list")) {
+            if (this.hostId != null) {
+                List<ShuttleProtocol> data = shuttleService.getShuttleStatusList(this.hostId);
+                socketMessage.setData(JSON.toJSONString(data));
+                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/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java
new file mode 100644
index 0000000..2336c76
--- /dev/null
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java
@@ -0,0 +1,12 @@
+package com.zy.asrs.wcs.rcs.ws.model;
+
+import lombok.Data;
+
+@Data
+public class WebSocketMessage {
+
+    private String url;
+
+    private String data;
+
+}

--
Gitblit v1.9.1