|
|
|
|
@ -146,17 +146,17 @@ |
|
|
|
|
text-shadow: 0 0 1px rgba(255, 255, 255, 0.3); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* 播报模式 */ |
|
|
|
|
/* 是否播报 */ |
|
|
|
|
.toggle-btn { |
|
|
|
|
float: right; |
|
|
|
|
display: flex; |
|
|
|
|
width: 180px; |
|
|
|
|
width: 100px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.toggle-btn .btn { |
|
|
|
|
flex: 1; |
|
|
|
|
text-align: center; |
|
|
|
|
line-height: 34px; |
|
|
|
|
line-height: 28px; |
|
|
|
|
border: 1px solid #ddd; |
|
|
|
|
cursor: pointer; |
|
|
|
|
background-color: #fff; |
|
|
|
|
@ -177,21 +177,15 @@ |
|
|
|
|
} |
|
|
|
|
</style> |
|
|
|
|
<script src="jquery.min.js"></script> |
|
|
|
|
<!-- 引入样式 --> |
|
|
|
|
<link rel="stylesheet" href="layer/theme/default/layer.css"> |
|
|
|
|
<!-- 引入组件库 --> |
|
|
|
|
<script src="layer/layer.js"></script> |
|
|
|
|
</head> |
|
|
|
|
|
|
|
|
|
<body> |
|
|
|
|
<div class="wrapper"> |
|
|
|
|
<div class="page-title">诊间电脑报警软件</div> |
|
|
|
|
<div style="overflow: hidden;"> |
|
|
|
|
<div class="toggle-btn"> |
|
|
|
|
<div class="btn active"> |
|
|
|
|
直接播报 |
|
|
|
|
</div> |
|
|
|
|
<div class="btn" style="border-left: 0;"> |
|
|
|
|
按键播报 |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="alarm-box"> |
|
|
|
|
<div class="alarm-item"> |
|
|
|
|
<div class="alarm-item-box alarm1"> |
|
|
|
|
@ -214,49 +208,72 @@ |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div class="alarm-foot"> |
|
|
|
|
<div style="display: none;" class="alarm-btn" id="alarmBtn">一键播报</div> |
|
|
|
|
<div class="alarm-btn stop" id="stopButton">停止播报</div> |
|
|
|
|
<div style="display: flex;align-items: center;margin-top: 20px;overflow: hidden;"> |
|
|
|
|
<div class="page-small-title">是否播报</div> |
|
|
|
|
<div class="toggle-btn"> |
|
|
|
|
<div class="btn"> |
|
|
|
|
是 |
|
|
|
|
</div> |
|
|
|
|
<div class="btn active" style="border-left: 0;"> |
|
|
|
|
否 |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;margin-top: 20px;"> |
|
|
|
|
<div class="page-small-title">报警点位置</div> |
|
|
|
|
<select class="input" id="address" placeholder="报警位置" style="width: 200px;"> |
|
|
|
|
</select> |
|
|
|
|
<button id="btnSaveAddress" class="btn-saveAddress">设置警点位置</button> |
|
|
|
|
</div> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: top;margin: 20px 0;"> |
|
|
|
|
<div class="page-small-title">播报内容</div> |
|
|
|
|
<textarea id="volTxt" class="input" style="width:80%;height:100px;"></textarea> |
|
|
|
|
<!-- <button id="btnSaveAddress" class="btn-saveAddress">设置警点位置</button> --> |
|
|
|
|
</div> |
|
|
|
|
<div style="display: flex;margin: 10px 0 20px;"> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">语速</div> |
|
|
|
|
<input class="input" id="rate" placeholder="语速" value="0.6" style="width: 120px;" />(0.1到10) |
|
|
|
|
<!-- 播报组件 --> |
|
|
|
|
<div id="speckBox" style="display: none; overflow: hidden;"> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: top;margin: 20px 0;"> |
|
|
|
|
<div class="page-small-title">播报内容</div> |
|
|
|
|
<textarea id="volTxt" class="input" style="width:80%;height:100px;">在(【报警点】)发生(【报警类型】)类型报警,请及时处理。 |
|
|
|
|
</textarea> |
|
|
|
|
</div> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">音量</div> |
|
|
|
|
<input class="input" id="volume" placeholder="语速" value="1" style="width: 120px;" />(0到1) |
|
|
|
|
<div style="display: flex;margin: 10px 0 20px;"> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">语速</div> |
|
|
|
|
<input class="input" id="rate" placeholder="语速" value="0.6" style="width: 120px;" />(0.1到10) |
|
|
|
|
</div> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">音量</div> |
|
|
|
|
<input class="input" id="volume" placeholder="语速" value="1" style="width: 120px;" />(0到1) |
|
|
|
|
</div> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">循环次数</div> |
|
|
|
|
<input class="input" id="repeatNum" placeholder="语速" value="3" style="width: 120px;" /> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">循环次数</div> |
|
|
|
|
<input class="input" id="repeatNum" placeholder="语速" value="3" style="width: 120px;" /> |
|
|
|
|
<div style="display: flex;margin: 10px 0 20px;"> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">音色</div> |
|
|
|
|
<select class="input" id="voices" placeholder="音色" style="width: 200px;"> |
|
|
|
|
</select> |
|
|
|
|
<button style="display:none;" id="btnGetVoice">获取音色</button> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<div style="display: flex;margin: 10px 0 20px;"> |
|
|
|
|
<div style="flex: 1;display: flex;align-items: center;"> |
|
|
|
|
<div class="page-small-title">音色</div> |
|
|
|
|
<select class="input" id="voices" placeholder="音色" style="width: 200px;"> |
|
|
|
|
</select> |
|
|
|
|
<button style="display:none;" id="btnGetVoice">获取音色</button> |
|
|
|
|
</div> |
|
|
|
|
<!-- 报警按钮 --> |
|
|
|
|
<div class="alarm-foot" style="padding-bottom: 30px;"> |
|
|
|
|
<div class="alarm-btn" id="alarmBtn">上报报警</div> |
|
|
|
|
<div class="alarm-btn stop" id="stopButton">取消报警</div> |
|
|
|
|
</div> |
|
|
|
|
</div> |
|
|
|
|
<script> |
|
|
|
|
// const baseUrl = "http://152.136.119.150:81";//外网测试环境 |
|
|
|
|
const baseUrl = "http://171.16.8.51:81";//"http://192.168.1.102:81";//本地测试环境 |
|
|
|
|
const iotBaseUrl = "http://171.16.8.58:8080"//"http://182.139.182.190:60032";//物联网平台外网测试环境 |
|
|
|
|
//本地测试 |
|
|
|
|
// const baseUrl = "http://192.168.1.102:81";//本地测试环境-上报 |
|
|
|
|
// const iotBaseUrl = "http://182.139.182.190:60032";//物联网平台测试 |
|
|
|
|
//现场测试 |
|
|
|
|
const baseUrl = "http://171.16.8.51:81";//上报 |
|
|
|
|
const iotBaseUrl = "http://171.16.8.58:8080"//物联网平台环境 |
|
|
|
|
//设备产品pid |
|
|
|
|
// const pid = 98;//测试环境 |
|
|
|
|
const pid = 119;//现场 |
|
|
|
|
if (!('speechSynthesis' in window)) { |
|
|
|
|
throw alert("对不起,您的浏览器不支持") |
|
|
|
|
layer.msg("对不起,您的浏览器不支持") |
|
|
|
|
} |
|
|
|
|
const alarmLevel = { |
|
|
|
|
1: '普通纠纷', |
|
|
|
|
@ -264,7 +281,7 @@ |
|
|
|
|
3: '暴力伤害', |
|
|
|
|
4: '火灾' |
|
|
|
|
}; |
|
|
|
|
let speakType = 1;//播报模式,1直接播报 2按键播报 |
|
|
|
|
var isSpeak = 1;//是否播报 默认不播报 |
|
|
|
|
var repeatNum = 3;//循环播放次数 |
|
|
|
|
var utterThis = new window.SpeechSynthesisUtterance(); |
|
|
|
|
utterThis.lang = 'zh-CN'; |
|
|
|
|
@ -294,45 +311,69 @@ |
|
|
|
|
setTimeout(function () { |
|
|
|
|
document.getElementById('btnGetVoice').click(); |
|
|
|
|
}, 800) |
|
|
|
|
// 选择报警级别 |
|
|
|
|
let level = null; |
|
|
|
|
document.querySelectorAll('.alarm-item-box').forEach(function (dom, index) { |
|
|
|
|
//组件折叠展开 |
|
|
|
|
document.querySelectorAll('.toggle-btn .btn').forEach(function (dom, index) { |
|
|
|
|
dom.addEventListener('click', function () { |
|
|
|
|
let _actDom = document.querySelectorAll('.alarm-item-box.active'); |
|
|
|
|
let _actDom = document.querySelectorAll('.toggle-btn .btn.active'); |
|
|
|
|
if (_actDom.length > 0) { |
|
|
|
|
_actDom[0].classList.remove('active') |
|
|
|
|
} |
|
|
|
|
dom.classList.add('active'); |
|
|
|
|
level = index; |
|
|
|
|
document.querySelector('textarea#volTxt').value = alarmLevel[index + 1]; |
|
|
|
|
var txt = document.querySelector('textarea#volTxt').value; |
|
|
|
|
if (speakType == 1) { |
|
|
|
|
speak(txt); |
|
|
|
|
reportSaveIot(txt);//本地存储 =》 上报 |
|
|
|
|
isSpeak = index; |
|
|
|
|
console.log('isspeak', isSpeak) |
|
|
|
|
if(index == 0) { |
|
|
|
|
document.getElementById('speckBox').style.display = "block"; |
|
|
|
|
}else{ |
|
|
|
|
document.getElementById('speckBox').style.display = "none"; |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
//切换播报模式 |
|
|
|
|
document.querySelectorAll('.toggle-btn .btn').forEach(function (dom, index) { |
|
|
|
|
// 选择报警级别 |
|
|
|
|
let level = null; |
|
|
|
|
document.querySelectorAll('.alarm-item-box').forEach(function (dom, index) { |
|
|
|
|
dom.addEventListener('click', function () { |
|
|
|
|
let _actDom = document.querySelectorAll('.toggle-btn .btn.active'); |
|
|
|
|
let _actDom = document.querySelectorAll('.alarm-item-box.active'); |
|
|
|
|
if (_actDom.length > 0) { |
|
|
|
|
_actDom[0].classList.remove('active') |
|
|
|
|
} |
|
|
|
|
dom.classList.add('active'); |
|
|
|
|
speakType = index + 1; |
|
|
|
|
document.getElementById('alarmBtn').style.display = speakType == 1 ? 'none' : 'inline-block'; |
|
|
|
|
level = index + 1; |
|
|
|
|
//报警内容 |
|
|
|
|
var id = document.querySelector('select#address').value; |
|
|
|
|
let _idx = deviceList.findIndex(function (item) { |
|
|
|
|
return item.id = id; |
|
|
|
|
}) |
|
|
|
|
let txt = ""; |
|
|
|
|
if(id != '' && _idx > -1) { |
|
|
|
|
let address = deviceList[_idx].remark; |
|
|
|
|
txt = "在(" + address + ")发生(" + (level !=null ? alarmLevel[level] : "【报警类型】") + ")类型报警,请及时处理。" |
|
|
|
|
}else { |
|
|
|
|
txt = "在(【报警点】)发生(" + (level != null ? alarmLevel[level] : "【报警类型】") + ")类型报警,请及时处理。" |
|
|
|
|
} |
|
|
|
|
console.log(txt); |
|
|
|
|
document.querySelector('textarea#volTxt').value = txt; |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
//一键播报 |
|
|
|
|
//上报报警 |
|
|
|
|
document.getElementById('alarmBtn').onclick = function () { |
|
|
|
|
var txt = document.querySelector('textarea#volTxt').value; |
|
|
|
|
if (level == null || txt == '') { |
|
|
|
|
alert('播报内容不能为空') |
|
|
|
|
var deviceId = document.querySelector('select#address').value; |
|
|
|
|
if (level == null) { |
|
|
|
|
layer.msg('请先选择报警类型后再上报!') |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
console.log(txt) |
|
|
|
|
speak(txt); |
|
|
|
|
if (deviceId == '') { |
|
|
|
|
layer.msg('请先选择报警点后再上报!') |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (txt == '') { |
|
|
|
|
layer.msg('播报内容不能为空!') |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if(isSpeak === 0) { |
|
|
|
|
console.log("isSpeak", isSpeak); |
|
|
|
|
speak(txt); |
|
|
|
|
} |
|
|
|
|
reportSaveIot(txt);//本地存储 =》 上报 |
|
|
|
|
} |
|
|
|
|
//播报 |
|
|
|
|
@ -364,26 +405,25 @@ |
|
|
|
|
function getDeviceList() { |
|
|
|
|
if (token != undefined && token) { |
|
|
|
|
$.ajax({ |
|
|
|
|
url: iotBaseUrl + "/prod-api/api/bizDevice/list?pid=98¶ms[type]=1", type: "get", headers: { Authorization: token }, dataType: "json", success: function (res) { |
|
|
|
|
url: iotBaseUrl + "/prod-api/api/bizDevice/list?pid=" + pid + "¶ms[type]=1", type: "get", headers: { Authorization: token }, dataType: "json", success: function (res) { |
|
|
|
|
if (res.code == 200) { |
|
|
|
|
deviceList = res.rows; |
|
|
|
|
var option = document.createElement("option"); |
|
|
|
|
option.value = "" |
|
|
|
|
option.text = "请选择报警点"; |
|
|
|
|
document.getElementById('address').add(option); |
|
|
|
|
deviceList.forEach(function (v) { |
|
|
|
|
var option = document.createElement("option"); |
|
|
|
|
option.value = v.id |
|
|
|
|
option.text = v.name; |
|
|
|
|
option.text = v.remark; |
|
|
|
|
document.getElementById('address').add(option); |
|
|
|
|
}) |
|
|
|
|
let addressIndex = window.localStorage.getItem('deviceId'); |
|
|
|
|
if (addressIndex != undefined && addressIndex) { |
|
|
|
|
let index = deviceList.findIndex(function (item) { |
|
|
|
|
return item.id = addressIndex; |
|
|
|
|
}) |
|
|
|
|
document.querySelector('select#address').value = deviceList[index].id; |
|
|
|
|
} |
|
|
|
|
} else if (res.code == 401) { |
|
|
|
|
window.sessionStorage.removeItem('bizToken'); |
|
|
|
|
token = ""; |
|
|
|
|
getDeviceList(); |
|
|
|
|
}else { |
|
|
|
|
layer.msg('未获取到报警点位置,请联系运维人员。') |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
@ -401,14 +441,24 @@ |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//报警点位存储本地 |
|
|
|
|
document.getElementById('btnSaveAddress').onclick = function () { |
|
|
|
|
var id = document.querySelector('select#address').value; |
|
|
|
|
//报警点位change |
|
|
|
|
$('#address').on('change', function () { |
|
|
|
|
var id = $(this).val(); |
|
|
|
|
console.log('id',id) |
|
|
|
|
let index = deviceList.findIndex(function (item) { |
|
|
|
|
return item.id = id; |
|
|
|
|
}) |
|
|
|
|
window.localStorage.setItem('deviceId', id); |
|
|
|
|
} |
|
|
|
|
let txt = ""; |
|
|
|
|
if(id != '' && index > -1) { |
|
|
|
|
let address = deviceList[index].remark; |
|
|
|
|
console.log('address',address) |
|
|
|
|
txt = "在(" + address + ")发生(" + (level != null ? alarmLevel[level] : "【报警类型】") + ")类型报警,请及时处理。"; |
|
|
|
|
}else{ |
|
|
|
|
txt = "在(【报警点】)发生(" + (level != null ? alarmLevel[level] : "【报警类型】") + ")类型报警,请及时处理。" |
|
|
|
|
} |
|
|
|
|
console.log(txt); |
|
|
|
|
document.querySelector('textarea#volTxt').value = txt; |
|
|
|
|
}); |
|
|
|
|
//报警信息上报 |
|
|
|
|
function reportSaveIot(txt) { |
|
|
|
|
var id = document.querySelector('select#address').value; |
|
|
|
|
@ -427,12 +477,20 @@ |
|
|
|
|
formdata.append('longidute', tags.lng); |
|
|
|
|
formdata.append('latidute', tags.lat); |
|
|
|
|
formdata.append('content', txt); |
|
|
|
|
var loadingIndex = layer.load(0, {shade: false}); |
|
|
|
|
$.ajax({ |
|
|
|
|
url: baseUrl + "/appData/putFile", type: "post", contentType: false, processData: false, dataType: 'json', data: formdata, success: function (res) { |
|
|
|
|
url: baseUrl + "/appData/putFile", type: "post", contentType: false, processData: false, |
|
|
|
|
timeout: 6000, dataType: 'json', data: formdata, success: function (res) { |
|
|
|
|
layer.close(loadingIndex); |
|
|
|
|
if (res.code === 200) { |
|
|
|
|
console.log('上报成功'); |
|
|
|
|
reportIot(txt); |
|
|
|
|
}else{ |
|
|
|
|
layer.msg('报警失败,请联系运维人员'); |
|
|
|
|
} |
|
|
|
|
},error: function() { |
|
|
|
|
layer.close(loadingIndex); |
|
|
|
|
layer.msg('报警失败,请联系运维人员'); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
@ -458,9 +516,13 @@ |
|
|
|
|
let _data = JSON.parse(res.data); |
|
|
|
|
if (_data.resultCode == 0) { |
|
|
|
|
console.log('上报成功2'); |
|
|
|
|
layer.msg('报警成功'); |
|
|
|
|
}else{ |
|
|
|
|
console.log(_data.msg); |
|
|
|
|
layer.msg('报警失败,请联系运维人员'); |
|
|
|
|
} |
|
|
|
|
},error: function() { |
|
|
|
|
layer.msg('报警失败,请联系运维人员'); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|