import dayjs from 'dayjs' const licia = require('miniprogram-licia') const app = getApp() interface IMessageItem { msgId: string msgContentType: '1' | '2' // 1:欢迎语 2: 文本 msgContent: any msgVisitTime: string msgFromType: '1' | '2' // 1: 患者 2: 医生 msgCreateTime: string // 消息创建时间 msgCreateTimeName?: string // 消息创建时间 showTime?: boolean questionId?: string // 问题ID Reference?: string // 参考资料 LikeTimes?: number // 点赞次数 IsLike?: boolean // 是否点赞 HasAnswer?: boolean // 是否有答案 } Page({ data: { popupShow: false, popupType: 'selectDoctor', popupParams: {}, expend: false, scrollTop: 0, scrollIntoView: '', doctorDetail: {} as any, doctorList: {}, questionActive: 0, questionList: [] as any, questionActiveList: [] as any[], headerQuestionList: [] as any, isLoad: false, isFinish: false, messageList: [ // { msgFromType: '2', msgContentType: '1', msgContent: '你的注射日还未填写,随访计划还未生成哦!' }, // { msgFromType: '2', msgContentType: '2', msgContent: '' }, // { msgFromType: '2', msgContentType: '3', msgContent: '' }, // { msgFromType: '2', msgContentType: '4', msgContent: '' }, // { msgFromType: '2', msgContentType: '5', msgContent: '' }, ] as IMessageItem[], nextMsgId: '', unReadCount: 0, firstNotReadMsgId: 0, isVisitAdl: 2, adlMsgId: 0, LikeTimes: 0, userInfo: {}, }, onLoad() { app.waitLogin({ type: 1 }).then(() => { app.mpBehavior({ PageName: 'PG_FAQ' }) app.getUserInfo().then((userInfo) => { this.setData({ userInfo, }) }) this.getBindDoctorList() this.getQuestionCommonList(this.data.questionActive) this.getMessageList() }) }, onShow() { if (app.globalData.loginState) { this.getBindDoctorList() } }, getBindDoctorList() { wx.ajax({ method: 'GET', url: '?r=wtx/account/get-bind-doctor-list', data: {}, }).then((res) => { this.setData({ doctorList: res, }) }) }, getMessageList() { if (this.data.isLoad || this.data.isFinish) return this.setData({ isLoad: true, }) const nextMsgId = this.data.nextMsgId wx.ajax({ method: 'GET', url: '?r=wtx/message-interact/get-message-list', data: { nextMsgId, }, }).then((res) => { res.messageList.map((item) => { if (item.msgContentType === '1') { item.msgOtherInfo = JSON.parse(item.msgOtherInfo) } return item }) if (!this.data.nextMsgId && !res.messageList.length) { res.messageList = [ { msgId: '0', msgContentType: '0', msgContent: '', msgVisitTime: '', msgFromType: '2', }, ] } 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() } }, handleView(index = -1) { this.setData({ scrollIntoView: index > -1 ? `view${index}` : `place`, }) }, getQuestionCommonList(questionActive: number) { wx.ajax({ method: 'GET', url: '?r=wtx/message-interact/get-question-list', data: {}, }).then((res) => { this.setData({ questionList: res, questionActiveList: res[questionActive].questionList, }) }) }, handleQuestion(e: any) { const { id, name } = e.currentTarget.dataset this.handleSendQuestion(name) wx.ajax({ method: 'POST', url: '?r=wtx/message-interact/send-question-message', data: { questionId: id, }, }).then((res) => { this.handleAskQuestion(res) }) }, handleSendQuestion(qName) { const { messageList } = this.data this.setData({ messageList: [ ...messageList, { msgId: new Date().getTime().toString(), msgContentType: '2', msgContent: qName, msgVisitTime: '', msgFromType: '1', msgCreateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), }, ], }) this.filterCreateTime() this.handleView() }, handleAskQuestion(aName) { const { messageList } = this.data this.setData({ messageList: [ ...messageList, { msgId: new Date().getTime().toString(), msgContentType: '2', msgContent: aName, msgVisitTime: '', msgFromType: '2', msgCreateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), }, ], }) this.filterCreateTime() this.handleView() }, handleQuestionClick(Id) { wx.ajax({ method: 'POST', url: '?r=wtx/common-question/click', data: { Id }, }) }, handleLike(e) { const { index } = e.currentTarget.dataset const { messageList, LikeTimes } = this.data const item = messageList[index] const LikeTimesKey = `messageList[${index}].LikeTimes` const IsLikeKey = `messageList[${index}].IsLike` this.setData({ [LikeTimesKey]: Number(item.LikeTimes) + 1, [IsLikeKey]: true, LikeTimes: LikeTimes + 1, }) this.likePost(item.questionId) }, likePost: licia.debounce(function (this: any, Id) { const { LikeTimes } = this.data this.setData({ LikeTimes: 0, }) wx.ajax({ method: 'POST', url: '?r=wtx/common-question/like', data: { Id, LikeTimes, }, }) }, 1000), 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, }) }, handleSendDate() { this.setData({ popupShow: true, popupType: 'selectDoctor', popupParams: {}, }) }, handleQuestionTab(e) { const { index } = e.currentTarget.dataset this.setData({ questionActive: index, questionActiveList: this.data.questionList[index].questionList, }) }, handleFooter() { this.setData({ expend: !this.data.expend, }) if (this.data.expend) { setTimeout(() => { this.handleView() }, 300) } }, handleDoctorList() { wx.navigateTo({ url: '/patient/pages/doctorList/index', }) }, handlePopupCancel() { this.setData({ popupShow: false, }) }, handleBack() { wx.navigateBack() }, })