电话咨询

This commit is contained in:
duoaohui
2026-06-04 15:19:31 +08:00
parent 3cffd160f5
commit e426357850

View File

@@ -486,26 +486,77 @@ const notifyCloudLawEnd = () => {
} }
const buildMiniProgramReturnUrl = () => { const buildMiniProgramReturnUrl = () => {
const configured = String(miniProgramReturnUrl.value || '').trim() const decodeRepeated = (value) => {
if (configured) { let text = String(value || '').trim()
if (!text) return ''
for (let i = 0; i < 3; i++) {
try { try {
return decodeURIComponent(configured) const next = decodeURIComponent(text)
if (next === text) break
text = next
} catch (e) { } catch (e) {
break
}
}
return text
}
const configured = decodeRepeated(miniProgramReturnUrl.value)
if (configured) {
return configured return configured
} }
if (!consultId.value) {
// #ifdef H5
try {
const cached = window.sessionStorage.getItem('echo_cloud_law_return_url') || ''
if (cached) return decodeRepeated(cached)
} catch (e) {}
// #endif
return ''
} }
if (!consultId.value) return ''
return `/pages_work/ai_consult/ai_consult?id=${encodeURIComponent(consultId.value)}&mode=detail&from=videoCall` return `/pages_work/ai_consult/ai_consult?id=${encodeURIComponent(consultId.value)}&mode=detail&from=videoCall`
} }
let endedRedirectTimer = null let endedRedirectTimer = null
let miniProgramRedirected = false let miniProgramRedirected = false
let miniProgramEndNotified = false
let miniProgramRedirectRetryTimer = null
const getMiniProgram = () => { const getMiniProgram = () => {
return typeof window !== 'undefined' && window.wx && window.wx.miniProgram ? window.wx.miniProgram : null return typeof window !== 'undefined' && window.wx && window.wx.miniProgram ? window.wx.miniProgram : null
} }
const navigateMiniProgramToReturnUrl = (returnUrl) => {
const mp = getMiniProgram()
if (!mp) return false
const url = String(returnUrl || '').trim()
if (url) {
const attempts = [
() => mp.reLaunch && mp.reLaunch({ url }),
() => mp.redirectTo && mp.redirectTo({ url }),
() => mp.navigateTo && mp.navigateTo({ url })
]
for (let i = 0; i < attempts.length; i++) {
try {
attempts[i]()
return true
} catch (e) {
console.warn('[CloudLawVideoCall] miniProgram navigate failed', e)
}
}
}
try {
if (typeof mp.navigateBack === 'function') {
mp.navigateBack({ delta: 1 })
return true
}
} catch (e) {
console.warn('[CloudLawVideoCall] miniProgram navigateBack failed', e)
}
return false
}
const notifyMiniProgramCallEnded = () => { const notifyMiniProgramCallEnded = () => {
if (isLawRole.value) return
const returnUrl = buildMiniProgramReturnUrl() const returnUrl = buildMiniProgramReturnUrl()
const payload = { const payload = {
type: 'cloudLawCallEnded', type: 'cloudLawCallEnded',
@@ -524,31 +575,38 @@ const notifyMiniProgramCallEnded = () => {
console.warn('[CloudLawVideoCall] postMessage failed', e) console.warn('[CloudLawVideoCall] postMessage failed', e)
} }
if (miniProgramRedirected) return if (miniProgramRedirected) return
try { if (navigateMiniProgramToReturnUrl(returnUrl)) {
if (miniProgram && returnUrl && typeof miniProgram.redirectTo === 'function') {
miniProgramRedirected = true miniProgramRedirected = true
miniProgram.redirectTo({ url: returnUrl }) return
} else if (miniProgram && typeof miniProgram.navigateBack === 'function') {
// 没有可跳转的咨询详情地址时,至少退回上一页(等待页),由小程序侧轮询兜底跳转
miniProgramRedirected = true
miniProgram.navigateBack({ delta: 1 })
} }
} catch (e) { if (miniProgramRedirectRetryTimer) return
miniProgramRedirected = false let retry = 0
console.warn('[CloudLawVideoCall] redirect mini program failed', e) miniProgramRedirectRetryTimer = setInterval(() => {
retry += 1
if (navigateMiniProgramToReturnUrl(returnUrl) || retry >= 10) {
clearInterval(miniProgramRedirectRetryTimer)
miniProgramRedirectRetryTimer = null
if (retry < 10) miniProgramRedirected = true
} }
}, 300)
}
const notifyMiniProgramCallEndedOnce = () => {
if (miniProgramEndNotified) return
miniProgramEndNotified = true
notifyMiniProgramCallEnded()
} }
const scheduleEndedRedirect = () => { const scheduleEndedRedirect = () => {
if (endedRedirectTimer) return if (endedRedirectTimer || isLawRole.value) return
endedRedirectTimer = setTimeout(() => { endedRedirectTimer = setTimeout(() => {
endedRedirectTimer = null endedRedirectTimer = null
notifyCloudLawEnd().finally(() => notifyMiniProgramCallEnded()) notifyCloudLawEnd().finally(() => notifyMiniProgramCallEndedOnce())
}, 1200) }, 1200)
} }
const goToConsultDetail = () => { const goToConsultDetail = () => {
notifyCloudLawEnd().finally(() => notifyMiniProgramCallEnded()) notifyCloudLawEnd().finally(() => notifyMiniProgramCallEndedOnce())
} }
const pollCommandsOnce = async () => { const pollCommandsOnce = async () => {
@@ -996,20 +1054,41 @@ const hangup = async () => {
} finally { } finally {
ended.value = true ended.value = true
leaving.value = false leaving.value = false
notifyMiniProgramCallEnded() notifyMiniProgramCallEndedOnce()
scheduleEndedRedirect()
} }
} }
onLoad(query => { onLoad(query => {
const decodeQueryValue = (value) => {
let text = String(value || '').trim()
if (!text) return ''
for (let i = 0; i < 3; i++) {
try {
const next = decodeURIComponent(text)
if (next === text) break
text = next
} catch (e) {
break
}
}
return text
}
rawCode.value = query?.code || query?.roomCode || '' rawCode.value = query?.code || query?.roomCode || ''
callId.value = query?.callId || query?.call_id || '' callId.value = query?.callId || query?.call_id || ''
consultId.value = query?.consultId || query?.consult_id || '' consultId.value = decodeQueryValue(query?.consultId || query?.consult_id || '')
miniProgramReturnUrl.value = query?.miniProgramReturnUrl || query?.mini_program_return_url || '' miniProgramReturnUrl.value = decodeQueryValue(query?.miniProgramReturnUrl || query?.mini_program_return_url || '')
cloudLawApiBase.value = query?.cloudLawApiBase || query?.cloud_law_api_base || '' cloudLawApiBase.value = query?.cloudLawApiBase || query?.cloud_law_api_base || ''
cloudLawToken.value = query?.cloudLawToken || query?.cloud_law_token || '' cloudLawToken.value = query?.cloudLawToken || query?.cloud_law_token || ''
cloudLawRole.value = query?.cloudLawRole || query?.cloud_law_role || '' cloudLawRole.value = query?.cloudLawRole || query?.cloud_law_role || ''
// #ifdef H5 // #ifdef H5
try {
if (consultId.value) {
window.sessionStorage.setItem('echo_cloud_law_consult_id', consultId.value)
}
if (miniProgramReturnUrl.value) {
window.sessionStorage.setItem('echo_cloud_law_return_url', miniProgramReturnUrl.value)
}
} catch (e) {}
if (String(cloudLawRole.value).toLowerCase() === 'law') { if (String(cloudLawRole.value).toLowerCase() === 'law') {
try { try {
window.sessionStorage.setItem('echo_cloud_law_meeting_role', 'law') window.sessionStorage.setItem('echo_cloud_law_meeting_role', 'law')
@@ -1041,18 +1120,33 @@ onMounted(() => {
ended.value = true ended.value = true
// 对方挂断或会议结束时,通知小程序跳转到「我的咨询详情」 // 对方挂断或会议结束时,通知小程序跳转到「我的咨询详情」
notifyCloudLawEnd().finally(() => { notifyCloudLawEnd().finally(() => {
notifyMiniProgramCallEnded() notifyMiniProgramCallEndedOnce()
scheduleEndedRedirect() scheduleEndedRedirect()
}) })
} }
}, { immediate: true }) }, { immediate: true })
}) })
watch(ended, (value) => {
if (!value || isLawRole.value) return
const returnUrl = buildMiniProgramReturnUrl()
if (!returnUrl) return
setTimeout(() => {
if (ended.value && !miniProgramRedirected) {
notifyMiniProgramCallEndedOnce()
}
}, 1500)
})
onBeforeUnmount(() => { onBeforeUnmount(() => {
if (endedRedirectTimer) { if (endedRedirectTimer) {
clearTimeout(endedRedirectTimer) clearTimeout(endedRedirectTimer)
endedRedirectTimer = null endedRedirectTimer = null
} }
if (miniProgramRedirectRetryTimer) {
clearInterval(miniProgramRedirectRetryTimer)
miniProgramRedirectRetryTimer = null
}
if (timerHandle) { if (timerHandle) {
clearInterval(timerHandle) clearInterval(timerHandle)
timerHandle = null timerHandle = null