吉安感知网项目-前端
罗广辉
2026-02-27 b4c03703be42f8874b8598710cd8733dc54171e1
Merge remote-tracking branch 'origin/master'
5 files modified
121 ■■■■ changed files
applications/mobile-web-view/src/appPages/voiceCallDetail/index.vue 20 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/deviceInvocation/deviceCallRecord/FormDiaLog.vue 54 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/deviceInvocation/deviceCallRecord/index.vue 36 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/hooks/useGlobalWS.js 1 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/voiceCallDetail/index.vue 10 ●●●●● patch | view | raw | blame | history
applications/mobile-web-view/src/appPages/voiceCallDetail/index.vue
@@ -448,9 +448,7 @@
    send('accept', incomingFrom, null)
    log('✅ 已点击接听,发送 accept 给', incomingFrom)
    // 停止铃声
//     const transmitData = { data: { type: 'stopVoice' } }
// uni.postMessage(transmitData)
    state.value = 'calling'
    // 如果 offer 已经提前到达(我们暂存了),立刻 answer
@@ -458,6 +456,9 @@
        answerOffer(lastOfferSdp, incomingFrom)
        lastOfferSdp = null
    }
    // 停止
    const transmitData = { data: { sign:'closeBox' } }
    uni.postMessage(transmitData)
}
function rejectCall() {
@@ -466,11 +467,8 @@
    // 你后端没有 reject,用 busy 表示拒绝/不可接听
    send('busy', incomingFrom, null)
    log('❌ 已拒绝来电,发送 busy 给', incomingFrom)
    const transmitData = { data: { type: 'hangupVoice' } }
    const transmitData = { data: { type: 'hangupVoice',sign:'closeBox'  } }
uni.postMessage(transmitData)
    // 停止铃声
//     const transmitData = { data: { type: 'stopVoice' } }
// uni.postMessage(transmitData)
    incomingFrom = null
    acceptedByMe = false
@@ -579,7 +577,8 @@
        // 对方挂断:显示提示,延迟10秒跳转
        callEnded.value = true
        endMessage.value = '对方已挂断'
        const transmitData = { data: { type: 'hangupVoice',sign:'closeBox'  } }
        uni.postMessage(transmitData)
        // 延迟5秒后跳转页面
        endTimer.value = setTimeout(() => {
            // 返回上一页(uni-app的语音通话列表页面)
@@ -588,11 +587,10 @@
            } else {
                log('❌ uni对象不存在,无法返回上一页')
            }
            const transmitData = { data: { type: 'hangupVoice' } }
            uni.postMessage(transmitData)
            // 重置通话结束状态
            callEnded.value = false
        }, 3000)
        }, 2000)
    }
}
applications/task-work-order/src/views/orderView/deviceInvocation/deviceCallRecord/FormDiaLog.vue
@@ -4,9 +4,23 @@
        <!--        <div class="detail-row-view" v-if="dialogReadonly">-->
        <el-table :data="detailsList" class="gd-dialog-table">
            <el-table-column type="index" show-overflow-tooltip label="序号" />
            <el-table-column prop="deviceStatus" show-overflow-tooltip label="设备状态" />
            <el-table-column prop="deviceStatus" show-overflow-tooltip label="设备状态" >
                <template v-slot="{ row }">
                    {{ getStatusText(row.deviceStatus) }}
                </template>
            </el-table-column>
            <el-table-column prop="occurTime" show-overflow-tooltip label="发生时间" />
        </el-table>
        <div class="gd-pagination-parent">
            <el-pagination
                popper-class="gd-select-popper"
                v-model:current-page="formData.current"
                v-model:page-size="formData.size"
                layout="total, prev, pager, next, sizes"
                :total="total"
                @change="loadDetail"
            />
        </div>
    </el-dialog>
</template>
@@ -21,6 +35,7 @@
import { useRoute } from 'vue-router'
const detailsList = ref([])
const total = ref(0)
const initForm = () => ({
    callId: '',
@@ -54,21 +69,28 @@
const deptTree = ref([])
const route = useRoute()
const validatePass = (rule, value, callback) => {
    if (value === '') {
        callback(new Error('请输入密码'))
    } else {
        callback()
const statusList = ref(['待机','起飞准备','起飞准备完毕','手动飞行','自动起飞','航线飞行','全景拍照','智能跟随',
'ADS-B 躲避','自动返航','自动降落','强制降落','三桨叶降落','升级中','未连接','APAS','虚拟摇杆状态','指令飞行','空中 RTK 收敛模式',
'机场选址中','POI环绕'])
function getStatusText(statusIndex) {
    // 如果状态索引为 null、undefined 或无效
    if (statusIndex === null || statusIndex === undefined || statusIndex === '') {
        return '--';
    }
}
const validatePass2 = (rule, value, callback) => {
    if (value === '') {
        callback(new Error('请再次输入密码'))
    } else if (value !== formData.value.password) {
        callback(new Error('两次输入密码不一致'))
    } else {
        callback()
    // 将状态索引转换为数字
    const index = Number(statusIndex);
    // 检查索引是否有效(在数组范围内)
    if (!isNaN(index) && index >= 0 && index < statusList.value.length) {
        return statusList.value[index];
    }
    // 无效索引返回默认值
    console.warn(`无效的设备状态索引: ${statusIndex}`);
    return '未知状态';
}
@@ -78,8 +100,8 @@
}
async function loadDetail(id) {
    formData.value.id = id
    const res = await getDeviceCallRecordDetails(formData)
    formData.value.id = id || formData.value.id
    const res = await getDeviceCallRecordDetails(formData.value)
    detailsList.value = res?.data?.data.records
}
applications/task-work-order/src/views/orderView/deviceInvocation/deviceCallRecord/index.vue
@@ -33,7 +33,7 @@
                <el-select
                    class="gd-select gray"
                    popper-class="gd-select-popper"
                    v-model="searchParams.taskInitiator"
                    v-model="searchParams.taskInitiatorId"
                    placeholder="请选择"
                    clearable
                    @change="handleSearch"
@@ -75,7 +75,11 @@
                    <el-table-column prop="patrolTaskName" show-overflow-tooltip label="任务名称" />
                    <el-table-column prop="taskDepartment" show-overflow-tooltip label="发起任务部门" />
                    <el-table-column prop="taskInitiator" show-overflow-tooltip label="任务发起人" />
                    <el-table-column prop="flightDuration" show-overflow-tooltip label="飞行时长" />
                    <el-table-column prop="flightDuration" show-overflow-tooltip label="飞行时长">
                        <template v-slot="{ row }">
                            {{ formatDuration(row.flightDuration) }}
                        </template>
                    </el-table-column>
                    <el-table-column prop="flightDistance" show-overflow-tooltip label="飞行里程(m)" />
                    <el-table-column prop="deviceName" show-overflow-tooltip label="执行设备" />
                    <el-table-column prop="planExecuteTime" show-overflow-tooltip label="计划执行时间" />
@@ -116,11 +120,12 @@
import FormDiaLog from './FormDiaLog.vue'
import { saveOperationLog } from '@ztzf/apis'
import { useRoute } from 'vue-router'
import { getDictLabel } from '@ztzf/utils'
const initSearchParams = () => ({
    deviceId: '',
    patrolTaskName: '',
    taskInitiator: '',
    taskInitiatorId: '',
    current: 1,
    size: 10,
})
@@ -144,7 +149,7 @@
async function getList() {
    loading.value = true
    try {
        const res = await getDeviceCallRecordPage(searchParams)
        const res = await getDeviceCallRecordPage(searchParams.value)
        list.value = res?.data?.data?.records ?? []
        total.value = res?.data?.data?.total ?? 0
    } finally {
@@ -184,6 +189,29 @@
    getList()
}
// 返回 '2m 5s' 格式
function formatDuration(seconds) {
    if (seconds === null || seconds === undefined || seconds === '') {
        return '--';
    }
    // 如果小于60秒,直接显示秒
    if (seconds < 60) {
        return `${seconds}秒`;
    }
    // 计算分钟和秒
    const minutes = Math.floor(seconds / 60);
    const remainingSeconds = seconds % 60;
    // 组装显示字符串
    if (remainingSeconds > 0) {
        return `${minutes}分${remainingSeconds}秒`;
    } else {
        return `${minutes}分`;
    }
}
function handleView(row) {
    dialogRef.value?.open({ mode: 'view', row: { ...row } })
uniapps/work-app/src/hooks/useGlobalWS.js
@@ -21,7 +21,6 @@
      console.log('📨 useGlobalWS 收到 WebView 消息:', data)
      // 处理挂断消息
      if (data?.type === 'hangupVoice') {
        console.log('📞 收到挂断消息')
        initWS()
      }
    });
uniapps/work-app/src/subPackages/voiceCallDetail/index.vue
@@ -17,7 +17,7 @@
const userParams = userStore?.userInfo ? JSON.stringify(userStore.userInfo) : '{}'
const sWebViewRef = ref(null);
const viewUrl = ref("");
const typeSign = ref('')
// #ifdef APP-PLUS
/**
 * 请求 Android 麦克风权限
@@ -80,6 +80,14 @@
});
function onPostMessage(data) {
typeSign.value = data?.sign || ''
if(typeSign.value === 'closeBox'){
    setTimeout(() => {
    // 关闭弹窗
    cancelIncomingCallNotification()
    }, 1000)
}
    // 将WebView消息传递给全局WebSocket处理
    if (typeof uni !== 'undefined' && uni.$emit) {
        uni.$emit('webViewMessage', data);