'use strict'; //间隔 长鸣 let status = ''; //蜂鸣器发送可用状态 let statusEle = false; //蓝牙唯一id let uuid = ''; //蜂鸣器时间配置 let time = ""; let text = ''; //饲喂状态 let feedStatus = false; //蓝牙连接状态 let connetcedStatus = false; // ajax防止重复提交状态 let noticeUpload = true; // ajax防止重复提交状态 let totalUpload = true; /** * 上传100条实时重量信息 */ let totalList = []; //检测更新 function updateApp() { mui.toast(api.version); } // 装料重量校准 function weightFix() { if (!feedList.length > 0) { mui.toast("没有装料信息"); return false; } let btnArray1 = [feedName + '已完成', feedName + '未开始']; mui.confirm('如果已完成需要先上传', '校准前' + feedName + '状态', btnArray1, function (e) { if (e.index === 0) { mui.toast('校准失败,已完成请先上传'); } else { beforeWeight = nowWeight; allowAuto = true var data = { id:sbId+'_'+api.deviceId, beforeWeight:beforeWeight, fix:true, sbId:sbId, classCode:Number(classCode), trainNumber:Number(trainNumber), feedIndex:feedIndex } document.getElementById('isfix').innerHTML = '已校准' mui.toast("校准完成"); } }); } //获取唯一id function generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } // 提交数据 function submitData() { //清空自动跳转判断 weightDataFilter.dataBuffer = [] wendinSize = [] api.showProgress({ title: feedName + _feedNum, text:remark, modal: true }); var timeouts = remark === '手动上传'?400:1500; setTimeout(function(){ api.hideProgress(); },timeouts) var date = new Date(); var dateOf = getDateStr(date); var dateTime = currTimeFn(date); var param = { dateOf: dateOf, name: feedName, remark: remark, planWeight: Number(_planSum), rationCowAmount: feedList[feedIndex] ? feedList[feedIndex].cow : 0, batchRation: feedList[feedIndex]?feedList[feedIndex].batchRation:0, feedWeight: _feedNum, feedId: feedList[feedIndex].id, driver: driverName, type: feedList[feedIndex].batchRation ? 2 : 1, sourceCow: api.getPrefs({sync: true, key: 'sourceCow'}), classCode: classCode, trainNumber: trainNumber, templet: templateName, templetType: templetType, sbId: sbId, createBy: driverName, start: api.getGlobalData({key: 'startTime'}), allowMinutes: minutes, end: dateTime, time: dateTime }; //自动上传完更改状态 remark = '手动上传' // console.log(JSON.stringify(param)) if(feedStatus){ // 保存到本地数据库 execute(db, "INSERT INTO t_tmr_result (id,text) VALUES ('"+generateUUID()+"','"+JSON.stringify(param)+"');", function (ret, err) {}) } // 保存到本地数据库 // execute(db, "INSERT INTO t_tmr_result (id,text) VALUES ('"+generateUUID()+"','"+JSON.stringify(param)+"');", function (ret, err) {}) //更新装料开始时间 api.setGlobalData({key: 'startTime', value: currTimeFn(new Date())}); // 保存当前阶段重量 beforeWeight = nowWeight; //获取下一个饲料下标 feedIndex = Number(feedIndex) + 1; // 没有下一个饲料,车次加一 if (feedIndex > feedList.length - 1) { // 下一车次第一个饲料 feedIndex = 0; //下一车次 trainIndex = Number(trainIndex) + 1; // 没有下一个车次,饲喂完成 if (trainIndex > trainArr.length - 1) { //班次饲喂结束 feedStatus = false _feedNum = batchName+'次饲喂完成' renderUnload(); renderLoad(); feedMyChart.setOption({ dataset: { source: [[1, _feedNum]] } }); weightMyChart.setOption({ dataset: { source: [[1, nowWeight]] } }); document.getElementById('submitData').setAttribute("class", 'btnc mui-btn-success dis'); document.getElementById('feedNum').innerHTML = batchName + '次' + '饲喂完成'; //发送饲喂结束给LED屏幕 var param1 = { SF: "AA A5 ", LEN: '1A 00 ', DES: 'FF FF ', SRC: '12 34 ', TID: 'B0 A1 ', CMD1: '38 02 ', X: '00 00 ', Y: '00 00 ', WIDTH: '40 00 ', HEIGHT: '20 00 ', FORMAT: '00 00 01 00 ', CNT: '04 00 ', CRC: '00 00 ', EF: '5A 55 ', msg: '' }; let newmsg = batchName + '次'; //隐藏提交按钮,显示班次饲喂完成,停止蜂鸣器所有状态 let msglen = newmsg.getByteLen(); if (msglen < 8) { for (i = 0; i < 8 - msglen; i++) { newmsg = newmsg + ' '; } } param1.msg = newmsg + '饲喂完成'; zfk.getMsg(param1, function (ret, err) { if (!ret.status){ console.log(JSON.stringify(err)); } let str = ret.sendMsg; str = str.replace(/\s+/g, ""); let num = str.length / 2; param.value = "FF0500" + num.toString(16) + str; // msgList.push(param.value); execute(db, "INSERT INTO t_ble_msg (id,text) VALUES ("+new Date().getTime()+",'"+param.value+"');", function (ret, err) {}) }) setTimeout(function(){ console.log("停止蜂鸣"); control("00", "00"); },500) return false; } // 存在下一车,自动点击下一车,并定位,同时刷新下一个开始装料时间 // document.getElementById('classeCode_' + classCode + 'train_' + trainIndex).click(); handleCarClick(document.getElementById('classeCode_' + classCode + 'train_' + trainIndex), classCode, trainIndex+1) document.querySelector('#' + 'classeCode_' + classCode + 'train_' + trainIndex).scrollIntoView(true); //刷新装料时间 api.setGlobalData({key: 'startTime', value: currTimeFn(new Date())}); return false; } else { // 有下一个饲料信息时,判断是否是圈舍 load = !feedList[feedIndex].batchRation; // 清空所有饲料选择状态,设置下一个饲料选中状态 var doms = document.getElementsByClassName('mui-badge'); if (doms.length > 0) { for (var i = 0; i < doms.length; i++) { doms[i].setAttribute("class", 'mui-badge'); } } document.getElementById('feed_' + feedIndex).setAttribute("class", 'mui-badge mui-badge-purple'); } // 刷新已装装料为0,显示下一个饲料名称,定位到下一个饲料位置,刷新允许误差,刷新计划重量,刷新显示班次信息 _feedNum = 0; feedName = feedList[feedIndex].name; allow = feedList[feedIndex].allow; _planSum = feedList[feedIndex].weight.toFixed(0); text = feedName + _planSum; minutes = feedList[feedIndex].mix_minutes; //定位到当前饲料 document.querySelector('#feed_' + feedIndex).scrollIntoView(true); document.getElementById('isfix').innerHTML = '未校准' document.getElementById('nowFeed').innerHTML = '' + batchName + ',' + feedName + ''; document.getElementById('submitData').innerHTML = '上传' + feedName; if (load) { document.getElementById('fix').innerHTML = '装料前校准'; document.getElementById('feedNum').innerHTML = ':' + _planSum + '/已装:' + _feedNum + ''; } else { document.getElementById('fix').innerHTML = '卸料前校准'; document.getElementById('feedNum').innerHTML = ':' + _planSum + '/已卸:' + _feedNum + ''; } renderUnload(); feedMyChart.setOption({ dataset: { source: [[1, _feedNum]] } }); // 误差小于100必须校准才能自动跳转 allowAuto = false; // setTimeout(() => { console.log("停止蜂鸣"); control("00", "00"); setTimeout(function () { statusEle = false; }, 500); } // 获取当前时间字符串 function currTimeFn(_date) { var _year = _date.getFullYear(); var _month = _date.getMonth() + 1 < 10 ? '0' + (_date.getMonth() + 1) : _date.getMonth() + 1; var _day = _date.getDate() < 10 ? '0' + _date.getDate() : _date.getDate(); var _hour = _date.getHours() < 10 ? '0' + _date.getHours() : _date.getHours(); var _minutes = _date.getMinutes() < 10 ? '0' + _date.getMinutes() : _date.getMinutes(); var _seconds = _date.getSeconds() < 10 ? '0' + _date.getSeconds() : _date.getSeconds(); return _year + "-" + _month + "-" + _day + " " + _hour + ":" + _minutes + ":" + _seconds; } function currTimeFnMs(_date) { var _year = _date.getFullYear(); var _month = _date.getMonth() + 1 < 10 ? '0' + (_date.getMonth() + 1) : _date.getMonth() + 1; var _day = _date.getDate() < 10 ? '0' + _date.getDate() : _date.getDate(); var _hour = _date.getHours() < 10 ? '0' + _date.getHours() : _date.getHours(); var _minutes = _date.getMinutes() < 10 ? '0' + _date.getMinutes() : _date.getMinutes(); var _seconds = _date.getSeconds() < 10 ? '0' + _date.getSeconds() : _date.getSeconds(); var _ms = _date.getMilliseconds() < 10 ? '0' + _date.getMilliseconds() : _date.getMilliseconds(); return _year + "-" + _month + "-" + _day + " " + _hour + ":" + _minutes + ":" + _seconds + " "+_ms; } function uploadNotice() { var notice = api.getPrefs({sync: true, key: 'notice'}); if (notice !== '' && noticeUpload) { noticeUpload = false; api.ajax({ url: 'https://tmr.nxcyx.com/api/app/tmr/noticeSave', // url: 'http://192.168.0.107:8081/api/noticeSave', headers: { 'Content-Type': 'application/json;charset=utf-8' //建议key使用首字母大写的形式,如 User-Agent }, method: 'post', data: { body: notice } }, function (ret, err) { if (ret && ret.code === 200) { api.removePrefs({ key: 'notice' }); } else if (err) { mui.toast("noticeSave:" + err.msg); } noticeUpload = true; }); } } //上传实时总重量 function uploadTotalWeight() { if (totalList.length > 100) { if (totalUpload) { var date = new Date() date.getMilliseconds(); date.get totalUpload = false; api.ajax({ url: 'https://tmr.nxcyx.com/api/app/tmr/totalWeightUpload', // url: 'http://192.168.0.107:8081/api/totalWeightUpload', headers: { 'Content-Type': 'application/json;charset=utf-8' //建议key使用首字母大写的形式,如 User-Agent }, method: 'post', data: { body: { sbId: sbId, weightList: totalList } } }, function (ret, err) { if (ret && ret.code === 200) { totalList = []; } else if (err) { mui.toast("totalWeightUpload" + err.msg); } totalUpload = true; }); } } } /** * 添加异常通知 * @param type * @param color * @param describe */ function addNotice(type,color,describe) { var param = { sourceCow: api.getPrefs({sync: true, key: 'sourceCow'}), type: type?type:4, color: color?color:'red', time: currTimeFn(new Date()), describe: describe }; api.setPrefs({ key: 'notice', value: param }); } /** * 定时任务 */ function totalWeightUpload() { uploadNotice(); uploadTotalWeight(); } function convertToPolarPoint(renderItemParams, radius, radian) { return [Math.cos(radian) * radius + renderItemParams.coordSys.cx, -Math.sin(radian) * radius + renderItemParams.coordSys.cy]; } function makePionterPoints(renderItemParams, polarEndRadian) { return [convertToPolarPoint(renderItemParams, _outerRadius, polarEndRadian), convertToPolarPoint(renderItemParams, _outerRadius, polarEndRadian + Math.PI * 0.03), convertToPolarPoint(renderItemParams, _pointerInnerRadius, polarEndRadian)]; } //计划量/已装量echarts参数 function renderItemFeed(params, api) { var valOnRadian = api.value(1); var coords = api.coord([api.value(0), valOnRadian]); var polarEndRadian = coords[3]; var imageStyle = { image: "https://tmr.nxcyx.com/img/custom-gauge-panel.png", x: params.coordSys.cx - _outerRadius, y: params.coordSys.cy - _outerRadius, width: _outerRadius * 2, height: _outerRadius * 2 }; return { type: 'group', children: [{ type: 'image', style: imageStyle, clipPath: { type: 'sector', shape: { cx: params.coordSys.cx, cy: params.coordSys.cy, r: _outerRadius, r0: _innerRadius, startAngle: 0, endAngle: -polarEndRadian, transition: 'endAngle', enterFrom: {endAngle: 0} } } }, { type: 'image', style: imageStyle, clipPath: { type: 'polygon', shape: { points: makePionterPoints(params, polarEndRadian) }, extra: { polarEndRadian: polarEndRadian, transition: 'polarEndRadian', enterFrom: {polarEndRadian: 0} }, during: function during(apiDuring) { apiDuring.setShape('points', makePionterPoints(params, apiDuring.getExtra('polarEndRadian'))); } } }, { type: 'circle', shape: { cx: params.coordSys.cx, cy: params.coordSys.cy, r: _insidePanelRadius }, style: { fill: '#fff', shadowBlur: 25, shadowOffsetX: 0, shadowOffsetY: 0, shadowColor: 'rgba(76,107,167,0.4)' } }, { type: 'text', extra: { valOnRadian: valOnRadian, transition: 'valOnRadian', enterFrom: {valOnRadian: 0} }, style: { text: makeTextFeed(valOnRadian), fontSize: fontsize, fontWeight: 900, x: params.coordSys.cx, y: params.coordSys.cy, fill: 'rgb(255, 0, 0)', align: 'center', verticalAlign: 'middle', enterFrom: {opacity: 0} }, during: function during(apiDuring) { apiDuring.setStyle('text', makeTextFeed(apiDuring.getExtra('valOnRadian'))); } }] }; } function makeTextFeed() { if (isNaN(_feedNum )) { return batchName + '次' + '\n' + '饲喂完成' }else if (Math.abs(_planSum - _feedNum) >= 0) { // return '剩余应装\n' + valOnRadian.toFixed(1) + 'kg'; return feedName + '\n' + echartsType + Math.abs(_planSum - _feedNum).toFixed(0) + 'kg'; } else { // return '剩余应卸\n' + valOnRadian.toFixed(1) + 'kg'; return feedName + '\n' + echartsType + Math.abs(_planSum - _feedNum).toFixed(0) + 'kg'; } } function renderLoad() { var weightOption = { animation: false, dataset: { source: [[1, nowWeight]] }, tooltip: {}, angleAxis: { type: 'value', startAngle: 0, show: false, min: 0, max: _weightSum }, radiusAxis: { type: 'value', show: false }, polar: {}, series: [{ type: 'custom', coordinateSystem: 'polar', renderItem: renderItemWeight }] }; weightOption && weightMyChart.setOption(weightOption); } function renderUnload() { var feedOption = { animation: false, dataset: { // source: [[1, _planSum]] source: [[1, _feedNum]] }, tooltip: {}, angleAxis: { type: 'value', startAngle: 0, show: false, min: 0, max: _planSum }, radiusAxis: { type: 'value', show: false }, polar: {}, series: [{ type: 'custom', coordinateSystem: 'polar', renderItem: renderItemFeed }] }; feedOption && feedMyChart.setOption(feedOption); } //总重量/剩余量echarts参数 function renderItemWeight(params, api) { var valOnRadian = api.value(1); var coords = api.coord([api.value(0), valOnRadian]); var polarEndRadian = coords[3]; var imageStyle = { image: "https://tmr.nxcyx.com/img/custom-gauge-panel.png", x: params.coordSys.cx - _outerRadius, y: params.coordSys.cy - _outerRadius, width: _outerRadius * 2, height: _outerRadius * 2 }; return { type: 'group', children: [{ type: 'image', style: imageStyle, clipPath: { type: 'sector', shape: { cx: params.coordSys.cx, cy: params.coordSys.cy, r: _outerRadius, r0: _innerRadius, startAngle: 0, endAngle: -polarEndRadian, transition: 'endAngle', enterFrom: {endAngle: 0} } } }, { type: 'image', style: imageStyle, clipPath: { type: 'polygon', shape: { points: makePionterPoints(params, polarEndRadian) }, extra: { polarEndRadian: polarEndRadian, transition: 'polarEndRadian', enterFrom: {polarEndRadian: 0} }, during: function during(apiDuring) { apiDuring.setShape('points', makePionterPoints(params, apiDuring.getExtra('polarEndRadian'))); } } }, { type: 'circle', shape: { cx: params.coordSys.cx, cy: params.coordSys.cy, r: _insidePanelRadius }, style: { fill: '#fff', shadowBlur: 25, shadowOffsetX: 0, shadowOffsetY: 0, shadowColor: 'rgba(76,107,167,0.4)' } }, { type: 'text', extra: { valOnRadian: valOnRadian, transition: 'valOnRadian', enterFrom: {valOnRadian: 0} }, style: { text: makeTextWeight(valOnRadian), fontSize: fontsize, fontWeight: 900, x: params.coordSys.cx, y: params.coordSys.cy, fill: 'rgb(0, 0, 0)', align: 'center', verticalAlign: 'middle', enterFrom: {opacity: 0} }, during: function during(apiDuring) { apiDuring.setStyle('text', makeTextWeight(apiDuring.getExtra('valOnRadian'))); } }] }; } function makeTextWeight(valOnRadian) { return '车内总重\n' + valOnRadian.toFixed(0) + 'kg'; } function handleBackMain() { mui.confirm('确认返回到首页?', '提示', btnArray, function (e) { if (e.index === 0) {} else { api.closeWin(); } }); } function closeApp() { mui.confirm('确认关闭TMR饲喂系统?', '提示', btnArray, function (e) { if (e.index === 0) {} else { api.closeWidget({ id: api.appId, //应用ID retData: { name: 'closeWidget' }, silent: true }); } }); } function execute(db, sql, callback) { db.executeSql({ name: 'test', sql: sql }, function(ret, err) { // console.log(JSON.stringify(ret)+'['+sql+']'); // console.log(JSON.stringify(err)+'['+sql+']'); callback(ret, err); }); } function select(db, selsql, callback) { db.selectSql({ name: 'test', sql: selsql }, function(ret, err) { // console.log(JSON.stringify(ret)+'['+selsql+']'); // console.log(JSON.stringify(err)+'['+selsql+']'); callback(ret, err); }); } var websInt; // 初始化设备查询 function initSbList() { document.getElementById('text').innerHTML = '初始化设备'; api.showProgress({ title: '初始化设备...', modal: true }); pickData = []; api.ajax({ url: 'https://tmr.nxcyx.com/api/app/tmr/sbList?sourceCow=' + api.getPrefs({ sync: true, key: 'sourceCow' }), // url: 'http://192.168.0.107:8081/api/sbList?sourceCow=' + api.getPrefs({ sync: true, key: 'sourceCow' }), method: 'get', timeout: 5 }, function (ret, err) { if (ret) { api.hideProgress(); document.getElementById('text').innerHTML = '设备初始化成功'; var initsb = api.getPrefs({ sync: true, key: 'initsb' }); ret.data.forEach(function (e) { if (initsb === e.name){ var json = { value: e.sbId, text: e.name }; pickData.push(json); } }); ret.data.forEach(function (e) { if (initsb !== e.name){ var json = { value: e.sbId, text: e.name }; pickData.push(json); } }); sbId = pickData[0].value; document.getElementById('showUserPicker').innerHTML = pickData[0].text; muiInit(); initTime(); } else { api.hideProgress(); mui.alert("sbList:" + err.msg); document.getElementById('text').innerHTML = '' + '服务器异常' + ''; } }); } // 初始化班次信息 function initTime() { api.ajax({ url: 'https://tmr.nxcyx.com/api/app/tmr/time?sourceCow=' + api.getPrefs({ sync: true, key: 'sourceCow' }), // url: 'http://192.168.0.107:8081/api/time?sourceCow=' + api.getPrefs({ sync: true, key: 'sourceCow' }), method: 'get' }, function (ret, err) { if (ret) { if (ret.data.length > 0) { document.getElementById('text').innerHTML = '班次初始化'; } else { document.getElementById('text').innerHTML = '当前暂无班次'; } var html = ''; ret.data.forEach(function (e, index) { if (index === 0) { html += ''; } else { html += ''; } }); document.getElementById('timeList').innerHTML = html; var param = { classCode: ret.data[0].batch, sbId: sbId, sourceCow: api.getPrefs({ sync: true, key: 'sourceCow' }), dateOf: getDateStr(new Date()) }; initService() initTrain(param); } else { console.log(JSON.stringify(err)) document.getElementById('text').innerHTML = '班次加载失败'; } }); } // 初始化当前班次所有车次 function initTrain(param) { document.getElementById('train').innerHTML = '暂无车次'; api.ajax({ url: 'https://tmr.nxcyx.com/api/app/tmr/planDay', // url: 'http://192.168.0.107:8081/api/planDay', headers: { 'Content-Type': 'application/json;charset=utf-8' //建议key使用首字母大写的形式,如 User-Agent }, method: 'post', data: { body: param } }, function (ret, err) { if (ret) { if (ret.data.length > 0) { document.getElementById('text').innerHTML = '车次初始化'; } else { document.getElementById('feedList').innerHTML = ''; feedList = []; document.getElementById('text').innerHTML = '当前暂无计划'; } if (ret.data.length === 0) { mui.toast("该班次暂无车次信息"); } else if (ret.data.length > 0) { var html = ''; trainArr = []; ret.data.forEach(function (e, index) { trainArr.push(e.trainNumber); if (index === 0) { html += '
  • '+e.className + e.trainNumber + '(' + e.templetName + ')
  • '; } else { html += '
  • '+e.className + e.trainNumber + '(' + e.templetName + ')
  • '; } }); document.getElementById('train').innerHTML = html; trainIndex = 0; classCode = ret.data[0].classCode; var param = { classCode: ret.data[0].classCode, sbId: sbId, trainNumber: ret.data[0].trainNumber, sourceCow: api.getPrefs({ sync: true, key: 'sourceCow' }), dateOf: getDateStr(new Date()) }; initOne(param); } } else { console.log(JSON.stringify(err)) document.getElementById('text').innerHTML = '车次加载失败'; } }); } // 初始化当前车次饲料信息 function initOne(param) { weightDataFilter.dataBuffer = [] wendinSize = [] document.getElementById('submitData').setAttribute("class", 'btnc mui-btn-success'); //开始饲喂状态 feedStatus = true api.ajax({ url: 'https://tmr.nxcyx.com/api/app/tmr/planDay', // url: 'http://192.168.0.107:8081/api/planDay', headers: { 'Content-Type': 'application/json;charset=utf-8' //建议key使用首字母大写的形式,如 User-Agent }, method: 'post', data: { body: param } }, function (ret, err) { if (ret) { first = true; document.getElementById('text').innerHTML = '装料信息初始化成功'; var html = ''; ret.data.forEach(function (e) { load = true; trainNumber = e.trainNumber; _weightSum = e.total.toFixed(0); // 合并饲料和圈舍圈舍存入步骤stepsList var json = [].concat(_toConsumableArray(e.feedJson), _toConsumableArray(e.cowshedJson)); //更新饲料列表 feedList = json; json.forEach(function (j, index) { if (index === 0) { html += '' + UNICODE_CHARS[index + 1] + j.name + ':' + Number(j.weight).toFixed(0) + ''; } else { html += '' + UNICODE_CHARS[index + 1] + j.name + ':' + Number(j.weight).toFixed(0) + ''; } }); document.getElementById('feedList').innerHTML = html; // 根据步骤下标取stepsList的值 document.getElementById('batchName').innerHTML = e.className + e.trainNumber + '(' + e.total.toFixed(0) + 'kg)'; //第一个饲料 feedIndex = 0; _feedNum = 0; feedName = json[0].name; allow = json[0].allow; // 计划 _planSum = json[0].weight.toFixed(0); minutes = json[0].mix_minutes; text = feedName + _planSum; batchName = e.className + e.trainNumber; templateName = e.templetName; templetType = e.templetType; api.setGlobalData({key: 'startTime', value: currTimeFn(new Date())}); document.getElementById('submitData').innerHTML = '上传' + json[0].name; document.querySelector('#feed_0').scrollIntoView(true); document.getElementById('isfix').innerHTML = '未校准' document.getElementById('nowFeed').innerHTML = '' + e.className + e.trainNumber + ',' + feedName + ''; document.getElementById('text').innerHTML = 'V' + api.appVersion+'Ble'; if (load) { document.getElementById('feedNum').innerHTML = ':' + _planSum + '/已装:' + _feedNum + ''; }else{ document.getElementById('feedNum').innerHTML = ':' + _planSum + '/已卸:' + _feedNum + ''; } renderUnload(); feedMyChart.setOption({ dataset: { source: [[1, _feedNum]] } }); // 误差小于100必须校准才能自动跳转 allowAuto = false; setTimeout(function(){ console.log("停止蜂鸣"); control("00", "00"); },500) }); } else { console.log(JSON.stringify(err)) document.getElementById('text').innerHTML = '装料信息加载失败'; } }); } function initService() { initManager({single: true}); } function rescan(){ if(!connetcedStatus){ if(bleData.length>0){ connect({peripheralUUID: bleData[0].value}); }else{ scan() } } } function muiInit() { (function ($, doc) { var showUserPickerButton = doc.getElementById('showUserPicker'); $.init(); $.ready(function () { /** * 获取对象属性的值 * 主要用于过滤三级联动中,可能出现的最低级的数据不存在的情况,实际开发中需要注意这一点; * @param {Object} obj 对象 * @param {String} param 属性名 */ var _getParam = function _getParam(obj, param) { return obj[param] || ''; }; if (userPicker) {} else { userPicker = new $.PopPicker(); carListener = null; showUserPickerButton.addEventListener('tap', function () { userPicker.show(function (items) { console.log('设备切换'); mui.toast('切换设备',{duration:1500,type:'div'}); sbId = items[0].value; showUserPickerButton.innerHTML = items[0].text; initTime(); }); }, false); } userPicker.setData(pickData); }); })(mui, document); } // 以下是一个基于JavaScript的称重异常过滤程序示例,该程序使用滑动窗口算法来过滤异常值: // 该程序使用一个dataBuffer数组来保存最近的一组测量值,并返回这组值的平均值。程序在filter方法中,将新的测量值加入到dataBuffer中,并调用getAverageValue方法获取平均值。如果该平均值与上一个有效值的偏差小于maxDeviation,则将该测量值视为有效值,并返回该平均值;否则将该测量值视为异常值,并返回上一个有效值。 // 使用时,可以创建一个WeightDataFilter实例并调用filter方法来传入新的测量值,如下所示: // let weightDataFilter = new WeightDataFilter(10, 0.5); // let filteredValue = weightDataFilter.filter(measurementValue); // 其中,10是窗口大小,0.5是最大的偏差值,可以根据实际需求进行调整。measurementValue是当前的测量值。 "use strict"; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } let WeightDataFilter = function () { function WeightDataFilter(windowSize, maxDeviation) { _classCallCheck(this, WeightDataFilter); this.windowSize = windowSize; this.maxDeviation = maxDeviation; this.dataBuffer = []; this.lastValidValue = NaN; } _createClass(WeightDataFilter, [{ key: "filter", value: function filter(value) { if (this.dataBuffer.length > this.windowSize) { this.dataBuffer.shift(); } this.dataBuffer.push(value); let filteredValue = this.getAverageValue(); if (isNaN(this.lastValidValue) || Math.abs(filteredValue - this.lastValidValue) <= this.maxDeviation) { this.lastValidValue = filteredValue; return filteredValue; } else { return this.lastValidValue; } } }, { key: "getAverageValue", value: function getAverageValue() { let sum = this.dataBuffer.reduce(function (total, value) { return total + value; }, 0); return sum / this.dataBuffer.length; } }]); return WeightDataFilter; }();