From b633caa483180d005ffac86590f9844c951a8d37 Mon Sep 17 00:00:00 2001 From: kola-web Date: Mon, 4 Nov 2024 18:52:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E5=AE=A4=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/customRecord/index.scss | 7 +- src/components/customRecord/index.ts | 7 +- src/components/customRecord/index.wxml | 5 +- src/components/uploadFile/index.ts | 7 +- src/module1/pages/chatRoom/index.json | 4 +- src/module1/pages/chatRoom/index.scss | 14 ++ src/module1/pages/chatRoom/index.ts | 228 ++++++++++++++++++++++++--------- src/module1/pages/chatRoom/index.wxml | 67 +++++----- 8 files changed, 232 insertions(+), 107 deletions(-) diff --git a/src/components/customRecord/index.scss b/src/components/customRecord/index.scss index b487c96..bee3143 100644 --- a/src/components/customRecord/index.scss +++ b/src/components/customRecord/index.scss @@ -1,8 +1,9 @@ .record { - width: 107rpx; - height: 107rpx; border: 10rpx solid #e6f7f9; border-radius: 50%; + &.record-slot { + border: none; + } .icon { width: 107rpx; height: 107rpx; @@ -39,7 +40,7 @@ position: absolute; left: calc(50% - 6rpx); bottom: -10rpx; - content: ''; + content: ""; width: 0; height: 0; border-style: solid; diff --git a/src/components/customRecord/index.ts b/src/components/customRecord/index.ts index f23f279..c6f2159 100644 --- a/src/components/customRecord/index.ts +++ b/src/components/customRecord/index.ts @@ -5,7 +5,12 @@ Component({ /** * 组件的属性列表 */ - properties: {}, + properties: { + slotIcon: { + type: Boolean, + value: false, + }, + }, /** * 组件的初始数据 diff --git a/src/components/customRecord/index.wxml b/src/components/customRecord/index.wxml index 4afcebc..dbf4515 100644 --- a/src/components/customRecord/index.wxml +++ b/src/components/customRecord/index.wxml @@ -1,11 +1,12 @@ - + + diff --git a/src/components/uploadFile/index.ts b/src/components/uploadFile/index.ts index 5e8f7ad..a7916cd 100644 --- a/src/components/uploadFile/index.ts +++ b/src/components/uploadFile/index.ts @@ -133,8 +133,9 @@ Component({ let url = `${app.globalData.upFileUrl}?r=file-service/upload-`; if (item.fileType === "image") { url += "img"; - } else if (item.fileType === "video") { + } else if (item.fileType === "video" || item.type === "video") { url += "video"; + item.tempFilePath = item.url; } else if (item.fileType === "audio") { url += "audio"; } else { @@ -162,8 +163,8 @@ Component({ }; if (item.fileType === "image") { expandJson.imgUrl = data.data.Url; - } else if (item.fileType === "video") { - expandJson.videoUrl = data.data.SnapshotUrl; + } else if (item.fileType === "video" || item.type === "video") { + expandJson.imgUrl = data.data.SnapshotUrl; } else if (item.fileType === "audio") { expandJson.duration = Number.parseInt(String(item.duration / 1000)); } diff --git a/src/module1/pages/chatRoom/index.json b/src/module1/pages/chatRoom/index.json index c0f7051..699223b 100644 --- a/src/module1/pages/chatRoom/index.json +++ b/src/module1/pages/chatRoom/index.json @@ -3,6 +3,8 @@ "navigationStyle": "default", "usingComponents": { "van-icon": "@vant/weapp/icon/index", - "van-popup": "@vant/weapp/popup/index" + "van-popup": "@vant/weapp/popup/index", + "customRecord": "/components/customRecord/index", + "uploadFile": "/components/uploadFile/index" } } diff --git a/src/module1/pages/chatRoom/index.scss b/src/module1/pages/chatRoom/index.scss index 9732796..1f00f60 100644 --- a/src/module1/pages/chatRoom/index.scss +++ b/src/module1/pages/chatRoom/index.scss @@ -177,6 +177,7 @@ page { } } .audio { + position: relative; margin-bottom: 32rpx; padding: 22rpx 24rpx; border-radius: 0 32rpx 32rpx; @@ -188,6 +189,19 @@ page { align-items: center; gap: 12rpx; box-sizing: border-box; + &.no-read { + &::after { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: -30rpx; + content: ''; + width: 16rpx; + height: 16rpx; + background: #ed4f39; + border-radius: 50%; + } + } .icon { width: 32rpx; height: 40rpx; diff --git a/src/module1/pages/chatRoom/index.ts b/src/module1/pages/chatRoom/index.ts index dfb84a1..24a3a7b 100644 --- a/src/module1/pages/chatRoom/index.ts +++ b/src/module1/pages/chatRoom/index.ts @@ -16,6 +16,7 @@ interface IMessageItem { hospitalName: string; showTime?: boolean; isPlay?: boolean; + uniqueCode?: string; } Page({ @@ -43,7 +44,8 @@ Page({ userInfo: {} as any, - sendMessage: [], + sendMessage: "", + videoUrl: "", }, innerAudioContext: null as WechatMiniprogram.InnerAudioContext | null, videoContext: null as WechatMiniprogram.VideoContext | null, @@ -52,12 +54,14 @@ Page({ id: options.id, }); this.videoContext = wx.createVideoContext("video"); + this.innerAudioContext = wx.createInnerAudioContext({ + useWebAudioImplement: true, + }); app.waitLogin().then(() => { // this.getAgree(); this.getMessageList(); this.getDetail(); - this.listenMessage(); app.getUserInfo(this); }); }, @@ -66,6 +70,9 @@ Page({ if (this.innerAudioContext) { this.innerAudioContext.stop(); } + if (this.videoContext) { + this.videoContext.stop(); + } }, getAgree() { wx.ajax({ @@ -117,22 +124,17 @@ Page({ url: `/module1/pages/chatRoomInfo/index?id=${this.data.id}&cid=${this.data.case.caseId}`, }); }, + handleCaseDetail() { + wx.navigateTo({ + url: `/module1/pages/casesDetail/index?id=${this.data.case.caseId}`, + }); + }, handleView(index = -1) { this.setData({ scrollIntoView: index > -1 ? `view${index}` : `place`, }); }, - listenMessage() { - wx.WebIM.conn.addEventHandler("room", { - onConnected: (message) => { - console.log("message: ", message); - }, - onTextMessage: (meessage) => { - console.log("meessage1: ", meessage); - }, - }); - }, getMessageList() { if (this.data.isLoad || this.data.isFinish) return; this.setData({ @@ -154,11 +156,7 @@ Page({ return; } res.map((item) => { - //消息内容类型,1-文本,2-语音,3-图片,4-视频,5-提示信息 - if (["2", "3", "4"].includes(item.contentType)) { - item.msgContent = JSON.parse(item.msgContent); - } - return item; + return this.formatMessage(item); }); this.setData({ messageList: [...res.reverse(), ...this.data.messageList], @@ -166,9 +164,7 @@ Page({ isLoad: false, }); this.filterCreateTime(); - if (!lastMsgId) { - this.handleView(); - } + this.handleView(); }); }, scrolltoupper(e) { @@ -176,13 +172,6 @@ Page({ this.getMessageList(); } }, - WebIMLogin() { - const { chatDoctor } = this.data; - wx.WebIM.conn.open({ - user: chatDoctor.chatUserId, - pwd: chatDoctor.chatUserPwd, - }); - }, handleSendMessage() { const { sendMessage, userInfo } = this.data; if (!sendMessage) { @@ -199,13 +188,100 @@ Page({ fromDoctorId: userInfo.DoctorId, createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), isSelf: 1, - isRead: 1, + isRead: 2, doctorImg: userInfo.Img, doctorName: userInfo.Name, hospitalName: userInfo.HospitalName, }; + this.setData({ + sendMessage: "", + }); this.WebIMSendMessage(message); }, + handleSendAudio(e) { + const { userInfo } = this.data; + const contentStr = JSON.stringify({ + url: e.detail.fileUrl, + duration: e.detail.duration, + }); + const message: IMessageItem = { + msgId: "", + contentType: "2", + content: contentStr, + fromDoctorId: userInfo.DoctorId, + createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), + isSelf: 1, + isRead: 2, + doctorImg: userInfo.Img, + doctorName: userInfo.Name, + hospitalName: userInfo.HospitalName, + }; + this.WebIMSendMessage(message); + }, + handleSendPhoto(e) { + const { userInfo } = this.data; + const contentStr = JSON.stringify({ + url: e.detail.fileUrl, + }); + const message: IMessageItem = { + msgId: "", + contentType: "3", + content: contentStr, + fromDoctorId: userInfo.DoctorId, + createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), + isSelf: 1, + isRead: 2, + doctorImg: userInfo.Img, + doctorName: userInfo.Name, + hospitalName: userInfo.HospitalName, + }; + this.WebIMSendMessage(message); + }, + handleSendVideo(e) { + const { userInfo } = this.data; + const contentStr = JSON.stringify({ + url: e.detail.fileUrl, + imgUrl: e.detail.imgUrl, + }); + const message: IMessageItem = { + msgId: "", + contentType: "4", + content: contentStr, + fromDoctorId: userInfo.DoctorId, + createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), + isSelf: 1, + isRead: 2, + doctorImg: userInfo.Img, + doctorName: userInfo.Name, + hospitalName: userInfo.HospitalName, + }; + this.WebIMSendMessage(message); + }, + sendMessage({ uniqueCode, ...message }) { + wx.ajax({ + method: "POST", + url: "?r=takeda/chat/send-message", + data: { + roomId: this.data.id, + message: { + contentType: message.contentType, + content: message.content, + uniqueCode, + }, + }, + }); + }, + WebIMLogin() { + const { chatDoctor } = this.data; + wx.WebIM.conn + .open({ + user: chatDoctor.chatUserId, + pwd: chatDoctor.chatUserPwd, + }) + .then(() => { + this.listenMessage(); + }); + }, WebIMSendMessage(message: IMessageItem) { const { chatGroupInfo } = this.data; const option = { @@ -223,8 +299,9 @@ Page({ .then((res) => { this.sendMessage({ ...message, uniqueCode: res.serverMsgId }); this.setData({ - messageList: [...this.data.messageList, message], + messageList: [...this.data.messageList, this.formatMessage(message)], }); + this.handleView(); }) .catch(() => { wx.showToast({ @@ -233,40 +310,35 @@ Page({ }); }); }, - sendMessage({ uniqueCode, ...message }) { - wx.ajax({ - method: "POST", - url: "?r=takeda/chat/send-message", - data: { - roomId: this.data.id, - message: { - contentType: message.contentType, - content: message.content, - uniqueCode, - }, + listenMessage() { + const { chatGroupInfo } = this.data; + wx.WebIM.conn.addEventHandler("room", { + onTextMessage: (message) => { + if (message.error) { + return; + } + if (message.to === chatGroupInfo.ChatGroupId) { + this.setData({ + messageList: [ + ...this.data.messageList, + this.formatMessage({ + ...message.ext, + isSelf: 2, + }), + ], + }); + this.handleReadAll(); + this.handleView(); + } }, }); }, - handleHot(e) { - const { index, mindex } = e.currentTarget.dataset; - const { messageList } = this.data; - const hotList = messageList[mindex].welcomeMsg?.hotQuestion; - const hot = hotList?.[index]; - this.setData({ - messageList: [ - ...messageList, - { - msgId: "", - contentType: "1", - msgContent: hot?.question, - msgVisitTime: "", - msgFromType: "1", - createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), - }, - ], - }); - this.handleView(); - this.sendQuestion(hot?.questionId); + formatMessage(message: IMessageItem) { + //消息内容类型,1-文本,2-语音,3-图片,4-视频,5-提示信息 + if (["2", "3", "4"].includes(message.contentType)) { + message.content = JSON.parse(message.content); + } + return message; }, formatTime(date: string) { let createTimeName = ""; @@ -308,7 +380,7 @@ Page({ this.setData({ fold: !this.data.fold, }); - if (this.data.fold) { + if (!this.data.fold) { setTimeout(() => { this.handleView(); }, 300); @@ -318,7 +390,7 @@ Page({ const { index } = e.currentTarget.dataset; const { messageList } = this.data; const messageItem = messageList[index]; - const { url } = messageItem.content[0]; + const { url } = messageItem.content; if (this.innerAudioContext) { if (messageItem.isPlay) { this.innerAudioContext.stop(); @@ -332,6 +404,13 @@ Page({ this.innerAudioContext.src = url; this.innerAudioContext.play(); messageItem.isPlay = true; + if (messageItem.isRead === 2 && messageItem.isSelf === 2) { + messageItem.isRead = 1; + this.handleReadAudio({ + msgId: messageItem.msgId, + uniqueCode: messageItem.uniqueCode, + }); + } this.innerAudioContext.onEnded(() => { messageItem.isPlay = false; this.setData({ @@ -343,16 +422,39 @@ Page({ }); } }, + handleReadAudio({ msgId, uniqueCode }) { + wx.ajax({ + method: "POST", + url: "?r=takeda/chat/read-message", + data: { + roomId: this.data.id, + msgId, + uniqueCode, + }, + }); + }, handlePreview(e) { const { url } = e.currentTarget.dataset; wx.previewImage({ urls: [url], }); }, - handleVideo() { + handleVideo(e) { + const { url } = e.currentTarget.dataset; if (this.videoContext) { + this.setData({ + videoUrl: url, + }); this.videoContext.play(); this.videoContext.requestFullScreen({}); } }, + + handleReadAll() { + wx.ajax({ + method: "POST", + url: "?r=takeda/chat/read-all-message", + data: { roomId: this.data.id }, + }); + }, }); diff --git a/src/module1/pages/chatRoom/index.wxml b/src/module1/pages/chatRoom/index.wxml index b0e00fd..7fc22bd 100644 --- a/src/module1/pages/chatRoom/index.wxml +++ b/src/module1/pages/chatRoom/index.wxml @@ -5,7 +5,7 @@ 已归档 - + ID:{{case.caseNo}} @@ -39,16 +39,17 @@ {{message.content}} - + - 李倩 中南大学湘雅医院李倩 + {{message.doctorName}} {{message.hospitalName}} {{message.content}} - + - {{message.msgContent[0].duration}}'' + {{message.content.duration}}'' - + @@ -86,7 +86,7 @@ {{message.doctorName}} {{message.hospitalName}} {{message.content}} - {{message.msgContent[0].duration}}'' + {{message.content.duration}}'' - + @@ -127,13 +126,16 @@ - + + + @@ -144,21 +146,18 @@ bind:tap="handleFooter" > - - + + 照片 - - + + 视频 - + - +