From 5d85ddfa83eed1eb08816a5acf450032f59d104a Mon Sep 17 00:00:00 2001 From: zhihao Date: Thu, 11 Dec 2025 15:37:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.cloudbase/container/debug.json | 1 + CommunicationRecords/.gitignore | 14 + CommunicationRecords/app.js | 6 +- CommunicationRecords/app.wxss | 2 +- CommunicationRecords/assets/default.png | Bin 0 -> 9274 bytes CommunicationRecords/images/Blvlogo.png | Bin 0 -> 9274 bytes .../images/Icon_阅读模式_7.487_7.504.png | Bin 0 -> 3360 bytes CommunicationRecords/images/Keyboard.png | Bin 0 -> 9710 bytes CommunicationRecords/images/Voice.png | Bin 0 -> 9638 bytes CommunicationRecords/images/lock.png | Bin 0 -> 490 bytes CommunicationRecords/images/lock2.png | Bin 0 -> 457 bytes CommunicationRecords/images/lock_3.png | Bin 0 -> 498 bytes CommunicationRecords/images/lock_r.png | Bin 0 -> 540 bytes CommunicationRecords/images/logo.png | Bin 0 -> 4427 bytes CommunicationRecords/images/touxiang.png | Bin 0 -> 402 bytes CommunicationRecords/images/unlock_b.png | Bin 0 -> 504 bytes CommunicationRecords/images/unlock_blue.png | Bin 0 -> 497 bytes CommunicationRecords/pages/chat/chat.js | 1126 +++++++++++++++++ CommunicationRecords/pages/chat/chat.json | 3 + CommunicationRecords/pages/chat/chat.wxml | 167 +++ CommunicationRecords/pages/chat/chat.wxss | 408 ++++++ CommunicationRecords/pages/chat/mock.js | 30 + CommunicationRecords/pages/logs/logs.js | 66 +- CommunicationRecords/pages/logs/logs.wxss | 2 +- CommunicationRecords/utils/authorize.js | 52 + CommunicationRecords/utils/config.js | 24 + CommunicationRecords/项目文档.md | 134 ++ CommunicationRecords/项目评审会议记录.md | 76 ++ 28 files changed, 2102 insertions(+), 9 deletions(-) create mode 100644 CommunicationRecords/.cloudbase/container/debug.json create mode 100644 CommunicationRecords/.gitignore create mode 100644 CommunicationRecords/assets/default.png create mode 100644 CommunicationRecords/images/Blvlogo.png create mode 100644 CommunicationRecords/images/Icon_阅读模式_7.487_7.504.png create mode 100644 CommunicationRecords/images/Keyboard.png create mode 100644 CommunicationRecords/images/Voice.png create mode 100644 CommunicationRecords/images/lock.png create mode 100644 CommunicationRecords/images/lock2.png create mode 100644 CommunicationRecords/images/lock_3.png create mode 100644 CommunicationRecords/images/lock_r.png create mode 100644 CommunicationRecords/images/logo.png create mode 100644 CommunicationRecords/images/touxiang.png create mode 100644 CommunicationRecords/images/unlock_b.png create mode 100644 CommunicationRecords/images/unlock_blue.png create mode 100644 CommunicationRecords/pages/chat/chat.js create mode 100644 CommunicationRecords/pages/chat/chat.json create mode 100644 CommunicationRecords/pages/chat/chat.wxml create mode 100644 CommunicationRecords/pages/chat/chat.wxss create mode 100644 CommunicationRecords/pages/chat/mock.js create mode 100644 CommunicationRecords/utils/authorize.js create mode 100644 CommunicationRecords/utils/config.js create mode 100644 CommunicationRecords/项目文档.md create mode 100644 CommunicationRecords/项目评审会议记录.md diff --git a/CommunicationRecords/.cloudbase/container/debug.json b/CommunicationRecords/.cloudbase/container/debug.json new file mode 100644 index 0000000..0d44458 --- /dev/null +++ b/CommunicationRecords/.cloudbase/container/debug.json @@ -0,0 +1 @@ +{"containers":[],"config":{}} \ No newline at end of file diff --git a/CommunicationRecords/.gitignore b/CommunicationRecords/.gitignore new file mode 100644 index 0000000..14ea590 --- /dev/null +++ b/CommunicationRecords/.gitignore @@ -0,0 +1,14 @@ +# Windows +[Dd]esktop.ini +Thumbs.db +$RECYCLE.BIN/ + +# macOS +.DS_Store +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes + +# Node.js +node_modules/ diff --git a/CommunicationRecords/app.js b/CommunicationRecords/app.js index 2db4645..a6df4b4 100644 --- a/CommunicationRecords/app.js +++ b/CommunicationRecords/app.js @@ -15,7 +15,11 @@ App({ }, globalData: { userInfo: null, - baseUrl: 'https://你的域名' // 后端 API 根地址 + baseUrl: 'https://你的域名', // 后端 API 根地址 + userKey:"", + avatarUrl:"", + weChatName:"", + } }) diff --git a/CommunicationRecords/app.wxss b/CommunicationRecords/app.wxss index 06c6fc9..d494213 100644 --- a/CommunicationRecords/app.wxss +++ b/CommunicationRecords/app.wxss @@ -1,4 +1,4 @@ -/**app.wxss**/ + .container { height: 100%; display: flex; diff --git a/CommunicationRecords/assets/default.png b/CommunicationRecords/assets/default.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2af15f5ab63282c4c2cfdae18162e8bb54278a GIT binary patch literal 9274 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%0Dh5(b1Zxo*S%>tu-=!ZDK2Zeq1N=$>*$2!nw;t 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 literal 0 HcmV?d00001 diff --git a/CommunicationRecords/images/Voice.png b/CommunicationRecords/images/Voice.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4f99fd59540cb1d872e8f8c58c6ae73589e6b8 GIT binary patch literal 9638 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 literal 0 HcmV?d00001 diff --git a/CommunicationRecords/images/lock.png b/CommunicationRecords/images/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..0e029b3aab561f9172218c8809b8a5ee37a3005f GIT binary patch literal 490 zcmVPx$q)9|UR9HvtmoZDjKorN{%Wa(n#X;Nz2XXCIU8F;G6T~mzD3-j?Nw*}IU^}Y2 zE^bytbg+|?2#%c`M8S{HQtxS`N*Zbso6{}{WXZjI|KI)Z-CYhr^W(biCL%5az+CV$ z^BW>Q06?3Wo0er=hb2*`zU#Vsh`5`Ovra@iUoqMMq?DX?Fo@VRO>;Gf*8(7=Jo&JA zBQ3zEFyfYJnunPI9LHHP4C68)eyo%_P)fB6g@V!Pbc+3{S&YP$GXq5DJ#25(5zq6^ zn7I=A?q>#&Qr-eUF_g4IMCZe%!*QIlVHg*owtF1_1H~tVn5kB)Ps0Fg+nyCdJZfEr z(ds9n*g-|(wL6dl{JR6c*?fk@X0CzE0Jd$Hgb=|2Qp%caV0j@nd%fO%tyXKr#+chMq{$u?Op-E!iXY2c1t=3zHdgp@6Rixj`|nMiHsmG0B}b{YiaU~ g|A!Px$gGod|R9Hvtm$6F3KoExi*=GVSw6awG@K(fNY zFvc{kwO5nU!ORT+*CX$qLI8{vpD||6TKoC~z&wDLpr2v3`b8vnQCa)o3e*69u7FST znPgkJ1}XzE^J?0ql6%O}0boU>o9C36`5r*%;KP_*5m_q&@Y%(@6)GyqM1dNhR-jg( zR^ZPx$tVu*cR9Hvtma%ITK@`S+(_Nv3m2D(oBiMLiBbbz0DE+@ z`~4W>e6DsS0nF?X@UW!vp(u)t*=+W$*Xx}risCY`37lQ-3n5$|kH>H82$BGU!Qf>G z;r5cqM@d(!M9u8`;l*5(pGtbr3c$>^fz^eGyWfg2zOE7-jYc-Zwe3?$>nVVozg{+6IY+8KK?l$|&^gdK@ZTNy37pQ3xMl;NCG}HL z{2r)$^)}n1w(GH^`7{5|Iugah;qb1zzc_}?$`X4(U($Xpz`ST?YaxUu?tT$C)e`0a o_yo*P|Fx`j@*X5DPn$jd3#zBYAxnE?`~Uy|07*qoM6N<$g2mtIng9R* literal 0 HcmV?d00001 diff --git a/CommunicationRecords/images/lock_r.png b/CommunicationRecords/images/lock_r.png new file mode 100644 index 0000000000000000000000000000000000000000..54e8876f328e9796919570b852e096a37a74b6d8 GIT binary patch literal 540 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 R5@i4Y002ovPDHLkV1jpGZ}b2F literal 0 HcmV?d00001 diff --git a/CommunicationRecords/images/touxiang.png b/CommunicationRecords/images/touxiang.png new file mode 100644 index 0000000000000000000000000000000000000000..2f6ca822f9a4e33b4edc388a28f1271972b2180e GIT binary patch literal 402 zcmV;D0d4+?P)Px$Oi4sRR9HvtmS3wxP!z@YM8h;j@+J|Ul<)sx6!PLvqfks}Ms9l^Zr#vv&b_)# z*{|%@&pLar_p3f&qclKNm1h8!za6Q+G2vFDc8-TS)n?VF1Wj_h* w*8nJh`Oi{lJ?UN`I=~`K({lhE4jc}A0bd^M0kK0ZJOBUy07*qoM6N<$f@+$pGynhq literal 0 HcmV?d00001 diff --git a/CommunicationRecords/images/unlock_b.png b/CommunicationRecords/images/unlock_b.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9dfa870a2b7703b190e8189a4198d890ba76d0 GIT binary patch literal 504 zcmVPx$vPnciR9Hvtm$6F2P!xv$le*~C6j5;yLDPbRxOS^9;!xcL@deaW5MQ7^fY_n7 zR-JWmvm&B{ot#8)l5&d;PozSNXhW?+U0 zApjvZQ6<7XnDYc=i?QHUb4qeEzdxDZB1MVYX)=%~>DuO3jB5aDO0dLcvWBkB*Wz6P zP*a6tfR`iy0Pu>T2lpKV1d?Kw6C&+ll*J>VF?pA-@DAr3~wshDMbmQC!G z*0r3SE~#m8-G$`!oP?aQrcK)e$W1Y6liD>UNsdtuz;nQJz;mE04!i&umR9ay0W;o8 zF>T29C=R4Wf*Bhf=t+k#a8lB>MO%P@!^go&`TY{0N$Cu27POlK^?3y#kP#DX;-L03 u2}Zv|kXJBnjhMF3iO&CjkaR-X&6p39f4Rj21yf1@0000Px$t4TybR9Hvtmp@CxP!z?_O^bt?;vh+I5I4a=T)R~l>7Z_cxCo}`D1HI`0Ae>$ zn~u7;SrO5}PEH~?c5)DluZz@Vljcgm)*4IxkZ6|#vV`;Q{k`*U?t70A^P?23RRZR~ zJPE*gTOfJ_bB)oeG>nm(?vxZ~enoHY5~Ll^n8Za<%51kau>q*M$-yT>6=4i7I{H`u zRNXuUuo4^qV8&*nEFVP%Pzud?V(H42{KS^{F!ez-J4F)M&JvNcG&9{gn<*b1;Mcl; z+v|2j)va@Y7uw&Mc`q`6y8eC#qHHG_NeiMhbkS=$v_dn_EM0a0fQRS+uHs7#q{iz9 zgU>wy*4`#Koqme-H*{COFl5h3x%II-kO2I<17Vs^FKy%+hzy|VW{v@;OXZ>l`#GK} z1m1r&O(Qg!n-{^XsMRbj}pegGkMvG5-G6{X`q0+2Y6IFLBdZwIUwfXBl3xIiO> zFl5cA6RP literal 0 HcmV?d00001 diff --git a/CommunicationRecords/pages/chat/chat.js b/CommunicationRecords/pages/chat/chat.js new file mode 100644 index 0000000..e4e70d0 --- /dev/null +++ b/CommunicationRecords/pages/chat/chat.js @@ -0,0 +1,1126 @@ +// 在文件顶部引入配置 +const config = require('../../utils/config.js'); +const mock = require('./mock.js') +const app = getApp() +// 1. 引入插件 +const plugin = requirePlugin('WechatSI'); +// 2. 获取全局唯一的语音识别管理器 +const manager = plugin.getRecordRecognitionManager(); +function formatNumber(n) { + n = n.toString() + return n[1] ? n : '0' + n +} +function formatTime(date) { + const y = date.getFullYear() + const m = formatNumber(date.getMonth() + 1) + const d = formatNumber(date.getDate()) + const h = formatNumber(date.getHours()) + const mi = formatNumber(date.getMinutes()) + return { + date: `${y}-${m}-${d}`, + time: `${y}-${m}-${d} ${h}:${mi}` + } +} + +Page({ + data: { + chatTitle: '宝来威智能AI', + msgList: [], + OriginalmsgList: [], + toView: '', + qinputTxt: '', + ginputTxt: '', + voiceMode: true, + recording: false, + recording1: false, + cancelSend: false, + cancelSend1: false, + TabCur:1, + UserKey:"", + resultText: '' , // 识别出的文本结果 + triggered: false, // 控制下拉状态 + pulling: false, // 是否正在下拉 + pullText: '下拉刷新', + PageNumber:1, + RecordingStatus:0,//0 丢弃 /1 全局/2私有 + TrhandleTouchEnd:0, + scrollHeight:500, + Keyboard:"", + Voice:"", + timer: null, // 用于存储定时器ID[5,6](@ref) + modalName:"", + inputValue:"", + RevisemsgId:-1, + isFocused: false, + avatarUrl:"/images/touxiang.png", + weChatName:"", + }, + + onLoad() { + + + this.setData({avatarUrl:app.globalData.avatarUrl,weChatName:app.globalData.weChatName}) + this.loadHistory() + this.initRecordManager() + this.GetmyScrollhight() + // this.initSound() + this.startTimer(); + }, + // 初始化提示音 + // initSound() { + // // this.dingCtx = wx.createInnerAudioContext(); + // // this.dingCtx.src = '/assets/sounds/ding.wav'; // 指向生成的音频文件 + // }, +// 页面卸载时清理资源 +onUnload: function () { + this.clearTimer(); + if (this.data.recording) { + manager.stop(); + this.setData({ + recording: false, + recording1: false, + cancelSend: false, + cancelSend1: false, + RecordingStatus: 0 + }); + } +}, +onHide() { + this.clearTimer(); + // 停止录音 + if (this.data.recording || this.data.recording1) { + manager.stop(); + this.setData({ + recording: false, + recording1: false, + cancelSend: false, + cancelSend1: false, + RecordingStatus: 0 + }); + } +}, +onShow: function() { + // 如果页面从后台返回,可以重新启动定时器[6](@ref) + this.startTimer(); +}, + + // 启动定时器 + startTimer: function() { + // 先清除可能存在的旧定时器,防止重复创建[6](@ref) + this.clearTimer(); + + const that = this; + // 设置一个每秒执行一次的定时器,并保存其ID[1](@ref) + const timerId = setInterval(function() { + // 在这里编写你需要每秒执行的逻辑 + that.executePerSecond(); + }, 1000); + + // 将定时器ID存入data中,便于管理[5,6](@ref) + this.setData({ + timer: timerId + }); + }, + executePerSecond: function() { + const list = this.data.OriginalmsgList + const TabCur=this.data.TabCur + if (!list ||list.length==0) { + return + } + const t =Date.now() + let cuncvl =0 + //debugger + + let dateObj //= new Date(dateString); + for (let index = 0; index < list.length; index++) { + const element = list[list.length-index-1]; + if (element.lock==='Unlock') { + let dateObj=new Date(element.time); + cuncvl =t - dateObj + if (cuncvl>300000) { + element.lock='lock' + list[list.length-index-1]=element + this.setData({OriginalmsgList:list}) + this.tabSelect1(TabCur) + + } + } + + + + } + + }, + // 清除定时器 + clearTimer: function() { + if (this.data.timer !== null) { + clearInterval(this.data.timer); // 清除定时器[4](@ref) + this.setData({ + timer: null + }); + console.log('定时器已清除'); + } +}, +async onAvatar(e){ + let tempFilePath =e.detail.avatarUrl + let UserKey = wx.getStorageSync('openid'); + this.uploadAvatarToServer(tempFilePath,UserKey) +}, +uploadAvatarToServer(tempFilePath,userKey) { + // 显示加载提示,提升用户体验 + wx.showLoading({ title: '上传中...' }); + + wx.uploadFile({ + url: 'https://wx-xcx-check.blv-oa.com:4433/api/Check/UploadFile', // 你的服务器上传接口 + filePath: tempFilePath, + name: 'file', // 与后端约定的文件参数名 + formData: { + 'rootPathType': 'Avatar', // 指定保存到 wwwroot/Avatar 目录 + 'userKey': userKey // 指定要更新头像的用户 + }, + success: (res) => { + wx.hideLoading(); + const data = JSON.parse(res.data); // 注意: uploadFile返回的data是字符串,需解析 + if (data.success) { + // 上传成功,拿到服务器返回的永久链接 + const permanentUrl = data.url; + this.setData({ + avatarUrl: permanentUrl // 更新为永久链接 + }); + // 接下来可以将 permanentUrl 保存到本地缓存或发送给后端更新用户信息 + wx.showToast({ title: '上传成功' }); + } else { + wx.showToast({ title: '上传失败: ' + data.message, icon: 'none' }); + } + }, + fail: (err) => { + wx.hideLoading(); + console.error('上传接口调用失败', err); + wx.showToast({ title: '网络错误', icon: 'none' }); + } + }); +}, + + /* ---------- 历史消息 ---------- */ + loadHistory() { + // 本地 Mock,上线改为请求接口 + + //const list = mock.map(item => ({ ...item, showDate: true })) + let UserKey=wx.getStorageSync('openid') + try { + this.GetConversations(UserKey,0) + } catch (error) { + // console.error('获取历史信息失败!:', error); + wx.showToast({ + title: "获取历史信息失败!", + icon: 'none' + }); + } + + //this.setData({ msgList: list }) + this.scrollBottom() + }, + async GetConversations(UserKey ,MessageType) { + + const apiRes = await new Promise((resolve, reject) => { + wx.request({ + url: `${config.baseUrl}/api/Check/GetConversationsByPage`, + method: 'POST', + data: {UserKey:UserKey ,Page:1,PageSize:20 ,MessageType:0}, + success: res =>{ + console.log(res) + const list = this.data.msgList + for (let index = 0; index < res.data.data.conversations.length; index++) { + const element = res.data.data.conversations[index]; + const createTime = element.createTime.toString().replace("T"," ") + let location =`${element.latitude},${element.longitude}` + const newMsg = { + id: element.id, + location:location, + guid :element.guid, + content:element.conversationContent, + date:createTime, + time:createTime, + isSelf:element.messageType, + showDate:createTime, + sendMethod:element.sendMethod, + voicetime:element.speakingTime, + status: 'success', + lock:'lock' + } + list.push(newMsg) + + } + + this.setData({ msgList: list,OriginalmsgList: list}) + }, + fail: reject + }); + }); + + }, + /* ---------- 文字输入 ---------- */ + qonInput(e) { + this.setData({ qinputTxt: e.detail.value }) + }, + gonInput(e) { + this.setData({ ginputTxt: e.detail.value }) + }, + qsendText() { + + let txt = this.data.qinputTxt.trim() + if (!txt) return + if (txt.length>100000) { + txt=txt.substring(0,100000).trim() + } + this.pushMsg(txt, 1,0) + this.upload(txt, 'text',1) + this.setData({ qinputTxt: '' }) + }, + gsendText() { + + let txt = this.data.qinputTxt.trim() + if (!txt) return + if (txt.length>1000) { + txt=txt.substring(0,1000).trim() + } + this.pushMsg(txt, 2,0) + this.upload(txt, 'text',2) + this.setData({ qinputTxt: '' }) + }, + /* ---------- 模式切换 ---------- */ + switchInputMode() { + this.setData({ voiceMode: !this.data.voiceMode }) + }, + + /* ---------- 语音录制 ---------- */ + initRecordManager: function () { + const that = this; + + // 识别开始事件 + manager.onStart = function (res) { + console.log("开始录音识别"); + // 可以在这里触发手机振动反馈 + wx.vibrateShort({ type: 'medium' }); + console.log("触发手机振动反馈"); + + + }; + + // 有新的识别内容返回(实时返回) + manager.onRecognize = function (res) { + console.log('实时识别结果:', res.result); + // 如果需要实时显示,可以在这里 setData + that.setData({ resultText: res.result }); + }; + + // 识别结束事件(返回最终结果) + manager.onStop = function (res) { + console.log('识别结束', res); + let finalText = res.result; + if (!finalText||finalText.length==0) { + wx.showToast({ title: '未识别到内容', icon: 'none' }); + finalText = ''; + return + } + //发送 + //debugger + let RecordingStatus =that.data.RecordingStatus + let TrhandleTouchEnd = that.data.TrhandleTouchEnd + let cost = Date.now() - that.recordStartTime + console.log(cost) + console.log(RecordingStatus) + if (RecordingStatus!==0 ||cost>=60000) { + // 播放提示音 + if (this.dingCtx) { + this.dingCtx.stop(); + this.dingCtx.play(); + } + if (finalText.length>100000) { + finalText=finalText.substring(0,100000).trim() + } + + if (cost>=60000) { + cost=60 + }else{ + cost = Math.ceil(cost / 1000) + } + + that.pushMsg(finalText, TrhandleTouchEnd,cost) + that.upload(finalText, 'voice',TrhandleTouchEnd) + } + + + + // 更新结果到页面 + that.setData({ + resultText: '', // 识别结束清空实时显示 + recording1: false, + recording: false, + RecordingStatus:0 + }); + }; + + // 识别错误事件 + manager.onError = function (res) { + // console.log('识别错误:'+ res); + // let TrhandleTouchEnd =that.data.TrhandleTouchEnd + // if (TrhandleTouchEnd==1) { + // manager.stop() + // } + // if (TrhandleTouchEnd==2) { + // manager.stop() + // } + + + + that.setData({ recording: false,recording1: false }); + // 可以根据错误码给出具体提示 + const errorMap = { + '-30003': '说话时间太短', + '-30004': '没有听清,请重试', + '-30011': '上个录音正在识别中' + }; + const msg = errorMap[res.retcode] || '识别失败'; + wx.showToast({ title: msg, icon: 'none' }); + + }; + }, + // 开始录音 + startRecord: function () { + const that = this; + // 先检查授权 + wx.getSetting({ + success(res) { + if (res.authSetting['scope.record']) { + // 已有授权,开始录音 + that.doStartRecord(); + } else { + // 请求授权 + wx.authorize({ + scope: 'scope.record', + success() { that.doStartRecord(); }, + fail() { + wx.showModal({ + title: '权限申请', + content: '需要您授权使用麦克风', + success(modalRes) { + if (modalRes.confirm) { + wx.openSetting(); // 引导用户去设置页开启 + } + } + }); + } + }); + } + } + }); + }, + // 执行开始录音操作 + doStartRecord: function () { + console.log("doStartRecord"); + + this.setData({ + // recording: true, + resultText: '' // 开始新的录音时清空上次结果 + }); + // 调用插件的start方法,传入参数 + setTimeout(() => { + console.log("调用插件的start方法,传入参数"); + + let TrhandleTouchEnd =this.data.TrhandleTouchEnd + console.log(TrhandleTouchEnd); + if (TrhandleTouchEnd==1) { + let recording =this.data.recording + console.log(recording); + if (recording==false) { + + // this.stopRecord1() + // this.stopRecord() + // console.log("打断录音"); + return + } + } + if (TrhandleTouchEnd==2) { + let recording1 =this.data.recording1 + console.log(recording1); + if (recording1==false) { + + // this.stopRecord1() + // this.stopRecord() + // console.log("打断录音"); + return + } + } + manager.start({ + lang: 'zh_CN', // 语言,支持 zh_CN(中文)、en_US(英文)等 + duration: 60000 // 录音时长,单位毫秒(这里是60秒) + }); + + }, 300); +}, + +// 停止录音 +stopRecord: function () { + if (this.data.recording) { + manager.stop(); // 停止录音并触发 onStop 回调 + } +}, +stopRecord1: function () { + if (this.data.recording1) { + manager.stop(); // 停止录音并触发 onStop 回调 + } +}, + + handleTouchStart(e) { + + console.log("handleTouchStart") + this.startY = e.touches[0].pageY + this.recordStartTime = Date.now() + this.setData({ recording: true, cancelSend: false ,RecordingStatus:0,TrhandleTouchEnd:1}) + //this.recorderManager.start({ duration: 60000, format: 'mp3' }) + const recording =this.data.recording + //wx.vibrateShort('heavy'); + if (recording) { + this.startRecord() + console.log("startRecord") + } + console.log("handleTouchStart_en") + }, + handleTouchStart1(e) { + //wx.vibrateLong(); +// wx.vibrateShort('heavy'); + console.log("handleTouchStart1") + this.startY1 = e.touches[0].pageY + this.recordStartTime = Date.now() + this.setData({ recording1: true, cancelSend1: false ,RecordingStatus:0,TrhandleTouchEnd:2}) + //this.recorderManager.start({ duration: 60000, format: 'mp3' }) + this.startRecord() + }, + handleTouchMove(e) { + + //console.log("handleTouchMove") + const diff = this.startY - e.touches[0].pageY + //console.log(diff) + if (diff > 100) { + this.setData({ cancelSend:true,RecordingStatus:0}) + manager.stop(); + } + + }, + handleTouchMove1(e) { + //console.log("handleTouchMove1") + const diff = this.startY1 - e.touches[0].pageY + //console.log(diff) + if (diff > 100) { + this.setData({ cancelSend1:true,RecordingStatus:0}) + manager.stop(); + } + + }, + handleTouchEnd() { + console.log("handleTouchEnd") + const cost = Date.now() - this.recordStartTime + if (cost < 350) { + //this.recorderManager.stop() + manager.stop(); + this.setData({ recording: false,RecordingStatus:0 }) + console.log( this.data.recording) + return + } + //this.recorderManager.stop() + manager.stop(); + this.setData({ recording: false ,RecordingStatus:1}) + console.log( this.data.recording) + }, + handleTouchEnd1() { + console.log("handleTouchEnd1") + const cost = Date.now() - this.recordStartTime + if (cost < 350) { + //this.recorderManager.stop() + manager.stop(); + this.setData({ recording1: false }) + console.log( this.data.recording) + return + } + //this.recorderManager.stop() + manager.stop(); + this.setData({ recording1: false,RecordingStatus:2 }) + console.log( this.data.recording) + }, + handleTouchCancel() { + console.log("handleTouchCancel") + //this.recorderManager.stop() + manager.stop(); + this.setData({ recording: false, cancelSend: false ,RecordingStatus:0}) + }, + handleTouchCancel1() { + + console.log("handleTouchCancel1") + //this.recorderManager.stop() + this.stopRecord() + this.setData({ recording1: false, cancelSend1: false,RecordingStatus:0 }) + }, + + + + /* ---------- 消息渲染 ---------- */ + pushMsg(content, MessageType,voicetime) { + const { date, time } = formatTime(new Date()) + const list = this.data.OriginalmsgList + const last = list[list.length - 1] + const showDate = !last || last.date !== date + const newMsg = { + id: Date.now(), + voicetime,voicetime, + content, + date, + time, + isSelf:MessageType, + showDate, + status: 'sending', // 添加状态字段: sending, success, failed + lock:'Unlock' + } + list.push(newMsg) + this.setData({ OriginalmsgList: list }) + let TabCur=this.data.TabCur + this.tabSelect1(TabCur) + this.scrollBottom() + return newMsg.id; + }, + scrollBottom() { + setTimeout(() => { + this.setData({ toView: `msg-${this.data.msgList.length - 1}` }) + }, 100) + }, + + /* ---------- 上传服务器 ---------- */ +async upload(txt, type, MessageType) { + console.log('upload') + const msgId = this.data.OriginalmsgList[this.data.OriginalmsgList.length - 1].id; + + + try { + const location = await new Promise((resolve, reject) => { + wx.getLocation({ + type: 'gcj02', + success(res) { + console.log('getLocation') + resolve(`${res.latitude},${res.longitude}`) + }, + fail(err) { + console.error('获取位置失败:', err) + resolve('') // 位置获取失败时使用空字符串 + } + }) + }) + const list = [...this.data.OriginalmsgList] + const msgIndex = list.findIndex(msg => msg.id === msgId) + list[msgIndex].location=location + list[msgIndex].sendMethod=type + list[msgIndex].isSelf=MessageType + list[msgIndex].time=this.GetTimeDate() + this.setData({ OriginalmsgList: list }) + + const apiRes = await this.post(txt, type, location, MessageType,list[msgIndex].voicetime) + + + console.log(apiRes) + // 更新消息状态为成功 + + this.updateMessageStatus(msgId, 'success') + list[msgIndex].time=apiRes.data.receivedTime + list[msgIndex].guid =apiRes.data.conversationGuid + this.setData({ OriginalmsgList: list }) + console.log(this.data.OriginalmsgList) + } catch (error) { + console.error('上传失败:') + console.error(error) + + // 更新消息状态为失败 + this.updateMessageStatus(msgId, 'failed') + wx.showToast({ + title: '发送失败,请重试', + icon: 'none' + }) + } + }, + + +// 添加更新消息状态的方法 +updateMessageStatus(msgId, status) { + + console.log('updateMessageStatus') + console.log(status) + const list = [...this.data.OriginalmsgList] + const msgIndex = list.findIndex(msg => msg.id === msgId) + if (msgIndex !== -1) { + list[msgIndex].status = status + this.setData({ OriginalmsgList: list }) + let TabCur = this.data.TabCur + this.tabSelect1(TabCur) + } +}, +// 添加重发消息方法 +retryMessage(e) { + const { id } = e.currentTarget.dataset + const list = this.data.OriginalmsgList + const msgIndex = list.findIndex(msg => msg.id === id) + if (msgIndex !== -1) { + const msg = list[msgIndex] + this.updateMessageStatus(id, 'sending') + this.upload(msg.content, msg.sendMethod, msg.isSelf) + } +}, + + async post(content, sendMethod, location,MessagType,voicetime) { + // console.log('post') + + let UserKey=wx.getStorageSync('openid') + const apiRes = await new Promise((resolve, reject) => { + wx.request({ + url: `${config.baseUrl}/api/Check/AddConversation`, + method: 'POST', + data: { + UserKey:UserKey , + ConversationContent: content, + SendMethod: sendMethod, + UserLocation: location, + MessageType:MessagType, + SpeakingTime:voicetime, + Guid:"" + }, + success: res =>{ + // console.log(res); + resolve(res); // 增加这行,解析Promise并返回结果 + }, + fail: (err) => { + //console.error('请求失败:', err); + reject(err); + } + }); + }); + //console.log(apiRes); + return apiRes + + }, + + + + tabSelect(e){ + this.tabSelect1(e.currentTarget.dataset.id) + }, + tabSelect1(type) { + let list = [] + let Oldlist = [] + switch (type) { + case 1: + list =this.data.OriginalmsgList + break; + case 2: + Oldlist =this.data.OriginalmsgList + for (let index = 0; index < Oldlist.length; index++) { + const element = Oldlist[index]; + if (element.isSelf===1) { + list.push(element) + } + } + break; + case 3: + Oldlist =this.data.OriginalmsgList + for (let index = 0; index < Oldlist.length; index++) { + const element = Oldlist[index]; + if (element.isSelf===2) { + list.push(element) + } + } + break; + default: + list =this.data.OriginalmsgList + break; + } + this.setData({ + msgList: list, + TabCur: type, + scrollLeft: (type-1)*60 + }) + }, + + /* 1. 下拉中(实时)*/ + onPulling(e) { + + if (!this.data.pulling) this.setData({ pulling: true }) + const dy = e.detail.dy // 下拉垂直距离 + this.setData({ pullText: dy > 80 ? '释放立即刷新' : '下拉刷新' }) + }, + /* 2. 达到阈值松手 → 真正刷新 */ + async onRefresh() { + + // this.setData({ pullText: '加载中…' }) + // await this.loadData(true) // true=刷新模式 + // this.setData({ triggered: false }) // 关闭下拉状态 + + // 记录刷新开始时间,用于计算最少展示时间 + const startTime = Date.now(); + const minAnimationTime = 1000; // 最少展示1秒动画 + + this.setData({ + pullText: '加载中…', + isLoading: true // 添加加载状态标识 + }); + + try { + // 执行数据加载 + await this.loadData(true); + + // 计算已用时间,如果不足1秒则延迟补足 + const elapsedTime = Date.now() - startTime; + const remainingTime = Math.max(minAnimationTime - elapsedTime, 0); + + if (remainingTime > 0) { + await new Promise(resolve => setTimeout(resolve, remainingTime)); + } + + // 显示"已加载最新记录"提示 + this.setData({ + pullText: '已加载最新记录' + }); + + // 短暂显示提示文字后再关闭下拉状态 + await new Promise(resolve => setTimeout(resolve, 500)); + + } catch (error) { + console.error('下拉刷新失败:', error); + this.setData({ + pullText: '加载失败,请重试' + }); + await new Promise(resolve => setTimeout(resolve, 1000)); + } finally { + // 无论成功失败,最终都关闭下拉状态 + this.setData({ + triggered: false, + isLoading: false + }); + } + + + }, + /* 3. 回弹复位 */ + onRestore() { + this.setData({ pulling: false, pullText: '下拉刷新' }) + }, + /* 4. 请求数据 */ + async loadData(reload = false) { + let oldli =this.data.OriginalmsgList + let pagenumber =Math.floor(oldli.length /20) + let yushu =oldli.length % 20 + if (yushu>0) { + let nli =[] + for (let nindex = yushu; nindex < oldli.length; nindex++) { + const element = oldli[nindex]; + nli.push(element) + } + oldli=nli + } + let UserKey=wx.getStorageSync('openid') + pagenumber=pagenumber+1 + const apiRes = await new Promise((resolve, reject) => { + + wx.request({ + url: `${config.baseUrl}/api/Check/GetConversationsByPage`, + method: 'POST', + data: {UserKey:UserKey ,Page:pagenumber,PageSize:20 ,MessageType:0}, + success: res =>{ + console.log(res) + let list = [] + for (let index = 0; index < res.data.data.conversations.length; index++) { + const element = res.data.data.conversations[index]; + const createTime = element.createTime.toString().replace("T"," ") + let location =`${element.latitude},${element.longitude}` + const newMsg = { + id: element.id, + guid :element.guid, + location:location, + content:element.conversationContent, + date:createTime, + time:createTime, + isSelf:element.messageType, + showDate:createTime, + sendMethod:element.sendMethod, + voicetime:element.speakingTime, + status: 'success', + lock:'lock' + } + list.push(newMsg) + } + + const newArray = list.concat(oldli) + this.setData({ PageNumber: pagenumber,OriginalmsgList: newArray,triggered: false}) + let TabCur=this.data.TabCur + this.tabSelect1(TabCur) + + + }, + fail: reject + }); + }); + }, + handleLongPressmsg(e){ + console.log(e) + + const id = e.currentTarget.id + const list = this.data.OriginalmsgList + if (!id||!list ||list.length==0) { + return + } + + for (let index = 0; index < list.length; index++) { + const element = list[list.length-index-1]; + if (id==element.id) { + if (element.status=='success' && element.lock=='Unlock') { + + this.setData({ + inputValue:element.content, + RevisemsgId:id, + modalName: "DialogModal1" // px→rpx + }); + + } + return + } + + } + + + }, + inputSearchForHotels(e){ + + this.setData({ + inputValue: e.detail.value + }) + }, + async hideModal(e) { + + this.setData({ + modalName: "" + }) + if (e.currentTarget.id=='ok') { + const id = this.data.RevisemsgId + const inputValue =this.data.inputValue + let TabCur=this.data.TabCur + const list = this.data.OriginalmsgList + if (inputValue.length==0) { + wx.showToast({ + title: '修改内容不能为空', + icon: 'none', + duration:2000 + }) + + return + } + + for (let index = 0; index < list.length; index++) { + const element = list[list.length-index-1]; + if (id==element.id) { + try { + const result = await this.updateConversation( + element.guid, // 会话ID + inputValue, // 新内容 + element.sendMethod, // 发送方式 + element.location, // 定位信息(可选) + element.isSelf // 消息类型(可选) + ); + list[list.length-index-1].content=inputValue + list[list.length-index-1].time=result.data.receivedTime + this.setData({ OriginalmsgList: list }) + this.tabSelect1(TabCur) + return + } catch (error) { + wx.showToast({ + title: '网络异常修改内容失败!', + icon: 'none', + duration:2000 + }) + list[list.length-index-1].time=this.GetTimeDate() + list[list.length-index-1].lock='Unlock' + this.setData({ OriginalmsgList: list }) + this.tabSelect1(TabCur) + return + } + + + } + + } + }else if (e.currentTarget.id=='Withdrawal') { + const id = this.data.RevisemsgId + + let TabCur=this.data.TabCur + const list = this.data.OriginalmsgList + let Nlist =this.data.OriginalmsgList + + for (let index = 0; index < list.length; index++) { + const element = list[list.length-index-1]; + if (id==element.id) { + try { + const result = await this.deleteConversation(element.guid); + Nlist.splice(list.length-index-1,1); + this.setData({ OriginalmsgList: Nlist,qinputTxt:element.content ,voiceMode:false}) + this.tabSelect1(TabCur) + return + } catch (error) { + wx.showToast({ + title: '网络异常修改内容失败!', + icon: 'none', + duration:2000 + }) + list[list.length-index-1].time=this.GetTimeDate() + list[list.length-index-1].lock='Unlock' + this.setData({ OriginalmsgList: list }) + this.tabSelect1(TabCur) + return + } + + + } + + } + } + + }, + GetTimeDate(){ +// 1. 获取当前时间戳 +let timestamp = Date.now(); // 例如:1733225035000 + +// 2. 将时间戳转换为 Date 对象 +let dateObj = new Date(timestamp); + +// 3. 获取各个时间部分并进行格式化 +let year = dateObj.getFullYear(); // 年份(四位) +let month = String(dateObj.getMonth() + 1).padStart(2, '0'); // 月份(补零) +let day = String(dateObj.getDate()).padStart(2, '0'); // 日期(补零) +let hours = String(dateObj.getHours()).padStart(2, '0'); // 小时(补零) +let minutes = String(dateObj.getMinutes()).padStart(2, '0'); // 分钟(补零) +let seconds = String(dateObj.getSeconds()).padStart(2, '0'); // 秒(补零) + +// 4. 拼接成所需的字符串格式 +// 格式:YYYY-MM-DD HH:mm:ss("yyyy-MM-dd HH:mm:ss") +let formattedString1 = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; +return formattedString1 +}, + +/** + * 软删除会话记录 + * @param {number|string} id - 会话记录ID + * @returns {Promise} - API响应结果 + */ +async deleteConversation(id) { + let UserKey = wx.getStorageSync('openid'); + const apiRes = await new Promise((resolve, reject) => { + wx.request({ + url: `${config.baseUrl}/api/Check/DeleteConversation`, + method: 'POST', + data: { + Guid: id, + UserKey: UserKey + }, + success: res => { + resolve(res); + }, + fail: (err) => { + console.error('删除会话记录失败:', err); + reject(err); + } + }); + }); + return apiRes; +}, +/** + * 更新会话记录 + * @param {number|string} id - 会话记录ID + * @param {string} content - 新的会话内容 + * @param {string} sendMethod - 新的发送方式 + * @param {string} [location] - 新的用户定位信息(可选) + * @param {number} [messageType] - 消息类型:1-公有消息,2-私有消息(可选) + * @returns {Promise} - API响应结果 + */ +async updateConversation(id, content, sendMethod, location = '', messageType = null) { + let UserKey = wx.getStorageSync('openid'); + const apiRes = await new Promise((resolve, reject) => { + wx.request({ + url: `${config.baseUrl}/api/Check/UpdateConversation`, + method: 'POST', + data: { + Guid: id, + UserKey: UserKey, + ConversationContent: content, + SendMethod: sendMethod, + UserLocation: location, + MessageType: messageType + }, + success: res => { + resolve(res); + }, + fail: (err) => { + console.error('更新会话记录失败:', err); + reject(err); + } + }); + }); + return apiRes; +}, +// 获得焦点时的处理函数 +onTextareaFocus: function(e) { + console.log('textarea 获得焦点', e.detail); + // 示例:记录焦点状态,用于UI变化 + this.setData({ + isFocused: true + }); +}, + +// 失去焦点时的处理函数 +onTextareaBlur: function(e) { + console.log('textarea 失去焦点', e.detail.value); + // 示例:进行表单验证或提交数据 + this.setData({ + isFocused: false + }); + +}, + + + GetmyScrollhight(){ + + wx.createSelectorQuery() + .in(this) + .select('#myScroll') + .boundingClientRect(rect => { + if (rect) { + const topPx = rect.top; // px + const bottomPx = 10 / 2; // 10rpx → 5px(2倍屏) + //const heightPx = screenHeight - topPx - bottomPx; + + wx.createSelectorQuery() + .in(this) + .select('#BottomFrame') //底部输入栏 + .boundingClientRect(nrect => { + if (nrect) { + const BottomFrametopPx = nrect.top; // px + const BottomFramebottomPx = 40 / 2; // 10rpx → 5px(2倍屏) + const BottomFrameheightPx = BottomFrametopPx-topPx- bottomPx; + + + // 3. 转 rpx 并写入 + this.setData({ + scrollHeight: BottomFrameheightPx //* 2 // px→rpx + }); + } + }) + .exec(); + + + } + }) + .exec(); + } +}) \ No newline at end of file diff --git a/CommunicationRecords/pages/chat/chat.json b/CommunicationRecords/pages/chat/chat.json new file mode 100644 index 0000000..8835af0 --- /dev/null +++ b/CommunicationRecords/pages/chat/chat.json @@ -0,0 +1,3 @@ +{ + "usingComponents": {} +} \ No newline at end of file diff --git a/CommunicationRecords/pages/chat/chat.wxml b/CommunicationRecords/pages/chat/chat.wxml new file mode 100644 index 0000000..8c692bf --- /dev/null +++ b/CommunicationRecords/pages/chat/chat.wxml @@ -0,0 +1,167 @@ + + + + + + + + 全部信息 + + + 公开信息 + + + 个人信息 + + + + + + + + + + + + + {{ pullText }} + + + + + + + + + + + + + + + ({{!item.voicetime? 0:item.voicetime}} s) + {{item.time}} + + + {{item.content}} + 发送中... + 发送失败,点击重发 + + + + + + + + + + + + + + {{resultText}} + 正在转换中... + + + + + + + + + + + + +