phone-drop.txt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>呼叫中心html客户端工具条</title>
  5. <meta charset="UTF-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <link rel="stylesheet" href="page.css" />
  8. <script type="text/javascript" src="jquery-1.11.0.js"></script>
  9. <script type="text/javascript" src="ccPhoneBarSocket.js"></script>
  10. <script type="text/javascript">
  11. var _phoneBar = new ccPhoneBarSocket();
  12. var scriptServer = "127.0.0.1";
  13. var extnum = '1001'; //分机号
  14. var opnum = '1001'; //工号
  15. var skillLevel = 9; //技能等级
  16. var groupId = 1; // 业务组id
  17. if(window.location.href.toString().indexOf("?") != -1){
  18. console.log( ccPhoneBarSocket.utils );
  19. extnum = ccPhoneBarSocket.utils.getQueryParam("extNum");
  20. opnum = ccPhoneBarSocket.utils.getQueryParam("opNum");
  21. groupId = ccPhoneBarSocket.utils.getQueryParam("groupId");
  22. console.log("extNum=", extnum, "opNum=", opnum);
  23. }
  24. function resetExtNumAndOpNum(ext, op, groupId) {
  25. window.location.href = "?extNum=" + ext + "&opNum=" + op + "&groupId=" + groupId;
  26. };
  27. (function loadLoginToken(){
  28. // 目前已经把 projectId 和 groupId合并为同一个参数;
  29. var getTokenUrl = "http://"+ scriptServer +":8880/call-center/create-token";
  30. var destUrl = getTokenUrl + "?extnum=" + extnum + "&opnum=" + opnum
  31. + "&groupId=" + groupId +"&skillLevel=" + skillLevel
  32. ;
  33. var script = document.createElement("script");
  34. script.type = "text/javascript";
  35. script.src = destUrl;
  36. document.getElementsByTagName('head')[0].appendChild(script);
  37. })();
  38. (function loadExtPassword(){
  39. var extPassword = '1234567';
  40. var url = "http://"+ scriptServer +":8880/call-center/create-ext-password?pass=" + extPassword;
  41. var script = document.createElement("script");
  42. script.type = "text/javascript";
  43. script.src = url;
  44. document.getElementsByTagName('head')[0].appendChild(script);
  45. })();
  46. (function loadGatewayList(){
  47. var url = "http://"+ scriptServer +":8880/call-center/create-gateway-list" ;
  48. var script = document.createElement("script");
  49. script.type = "text/javascript";
  50. script.src = url;
  51. document.getElementsByTagName('head')[0].appendChild(script);
  52. })();
  53. // 将视频级别填充到下拉列表中的函数
  54. function populateVideoLevelDropdown(objId) {
  55. let select = document.getElementById(objId);
  56. if(select == null) return;
  57. // 遍历视频级别数据
  58. for (let key in ccPhoneBarSocket.videoLevels) {
  59. if (ccPhoneBarSocket.videoLevels.hasOwnProperty(key)) {
  60. let level = ccPhoneBarSocket.videoLevels[key];
  61. let option = document.createElement('option');
  62. option.value = level.levelId; // 设置值为 levelId
  63. option.text = level.description; // 显示文本
  64. select.appendChild(option);
  65. }
  66. }
  67. select.value = ccPhoneBarSocket.videoLevels.HD.levelId ;
  68. }
  69. </script>
  70. <script>
  71. var _callConfig = null;
  72. window.onload = function(){
  73. // 调用函数填充视频清晰度的下拉列表
  74. populateVideoLevelDropdown('videoLevelSelect');
  75. populateVideoLevelDropdown('member_video_level');
  76. //工具条对象断开事件
  77. // _phoneBar.on(ccPhoneBarSocket.eventList.ws_disconnected, function(msg){
  78. // console.log(msg);
  79. // });
  80. //
  81. // //工具条对象连接成功
  82. // _phoneBar.on(ccPhoneBarSocket.eventList.ws_connected, function(msg){
  83. // console.log(msg);
  84. // });
  85. //
  86. // _phoneBar.on(ccPhoneBarSocket.eventList.callee_ringing, function(msg){
  87. // console.log(msg.content, "被叫振铃事件");
  88. // });
  89. // _phoneBar.on(ccPhoneBarSocket.eventList.caller_answered, function(msg){
  90. // console.log(msg, "主叫接通" );
  91. // });
  92. // _phoneBar.on(ccPhoneBarSocket.eventList.caller_hangup, function(msg){
  93. // console.log(msg, "主叫挂断");
  94. // });
  95. //
  96. // _phoneBar.on(ccPhoneBarSocket.eventList.callee_answered, function(msg){
  97. // console.log(msg, "被叫接通");
  98. // });
  99. // _phoneBar.on(ccPhoneBarSocket.eventList.callee_hangup, function(msg){
  100. // console.log(msg, "被叫挂断");
  101. // });
  102. //
  103. // _phoneBar.on(ccPhoneBarSocket.eventList.status_changed, function(msg){
  104. // console.log("座席状态改变: " ,msg);
  105. // });
  106. //
  107. // // 一次外呼结束;
  108. // _phoneBar.on(ccPhoneBarSocket.eventList.outbound_finished, function(msg){
  109. // console.log('一次外呼结束', msg);
  110. // });
  111. // websocket通信对象断开事件;
  112. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.ws_disconnected.code, function(msg){
  113. console.log(msg);
  114. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.ws_disconnected.code);
  115. $("#transfer_area").hide();
  116. });
  117. _phoneBar.on(ccPhoneBarSocket.eventList.OUTBOUND_START, function (msg) {
  118. console.log('outbound_start',msg);
  119. });
  120. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.request_args_error.code, function(msg){
  121. console.log(msg);
  122. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.request_args_error.code);
  123. });
  124. //用户已在其他设备登录
  125. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.user_login_on_other_device.code, function(msg){
  126. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.user_login_on_other_device.code);
  127. alert(ccPhoneBarSocket.eventListWithTextInfo.user_login_on_other_device.msg);
  128. });
  129. //websocket连接成功
  130. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.ws_connected.code, function(msg){
  131. console.log(msg);
  132. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.ws_connected.code);
  133. });
  134. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.callee_ringing.code, function(msg){
  135. console.log(msg.content, "被叫振铃事件");
  136. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.callee_ringing.code);
  137. });
  138. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.caller_answered.code, function(msg){
  139. console.log(msg, "主叫接通" );
  140. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.caller_answered.code);
  141. });
  142. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.caller_hangup.code, function(msg){
  143. console.log(msg, "主叫挂断");
  144. $("#reInviteVideoBtn").attr("disabled","disabled");
  145. $("#sendVideoFileBtn").attr("disabled","disabled");
  146. $("#transfer_area").hide();
  147. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.caller_hangup.code);
  148. });
  149. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.callee_answered.code, function(msg){
  150. console.log(msg, "被叫接通");
  151. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.callee_answered.code);
  152. });
  153. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.callee_hangup.code, function(msg){
  154. console.log(msg, "被叫挂断");
  155. $("#transfer_area").hide();
  156. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.callee_hangup.code);
  157. });
  158. _phoneBar.on(ccPhoneBarSocket.eventListWithTextInfo.status_changed.code, function(msg){
  159. console.log("座席状态改变: " ,msg);
  160. _phoneBar.updatePhoneBar(msg, ccPhoneBarSocket.eventListWithTextInfo.status_changed.code);
  161. });
  162. _phoneBar.on(ccPhoneBarSocket.eventList.on_audio_call_connected, function(msg){
  163. console.log("音频通话已建立: " ,msg);
  164. $("#reInviteVideoBtn").removeAttr("disabled");
  165. });
  166. _phoneBar.on(ccPhoneBarSocket.eventList.customer_channel_hold, function (msg) {
  167. console.log("客户通话已保持: " ,msg);
  168. $("#callStatus").text("通话已保持");
  169. });
  170. _phoneBar.on(ccPhoneBarSocket.eventList.customer_channel_unhold, function (msg) {
  171. console.log("客户通话已接回." ,msg);
  172. $("#callStatus").text("客户通话已接回");
  173. });
  174. _phoneBar.on(ccPhoneBarSocket.eventList.on_video_call_connected, function(msg){
  175. console.log("视频通话已建立: " ,msg);
  176. $("#sendVideoFileBtn").removeAttr("disabled");
  177. });
  178. _phoneBar.on(ccPhoneBarSocket.eventList.inner_consultation_start, function(msg){
  179. $("#callStatus").text("咨询开始.");
  180. });
  181. _phoneBar.on(ccPhoneBarSocket.eventList.inner_consultation_stop, function(msg){
  182. $("#callStatus").text("咨询结束.");
  183. });
  184. _phoneBar.on(ccPhoneBarSocket.eventList.transfer_call_success, function(msg){
  185. $("#callStatus").text("电话转接成功.");
  186. });
  187. // 订阅的坐席状态列表发生改变
  188. _phoneBar.on(ccPhoneBarSocket.eventList.agent_status_data_changed, function (msg) {
  189. console.log("agent_status_data_changed.");
  190. // 当 transfer_to_groupId 值改变时更新 transfer_to_member
  191. $(transferToGroupId).off("change");
  192. $(transferToGroupId).on("change", function () {
  193. refreshMemberIdList();
  194. });
  195. refreshMemberIdList();
  196. });
  197. // 电话工具条参数配置;
  198. _callConfig = {
  199. 'useDefaultUi' : true,
  200. // loginToken 信息是加密的字符串, 包含以下字段信息:extnum[分机号]、opnum[工号]、groupId[业务组]、skillLevel[技能等级]
  201. 'loginToken': '',
  202. // 电话工具条服务器端的地址; 端口默认是1081
  203. 'ipccServer': scriptServer + ':1081',
  204. // 网关列表, 默认需要加密后在在通过客户端向呼叫系统传递;
  205. // 注意在注册模式下,网关参数更改之后,必须重启语音服务 [docker restart freeswitch] 方可生效,不支持热更新;
  206. // 支持多个网关同时使用,按照优先级依次使用, 支持网关负载容错溢出 [第一条网关外呼出错后,自动使用第二条网关重试,直至外呼不出错] ;
  207. 'gatewayList': [
  208. {
  209. uuid: '01', // 网关唯一编号;
  210. updateTime: 1992622572983, //网关信息更新时间, 每次修改必须更新这个字段,否则配置无法生效;
  211. gatewayAddr: '192.168.67.219', // 网关地址或名称, 如果是注册模式: 网关地址参数则填写为网关名称;
  212. callerNumber: '007', //主叫号码
  213. calleePrefix: '', // 被叫前缀
  214. priority: 2, //优先级,数字越小,越优先被使用;
  215. concurrency: 20, // 网关并发数,同时支持呼叫数;
  216. register: false, // 是否为注册模式
  217. audioCodec: 'g711' // 网关通信语音编码;
  218. }
  219. ],
  220. // 网关列表信息是否为加密模式;
  221. 'gatewayEncrypted': false
  222. };
  223. // 使用工具条之前需要先初始化 _callConfig 参数, 填充各个字段的值: 合计7个字段,必须填写正确 ;
  224. //********************************************************************************************
  225. // 以下代码设置加密的参数: loginToken、extPassword、gatewayList; 在本页面的demo演示中需要调用服务器端接口获取密文字符串;
  226. console.log('loginToken = ',loginToken);
  227. if(typeof(loginToken) != "undefined") {
  228. _callConfig["loginToken"] = loginToken;
  229. } else{
  230. alert("电话工具条:无法获取 loginToken!");
  231. return;
  232. }
  233. console.log('_phoneEncryptPassword = ',_phoneEncryptPassword);
  234. if(typeof(_phoneEncryptPassword) != "undefined") {
  235. _callConfig["extPassword"] = _phoneEncryptPassword;
  236. } else{
  237. alert("电话工具条:无法获取 _phoneEncryptPassword!");
  238. return;
  239. }
  240. console.log('_configGatewayList = ', _configGatewayList);
  241. if(typeof(_configGatewayList) != "undefined" && _callConfig["gatewayEncrypted"]) {
  242. //_callConfig["gatewayList"] = _configGatewayList;
  243. } else{
  244. // alert("电话工具条:无法获取 _configGatewayList!");
  245. }
  246. _phoneBar.initConfig(_callConfig);
  247. };
  248. function onConferenceEnd() {
  249. document.getElementById("endConference").setAttribute("disabled", "true");
  250. document.getElementById("startConference").removeAttribute("disabled");
  251. document.getElementById("conference_member_list").style.display = "none";
  252. // 启用外呼按钮
  253. $("#callBtn").addClass('on');
  254. // 启用置闲按钮
  255. $("#setFree").addClass('on');
  256. // 启用签出按钮
  257. $("#onLineBtn").addClass('on');
  258. //移除所有的参会成员
  259. $(".conf_member_item_row").remove();
  260. $("#callStatus").text("会议结束.");
  261. }
  262. function onConferenceStart() {
  263. document.getElementById("endConference").removeAttribute("disabled");
  264. document.getElementById("conference_member_list").style.display = "block";
  265. $("#callStatus").text("视频会议进行中...");
  266. }
  267. /**
  268. * 成功把电话转接到多人视频会议
  269. */
  270. function onTransferToConferenceSuccess(msg) {
  271. $("#callStatus").text("成转接到视频会议");
  272. $("#setFree").removeClass("on");
  273. $("#setBusy").removeClass("on");
  274. $("#callBtn").removeClass("on");
  275. //界面显示成功转接到视频会议电话
  276. var phone = msg.object.phone;
  277. var name = msg.object.name;
  278. _phoneBar.conferenceAddMemberFromExistCall(name, phone);
  279. }
  280. </script>
  281. </head>
  282. <body>
  283. <form>
  284. <table width="1224">
  285. <tr>
  286. <td width="100%" colspan="2" height="55">
  287. <img src="images/logo.jpg" width="200" height="50" />
  288. </td>
  289. </tr>
  290. <tr>
  291. <td width="70%">
  292. <div>
  293. <div class="head_dial" style="padding-left: 10px; ">
  294. <dl class="dial">
  295. <dt>
  296. <label for="ccphoneNumber"></label><input type="text" name="ccphoneNumber" id="ccphoneNumber" placeholder="请输入电话号码" class="tel_txt" />
  297. </dt>
  298. <dd>
  299. <ul><li id="callStatus" title="" class="status4">没有连接</li></ul>
  300. <span id="showCallLen" style="display:none"><b>00:00</b></span>
  301. </dd>
  302. </dl>
  303. <ul class="dial_btn">
  304. <li><a href="#" id="setFree" class="xz_btn off"></a><span>置闲</span></li>
  305. <li><a href="#" id="setBusy" class="sm_btn off"></a><span>忙碌</span></li>
  306. <li><a href="#" id="callBtn" class="wh_btn"></a><span>外呼</span></li>
  307. <li id="holdBtnLi"><a href="#" id="holdBtn" class="bc_btn off"></a><span>保 持</span></li>
  308. <li id="unHoldBtnLi"><a href="#" id="unHoldBtn" class="bc2_btn off"></a><span>取消保持</span></li>
  309. <li><a href="#" id="transferBtn" class="zjie_btn"></a><span>转接</span></li>
  310. <li><a href="#" id="consultationBtn" class="zixun_btn"></a><span>咨询</span></li>
  311. <li><a href="#" id="conferenceBtn" class="hy_btn"></a><span>会议</span></li>
  312. <li><a href="#" id="hangUpBtn" class="gj_btn"></a><span>挂机</span></li>
  313. <li><a href="#" id="resetStatus" class="qz_btn"></a><span>强置</span></li>
  314. <li><a href="#" id="onLineBtn" class="sx_btn on"></a><span>签入</span></li>
  315. </ul>
  316. </div>
  317. </div>
  318. </td>
  319. <td width="30%">
  320. <div>
  321. <div style="padding-left: 10px; ">
  322. &nbsp; &nbsp; 外呼设置:
  323. <label for="videoCallBtn"> <input type="radio" value="video" name="callType" id="videoCallBtn" />视频外呼</label> &nbsp;&nbsp;
  324. <label for="audioCallBtn"> <input type="radio" value="audio" name="callType" checked="checked" id="audioCallBtn" />语音外呼</label> <br />
  325. &nbsp; &nbsp; 视频清晰度:
  326. <label for="videoLevelSelect"></label><select id="videoLevelSelect">
  327. </select>
  328. <input type="button" id="reInviteVideoBtn" title="发送视频邀请,可把音频通话转换为视频通话。"
  329. onclick="_phoneBar.reInviteVideoCall();" value="视频邀请" disabled="disabled" >
  330. &nbsp;&nbsp;&nbsp;&nbsp;
  331. <label for="videoListSelect"></label>
  332. <select id="videoListSelect">
  333. <option value="">请选择视频</option>
  334. <option value="/usr/local/freeswitchvideo/share/freeswitch/sounds/bank.mp4">客服实例视频</option>
  335. <option value="/usr/local/freeswitchvideo/share/freeswitch/sounds/conference.mp4">多方会议视频</option>
  336. <option value="/usr/local/freeswitchvideo/share/freeswitch/sounds/15-seconds.mp4">15-seconds-demo</option>
  337. </select>
  338. <input type="button" id="sendVideoFileBtn" title="推送视频给对方,以便结束当前通话。"
  339. onclick="_phoneBar.sendVideoFile($('#videoListSelect').val());" value="推送视频" disabled="disabled" >
  340. </div>
  341. </div>
  342. </td>
  343. </tr>
  344. <tr id="transfer_area" width="100%" style="display: none">
  345. <td colspan="2" width="100%" style="padding-left: 140px; padding-top: 30px;">
  346. <table width="100%">
  347. <tr>
  348. <td width="90">业务组 </td>
  349. <td width="90">坐席成员</td>
  350. <td>&nbsp; </td>
  351. </tr>
  352. <tr>
  353. <td>
  354. <select size="10" id="transfer_to_groupIds" name="transfer_to_groupIds">
  355. <option value="">请选择</option>
  356. </select>
  357. </td>
  358. <td>
  359. <select size="10" id="transfer_to_member" name="transfer_to_member">
  360. <option value="">请选择</option>
  361. </select>
  362. </td>
  363. <td valign="middle">
  364. <input type="button" name="doTransferBtn" id="doTransferBtn"
  365. onclick="_phoneBar.transferBtnClickUI()"
  366. style="width: 70px;" value="转接电话" title="把当前电话转接给他/她处理。" /> &nbsp;
  367. <input type="button" name="stopCallWait" id="stopCallWait"
  368. onclick="_phoneBar.stopCallWaitBtnClickUI()"
  369. style="width: 70px;" value="接回客户" title="在咨询失败的情况下使用该按钮,接回处于等待中的电话。" /> &nbsp;
  370. <input type="button" name="transferCallWait" id="transferCallWait"
  371. onclick="_phoneBar.transferCallWaitBtnClickUI()"
  372. style="width: 70px;" value="转接客户" title="在咨询成功的情况下使用该按钮,把电话转接给专家坐席。" /> &nbsp;
  373. <input type="button" name="doConsultationBtn" id="doConsultationBtn"
  374. onclick="_phoneBar.consultationBtnClickUI()"
  375. style="width: 70px;" value="拨号咨询" title="" />
  376. </td>
  377. </tr>
  378. </table>
  379. </td>
  380. </tr>
  381. </table>
  382. </form>
  383. <div id="chat-container">
  384. <div id="chat-messages" class="message-container"></div>
  385. </div>
  386. <script>
  387. // 以下是通话转接操作界面的功能
  388. const transferToGroupId = document.getElementById("transfer_to_groupIds");
  389. const transferToMember = document.getElementById("transfer_to_member");
  390. // 填充 transfer_to_groupId 数据
  391. function populateGroupIdOptions() {
  392. transferToGroupId.length = 0; //清除所有选项
  393. let groups = _phoneBar.callConfig.groups;
  394. groups.forEach(group => {
  395. const option = document.createElement("option");
  396. option.value = group.groupId;
  397. option.textContent = group.bizGroupName;
  398. transferToGroupId.appendChild(option);
  399. });
  400. if(transferToGroupId.selectedIndex == -1){
  401. transferToGroupId.selectedIndex = 0;
  402. }
  403. };
  404. // 根据选中的 groupId 填充 transfer_to_member 数据
  405. function populateMemberIdOptions(members, selectedGroupId) {
  406. if (!Array.isArray(members)) {
  407. console.error("populateMemberOptions: members is not a Array.", members);
  408. return;
  409. }
  410. transferToMember.innerHTML = '<option value="">请选择</option>';
  411. members
  412. .filter(member => member.groupId === selectedGroupId)
  413. .forEach(member => {
  414. const option = document.createElement("option");
  415. const statusMap = { 1 : "刚签入", 2: "空闲", 3: "忙碌", 4: "通话中", 5: "事后处理" };
  416. option.value = member.opnum;
  417. option.textContent = `${member.opnum}(${statusMap[member.agentStatus] || ""})`;
  418. transferToMember.appendChild(option);
  419. });
  420. };
  421. function refreshMemberIdList() {
  422. const selectedGroupId = transferToGroupId.value;
  423. if(selectedGroupId != "") {
  424. let origValue = transferToMember.value;
  425. populateMemberIdOptions(_phoneBar.callConfig.agentList, selectedGroupId);
  426. //判断原始选择项是否还存在,存在则重新赋值;
  427. let hasValue = transferToMember.querySelector(`option[value="${origValue}"]`) !== null;
  428. if(hasValue) {
  429. transferToMember.value = origValue;
  430. }
  431. }
  432. }
  433. /* asr实时对话文本框的功能 */
  434. _phoneBar.on(ccPhoneBarSocket.eventList.asr_process_started, function (msg) {
  435. $(chatMessages).html("");
  436. });
  437. _phoneBar.on(ccPhoneBarSocket.eventList.asr_result_generate, function (msg) {
  438. handleAsrMessage(msg);
  439. });
  440. _phoneBar.on(ccPhoneBarSocket.eventList.asr_process_end_customer, function (msg) {
  441. handleAsrMessage(msg);
  442. });
  443. _phoneBar.on(ccPhoneBarSocket.eventList.asr_process_end_agent, function (msg) {
  444. handleAsrMessage(msg);
  445. });
  446. const chatMessages = document.getElementById('chat-messages');
  447. $("#chat-container").hide();
  448. function handleAsrMessage(data) {
  449. $("#chat-container").show();
  450. const { status, object } = data;
  451. if (status === 619 && object) {
  452. const { role, text, vadType } = object;
  453. if(vadType == 1) {
  454. addMessageToChat(role, text);
  455. }
  456. } else if (status === 620 || status === 621) {
  457. addSystemMessage("对话已结束。");
  458. }
  459. }
  460. function addMessageToChat(role, text) {
  461. const messageDiv = document.createElement('div');
  462. messageDiv.className = 'message ' + (role === 1 ? 'customer' : 'agent');
  463. // 添加角色名称
  464. const roleHeader = document.createElement('div');
  465. roleHeader.className = 'message-header';
  466. roleHeader.textContent = role === 1 ? '客户' : '我';
  467. const messageContent = document.createElement('div');
  468. messageContent.textContent = text;
  469. // messageDiv.appendChild(roleHeader);
  470. messageDiv.appendChild(messageContent);
  471. chatMessages.appendChild(messageDiv);
  472. scrollToBottom();
  473. }
  474. function addSystemMessage(text) {
  475. const systemMessage = document.createElement('div');
  476. systemMessage.className = 'system-message';
  477. systemMessage.textContent = text;
  478. chatMessages.appendChild(systemMessage);
  479. scrollToBottom();
  480. }
  481. function scrollToBottom() {
  482. chatMessages.scrollTop = chatMessages.scrollHeight;
  483. }
  484. </script>
  485. </body>
  486. </html>