Files
klp-oa/klp-ui/src/utils/websocketManager.js
砂糖 d8f68c9ec2 feat(zinc): 新增PDO接口和日期筛选组件,重构生产统计页面
refactor(api): 移除冗余API路径前缀
style(websocket): 移除重复的日志打印
feat(label): 新增原料标签组件并替换生产标签
refactor(lines): 移除废弃的流程图组件和配置
feat(utils): 新增日期范围工具函数
feat(statistic): 集成日期筛选和图表分析功能
2026-01-23 14:01:52 +08:00

140 lines
3.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* WebSocket 管理器
* 用于管理多个 WebSocket 连接
*/
class WebSocketManager {
constructor(url) {
this.connections = new Map()
this.baseUrl = url
}
/**
* 创建 WebSocket 连接
* @param {String} type - WebSocket 类型 (track_measure, track_position, track_signal, track_matmap, calc_setup_result)
* @param {Function} onMessage - 接收消息的回调函数
* @param {Function} onOpen - 连接打开的回调函数
* @param {Function} onError - 错误回调函数
* @param {Function} onClose - 关闭回调函数
*/
connect(type, { onMessage, onOpen, onError, onClose } = {}) {
// 如果已存在连接,先断开
if (this.connections.has(type)) {
this.disconnect(type)
}
console.log(`[WebSocket] 正在连接: ${type}`)
const url = `${this.baseUrl}?type=${type}`
console.log(`[WebSocket] 正在连接: ${type}`)
try {
const socket = new WebSocket(url)
socket.onopen = (event) => {
console.log(`[WebSocket] 连接成功: ${type}`)
if (onOpen) onOpen(event)
}
socket.onmessage = (event) => {
try {
const data = JSON.parse(event.data)
if (onMessage) onMessage(data)
} catch (error) {
console.error(`[WebSocket] 数据解析失败 (${type}):`, error)
// 如果不是 JSON直接传递原始数据
if (onMessage) onMessage(event.data)
}
}
socket.onerror = (error) => {
console.error(`[WebSocket] 连接错误 (${type}):`, error)
if (onError) onError(error)
}
socket.onclose = (event) => {
console.log(`[WebSocket] 连接关闭 (${type}):`, event.code, event.reason)
this.connections.delete(type)
if (onClose) {
onClose(event)
} else if (event.code !== 1000) {
// 非正常关闭3秒后自动重连
console.log(`[WebSocket] 3秒后尝试重连: ${type}`)
setTimeout(() => {
this.connect(type, { onMessage, onOpen, onError, onClose })
}, 3000)
}
}
this.connections.set(type, socket)
return socket
} catch (error) {
console.error(`[WebSocket] 创建连接失败 (${type}):`, error)
// 失败后3秒重试
setTimeout(() => {
this.connect(type, { onMessage, onOpen, onError, onClose })
}, 3000)
}
}
/**
* 断开指定类型的连接
*/
disconnect(type) {
const socket = this.connections.get(type)
if (socket) {
console.log(`[WebSocket] 主动断开: ${type}`)
socket.close(1000, '主动关闭')
this.connections.delete(type)
}
}
/**
* 断开所有连接
*/
disconnectAll() {
console.log('[WebSocket] 断开所有连接')
this.connections.forEach((socket, type) => {
this.disconnect(type)
})
}
/**
* 获取指定类型的连接状态
*/
isConnected(type) {
const socket = this.connections.get(type)
return socket && socket.readyState === WebSocket.OPEN
}
/**
* 获取所有连接状态
*/
getAllStatus() {
const status = {}
this.connections.forEach((socket, type) => {
status[type] = socket.readyState === WebSocket.OPEN
})
return status
}
/**
* 发送消息(如果需要)
*/
send(type, message) {
const socket = this.connections.get(type)
if (socket && socket.readyState === WebSocket.OPEN) {
const data = typeof message === 'string' ? message : JSON.stringify(message)
socket.send(data)
return true
}
console.warn(`[WebSocket] 无法发送消息,连接未打开: ${type}`)
return false
}
}
// 导出单例
export default WebSocketManager