diff --git a/apps/web-antd/src/app.vue b/apps/web-antd/src/app.vue index 05d7a4f8..ea81f39f 100644 --- a/apps/web-antd/src/app.vue +++ b/apps/web-antd/src/app.vue @@ -62,7 +62,7 @@ const initWebsocket = () => { chatStore.initDB(); // 加载好友列表(使用用户ID) - chatStore.loadFriends(userStore.presetUsers, userStore.currentUser?.id); + chatStore.loadFriends(userStore.presetUsers, userStore.currentUser?.doctor_id); // 创建WebSocket连接 connectWebSocket(); diff --git a/apps/web-antd/src/views/business/chat/components/MessageInput.vue b/apps/web-antd/src/views/business/chat/components/MessageInput.vue index 23e73219..26eb5839 100644 --- a/apps/web-antd/src/views/business/chat/components/MessageInput.vue +++ b/apps/web-antd/src/views/business/chat/components/MessageInput.vue @@ -312,6 +312,7 @@ const handleAudioRecorded = (event) => { sendMessage({ senderId: userStore.currentUser.id, receiverId: chatStore.currentFriend.id, + roomId: chatStore.currentFriend.room_id, type: 'audio', content: url }).catch(error => { diff --git a/apps/web-antd/src/views/business/chat/composables/useRecording.ts b/apps/web-antd/src/views/business/chat/composables/useRecording.ts index 35fbe019..df049726 100644 --- a/apps/web-antd/src/views/business/chat/composables/useRecording.ts +++ b/apps/web-antd/src/views/business/chat/composables/useRecording.ts @@ -1,67 +1,70 @@ -import {ref} from "vue" -import {message} from "ant-design-vue" +import { ref } from 'vue'; + +import { message } from 'ant-design-vue'; export function useRecording() { - const isRecording = ref(false) - const mediaRecorder = ref(null) - const audioChunks = ref([]) - const recordingStartTime = ref(0) + const isRecording = ref(false); + const mediaRecorder = ref(null); + const audioChunks = ref([]); + const recordingStartTime = ref(0); const startRecording = () => { - if (isRecording.value) return + if (isRecording.value) return; navigator.mediaDevices - .getUserMedia({audio: true}) + .getUserMedia({ audio: true }) .then((stream) => { - isRecording.value = true - audioChunks.value = [] - recordingStartTime.value = Date.now() + isRecording.value = true; + audioChunks.value = []; + recordingStartTime.value = Date.now(); - mediaRecorder.value = new MediaRecorder(stream) + mediaRecorder.value = new MediaRecorder(stream); mediaRecorder.value.ondataavailable = (event) => { - audioChunks.value.push(event.data) - } + audioChunks.value.push(event.data); + }; mediaRecorder.value.onstop = () => { - const audioBlob = new Blob(audioChunks.value, {type: "audio/wav"}) - const audioUrl = URL.createObjectURL(audioBlob) - const duration = Math.floor((Date.now() - recordingStartTime.value) / 1000) + const audioBlob = new Blob(audioChunks.value, { type: 'audio/wav' }); + const audioUrl = URL.createObjectURL(audioBlob); + const duration = Math.floor( + (Date.now() - recordingStartTime.value) / 1000, + ); - console.log(' aaa', 'ssssssssssssssss') + console.log(' aaa', 'ssssssssssssssss'); // 触发音频消息发送事件 - const event = new CustomEvent("audioRecorded", { + const event = new CustomEvent('audioRecorded', { detail: { url: audioUrl, - duration: duration, + duration, blob: audioBlob, }, - }) - window.dispatchEvent(event) + }); + window.dispatchEvent(event); // 停止所有音频轨道 - stream.getTracks().forEach((track) => track.stop()) - } + stream.getTracks().forEach((track) => track.stop()); + }; - mediaRecorder.value.start() + mediaRecorder.value.start(); }) .catch((error) => { - console.error("录音失败:", error) - message.error("无法访问麦克风,请检查权限设置") - isRecording.value = false - }) - } + console.error('录音失败:', error); + message.error('无法访问麦克风,请检查权限设置'); + isRecording.value = false; + }); + }; const stopRecording = () => { - if (!isRecording.value || !mediaRecorder.value) return + if (!isRecording.value || !mediaRecorder.value) return; - isRecording.value = false - mediaRecorder.value.stop() - } + isRecording.value = false; + mediaRecorder.value.stop(); + }; return { isRecording, startRecording, stopRecording, - } + }; } diff --git a/apps/web-antd/src/views/business/chat/composables/useWebRTC.ts b/apps/web-antd/src/views/business/chat/composables/useWebRTC.ts index 88bde710..694215f0 100644 --- a/apps/web-antd/src/views/business/chat/composables/useWebRTC.ts +++ b/apps/web-antd/src/views/business/chat/composables/useWebRTC.ts @@ -411,7 +411,7 @@ export function useWebRTC() { ); try { await callAPI.sendCandidate( - userStore.currentUser?.id, + userStore.currentUser?.doctor_id, peerId, callId, event.candidate, diff --git a/apps/web-antd/src/views/business/chat/composables/useWebSocket.ts b/apps/web-antd/src/views/business/chat/composables/useWebSocket.ts index ec2c389d..b47e306d 100644 --- a/apps/web-antd/src/views/business/chat/composables/useWebSocket.ts +++ b/apps/web-antd/src/views/business/chat/composables/useWebSocket.ts @@ -48,8 +48,8 @@ export function useWebSocket() { console.log(userStore.currentUser, 'ssssssssss') // 绑定当前用户 - if (userStore.currentUser?.id) { - bindUser(userStore.currentUser.id); + if (userStore.currentUser?.doctor_id) { + bindUser(userStore.currentUser.doctor_id); } }; @@ -66,7 +66,7 @@ export function useWebSocket() { // 处理普通消息 - 添加来源判断防止循环 if (data.sender_user_id && data.receiver_user_id) { - chatStore.handleIncomingMessage(data, userStore.currentUser?.id); + chatStore.handleIncomingMessage(data, userStore.currentUser?.doctor_id); } } catch (error) { console.error('解析WebSocket消息失败:', error); @@ -135,7 +135,7 @@ export function useWebSocket() { const sendMessage = (receiverUserId, messageType, content) => { const message = { request_type: 'send_message', - sender_user_id: userStore.currentUser?.id, + sender_user_id: userStore.currentUser?.doctor_id, receiver_user_id: receiverUserId, message_type: messageType, message_content: content, @@ -148,7 +148,7 @@ export function useWebSocket() { return send({ request_type: 'call_signal', ...signal, - sender_user_id: userStore.currentUser?.id, + sender_user_id: userStore.currentUser?.doctor_id, }); }; diff --git a/apps/web-antd/src/views/business/chat/stores/chat.ts b/apps/web-antd/src/views/business/chat/stores/chat.ts index d899f318..e62f27f0 100644 --- a/apps/web-antd/src/views/business/chat/stores/chat.ts +++ b/apps/web-antd/src/views/business/chat/stores/chat.ts @@ -99,7 +99,7 @@ export const useChatStore = defineStore("chat", () => { try { logWithTime("log", "发送通话信令:", signal) - if (!userStore.currentUser?.id) { + if (!userStore.currentUser?.doctor_id) { throw new Error("用户未登录") } @@ -672,7 +672,7 @@ export const useChatStore = defineStore("chat", () => { type: currentCall.value.callType === "video" ? "video-call" : "audio-call", content: "[对方已拒绝]", time: new Date().toLocaleTimeString().slice(0, 5), - senderId: userStore.currentUser?.id, + senderId: userStore.currentUser?.doctor_id, read: true, timestamp: Date.now(), duration: 0, @@ -760,7 +760,7 @@ export const useChatStore = defineStore("chat", () => { type: currentCall.value.callType === "video" ? "video-call" : "audio-call", content: "[未接来电]", time: new Date().toLocaleTimeString().slice(0, 5), - senderId: userStore.currentUser?.id, + senderId: userStore.currentUser?.doctor_id, read: true, timestamp: Date.now(), duration: 0, @@ -790,7 +790,7 @@ export const useChatStore = defineStore("chat", () => { type: currentCall.value.callType === "video" ? "video-call" : "audio-call", content: "[对方忙线]", time: new Date().toLocaleTimeString().slice(0, 5), - senderId: userStore.currentUser?.id, + senderId: userStore.currentUser?.doctor_id, read: true, timestamp: Date.now(), duration: 0, @@ -936,7 +936,7 @@ export const useChatStore = defineStore("chat", () => { return } - if (!userStore.currentUser?.id) { + if (!userStore.currentUser?.doctor_id) { alert("用户未登录,无法发起通话") return } @@ -984,7 +984,7 @@ export const useChatStore = defineStore("chat", () => { type: type === "video" ? "video-call" : "audio-call", content: "[未接来电]", time: new Date().toLocaleTimeString().slice(0, 5), - senderId: userStore.currentUser?.id, + senderId: userStore.currentUser?.doctor_id, read: true, timestamp: Date.now(), duration: 0, @@ -1119,7 +1119,7 @@ export const useChatStore = defineStore("chat", () => { type: incomingCall.value.callType === "video" ? "video-call" : "audio-call", content: content, time: new Date().toLocaleTimeString().slice(0, 5), - senderId: userStore.currentUser?.id, + senderId: userStore.currentUser?.doctor_id, read: true, timestamp: Date.now(), duration: 0, @@ -1177,7 +1177,7 @@ export const useChatStore = defineStore("chat", () => { type: callTypeVal === "video" ? "video-call" : "audio-call", content: content, time: new Date().toLocaleTimeString().slice(0, 5), - senderId: userStore.currentUser?.id, + senderId: userStore.currentUser?.doctor_id, read: true, timestamp: Date.now(), duration: duration, diff --git a/apps/web-antd/src/views/business/chat/utils/request.ts b/apps/web-antd/src/views/business/chat/utils/request.ts index 5270d8d4..0f106bf6 100644 --- a/apps/web-antd/src/views/business/chat/utils/request.ts +++ b/apps/web-antd/src/views/business/chat/utils/request.ts @@ -130,8 +130,7 @@ export const sendMessage = (data) => { receiver_user_id: data.receiverId.toString(), message_type: messageTypeMap[data.type] || 0, message_content: data.content || '', - // 添加来源标记 - isFromHttp: true, + duration: data.duration || 0, }; // 如果包含通话信令,添加call_id和call_status