// pages/consulting/consulting.js // 网络请求工具类 var networkUtil = require('../../utils/network_util.js') var api = require('../../utils/apiFile.js') // 获取应用实例 var app = getApp(); //聊天工具类 //let msgStorage = require("./chat/msgstorage"); let disp = require("../../utils/broadcast"); let WebIM = require("../../utils/WebIM")["default"]; //let msgType = require("./chat/msgtype"); let page = 0; let Index = 0; let isFail = false; let RECORD_CONST = require("./audio/record_status"); let RecordStatus = RECORD_CONST.RecordStatus; let RecordDesc = RECORD_CONST.RecordDesc; let RunAnimation = false const InitHeight = [50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50] Page({ /** * 页面的初始数据 */ data: { illnessList:{}, illness:[], symptomStr:'', drugsStr:'', isShowRecordingBtn:false, chatMsg:[], yourhxname:'', myhxname:'', RecordDesc, // 模板中有引用 radomheight: InitHeight, recorderManager: wx.getRecorderManager(), recordClicked: false, recordStatus: RecordStatus.HIDE, RecordStatus, }, handleInputChange: function(e){ // 取出定义的变量名 let currentValue = e.detail.value; // 取出定义的变量名 let targetData = e.currentTarget.dataset.modal; // 将 input 值赋值给 定义的变量名,this.name 可以直接取到在 data 中定义的 name 值,其效果跟 this[变量名] 是对等的,这是 js 基础 this.data[targetData] = currentValue; }, //确认疾病类型 confirmIlltype: function(e) { this.setData({ illness:e.detail.data }) }, //开始咨询 startConsulting(e){ var diseaseId = "" var illness = this.data.illness; var me = this; illness.forEach(function(item){ diseaseId += item.id +',' }) diseaseId = diseaseId.substring(0,diseaseId.length -1) if(!this.data.symptomStr){ wx.showModal({ title: '提示', content: '请输入症状描述', showCancel: false, success: function(res) {} }) return } if(!this.data.drugsStr){ wx.showModal({ title: '提示', content: '请输入用药情况', showCancel: false, success: function(res) {} }) return } if(!diseaseId){ wx.showModal({ title: '提示', content: '请选择疾病类型', showCancel: false, success: function(res) {} }) return } var data = { memberId:this.data.memberId, serviceId:this.data.serviceId, diseaseId:diseaseId,//疾病id diseaseDesc:this.data.symptomStr, //描述 diseaseDrug:this.data.drugsStr,//用药 doctorId:this.data.doctorId//医生id } networkUtil._post(api.addBabyDisease,data,function(res){ if(res.data){ console.log(res) me.setData({ type:1, disabled:true }) } },function(res){ },'application/json') }, //历史咨询记录 hisConsultation(e){ wx.navigateTo({ url: '../consultationRecord/consultationRecord', }) }, //录音开始 showRecordingBtn(){ this.setData({ isShowRecordingBtn:!this.data.isShowRecordingBtn }) }, handleRecordingMove(e){ var touches = e.touches[0]; var changedTouches = this.data.changedTouches; if(!changedTouches){ return; } if(this.data.recordStatus == RecordStatus.SWIPE){ if(changedTouches.pageY - touches.pageY < 20){ this.setData({ recordStatus: RecordStatus.HOLD }); } } if(this.data.recordStatus == RecordStatus.HOLD){ if(changedTouches.pageY - touches.pageY > 20){ this.setData({ recordStatus: RecordStatus.SWIPE }); } } }, handleRecording(e){ let me = this; wx.vibrateShort({ success:function() { console.log('震动调取成功') }, }) me.setData({ recordClicked: true }) setTimeout(() => { if (me.data.recordClicked == true) { executeRecord() } }, 350) function executeRecord(){ wx.getSetting({ success: (res) => { let recordAuth = res.authSetting['scope.record'] if (recordAuth == false) { //已申请过授权,但是用户拒绝 wx.openSetting({ success: function (res) { let recordAuth = res.authSetting['scope.record'] if (recordAuth == true) { wx.showToast({ title: "授权成功", icon: "success" }) } else { wx.showToast({ title: "请授权录音", icon: "none" }) } me.setData({ isLongPress: false }) } }) } else if (recordAuth == true) { // 用户已经同意授权 startRecord() } else { // 第一次进来,未发起授权 wx.authorize({ scope: 'scope.record', success: () => {//授权成功 wx.showToast({ title: "授权成功", icon: "success" }) } }) } }, fail: function () { wx.showToast({ title: "鉴权失败,请重试", icon: "none" }) } }) } function startRecord(){ me.data.changedTouches = e.touches[0]; me.setData({ recordStatus: RecordStatus.HOLD }); RunAnimation = true; me.myradom(); let recorderManager = me.data.recorderManager || wx.getRecorderManager(); recorderManager.onStart(() => { // console.log("开始录音..."); }); recorderManager.start({ format: "mp3" }); // 超时 setTimeout(function(){ me.handleRecordingCancel(); RunAnimation = false }, 100000); } }, handleRecordingCancel(){ RunAnimation = false let recorderManager = this.data.recorderManager; // 向上滑动状态停止:取消录音发放 if(this.data.recordStatus == RecordStatus.SWIPE){ this.setData({ recordStatus: RecordStatus.RELEASE }); } else{ this.setData({ recordStatus: RecordStatus.HIDE, recordClicked: false }); } recorderManager.onStop((res) => { console.log("结束录音...", res); if(this.data.recordStatus == RecordStatus.RELEASE){ console.log("user canceled"); this.setData({ recordStatus: RecordStatus.HIDE }); return; } if (res.duration < 1000) { wx.showToast({ title: "录音时间太短", icon: "none" }) } else { // 上传 this.uploadRecord(res.tempFilePath, res.duration); } }); // 停止录音 recorderManager.stop(); }, uploadRecord(tempFilePath, dur){ var str = WebIM.config.appkey.split("#"); var me = this; var token = WebIM.conn.context.accessToken; var myName = wx.getStorageSync('hxName') wx.uploadFile({ url: "https://a1.easemob.com/" + str[0] + "/" + str[1] + "/chatfiles", filePath: tempFilePath, name: "file", header: { "Content-Type": "multipart/form-data", Authorization: "Bearer " + token }, success(res){ // 发送 xmpp 消息 var id = WebIM.conn.getUniqueId(); var msg = new WebIM.message('audio', id); var dataObj = JSON.parse(res.data); // 接收消息对象 msg.set({ apiUrl: WebIM.config.apiURL, accessToken: token, body: { type: 'audio', url: dataObj.uri + "/" + dataObj.entities[0].uuid, filetype: "", filename: tempFilePath, accessToken: token, length: Math.ceil(dur / 1000) }, from: myName, ext:{ serviceId:me.data.serviceId }, to: me.data.yourhxname, roomType: false, chatType: 'singleChat', success: function (argument) { disp.fire('em.chat.sendSuccess', id); } }); var msglength = Math.ceil(dur / 1000); //console.log('发送的语音消息', msg.body) WebIM.conn.send(msg.body); if(msg){ var time = WebIM.time(); var msgData = { info: { from: msg.from, to: msg.to }, username: '', yourname: msg.from, msg: { type: 'audio', data: msg.body.body.url, url: msg.body.body.url, token:token, length:msglength, }, style: 'self', time: time, mid: 'audio' + msg.id } me.data.chatMsg.push(msgData) var sessionKey = me.data.yourhxname + myName + me.data.serviceId; var historyChatMsgs = wx.getStorageSync("rendered_" + sessionKey) || []; historyChatMsgs.push(msgData); console.log(historyChatMsgs) wx.vibrateLong({ success:function() { console.log('震动调取成功') }, }) wx.setStorage({ key: "rendered_" + me.data.yourhxname + myName + me.data.serviceId, data: historyChatMsgs, success: function () { console.log('success发送图片', me.data) me.setData({ chatMsg: me.data.chatMsg, }) me.onRender(); setTimeout(function () { me.setData({ toView: me.data.chatMsg[me.data.chatMsg.length - 1].mid }) }, 100) } }) } } }); }, myradom(){ const that = this; var _radomheight = that.data.radomheight; for (var i = 0; i < that.data.radomheight.length; i++) { //+1是为了避免为0 _radomheight[i] = (100 * Math.random().toFixed(2))+10; } that.setData({ radomheight: _radomheight }); if (RunAnimation) { setTimeout(function () {that.myradom(); }, 300); }else{ return } }, //发送图片 previewImage(event){ var url = event.target.dataset.url; wx.previewImage({ urls: [url] // 需要预览的图片 http 链接列表 }); }, sendImage(){ var me = this; wx.chooseImage({ count: 1, sizeType: ["original", "compressed"], sourceType: ["album"], success(res){ me.upLoadImage(res); }, }); }, openCamera(){ var me = this; wx.chooseImage({ count: 1, sizeType: ["original", "compressed"], sourceType: ["camera"], success(res){ me.upLoadImage(res); } }); }, upLoadImage(res){ var me = this; var tempFilePaths = res.tempFilePaths; var token = WebIM.conn.context.accessToken wx.getImageInfo({ src: res.tempFilePaths[0], success(res){ var allowType = { jpg: true, gif: true, png: true, bmp: true }; var str = WebIM.config.appkey.split("#"); var width = res.width; var height = res.height; var index = res.path.lastIndexOf("."); var filetype = (~index && res.path.slice(index + 1)) || ""; if(filetype.toLowerCase() in allowType){ wx.uploadFile({ url: "https://a1.easemob.com/" + str[0] + "/" + str[1] + "/chatfiles", filePath: tempFilePaths[0], name: "file", header: { "Content-Type": "multipart/form-data", Authorization: "Bearer " + token }, success(res){ if(res.statusCode === 400){ // 图片上传阿里云检验不合法 var errData = JSON.parse(res.data); if (errData.error === 'content improper') { wx.showToast({ title: '图片不合法' }); return false } } var data = res.data; var dataObj = JSON.parse(data); var id = WebIM.conn.getUniqueId(); // 生成本地消息 id var msg = new WebIM.message('img', id); var myName = wx.getStorageSync('hxName') var file = { type: 'img', size: { width: width, height: height }, url: dataObj.uri + "/" + dataObj.entities[0].uuid, filetype: filetype, filename: tempFilePaths[0] }; msg.set({ apiUrl: WebIM.config.apiURL, body: file, from: myName, to: me.data.yourhxname, ext:{ serviceId:me.data.serviceId }, roomType: false, chatType: 'singleChat', success: function (argument) { disp.fire('em.chat.sendSuccess', id); } }); WebIM.conn.send(msg.body); if(msg){ var time = WebIM.time(); var msgData = { info: { to: msg.body.to }, username: myName, yourname: msg.body.to, msg: { type: msg.type, data: msg.body.body.url, url:msg.body.body.url, size: { width: msg.body.body.size.width, height: msg.body.body.size.height, } }, style: 'self', time: time, mid: msg.id } } me.data.chatMsg.push(msgData) var sessionKey = me.data.yourhxname + myName + me.data.serviceId; var historyChatMsgs = wx.getStorageSync("rendered_" + sessionKey) || []; historyChatMsgs.push(msgData); wx.vibrateLong({ success:function() { console.log('震动调取成功') }, }) wx.setStorage({ key: "rendered_" + me.data.yourhxname + myName + me.data.serviceId, data: historyChatMsgs, success: function () { console.log('success发送图片', me.data) me.setData({ chatMsg: me.data.chatMsg, }) me.onRender(); setTimeout(function () { me.setData({ toView: me.data.chatMsg[me.data.chatMsg.length - 1].mid }) }, 100) } }) } }); } } }); }, //发送文字消息 bindMessage(e){ console.log(e.detail.value) this.setData({ userMessage: e.detail.value }); if(this.data.userMessage){ this.setData({ bubbles:true }) }else{ this.setData({ bubbles:false }) } }, sendMessage: function () { String.prototype.trim=function() { return this.replace(/(^\s*)|(\s*$)/g, ''); } if(!this.data.userMessage.trim()){ return; } var that = this wx.getNetworkType({ success: function (res) { // console.log("getNetworkType:",res) if (res.networkType == 'none' && wx.getStorageSync('isHxOpend') == true) { wx.showModal({ title: '提示', content: '请检查网络', showCancel: false, success: function (res) { } }) //断网时不清空消息 that.setData({ inputMessage: that.data.sendInfo }) } else { // //console.log(that.data.userMessage) // //console.log(that.data.sendInfo) var myName = wx.getStorageSync('hxName') var id = WebIM.conn.getUniqueId(); var msg = new WebIM.message('txt', id); msg.set({ msg: that.data.userMessage, to: that.data.yourhxname, roomType: false, ext:{ serviceId:that.data.serviceId }, success: function (id, serverMsgId) { console.log(' sendMessage success') }, fail: function (error) { console.log("sendMessage error:" + error) } }); console.log('发送消息', msg) msg.body.chatType = 'singleChat'; WebIM.conn.send(msg.body); that.triggerEvent( "newTextMsg", { msg: msg, type: 'txt', }, { bubbles: true, composed: true } ); if (msg) { var value = WebIM.parseEmoji(msg.value.replace(/\n/mg, '')) var time = WebIM.time() var msgData = { info: { to: msg.body.to }, username: myName, yourname: msg.body.to, msg: { type: msg.type, data: value }, style: 'self', time: time, mid: msg.id } that.data.chatMsg.push(msgData) var sessionKey = that.data.yourhxname + myName + that.data.serviceId; var historyChatMsgs = wx.getStorageSync("rendered_" + sessionKey) || []; historyChatMsgs.push(msgData); wx.vibrateLong({ success:function() { console.log('震动调取成功') }, }) wx.setStorage({ key: "rendered_" + that.data.yourhxname + myName + that.data.serviceId, data: historyChatMsgs, success: function () { //console.log('success', that.data) that.setData({ chatMsg: that.data.chatMsg, emojiList: [], inputMessage: '', bubbles:false }) that.onRender(); setTimeout(function () { that.setData({ toView: that.data.chatMsg[that.data.chatMsg.length - 1].mid }) }, 100) } }) that.setData({ userMessage: '' }) } } }, }) }, //接收消息 receiveMsg: function (msg, type) { console.log(msg) var that = this var myName = wx.getStorageSync('hxName') if (msg.from == that.data.yourhxname || msg.to == that.data.myhxname) { //console.log(msg) if (type == 'txt') { var value = WebIM.parseEmoji(msg.data.replace(/\n/mg, '')) } else if (type == 'emoji') { var value = msg.data } //console.log(msg) //console.log(value) var time = WebIM.time() var msgData = { info: { from: msg.from, to: msg.to }, username: '', yourname: msg.from, msg: { type: type, data: value, url: msg.url }, style: '', time: time, mid: msg.type + msg.id } if (type == 'audio') { msgData.msg.length = msg.length, msgData.msg.token = msg.accessToken } if (msg.from == that.data.yourhxname) { msgData.style = '' msgData.username = msg.from } else { msgData.style = 'self' msgData.username = msg.to } if(msg.ext.isEnding){ msgData.isEnding = msg.ext.isEnding; that.setData({ type:2 }) } //console.log(msgData, that.data.chatMsg, that.data) that.data.chatMsg.push(msgData) var sessionKey = that.data.yourhxname + myName + that.data.serviceId; var historyChatMsgs = wx.getStorageSync("rendered_" + sessionKey) || []; //console.log('当前历史',renderableMsg) //console.log('历史消息', historyChatMsgs) historyChatMsgs.push(msgData); wx.vibrateLong({ success:function() { console.log('震动调取成功') }, }) wx.setStorage({ key: "rendered_" + that.data.yourhxname + myName + that.data.serviceId, data: historyChatMsgs, success: function () { console.log('success接收保存', that.data) that.setData({ chatMsg: that.data.chatMsg, }) that.onRender(); setTimeout(function () { that.setData({ toView: that.data.chatMsg[that.data.chatMsg.length - 1].mid }) }, 100) } }) } }, onRender(){ wx.pageScrollTo({ scrollTop: 5000, duration: 300, success: function(){console.log('滚动成功')}, fail: function(){console.log('滚动失败')} }) }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { var options = JSON.parse(options.username) let me = this; this.setData({ illnessList:{ title:'疾病类型', data:[{id:'1',value:'咳嗽'},{id:'2',value:'发热'},{id:'3',value:'贫血'},{id:'4',value:'腹泻'},{id:'5',value:'肺炎'}, {id:'6',value:'手足口病'},{id:'7',value:'鹅口疮'},{id:'8',value:'湿疹'},{id:'9',value:'肠炎'},{id:'10',value:'便秘'}], placeholder:'请选择疾病类型' }, myhxname:wx.getStorageSync('hxName'), yourhxname:options.your, serviceId:options.serviceId, memberId:options.memberId, doctorId:options.doctorId }); //获取用药记录 networkUtil._get(api.getBabyDisease,{serviceId:options.serviceId},function(res){ var illnessId = res.data.data.diseaseId; var illnessData = me.data.illnessList.data; var illness = []; var disabled = false; var type = 2; if(illnessId){ illnessId = illnessId.split(',') } if(illnessId&&illnessId.length > 1){ disabled = true; type = 1; illnessId.forEach(function(item){ illness = illness.concat(illnessData.filter(it => it.id == item).map(it => it)) }) } if(illnessId&&illnessId.length == 1){ disabled = true; type = 1; illness = illnessData.filter(it => it.id == illnessId).map(it => it); } me.setData({ symptomStr:res.data.data.diseaseDesc, drugsStr:res.data.data.diseaseDrug, illness:illness, disabled:disabled, type:type }) },function(res){ }) //聊天功能 let yourhxname = this.data.yourhxname; let myhxname = wx.getStorageSync("hxName"); let serviceId = options.serviceId; let sessionKey = yourhxname + myhxname + serviceId; let chatMsg = app.globalData.unrederMsg this.renderMsg(null, null, chatMsg, sessionKey); }, renderMsg(renderableMsg, type, curChatMsg, sessionKey, isnew){ let me = this var historyChatMsgs = wx.getStorageSync("rendered_" + sessionKey) || []; //console.log('当前历史',renderableMsg) console.log('历史消息', historyChatMsgs) if(curChatMsg !== []){ curChatMsg.forEach(function(item){ if(me.data.serviceId == item.serviceId){ historyChatMsgs = historyChatMsgs.concat(item); } }) //historyChatMsgs = historyChatMsgs.concat(curChatMsg); app.globalData.unrederMsg = [] } if(!historyChatMsgs.length) return; this.setData({ chatMsg: historyChatMsgs.slice(-10), // 跳到最后一条 toView: historyChatMsgs[historyChatMsgs.length - 1].mid, }); wx.setStorageSync("rendered_" + sessionKey, historyChatMsgs); Index = historyChatMsgs.slice(-10).length; wx.pageScrollTo({ scrollTop: 5000, duration: 300, }) }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { } })