|
|
@@ -1,106 +0,0 @@
|
|
|
-import { ref } from 'vue'
|
|
|
-import { ElNotification } from 'element-plus'
|
|
|
-import { getToken } from '@/utils/auth'
|
|
|
-
|
|
|
-const DEFAULT_URL = `${location.protocol === 'https:' ? 'wss:' : 'ws:'}//${location.host}/pipe/ws/deviceStatus`
|
|
|
-
|
|
|
-export const workOrders = ref([])
|
|
|
-export const workOrderTotal = ref(0)
|
|
|
-export const workOrderWsState = ref('closed')
|
|
|
-
|
|
|
-let socket = null
|
|
|
-let heartbeatTimer = null
|
|
|
-let reconnectTimer = null
|
|
|
-let stopped = true
|
|
|
-let reconnectAttempts = 0
|
|
|
-let initialized = false
|
|
|
-let lastOrderIds = new Set()
|
|
|
-
|
|
|
-function send(data) {
|
|
|
- if (socket && socket.readyState === WebSocket.OPEN) socket.send(JSON.stringify(data))
|
|
|
-}
|
|
|
-function clearTimers() {
|
|
|
- if (heartbeatTimer) clearInterval(heartbeatTimer)
|
|
|
- if (reconnectTimer) clearTimeout(reconnectTimer)
|
|
|
- heartbeatTimer = null
|
|
|
- reconnectTimer = null
|
|
|
-}
|
|
|
-function scheduleReconnect() {
|
|
|
- if (stopped || reconnectTimer) return
|
|
|
- const delay = Math.min(30000, 5000 * Math.pow(2, reconnectAttempts++))
|
|
|
- reconnectTimer = setTimeout(() => { reconnectTimer = null; connect() }, delay)
|
|
|
-}
|
|
|
-function notifyNewOrders(items) {
|
|
|
- const newItems = items.filter(item => {
|
|
|
- const id = String(item.orderId || item.orderNo || '')
|
|
|
- return id && !lastOrderIds.has(id)
|
|
|
- })
|
|
|
- lastOrderIds = new Set(items.map(item => String(item.orderId || item.orderNo || '')).filter(Boolean))
|
|
|
- if (initialized && newItems.length) {
|
|
|
- const first = newItems[0]
|
|
|
- ElNotification({
|
|
|
- title: '工单提醒',
|
|
|
- message: newItems.length === 1 ? `${first.orderNo || '新工单'}:${first.orderDesc || '有新的待处理工单'}` : `收到 ${newItems.length} 条新的待处理工单`,
|
|
|
- type: 'warning',
|
|
|
- duration: 5000
|
|
|
- })
|
|
|
- }
|
|
|
- initialized = true
|
|
|
-}
|
|
|
-function startHeartbeat() {
|
|
|
- if (heartbeatTimer) clearInterval(heartbeatTimer)
|
|
|
- heartbeatTimer = setInterval(() => send({ type: 'ping' }), 25000)
|
|
|
-}
|
|
|
-function connect() {
|
|
|
- if (stopped || (socket && [WebSocket.CONNECTING, WebSocket.OPEN].includes(socket.readyState))) return
|
|
|
- const rawToken = getToken()
|
|
|
- if (!rawToken) { workOrderWsState.value = 'waiting-token'; scheduleReconnect(); return }
|
|
|
- clearTimers()
|
|
|
- workOrderWsState.value = 'connecting'
|
|
|
- try {
|
|
|
- socket = new WebSocket(import.meta.env.VITE_DEVICE_STATUS_WS_URL || DEFAULT_URL)
|
|
|
- socket.onopen = () => {
|
|
|
- reconnectAttempts = 0
|
|
|
- const token = rawToken.startsWith('Bearer ') ? rawToken : `Bearer ${rawToken}`
|
|
|
- send({ type: 'authenticate', token })
|
|
|
- }
|
|
|
- socket.onmessage = event => {
|
|
|
- let message
|
|
|
- try { message = JSON.parse(event.data) } catch { return }
|
|
|
- if (message.type === 'authenticated') {
|
|
|
- if (!message.success) { workOrderWsState.value = 'auth-failed'; stopped = true; socket.close(); return }
|
|
|
- workOrderWsState.value = 'open'
|
|
|
- send({ type: 'workOrderReminder' })
|
|
|
- startHeartbeat()
|
|
|
- return
|
|
|
- }
|
|
|
- if (message.type === 'workOrderReminderPush' || message.type === 'workOrderReminder') {
|
|
|
- if (!message.success) return
|
|
|
- const data = message.data || {}
|
|
|
- const items = Array.isArray(data.items) ? data.items : []
|
|
|
- workOrders.value = items
|
|
|
- workOrderTotal.value = Number(data.total || 0)
|
|
|
- notifyNewOrders(items)
|
|
|
- }
|
|
|
- }
|
|
|
- socket.onerror = () => { workOrderWsState.value = 'error' }
|
|
|
- socket.onclose = () => {
|
|
|
- clearTimers(); socket = null
|
|
|
- if (!stopped) { workOrderWsState.value = 'closed'; scheduleReconnect() }
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- workOrderWsState.value = 'error'; socket = null; scheduleReconnect()
|
|
|
- }
|
|
|
-}
|
|
|
-export function startWorkOrderReminder() {
|
|
|
- stopped = false
|
|
|
- connect()
|
|
|
- return { workOrders, workOrderTotal, workOrderWsState }
|
|
|
-}
|
|
|
-export function stopWorkOrderReminder() {
|
|
|
- stopped = true
|
|
|
- clearTimers()
|
|
|
- if (socket) socket.close(1000, 'application stop')
|
|
|
- socket = null
|
|
|
- workOrderWsState.value = 'closed'
|
|
|
-}
|