吉安感知网项目-前端
shuishen
2026-02-26 353ac4ed3a3e2a7f3526e3bceeea7b74a87bb834
feat:语音通话及工单样式调整
3 files modified
164 ■■■■ 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 105 ●●●●● 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-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,
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()
}