zy-asrs-wcs/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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> zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java
New file @@ -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"); } } 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 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); } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java
New file @@ -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); } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java
New file @@ -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; } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java
New file @@ -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(); //将websocket对象进行保存 webSocketServers.add(this); //添加在线人数 addOnlineClient(); log.info("有新窗口开始监听:" + session.getId() + ",当前在线人数为:" + getOnlineClient()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose() { webSocketServers.remove(this); //从set中删除 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 { // 解析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--; } } } zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java
New file @@ -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; }