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);