From f58d1d88c821b193750aa5ac64f903dba8ad1aa9 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 18 May 2026 08:03:52 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(im):=20=E6=8C=AF=E9=93=83?= =?UTF-8?q?=E8=B6=85=E6=97=B6=20Job=20=E5=8D=95=E4=BA=BA=E7=B2=92=E5=BA=A6?= =?UTF-8?q?=E6=A0=87=20NO=5FANSWER=20+=20=E7=8B=AC=E7=AB=8B=20NO=5FANSWER?= =?UTF-8?q?=20=E4=BF=A1=E4=BB=A4=E6=8E=A8=E9=80=81=20=E2=9C=A8=20feat(im):?= =?UTF-8?q?=20=E5=A4=84=E7=90=86=20RTC=5FCALL(NO=5FANSWER)=20=E4=BF=A1?= =?UTF-8?q?=E4=BB=A4=EF=BC=9B=E7=A7=81=E8=81=8A=E6=B0=94=E6=B3=A1=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E3=80=8C=E6=9C=AA=E6=8E=A5=E5=90=AC=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/im/home/store/rtcStore.ts | 10 +++++++++- src/views/im/home/store/websocketStore.ts | 7 +++++-- src/views/im/utils/constants.ts | 1 + src/views/im/utils/message.ts | 3 +++ 4 files changed, 18 insertions(+), 3 deletions(-) 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: