吉安感知网项目-前端
shuishen
2026-02-26 353ac4ed3a3e2a7f3526e3bceeea7b74a87bb834
feat:语音通话及工单样式调整
3 files modified
134 ■■■■■ changed files
applications/task-work-order/src/styles/common/cockpit.scss 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue 75 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/hooks/useGlobalWS.js 57 ●●●●● patch | view | raw | blame | history
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 {
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-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 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-content gd-table-content-bg">
                <el-table class="gd-table" :data="list" @selection-change="handleSelectionChange">
                    <el-table-column type="index" width="64" label="序号" />
@@ -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>
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()
}