|
|
@ -4,7 +4,7 @@ import { btnStatus,recorder,getWebSocketUrl,connectWebSocket } from "./recorder. |
|
|
import { createAlova } from 'alova'; |
|
|
import { createAlova } from 'alova'; |
|
|
import adapterFetch from 'alova/fetch'; |
|
|
import adapterFetch from 'alova/fetch'; |
|
|
|
|
|
|
|
|
let { onchangeSize,initDate,setScrollPosition,addBackItemText,addItemImg,addItemSmallImg,addItemBigImg,addredHot,addBackItemAction,addWrapper,addClickItemImg } = QMUtil; |
|
|
|
|
|
|
|
|
let { onchangeSize,initDate,setScrollPosition,addBackItemText,addItemImg,addItemSmallImg,addItemBigImg,addredHot,addBackItemAction,addBackShopAction,addWrapper,addClickItemImg,addClickWCList,addQRCode, washroom } = QMUtil; |
|
|
|
|
|
|
|
|
const alovaInstance = createAlova({ |
|
|
const alovaInstance = createAlova({ |
|
|
requestAdapter: adapterFetch(), |
|
|
requestAdapter: adapterFetch(), |
|
|
@ -14,6 +14,7 @@ const alovaInstance = createAlova({ |
|
|
window.cli = null |
|
|
window.cli = null |
|
|
window.woNode = null |
|
|
window.woNode = null |
|
|
window.woVoice = null |
|
|
window.woVoice = null |
|
|
|
|
|
window.isSearch=false; |
|
|
|
|
|
|
|
|
window.onload = () => { |
|
|
window.onload = () => { |
|
|
onchangeSize(); |
|
|
onchangeSize(); |
|
|
@ -40,14 +41,17 @@ let addMy = () => { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
window.audioStart = () => { |
|
|
window.audioStart = () => { |
|
|
window.stopTTS(); |
|
|
|
|
|
//开始识别
|
|
|
//开始识别
|
|
|
if (btnStatus === "UNDEFINED" || btnStatus === "CLOSED") { |
|
|
|
|
|
connectWebSocket(); |
|
|
|
|
|
document.getElementById("stopBnt").style.display = "block"; |
|
|
|
|
|
document.getElementById("startBnt").style.display = "none"; |
|
|
|
|
|
addMy(); //添加我气泡
|
|
|
|
|
|
setScrollPosition(); |
|
|
|
|
|
|
|
|
if(!window.isSearch){ |
|
|
|
|
|
window.stopTTS(); |
|
|
|
|
|
if (btnStatus === "UNDEFINED" || btnStatus === "CLOSED") { |
|
|
|
|
|
connectWebSocket(); |
|
|
|
|
|
document.getElementById("stopBnt").style.display = "block"; |
|
|
|
|
|
document.getElementById("startBnt").style.display = "none"; |
|
|
|
|
|
addMy(); //添加我气泡
|
|
|
|
|
|
setScrollPosition(); |
|
|
|
|
|
} |
|
|
|
|
|
//callAiModel("电影院在哪里");
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -65,6 +69,7 @@ window.content = [{"logo":"./assets/con1.png","img":"./assets/conDail.png"},{"lo |
|
|
|
|
|
|
|
|
//接收模型回复处理内容
|
|
|
//接收模型回复处理内容
|
|
|
function callBack(str){ |
|
|
function callBack(str){ |
|
|
|
|
|
window.isSearch = false; |
|
|
document.getElementById("ing").remove(); |
|
|
document.getElementById("ing").remove(); |
|
|
console.log(str); |
|
|
console.log(str); |
|
|
let obj = str; |
|
|
let obj = str; |
|
|
@ -73,48 +78,111 @@ function callBack(str){ |
|
|
addredHot(); |
|
|
addredHot(); |
|
|
} |
|
|
} |
|
|
switch(obj.data.type){ |
|
|
switch(obj.data.type){ |
|
|
|
|
|
case "shopNotFound" : |
|
|
|
|
|
addredHot(); |
|
|
|
|
|
addBackItemText("此品牌在我商场未入驻。"); |
|
|
|
|
|
break; |
|
|
case undefined: |
|
|
case undefined: |
|
|
break; |
|
|
break; |
|
|
case "shopList" : |
|
|
case "shopList" : |
|
|
if(typeof obj.data.value.length == "number"){ |
|
|
|
|
|
obj.data.value.forEach((item, index)=>{ |
|
|
|
|
|
addBackItemAction(item); |
|
|
|
|
|
}); |
|
|
|
|
|
}else{ |
|
|
|
|
|
addBackItemText(obj.data.value.text || "为您推荐以下店铺"); |
|
|
|
|
|
obj.data.value.content.forEach((item, index)=>{ |
|
|
|
|
|
addBackItemAction(item); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if(obj.data.value.text){ |
|
|
|
|
|
addBackItemText(obj.data.value.text); |
|
|
|
|
|
}else{ |
|
|
|
|
|
if(obj.data.value.content && obj.data.value.content.length>0){ |
|
|
|
|
|
let opt = { |
|
|
|
|
|
value:"", |
|
|
|
|
|
txt:"为您推荐以下店铺" |
|
|
|
|
|
} |
|
|
|
|
|
obj.data.value.content.sort((a,b)=>{ |
|
|
|
|
|
if(a.buildingOrder != b.buildingOrder){ |
|
|
|
|
|
return a.buildingOrder - b.buildingOrder; |
|
|
|
|
|
}else{ |
|
|
|
|
|
return a.floorOrder - b.floorOrder; |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
obj.data.value.content.forEach((item,index)=>{ |
|
|
|
|
|
let floor=item.building+item.floor+"楼"; |
|
|
|
|
|
if(!opt.value){ |
|
|
|
|
|
opt.value = floor; |
|
|
|
|
|
opt.txt += floor+item.name+", "; |
|
|
|
|
|
}else{ |
|
|
|
|
|
if(opt.value == floor){ |
|
|
|
|
|
opt.txt += item.name+", "; |
|
|
|
|
|
}else{ |
|
|
|
|
|
opt.txt += floor+item.name+", "; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
opt.txt = opt.txt.substring(0, opt.txt.length-2); |
|
|
|
|
|
addBackItemText(opt.txt); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if(obj.data.value.content && obj.data.value.content.length>0){ |
|
|
|
|
|
let div = addWrapper(); |
|
|
|
|
|
addBackShopAction(div, obj.data.value.content, null); |
|
|
|
|
|
} |
|
|
break; |
|
|
break; |
|
|
case "activity" : |
|
|
case "activity" : |
|
|
if(typeof obj.data.value.length == "number"){ |
|
|
|
|
|
obj.data.value.forEach((item, index)=>{ |
|
|
|
|
|
addBackItemAction(item); |
|
|
|
|
|
}); |
|
|
|
|
|
}else{ |
|
|
|
|
|
addBackItemText(obj.data.value.text || "为您推荐以下活动"); |
|
|
|
|
|
obj.data.value.content.forEach((item, index)=>{ |
|
|
|
|
|
addBackItemAction(item); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
addBackItemText(obj.data.value.text || "为您推荐以下活动"); |
|
|
|
|
|
obj.data.value.content.forEach((item, index)=>{ |
|
|
|
|
|
addBackItemAction(item); |
|
|
|
|
|
}); |
|
|
break; |
|
|
break; |
|
|
case "shop" : |
|
|
case "shop" : |
|
|
if(obj.data.value.length !=0){ |
|
|
|
|
|
addBackItemText(`${obj.data.value[0].name}位于商场 ${obj.data.value[0].house_number},\n下方为您推荐导航线路`); |
|
|
|
|
|
addItemImg("./assets/map.png"); |
|
|
|
|
|
|
|
|
if(typeof obj.data.value != "string"){ |
|
|
|
|
|
if(obj.data.value.length !=0){ |
|
|
|
|
|
let opt = { |
|
|
|
|
|
value:"", |
|
|
|
|
|
txt:"" |
|
|
|
|
|
} |
|
|
|
|
|
obj.data.value.sort((a,b)=>{ |
|
|
|
|
|
if(a.buildingOrder != b.buildingOrder){ |
|
|
|
|
|
return a.buildingOrder - b.buildingOrder; |
|
|
|
|
|
}else{ |
|
|
|
|
|
return a.floorOrder - b.floorOrder; |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
obj.data.value.forEach((item,index)=>{ |
|
|
|
|
|
let floor=item.building+item.floor+"楼"; |
|
|
|
|
|
if(!opt.value){ |
|
|
|
|
|
opt.value = floor; |
|
|
|
|
|
opt.txt += floor+", "; |
|
|
|
|
|
}else{ |
|
|
|
|
|
if(opt.value != floor){ |
|
|
|
|
|
opt.txt += floor+", "; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
opt.txt = opt.txt.substring(0, opt.txt.length-2); |
|
|
|
|
|
if(obj.data.value.length === 1){ |
|
|
|
|
|
addBackItemText(`${obj.data.value[0].name} 位于商场 ${opt.txt},\n下方为您推荐导航路线`); |
|
|
|
|
|
addItemImg("./assets/map.png"); |
|
|
|
|
|
addQRCode(); |
|
|
|
|
|
if(obj.data.recommend && obj.data.recommend.length>0){ |
|
|
|
|
|
addBackItemText("相关品牌推荐:","",false); |
|
|
|
|
|
let div = addWrapper(); |
|
|
|
|
|
addBackShopAction(div, obj.data.recommend, null); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
addBackItemText(`${obj.data.query} 位于商场 ${opt.txt}`); |
|
|
|
|
|
let div = addWrapper(); |
|
|
|
|
|
addBackShopAction(div, obj.data.value, null); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
addBackItemText(`您的问题我还在持续学习中.`); |
|
|
|
|
|
} |
|
|
}else{ |
|
|
}else{ |
|
|
addBackItemText(`您的问题我还在持续学习中.`); |
|
|
|
|
|
|
|
|
addBackItemText(obj.data.value); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case "facility" : |
|
|
case "facility" : |
|
|
if(typeof obj.data.value.length == "number"){ |
|
|
|
|
|
addBackItemText(`下方为您推荐导航到${obj.data.value}的线路`); |
|
|
|
|
|
addItemImg("./assets/map1.png"); |
|
|
|
|
|
|
|
|
if(obj.data.value === "服务台"){ |
|
|
|
|
|
addBackItemText(`客服中心在二期七楼,下方为您推荐导航到${obj.data.value}的路线`); |
|
|
}else{ |
|
|
}else{ |
|
|
addBackItemText(`下方为您推荐导航到${obj.data.value}的线路`); |
|
|
|
|
|
addItemImg("./assets/map1.png"); |
|
|
|
|
|
|
|
|
addBackItemText(`下方为您推荐导航到最近${obj.data.value}的路线`); |
|
|
} |
|
|
} |
|
|
|
|
|
addItemImg("./assets/map1.png"); |
|
|
|
|
|
addQRCode(); |
|
|
break; |
|
|
break; |
|
|
case "weather" : |
|
|
case "weather" : |
|
|
addBackItemText(`${obj.data.value.city}今天天气${obj.data.value.dayweather},最高温度${obj.data.value.daytemp_float}`); |
|
|
addBackItemText(`${obj.data.value.city}今天天气${obj.data.value.dayweather},最高温度${obj.data.value.daytemp_float}`); |
|
|
@ -129,20 +197,35 @@ function callBack(str){ |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
case "qrcode" : //二维码
|
|
|
case "qrcode" : //二维码
|
|
|
obj.data.value.text && addBackItemText(obj.data.value.text); |
|
|
|
|
|
if(obj.data.value.content && obj.data.value.content.length>0){ |
|
|
|
|
|
addItemSmallImg(obj.data.value.content[0].logo); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if(obj.data.value.text || obj.data.value.content){ |
|
|
|
|
|
obj.data.value.text && addBackItemText(obj.data.value.text); |
|
|
|
|
|
if(obj.data.value.content && obj.data.value.content.length>0){ |
|
|
|
|
|
addItemSmallImg(obj.data.value.content[0].logo); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
addBackItemText("您的问题我还在持续学习中."); |
|
|
|
|
|
} |
|
|
break; |
|
|
break; |
|
|
case "coupon" : //优惠券
|
|
|
case "coupon" : //优惠券
|
|
|
if(obj.data.value.text){ |
|
|
|
|
|
addBackItemText(obj.data.value.text); |
|
|
|
|
|
let div = addWrapper(); |
|
|
|
|
|
window.content.forEach((item)=>{ |
|
|
|
|
|
addClickItemImg(div, item.logo, item.img, 165, 212, window.clickCoupon); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
if(obj.data.value.text || window.content.length>0){ |
|
|
|
|
|
obj.data.value.text && addBackItemText(obj.data.value.text); |
|
|
|
|
|
if(window.content.length>0){ |
|
|
|
|
|
let div = addWrapper(); |
|
|
|
|
|
window.content.forEach((item)=>{ |
|
|
|
|
|
addClickItemImg(div, item.logo, item.img, 165, 212, window.clickCoupon); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
}else{ |
|
|
|
|
|
addBackItemText("您的问题我还在持续学习中."); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
|
|
|
case "washroom" : //洗手间
|
|
|
|
|
|
addBackItemText(`下方为您推荐导航到最近洗手间的路线`); |
|
|
|
|
|
addItemImg("./assets/map1.png"); |
|
|
|
|
|
addQRCode(); |
|
|
|
|
|
addBackItemText(`网红洗手间推荐:`,"",false); |
|
|
|
|
|
addClickWCList(addWrapper(),window.clickWashroom); |
|
|
|
|
|
break; |
|
|
case "video" : //视频
|
|
|
case "video" : //视频
|
|
|
obj.data.value.text && addBackItemText(obj.data.value.text); |
|
|
obj.data.value.text && addBackItemText(obj.data.value.text); |
|
|
if(obj.data.value.content && obj.data.value.content.length>0){ |
|
|
if(obj.data.value.content && obj.data.value.content.length>0){ |
|
|
@ -195,6 +278,32 @@ window.clickVideo = function(event){ |
|
|
window.hello(); |
|
|
window.hello(); |
|
|
}) |
|
|
}) |
|
|
} |
|
|
} |
|
|
|
|
|
//点击洗手间
|
|
|
|
|
|
window.clickWashroom = function(event){ |
|
|
|
|
|
console.log(event.target.dataset.floor); |
|
|
|
|
|
window.isplayHello = false; //停止播放招呼语音
|
|
|
|
|
|
window.stopTTS(); |
|
|
|
|
|
let mark = document.getElementById("mark"); |
|
|
|
|
|
mark.style.display = "flex"; |
|
|
|
|
|
|
|
|
|
|
|
let div = document.createElement("div"); |
|
|
|
|
|
div.className = "wcdail"; |
|
|
|
|
|
div.innerHTML = `<div class="hotroom">
|
|
|
|
|
|
<img style="border-radius: 12px;position: absolute;" src="${event.target.dataset.img}" width="255" /> |
|
|
|
|
|
<div class="wccontent"> |
|
|
|
|
|
<span class="wctitle">洗手间-${event.target.dataset.name}</span> |
|
|
|
|
|
<span class="wcaddress"><img src="./assets/wc/add_icon.png"/>${event.target.dataset.floor}</span> |
|
|
|
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<img src="./assets/wc/wc_nav.png" />`;
|
|
|
|
|
|
mark.appendChild(div); |
|
|
|
|
|
mark.addEventListener("click", ()=>{ |
|
|
|
|
|
div.remove(); |
|
|
|
|
|
mark.style.display = "none"; |
|
|
|
|
|
window.isplayHello = true; |
|
|
|
|
|
window.hello(); |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
let getAiData = async (msg) => { |
|
|
let getAiData = async (msg) => { |
|
|
const response = await alovaInstance.Post('http://dify.123.1000my.com:59222/v1/workflows/run', { |
|
|
const response = await alovaInstance.Post('http://dify.123.1000my.com:59222/v1/workflows/run', { |
|
|
@ -207,22 +316,34 @@ let getAiData = async (msg) => { |
|
|
headers: { |
|
|
headers: { |
|
|
'Authorization': 'Bearer app-Fzon9DlAGNVwJSSrjF1gCiw4' |
|
|
'Authorization': 'Bearer app-Fzon9DlAGNVwJSSrjF1gCiw4' |
|
|
} |
|
|
} |
|
|
|
|
|
}).catch(error => { |
|
|
|
|
|
let res = { |
|
|
|
|
|
code:200, |
|
|
|
|
|
data: { |
|
|
|
|
|
"type": "other", |
|
|
|
|
|
"value": "您的问题我还在持续学习中." |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
callBack(res) |
|
|
|
|
|
return; |
|
|
}); |
|
|
}); |
|
|
console.log(response) |
|
|
console.log(response) |
|
|
let res = { |
|
|
let res = { |
|
|
code:200, |
|
|
code:200, |
|
|
data: { |
|
|
data: { |
|
|
"type": response.data?.outputs?.type, |
|
|
"type": response.data?.outputs?.type, |
|
|
"value": response.data?.outputs?.value |
|
|
|
|
|
|
|
|
"value": response.data?.outputs?.value, |
|
|
|
|
|
"recommend": response.data?.outputs?.recommend, |
|
|
|
|
|
"query": response.data?.outputs?.query |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
callBack(res) |
|
|
callBack(res) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function callAiModel(msg){ |
|
|
function callAiModel(msg){ |
|
|
console.log(msg) |
|
|
|
|
|
|
|
|
window.isSearch = true; |
|
|
// 调用模型
|
|
|
// 调用模型
|
|
|
addBackItemText("思考中...","ing",false) |
|
|
|
|
|
|
|
|
addBackItemText("思考中...","ing",false); |
|
|
setScrollPosition(); |
|
|
setScrollPosition(); |
|
|
// 调用api
|
|
|
// 调用api
|
|
|
getAiData(msg); |
|
|
getAiData(msg); |
|
|
@ -230,7 +351,6 @@ function callAiModel(msg){ |
|
|
|
|
|
|
|
|
//停止识别后动作
|
|
|
//停止识别后动作
|
|
|
window.audioStop = () => { |
|
|
window.audioStop = () => { |
|
|
console.log("audioStop") |
|
|
|
|
|
//停止识别
|
|
|
//停止识别
|
|
|
if (btnStatus === "CONNECTING" || btnStatus === "OPEN") { |
|
|
if (btnStatus === "CONNECTING" || btnStatus === "OPEN") { |
|
|
// 结束录音
|
|
|
// 结束录音
|
|
|
@ -257,8 +377,8 @@ window.hello=()=>{ |
|
|
clearTimeout(window.timer); |
|
|
clearTimeout(window.timer); |
|
|
if(window.isplayHello){ |
|
|
if(window.isplayHello){ |
|
|
window.isHello=true; |
|
|
window.isHello=true; |
|
|
window.startTTS("您好呀,我是德基广场数字客服小德,请问有什么需要帮助的吗?"); |
|
|
|
|
|
document.getElementById("cont").innerHTML = `<li class="left"><span>小德</span></li><li class="left"><div>您好呀,有什么需要帮助的吗?</div></li>`; |
|
|
|
|
|
|
|
|
window.startTTS("您好呀,我是德基广场数字客服小红帽,请问有什么需要帮助的吗?"); |
|
|
|
|
|
document.getElementById("cont").innerHTML = `<li class="left"><span>小红帽</span></li><li class="left"><div>您好呀,有什么需要帮助的吗?</div></li>`; |
|
|
} |
|
|
} |
|
|
},60000); |
|
|
},60000); |
|
|
} |
|
|
} |
|
|
|