From 353ac4ed3a3e2a7f3526e3bceeea7b74a87bb834 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Thu, 26 Feb 2026 16:12:22 +0800
Subject: [PATCH] feat:语音通话及工单样式调整

---
 applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue |  105 +++++++++++-----------------------
 applications/task-work-order/src/styles/common/cockpit.scss                        |    2 
 uniapps/work-app/src/hooks/useGlobalWS.js                                          |   57 ++++++++++++++++++-
 3 files changed, 89 insertions(+), 75 deletions(-)

diff --git a/applications/task-work-order/src/styles/common/cockpit.scss b/applications/task-work-order/src/styles/common/cockpit.scss
index fb44707..754c1f7 100644
--- a/applications/task-work-order/src/styles/common/cockpit.scss
+++ b/applications/task-work-order/src/styles/common/cockpit.scss
@@ -845,7 +845,7 @@
 }
 
 .gd-search-form {
-  padding-bottom: 20px;
+  padding-bottom: 15px;
   display: flex;
 
   .el-form-item__label {
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
index 2955350..f9cfff9 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -6,63 +6,30 @@
 		</el-tabs>
 		<el-form ref="queryParamsRef" :model="searchParams" class="gd-search-form">
 			<el-form-item label="工单名称" prop="workOrderName">
-				<el-input
-					class="gd-input gray"
-					v-model="searchParams.workOrderName"
-					placeholder="请输入"
-					clearable
-					@clear="handleSearch"
-				/>
+				<el-input class="gd-input gray" v-model="searchParams.workOrderName" placeholder="请输入" clearable
+					@clear="handleSearch" />
 			</el-form-item>
 
 			<el-form-item label="工单类型" prop="workOrderType">
-				<el-select
-					class="gd-select gray"
-					popper-class="gd-select-popper"
-					v-model="searchParams.workOrderType"
-					placeholder="请选择"
-					clearable
-					@change="handleSearch"
-				>
-					<el-option
-						v-for="item in dictObj.workOrderType"
-						:key="item.dictKey"
-						:label="item.dictValue"
-						:value="item.dictKey"
-					/>
+				<el-select class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.workOrderType"
+					placeholder="请选择" clearable @change="handleSearch">
+					<el-option v-for="item in dictObj.workOrderType" :key="item.dictKey" :label="item.dictValue"
+						:value="item.dictKey" />
 				</el-select>
 			</el-form-item>
 
 			<el-form-item label="工单状态" prop="workOrderStatus">
-				<el-select
-					class="gd-select gray"
-					popper-class="gd-select-popper"
-					v-model="searchParams.workOrderStatus"
-					placeholder="请选择"
-					clearable
-					@change="handleSearch"
-				>
-					<el-option
-						v-for="item in dictObj.workOrderStatus"
-						:key="item.dictKey"
-						:label="item.dictValue.split('_')[1]"
-						:value="item.dictKey"
-					/>
+				<el-select class="gd-select gray" popper-class="gd-select-popper" v-model="searchParams.workOrderStatus"
+					placeholder="请选择" clearable @change="handleSearch">
+					<el-option v-for="item in dictObj.workOrderStatus" :key="item.dictKey"
+						:label="item.dictValue.split('_')[1]" :value="item.dictKey" />
 				</el-select>
 			</el-form-item>
 
 			<el-form-item label="执行时间" prop="executeTime">
-				<el-date-picker
-					class="gd-date-picker gray"
-					popper-class="gd-date-picker-popper"
-					v-model="dateRange"
-					type="daterange"
-					range-separator="-"
-					start-placeholder="开始日期"
-					end-placeholder="结束日期"
-					value-format="YYYY-MM-DD HH:mm:ss"
-					@change="handleSearch"
-				/>
+				<el-date-picker class="gd-date-picker gray" popper-class="gd-date-picker-popper" v-model="dateRange"
+					type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+					value-format="YYYY-MM-DD HH:mm:ss" @change="handleSearch" />
 			</el-form-item>
 
 			<el-form-item class="gd-search-actions">
@@ -71,13 +38,14 @@
 			</el-form-item>
 		</el-form>
 
-		<div class="gd-table-toolbar">
-			<el-button v-if="permission.order_release" :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">
-				新增工单
-			</el-button>
-		</div>
-
 		<div class="gd-table-container" v-loading="loading">
+			<div class="gd-table-toolbar">
+				<el-button v-if="permission.order_release" :icon="Plus" color="#4C34FF" type="primary"
+					@click="openForm('add')">
+					新增工单
+				</el-button>
+			</div>
+
 			<div class="gd-table-content gd-table-content-bg">
 				<el-table class="gd-table" :data="list" @selection-change="handleSelectionChange">
 					<el-table-column type="index" width="64" label="序号" />
@@ -90,7 +58,7 @@
 					</el-table-column>
 					<el-table-column prop="status" show-overflow-tooltip label="阶段状态">
 						<template v-slot="{ row }">
-							<span :style="{color: colors?.[row?.workOrderStatus]}">
+							<span :style="{ color: colors?.[row?.workOrderStatus] }">
 								{{ getDictLabel(row.workOrderStatus, dictObj.workOrderStatus).split('_')[0] }}
 							</span>
 						</template>
@@ -118,14 +86,9 @@
 			</div>
 
 			<div class="gd-pagination-parent">
-				<el-pagination
-					popper-class="gd-select-popper"
-					v-model:current-page="searchParams.current"
-					v-model:page-size="searchParams.size"
-					layout="total, prev, pager, next, sizes"
-					:total="total"
-					@change="getList"
-				/>
+				<el-pagination popper-class="gd-select-popper" v-model:current-page="searchParams.current"
+					v-model:page-size="searchParams.size" layout="total, prev, pager, next, sizes" :total="total"
+					@change="getList" />
 			</div>
 		</div>
 
@@ -182,7 +145,7 @@
 provide('dictObj', dictObj)
 
 // 获取列表
-async function getList() {
+async function getList () {
 	const range = dateRangeFormat(dateRange.value)
 	loading.value = true
 	try {
@@ -200,27 +163,27 @@
 }
 
 // 查询
-function handleSearch() {
+function handleSearch () {
 	searchParams.value.current = 1
 	getList()
 }
 
 // 重置查询
-function resetForm() {
+function resetForm () {
 	queryParamsRef.value?.resetFields()
 	dateRange.value = []
 	searchParams.value.current = 1
 	getList()
 }
 
-function tabsClick(tab, event) {
+function tabsClick (tab, event) {
 	activeName.value = tab.props.name
 	resetForm()
 	handleSearch()
 }
 
 // 新增/编辑/查看 弹框
-function openForm(mode, row) {
+function openForm (mode, row) {
 	dialogVisible.value = true
 	nextTick(() => {
 		dialogRef.value?.open({ mode, row })
@@ -230,7 +193,7 @@
 // 21响应中_申请取消、22响应中_申请修改、23响应中_已取消、
 // 30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、
 // 50验收通过_待结算、60结算完成_已结算
-function openFormChange(row) {
+function openFormChange (row) {
 	dialogVisible.value = true
 	nextTick(() => {
 		const mode = ['11'].includes(row.workOrderStatus) && permission.value.order_release ? 'edit' : 'view'
@@ -253,7 +216,7 @@
 }
 
 // 删除
-async function handleDelete(row) {
+async function handleDelete (row) {
 	const tips = row ? '该条' : '选中的项'
 	await ElMessageBox.confirm(`确认删除${tips}吗?`, '提示', {
 		type: 'warning',
@@ -269,19 +232,19 @@
 }
 
 // 勾选值设置
-function handleSelectionChange(rows) {
+function handleSelectionChange (rows) {
 	selectedIds.value = rows.map(item => item.id)
 }
 
 // 获取字典
-function getDictList() {
+function getDictList () {
 	getDictionaryByCode('deviceLoadDemand,workOrderType,workOrderStatus,taskStatus').then(res => {
 		dictObj.value = res.data.data
 	})
 }
 
 // 获取两个tab的总条数
-async function getTabTotals() {
+async function getTabTotals () {
 	// 获取全部tab的总数
 	const allRes = await gdWorkOrderPageApi({
 		current: 1,
diff --git a/uniapps/work-app/src/hooks/useGlobalWS.js b/uniapps/work-app/src/hooks/useGlobalWS.js
index 36086d1..052312a 100644
--- a/uniapps/work-app/src/hooks/useGlobalWS.js
+++ b/uniapps/work-app/src/hooks/useGlobalWS.js
@@ -10,6 +10,8 @@
   const callStatus = ref(null)
   // token 存储
   const accessToken = ref('')
+  // 断线恢复定时器
+  let recoverTimer = null
   // 存储铃声实例
   let ringtoneInstance = null
 
@@ -143,11 +145,61 @@
   // }
 
   // 初始化WebSocket连接
+  function isVoiceCallDetailActive() {
+    try {
+      const pages = getCurrentPages()
+      const currentPage = pages[pages.length - 1]
+      const route = currentPage?.route || currentPage?.$page?.fullPath || ''
+      return String(route).includes('subPackages/voiceCallDetail/index')
+    } catch (error) {
+      return false
+    }
+  }
+
+  function shouldRecoverWS() {
+    return !isVoiceCallDetailActive() && !!useUserStore()?.userInfo?.access_token
+  }
+
+  function ensureRecoverTimer() {
+    if (recoverTimer) {
+      return
+    }
+    recoverTimer = setInterval(() => {
+      if (websocketService.getConnected()) {
+        clearInterval(recoverTimer)
+        recoverTimer = null
+        return
+      }
+      if (shouldRecoverWS()) {
+        initWS()
+      }
+    }, 3000)
+  }
+
   function initWS() {
     const userStore = useUserStore()
     accessToken.value =userStore?.userInfo.access_token
+    if (!accessToken.value || isVoiceCallDetailActive()) {
+      return
+    }
     try {
       websocketService.setOnMessageCallback(messageHandler);
+      websocketService.setOnOpenCallback(() => {
+        if (recoverTimer) {
+          clearInterval(recoverTimer)
+          recoverTimer = null
+        }
+      })
+      websocketService.setOnCloseCallback(() => {
+        if (shouldRecoverWS()) {
+          ensureRecoverTimer()
+        }
+      })
+      websocketService.setOnErrorCallback(() => {
+        if (shouldRecoverWS()) {
+          ensureRecoverTimer()
+        }
+      })
 
       // 获取当前用户ID,优先使用store中的用户信息
       const userId = userStore.userInfo?.new_userInfo.userId || defaultUserId;
@@ -158,9 +210,6 @@
         // 使用用户ID初始化WebSocket连接
         websocketService.init(userId, WS_BASE, accessToken.value);
         // console.log('🌐 全局WebSocket初始化成功,用户ID:', userId);
-      } else {
-        websocketService.connect();
-
       }
     } catch (error) {
     }
@@ -176,6 +225,8 @@
     },
     { immediate: true, deep: true }
   )
+
+  ensureRecoverTimer()
 }
 
 

--
Gitblit v1.9.3