diff --git a/src/views/im/home/store/rtcStore.ts b/src/views/im/home/store/rtcStore.ts index 66247df34..6347cc26e 100644 --- a/src/views/im/home/store/rtcStore.ts +++ b/src/views/im/home/store/rtcStore.ts @@ -337,6 +337,13 @@ export const useRtcStore = defineStore('imRtc', () => { } } + /** 群通话单人振铃超时;对 banner 的处理与拒接一致(语义独立、实现共享) */ + function applyParticipantNoAnswer( + payload: Pick + ) { + applyParticipantRejected(payload) + } + /** 从指定群活跃通话的 joined / pending 列表里同步移除某用户;用于 disconnect / reject 让胶囊条不再展示 */ function dropFromGroupActiveCall(groupId: number, room: string, userId: number) { const existing = groupActiveCalls.value.get(groupId) @@ -377,6 +384,7 @@ export const useRtcStore = defineStore('imRtc', () => { getGroupCall, applyParticipantConnected, applyParticipantDisconnected, - applyParticipantRejected + applyParticipantRejected, + applyParticipantNoAnswer } }) diff --git a/src/views/im/home/store/websocketStore.ts b/src/views/im/home/store/websocketStore.ts index a779d958e..72cd473d9 100644 --- a/src/views/im/home/store/websocketStore.ts +++ b/src/views/im/home/store/websocketStore.ts @@ -743,10 +743,13 @@ export const useImWebSocketStore = defineStore('imWebSocketStore', { case ImRtcParticipantStatus.REJECTED: rtcStore.applyParticipantRejected(payload) break - case ImRtcParticipantStatus.JOINED: case ImRtcParticipantStatus.NO_ANSWER: + // 群通话单人振铃超时;信令独立保留语义,处理与 REJECTED 一致 + rtcStore.applyParticipantNoAnswer(payload) + break + case ImRtcParticipantStatus.JOINED: case ImRtcParticipantStatus.LEFT: - // ACCEPT / CANCEL / HUNGUP 暂不需要本端额外响应;rtcStore 状态由 1602/1603 + END 维护 + // ACCEPT / HUNGUP 暂不需要本端额外响应;rtcStore 状态由 1602/1603 + END 维护 break default: console.warn('[IM WS] 未识别的 RTC_CALL status', payload) diff --git a/src/views/im/utils/constants.ts b/src/views/im/utils/constants.ts index 59404e50b..4e923759c 100644 --- a/src/views/im/utils/constants.ts +++ b/src/views/im/utils/constants.ts @@ -182,6 +182,7 @@ export const ImRtcCallEndReason = { HANGUP: 1, // 接通后任一方主动挂断 REJECT: 2, // 被叫接通前点拒接 CANCEL: 3, // 主叫接通前主动取消 + NO_ANSWER: 4, // 振铃超时未接通 BUSY: 5, // 私聊呼叫时对方正忙 ERROR: 9 // 网络中断 / 设备失败 } as const diff --git a/src/views/im/utils/message.ts b/src/views/im/utils/message.ts index 153336d2b..5da6eab75 100644 --- a/src/views/im/utils/message.ts +++ b/src/views/im/utils/message.ts @@ -913,6 +913,7 @@ export function resolveRtcCallLastContent( * CANCEL → 操作者「已取消」/ 另一方「对方已取消」 * REJECT → 操作者「已拒绝」/ 另一方「对方已拒绝」 * BUSY → 操作者「忙线未接听」/ 另一方「对方忙线中」 + * NO_ANSWER → 操作者「未接听」/ 另一方「对方未接听」(振铃超时 Job 触发) * ERROR → 「通话中断 [N]」(接通后异常断开;duration > 0 时带时长) */ export function resolveRtcCallPrivateBubbleText(payload: RtcCallEndPayload | null): string { @@ -929,6 +930,8 @@ export function resolveRtcCallPrivateBubbleText(payload: RtcCallEndPayload | nul return isOperator ? '已取消' : '对方已取消' case ImRtcCallEndReason.REJECT: return isOperator ? '已拒绝' : '对方已拒绝' + case ImRtcCallEndReason.NO_ANSWER: + return isOperator ? '未接听' : '对方未接听' case ImRtcCallEndReason.BUSY: return isOperator ? '忙线未接听' : '对方忙线中' case ImRtcCallEndReason.ERROR: