import dayjs from 'dayjs' const _app = getApp() interface IMessageItem { msgId: string msgContentType: '1' | '2' | '3' | '4' // 1:文本 4: 语音 msgContent: any msgVisitTime: string msgFromType: '1' | '2' // 1: 患者 2: 医生 isPlay?: boolean welcomeMsg?: { hotQuestion: Item[] } msgCreateTime: string // 消息创建时间 msgCreateTimeName?: string // 消息创建时间 showTime?: boolean } interface Item { questionId: string question: string } Page({ data: { fold: true, scrollTop: 0, scrollIntoView: '', doctorDetail: {} as any, questionActive: 0, questionList: [] as any, questionActiveList: [] as Item[], isLoad: false, isFinish: false, messageList: [ { msgId: '686', msgContentType: '2', msgContent: '重症肌无力患者复查的频率取决于多种因素', welcomeMsg: '', msgVisitTime: '', msgFromType: '2', msgCreateTime: '2024-10-10 09:37:40', }, { msgId: '686', msgContentType: '3', msgContent: '重症肌无力患者复查的频率取决于多种因素', welcomeMsg: '', msgVisitTime: '', msgFromType: '2', msgCreateTime: '2024-10-10 09:37:40', }, { msgId: '686', msgContentType: '2', msgContent: '重症肌无力患者复查的频率取决于多种因素', welcomeMsg: '', msgVisitTime: '', msgFromType: '1', msgCreateTime: '2024-10-10 09:37:40', }, { msgId: '686', msgContentType: '3', msgContent: '重症肌无力患者复查的频率取决于多种因素', welcomeMsg: '', msgVisitTime: '', msgFromType: '1', msgCreateTime: '2024-10-10 09:37:40', }, { msgId: '681', msgContentType: '1', msgContent: '重症肌无力是否有遗传性?', welcomeMsg: '', msgVisitTime: '', msgFromType: '1', msgCreateTime: '2024-10-10 09:37:17', }, { msgId: '681', msgContentType: '1', msgContent: '重症肌无力是否有遗传性?', welcomeMsg: '', msgVisitTime: '', msgFromType: '1', msgCreateTime: '2024-10-10 09:37:17', }, { msgId: '483', msgContentType: '4', msgContent: '[{"duration":8,"url":"https://circlehbsaas.oss-cn-beijing.aliyuncs.com/audio/20240907757_tmp_acf4f18c59553a8d2d9f74e173a16328.m4a.mp3"}]', welcomeMsg: '', msgVisitTime: '', msgFromType: '2', msgCreateTime: '2024-10-08 15:24:19', }, { msgId: '483', msgContentType: '4', msgContent: '[{"duration":8,"url":"https://circlehbsaas.oss-cn-beijing.aliyuncs.com/audio/20240907757_tmp_acf4f18c59553a8d2d9f74e173a16328.m4a.mp3"}]', welcomeMsg: '', msgVisitTime: '', msgFromType: '1', msgCreateTime: '2024-10-08 15:24:19', }, ], nextMsgId: '', unReadCount: 0, firstNotReadMsgId: 0, isVisitAdl: 2, adlMsgId: 0, week: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], timeDay: { 1: '上午', 2: '下午' }, userInfo: {}, }, innerAudioContext: null as WechatMiniprogram.InnerAudioContext | null, videoContext: null as WechatMiniprogram.VideoContext | null, onLoad(options) { this.videoContext = wx.createVideoContext('video') }, onUnload() { if (this.innerAudioContext) { this.innerAudioContext.stop() } }, handleView(index = -1) { this.setData({ scrollIntoView: index > -1 ? `view${index}` : `place`, }) }, getDoctorDetail() { wx.ajax({ method: 'GET', url: '?r=zd/message-interact/get-bind-doctor-info', data: {}, }).then((res) => { this.setData({ doctorDetail: { ...res, }, }) }) }, getQuestionList() { wx.ajax({ method: 'GET', url: '?r=zd/message-interact/get-question-list', data: {}, }).then((res) => { this.setData({ questionList: res, questionActiveList: res[0].questionList, }) }) }, getMessageList() { if (this.data.isLoad || this.data.isFinish) return this.setData({ isLoad: true, }) const nextMsgId = this.data.nextMsgId wx.ajax({ method: 'GET', url: '?r=zd/message-interact/patient-get-message-list', data: { nextMsgId, }, }).then((res) => { res.messageList.map((item) => { if (item.msgContentType === '4') { item.msgContent = JSON.parse(item.msgContent) } if (item.msgContentType === '2') { item.msgVisitTime = JSON.parse(item.msgVisitTime) } if (item.msgContentType === '5') { item.welcomeMsg = JSON.parse(item.welcomeMsg) } return item }) this.setData({ messageList: [...res.messageList.reverse(), ...this.data.messageList], nextMsgId: res.nextMsgId, unReadCount: res.unReadCount, firstNotReadMsgId: res.firstNotReadMsgId, isVisitAdl: res.isVisitAdl, adlMsgId: res.adlMsgId, isLoad: false, isFinish: nextMsgId === res.nextMsgId, }) this.filterCreateTime() if (!nextMsgId) { this.handleView() } }) }, scrolltoupper(e) { // if (e.detail.direction === 'top') { // this.getMessageList() // } }, 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: '', msgContentType: '1', msgContent: hot?.question, msgVisitTime: '', msgFromType: '1', msgCreateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), }, ], }) this.handleView() this.sendQuestion(hot?.questionId) }, handleQuestion(e) { const { index } = e.currentTarget.dataset const { questionActiveList, messageList } = this.data const question = questionActiveList[index] this.setData({ messageList: [ ...messageList, { msgId: '', msgContentType: '1', msgContent: question.question, msgVisitTime: '', msgFromType: '1', msgCreateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), }, ], }) this.sendQuestion(question.questionId) }, sendQuestion(questionId) { wx.ajax({ method: 'POST', url: '?r=zd/message-interact/send-question-message', data: { questionId, }, }).then((res) => { this.setData({ messageList: [ ...this.data.messageList, { msgId: '', msgContentType: '1', msgContent: res, msgVisitTime: '', msgFromType: '2', msgCreateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), }, ], }) this.filterCreateTime() this.handleView() }) }, formatTime(date: string) { let msgCreateTimeName = '' if (dayjs().format('YYYY-MM-DD') === dayjs(date).format('YYYY-MM-DD')) { msgCreateTimeName = dayjs(date).format('HH:mm') } else if (dayjs().format('YYYY-MM-DD') === dayjs(date).add(1, 'day').format('YYYY-MM-DD')) { msgCreateTimeName = `昨天 ${dayjs(date).format('HH:mm')}` } else if (dayjs().diff(date, 'day') < 7) { msgCreateTimeName = dayjs(date).format(`dddd HH:mm`) } else { msgCreateTimeName = dayjs(date).format('YYYY-MM-DD HH:mm') } return msgCreateTimeName }, filterCreateTime() { const gapTime = 5 * 60 * 1000 const { messageList } = this.data let preTime = 0 messageList.forEach((item, index) => { if (index === 0) { item.showTime = true preTime = dayjs(item.msgCreateTime).valueOf() item.msgCreateTimeName = this.formatTime(item.msgCreateTime) } else { const curTime = dayjs(item.msgCreateTime).valueOf() if (curTime - preTime > gapTime) { item.showTime = true item.msgCreateTimeName = this.formatTime(item.msgCreateTime) preTime = dayjs(item.msgCreateTime).valueOf() } } }) this.setData({ messageList, }) }, handleQuestionTab(e) { const { index } = e.currentTarget.dataset this.setData({ questionActive: index, questionActiveList: this.data.questionList[index].questionList, }) }, handleDoctorDetail() { const { doctorId } = this.data.doctorDetail wx.navigateTo({ url: `/pages/doctorDetail/index?id=${doctorId}`, }) }, handleRead() { const { firstNotReadMsgId, messageList } = this.data const index = messageList.findIndex((item) => `${item.msgId}` === `${firstNotReadMsgId}`) this.handleView(index) this.setData({ unReadCount: 0, }) }, handleFooter() { this.setData({ fold: !this.data.fold, }) if (this.data.fold) { setTimeout(() => { this.handleView() }, 300) } }, handleAdl() { wx.navigateTo({ url: '/pages/adl/index', }) }, handleAudio(e) { const { index } = e.currentTarget.dataset const { messageList } = this.data const messageItem = messageList[index] const { url } = messageItem.msgContent[0] if (this.innerAudioContext) { if (messageItem.isPlay) { this.innerAudioContext.stop() messageItem.isPlay = false this.setData({ messageList, }) return } this.innerAudioContext.stop() this.innerAudioContext.src = url this.innerAudioContext.play() messageItem.isPlay = true this.innerAudioContext.onEnded(() => { messageItem.isPlay = false this.setData({ messageList, }) }) this.setData({ messageList, }) } }, handlePreview(e) { const { url } = e.currentTarget.dataset wx.previewImage({ urls: [url], }) }, handleVideo() { if (this.videoContext) { this.videoContext.play() this.videoContext.requestFullScreen({}) } }, })