After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 985 B |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.3 MiB |
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 144 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 364 B |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 7.9 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 240 KiB |
@ -1,6 +1,390 @@
@@ -1,6 +1,390 @@
|
||||
const _app = getApp<IAppOption>(); |
||||
import dayjs from 'dayjs' |
||||
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
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: {}, |
||||
onLoad() {}, |
||||
}); |
||||
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({}) |
||||
} |
||||
}, |
||||
}) |
||||
|