#
Junjie
2024-03-25 ed227d88003e1c9cc08d549bba6d058c7ac1b785
#
3个文件已修改
5个文件已添加
296 ■■■■■ 已修改文件
zy-asrs-wcs/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/config/WebSocketConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/common/security/SecurityConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/controller/ShuttleController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/ShuttleService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/service/impl/ShuttleServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/ShuttleWebSocket.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/rcs/ws/model/WebSocketMessage.java 12 ●●●●● 补丁 | 查看 | 原始文档 | 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;
}