2023-10-19 15:00:17 +08:00
|
|
|
|
'use strict';
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//间隔 长鸣
|
|
|
|
|
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 = [];
|
|
|
|
|
|
|
|
|
|
//检测更新
|
2023-10-19 15:00:17 +08:00
|
|
|
|
function updateApp() {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
mui.toast(api.version);
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// 装料重量校准
|
2023-10-19 15:00:17 +08:00
|
|
|
|
function weightFix() {
|
|
|
|
|
if (!feedList.length > 0) {
|
|
|
|
|
mui.toast("没有装料信息");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-02-01 10:44:54 +08:00
|
|
|
|
let btnArray1 = [feedName + '已完成', feedName + '未开始'];
|
2023-12-20 14:40:11 +08:00
|
|
|
|
mui.confirm('<b style="color:red">如果已完成需要先上传</b>', '<b style="font-weight:900">校准前' + feedName + '状态</b>', btnArray1, function (e) {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
if (e.index === 0) {
|
2023-10-19 15:00:17 +08:00
|
|
|
|
mui.toast('<b style="color:red">校准失败,已完成请先上传</b>');
|
|
|
|
|
} else {
|
|
|
|
|
beforeWeight = nowWeight;
|
2023-11-01 11:38:13 +08:00
|
|
|
|
allowAuto = true
|
2024-02-01 10:44:54 +08:00
|
|
|
|
|
|
|
|
|
var data = {
|
|
|
|
|
id:sbId+'_'+api.deviceId,
|
|
|
|
|
beforeWeight:beforeWeight,
|
|
|
|
|
fix:true,
|
|
|
|
|
sbId:sbId,
|
|
|
|
|
classCode:Number(classCode),
|
|
|
|
|
trainNumber:Number(trainNumber),
|
|
|
|
|
feedIndex:feedIndex
|
|
|
|
|
}
|
2023-11-27 17:34:40 +08:00
|
|
|
|
document.getElementById('isfix').innerHTML = '<font style="color:green;font-size: x-large;">已校准</font>'
|
2023-10-19 15:00:17 +08:00
|
|
|
|
mui.toast("校准完成");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//获取唯一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);
|
2023-10-20 10:52:35 +08:00
|
|
|
|
});
|
2024-01-08 14:58:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 15:00:17 +08:00
|
|
|
|
// 提交数据
|
|
|
|
|
function submitData() {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//清空自动跳转判断
|
2024-01-08 14:58:42 +08:00
|
|
|
|
weightDataFilter.dataBuffer = []
|
2024-02-01 10:44:54 +08:00
|
|
|
|
wendinSize = []
|
|
|
|
|
api.showProgress({
|
|
|
|
|
title: feedName + _feedNum,
|
|
|
|
|
text:remark,
|
|
|
|
|
modal: true
|
|
|
|
|
});
|
|
|
|
|
var timeouts = remark === '手动上传'?400:1500;
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
api.hideProgress();
|
|
|
|
|
},timeouts)
|
2023-10-19 15:00:17 +08:00
|
|
|
|
var date = new Date();
|
|
|
|
|
var dateOf = getDateStr(date);
|
|
|
|
|
var dateTime = currTimeFn(date);
|
|
|
|
|
var param = {
|
|
|
|
|
dateOf: dateOf,
|
|
|
|
|
name: feedName,
|
2023-12-11 10:31:40 +08:00
|
|
|
|
remark: remark,
|
2023-10-19 15:00:17 +08:00
|
|
|
|
planWeight: Number(_planSum),
|
|
|
|
|
rationCowAmount: feedList[feedIndex] ? feedList[feedIndex].cow : 0,
|
2024-02-01 10:44:54 +08:00
|
|
|
|
batchRation: feedList[feedIndex]?feedList[feedIndex].batchRation:0,
|
2023-10-19 15:00:17 +08:00
|
|
|
|
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'}),
|
2024-01-08 14:58:42 +08:00
|
|
|
|
allowMinutes: minutes,
|
2023-10-19 15:00:17 +08:00
|
|
|
|
end: dateTime,
|
|
|
|
|
time: dateTime
|
|
|
|
|
};
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//自动上传完更改状态
|
|
|
|
|
remark = '手动上传'
|
2024-01-08 14:58:42 +08:00
|
|
|
|
// console.log(JSON.stringify(param))
|
2024-02-01 10:44:54 +08:00
|
|
|
|
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) {})
|
|
|
|
|
//更新装料开始时间
|
2024-01-05 11:31:05 +08:00
|
|
|
|
api.setGlobalData({key: 'startTime', value: currTimeFn(new Date())});
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// 保存当前阶段重量
|
2023-12-20 14:40:11 +08:00
|
|
|
|
beforeWeight = nowWeight;
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//获取下一个饲料下标
|
|
|
|
|
feedIndex = Number(feedIndex) + 1;
|
2023-12-20 14:40:11 +08:00
|
|
|
|
// 没有下一个饲料,车次加一
|
|
|
|
|
if (feedIndex > feedList.length - 1) {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// 下一车次第一个饲料
|
|
|
|
|
feedIndex = 0;
|
|
|
|
|
//下一车次
|
|
|
|
|
trainIndex = Number(trainIndex) + 1;
|
2023-12-20 14:40:11 +08:00
|
|
|
|
// 没有下一个车次,饲喂完成
|
|
|
|
|
if (trainIndex > trainArr.length - 1) {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//班次饲喂结束
|
2023-12-20 14:40:11 +08:00
|
|
|
|
feedStatus = false
|
|
|
|
|
_feedNum = batchName+'次饲喂完成'
|
2023-11-03 16:30:27 +08:00
|
|
|
|
renderUnload();
|
2023-12-20 14:40:11 +08:00
|
|
|
|
renderLoad();
|
2023-11-03 16:30:27 +08:00
|
|
|
|
feedMyChart.setOption({
|
|
|
|
|
dataset: {
|
|
|
|
|
source: [[1, _feedNum]]
|
|
|
|
|
}
|
|
|
|
|
});
|
2023-12-20 14:40:11 +08:00
|
|
|
|
weightMyChart.setOption({
|
|
|
|
|
dataset: {
|
|
|
|
|
source: [[1, nowWeight]]
|
|
|
|
|
}
|
|
|
|
|
});
|
2024-02-01 10:44:54 +08:00
|
|
|
|
document.getElementById('submitData').setAttribute("class", 'btnc mui-btn-success dis');
|
|
|
|
|
document.getElementById('feedNum').innerHTML = batchName + '次' + '饲喂完成';
|
|
|
|
|
//发送饲喂结束给LED屏幕
|
2023-12-20 14:40:11 +08:00
|
|
|
|
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: ''
|
|
|
|
|
};
|
2024-02-01 10:44:54 +08:00
|
|
|
|
let newmsg = batchName + '次';
|
|
|
|
|
//隐藏提交按钮,显示班次饲喂完成,停止蜂鸣器所有状态
|
|
|
|
|
let msglen = newmsg.getByteLen();
|
2023-12-20 14:40:11 +08:00
|
|
|
|
if (msglen < 8) {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
for (i = 0; i < 8 - msglen; i++) {
|
2023-12-20 14:40:11 +08:00
|
|
|
|
newmsg = newmsg + ' ';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
param1.msg = newmsg + '饲喂完成';
|
|
|
|
|
zfk.getMsg(param1, function (ret, err) {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
if (!ret.status){
|
|
|
|
|
console.log(JSON.stringify(err));
|
|
|
|
|
}
|
|
|
|
|
let str = ret.sendMsg;
|
2023-12-20 14:40:11 +08:00
|
|
|
|
str = str.replace(/\s+/g, "");
|
2024-02-01 10:44:54 +08:00
|
|
|
|
let num = str.length / 2;
|
2023-12-20 14:40:11 +08:00
|
|
|
|
param.value = "FF0500" + num.toString(16) + str;
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// msgList.push(param.value);
|
|
|
|
|
execute(db, "INSERT INTO t_ble_msg (id,text) VALUES ("+new Date().getTime()+",'"+param.value+"');", function (ret, err) {})
|
2023-12-20 14:40:11 +08:00
|
|
|
|
})
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
console.log("停止蜂鸣");
|
|
|
|
|
control("00", "00");
|
|
|
|
|
},500)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// 存在下一车,自动点击下一车,并定位,同时刷新下一个开始装料时间
|
|
|
|
|
// document.getElementById('classeCode_' + classCode + 'train_' + trainIndex).click();
|
|
|
|
|
handleCarClick(document.getElementById('classeCode_' + classCode + 'train_' + trainIndex), classCode, trainIndex+1)
|
2023-12-20 14:40:11 +08:00
|
|
|
|
document.querySelector('#' + 'classeCode_' + classCode + 'train_' + trainIndex).scrollIntoView(true);
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//刷新装料时间
|
2023-12-20 14:40:11 +08:00
|
|
|
|
api.setGlobalData({key: 'startTime', value: currTimeFn(new Date())});
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// 有下一个饲料信息时,判断是否是圈舍
|
|
|
|
|
load = !feedList[feedIndex].batchRation;
|
|
|
|
|
// 清空所有饲料选择状态,设置下一个饲料选中状态
|
2023-12-20 14:40:11 +08:00
|
|
|
|
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;
|
2024-02-01 10:44:54 +08:00
|
|
|
|
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 = '<font style="color:red;font-size: x-large;">未校准</font>'
|
|
|
|
|
document.getElementById('nowFeed').innerHTML = '<font style="color:blue;margin-left:10px;">' + batchName + ',' + feedName + '</font>';
|
2023-12-20 14:40:11 +08:00
|
|
|
|
document.getElementById('submitData').innerHTML = '上传' + feedName;
|
|
|
|
|
if (load) {
|
|
|
|
|
document.getElementById('fix').innerHTML = '装料前校准';
|
2024-02-01 10:44:54 +08:00
|
|
|
|
document.getElementById('feedNum').innerHTML = '<font style="color:blue">:' + _planSum + '</font>/<font style="color:green">已装:' + _feedNum + '</font>';
|
2023-12-20 14:40:11 +08:00
|
|
|
|
} else {
|
|
|
|
|
document.getElementById('fix').innerHTML = '卸料前校准';
|
2024-02-01 10:44:54 +08:00
|
|
|
|
document.getElementById('feedNum').innerHTML = '<font style="color:blue">:' + _planSum + '</font>/<font style="color:green">已卸:' + _feedNum + '</font>';
|
2023-12-20 14:40:11 +08:00
|
|
|
|
}
|
|
|
|
|
renderUnload();
|
|
|
|
|
feedMyChart.setOption({
|
|
|
|
|
dataset: {
|
|
|
|
|
source: [[1, _feedNum]]
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
|
|
|
|
});
|
2023-12-20 14:40:11 +08:00
|
|
|
|
// 误差小于100必须校准才能自动跳转
|
|
|
|
|
allowAuto = false;
|
|
|
|
|
// setTimeout(() => {
|
|
|
|
|
console.log("停止蜂鸣");
|
|
|
|
|
control("00", "00");
|
|
|
|
|
setTimeout(function () {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
|
2023-12-20 14:40:11 +08:00
|
|
|
|
statusEle = false;
|
|
|
|
|
}, 500);
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取当前时间字符串
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
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;
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function uploadNotice() {
|
|
|
|
|
var notice = api.getPrefs({sync: true, key: 'notice'});
|
2024-02-01 10:44:54 +08:00
|
|
|
|
if (notice !== '' && noticeUpload) {
|
|
|
|
|
noticeUpload = false;
|
2023-10-19 15:00:17 +08:00
|
|
|
|
api.ajax({
|
|
|
|
|
url: 'https://tmr.nxcyx.com/api/app/tmr/noticeSave',
|
2024-02-01 10:44:54 +08:00
|
|
|
|
// url: 'http://192.168.0.107:8081/api/noticeSave',
|
2023-10-19 15:00:17 +08:00
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json;charset=utf-8' //建议key使用首字母大写的形式,如 User-Agent
|
|
|
|
|
},
|
|
|
|
|
method: 'post',
|
|
|
|
|
data: {
|
|
|
|
|
body: notice
|
|
|
|
|
}
|
|
|
|
|
}, function (ret, err) {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
if (ret && ret.code === 200) {
|
2023-10-19 15:00:17 +08:00
|
|
|
|
api.removePrefs({
|
|
|
|
|
key: 'notice'
|
|
|
|
|
});
|
|
|
|
|
} else if (err) {
|
|
|
|
|
mui.toast("noticeSave:" + err.msg);
|
|
|
|
|
}
|
2024-02-01 10:44:54 +08:00
|
|
|
|
noticeUpload = true;
|
2023-10-19 15:00:17 +08:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
//上传实时总重量
|
2023-10-19 15:00:17 +08:00
|
|
|
|
function uploadTotalWeight() {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
2024-02-01 10:44:54 +08:00
|
|
|
|
}, function (ret, err) {
|
|
|
|
|
if (ret && ret.code === 200) {
|
|
|
|
|
totalList = [];
|
|
|
|
|
} else if (err) {
|
|
|
|
|
mui.toast("totalWeightUpload" + err.msg);
|
|
|
|
|
}
|
|
|
|
|
totalUpload = true;
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加异常通知
|
2023-11-10 09:34:34 +08:00
|
|
|
|
* @param type
|
|
|
|
|
* @param color
|
2024-02-01 10:44:54 +08:00
|
|
|
|
* @param describe
|
2023-10-19 15:00:17 +08:00
|
|
|
|
*/
|
2023-11-10 09:34:34 +08:00
|
|
|
|
function addNotice(type,color,describe) {
|
2023-10-19 15:00:17 +08:00
|
|
|
|
var param = {
|
|
|
|
|
sourceCow: api.getPrefs({sync: true, key: 'sourceCow'}),
|
2023-11-10 09:34:34 +08:00
|
|
|
|
type: type?type:4,
|
|
|
|
|
color: color?color:'red',
|
2023-10-19 15:00:17 +08:00
|
|
|
|
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')));
|
|
|
|
|
}
|
|
|
|
|
}]
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
function makeTextFeed() {
|
2023-10-27 09:13:06 +08:00
|
|
|
|
if (isNaN(_feedNum )) {
|
|
|
|
|
return batchName + '次' + '\n' + '饲喂完成'
|
|
|
|
|
}else if (Math.abs(_planSum - _feedNum) >= 0) {
|
2023-10-19 15:00:17 +08:00
|
|
|
|
// 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';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
function renderLoad() {
|
2023-10-19 15:00:17 +08:00
|
|
|
|
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';
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-03 16:30:27 +08:00
|
|
|
|
function handleBackMain() {
|
|
|
|
|
mui.confirm('确认返回到首页?', '提示', btnArray, function (e) {
|
2023-11-07 16:59:38 +08:00
|
|
|
|
if (e.index === 0) {} else {
|
2023-11-03 16:30:27 +08:00
|
|
|
|
api.closeWin();
|
|
|
|
|
}
|
2023-10-19 15:00:17 +08:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function closeApp() {
|
|
|
|
|
mui.confirm('确认关闭TMR饲喂系统?', '提示', btnArray, function (e) {
|
2023-11-07 16:59:38 +08:00
|
|
|
|
if (e.index === 0) {} else {
|
2023-10-19 15:00:17 +08:00
|
|
|
|
api.closeWidget({
|
|
|
|
|
id: api.appId, //应用ID
|
|
|
|
|
retData: { name: 'closeWidget' },
|
|
|
|
|
silent: true
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-20 14:40:11 +08:00
|
|
|
|
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);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
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 = '<font style="color:red">' + '服务器异常' + '</font>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化班次信息
|
|
|
|
|
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 += '<button id="class_'+e.batch+'" class="btnc classes mui-btn-inline mui-btn-primary" type="button" onclick="handleClassClickH(this,' + '\'' + e.batch + '\')">' + e.name + '(' + e.start + '-' + e.end + ')</button>';
|
|
|
|
|
} else {
|
|
|
|
|
html += '<button id="class_'+e.batch+'" class="btnc classes mui-btn-inline" type="button" onclick="handleClassClickH(this,' + '\'' + e.batch + '\')">' + e.name + '(' + e.start + '-' + e.end + ')</button>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
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 = '<font style="color:red">班次加载失败</font>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化当前班次所有车次
|
|
|
|
|
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 += '<li id="classeCode_' + e.classCode + 'train_' + index + '" class="mui-table-view-cell trains" onclick="handleCarClickH(this,' + '\'' + e.classCode + '\',\'' + e.trainNumber + '\')">'+e.className + e.trainNumber + '(' + e.templetName + ')</li>';
|
|
|
|
|
} else {
|
|
|
|
|
html += '<li id="classeCode_' + e.classCode + 'train_' + index + '" class="mui-table-view-cell" onclick="handleCarClickH(this,' + '\'' + e.classCode + '\',\'' + e.trainNumber + '\')">'+e.className + e.trainNumber + '(' + e.templetName + ')</li>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
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 = '<font style="color:red">车次加载失败</font>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化当前车次饲料信息
|
|
|
|
|
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 += '<span id="feed_' + index + '" class="mui-badge mui-badge-purple" style="font-size: xx-large;font-weight: 900;">' + UNICODE_CHARS[index + 1] + j.name + ':' + Number(j.weight).toFixed(0) + '</span>';
|
|
|
|
|
} else {
|
|
|
|
|
html += '<span id="feed_' + index + '" class="mui-badge" style="font-size: xx-large;font-weight: 900;">' + UNICODE_CHARS[index + 1] + j.name + ':' + Number(j.weight).toFixed(0) + '</span>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
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 = '<font style="color:red;font-size: x-large;">未校准</font>'
|
|
|
|
|
document.getElementById('nowFeed').innerHTML = '<font style="color:blue;margin-left:10px; ">' + e.className + e.trainNumber + ',' + feedName + '</font>';
|
|
|
|
|
document.getElementById('text').innerHTML = 'V' + api.appVersion+'Ble';
|
|
|
|
|
if (load) {
|
|
|
|
|
document.getElementById('feedNum').innerHTML = '<font style="color:blue">:' + _planSum + '</font>/<font style="color:green">已装:' + _feedNum + '</font>';
|
|
|
|
|
}else{
|
|
|
|
|
document.getElementById('feedNum').innerHTML = '<font style="color:blue">:' + _planSum + '</font>/<font style="color:green">已卸:' + _feedNum + '</font>';
|
|
|
|
|
}
|
|
|
|
|
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 = '<font style="color:red">装料信息加载失败</font>';
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 15:00:17 +08:00
|
|
|
|
// 以下是一个基于JavaScript的称重异常过滤程序示例,该程序使用滑动窗口算法来过滤异常值:
|
|
|
|
|
// 该程序使用一个dataBuffer数组来保存最近的一组测量值,并返回这组值的平均值。程序在filter方法中,将新的测量值加入到dataBuffer中,并调用getAverageValue方法获取平均值。如果该平均值与上一个有效值的偏差小于maxDeviation,则将该测量值视为有效值,并返回该平均值;否则将该测量值视为异常值,并返回上一个有效值。
|
|
|
|
|
// 使用时,可以创建一个WeightDataFilter实例并调用filter方法来传入新的测量值,如下所示:
|
|
|
|
|
// let weightDataFilter = new WeightDataFilter(10, 0.5);
|
|
|
|
|
// let filteredValue = weightDataFilter.filter(measurementValue);
|
|
|
|
|
|
|
|
|
|
// 其中,10是窗口大小,0.5是最大的偏差值,可以根据实际需求进行调整。measurementValue是当前的测量值。
|
2023-10-20 10:52:35 +08:00
|
|
|
|
"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"); } }
|
|
|
|
|
|
2024-02-01 10:44:54 +08:00
|
|
|
|
let WeightDataFilter = function () {
|
2023-10-20 10:52:35 +08:00
|
|
|
|
function WeightDataFilter(windowSize, maxDeviation) {
|
|
|
|
|
_classCallCheck(this, WeightDataFilter);
|
|
|
|
|
|
2023-10-19 15:00:17 +08:00
|
|
|
|
this.windowSize = windowSize;
|
|
|
|
|
this.maxDeviation = maxDeviation;
|
|
|
|
|
this.dataBuffer = [];
|
|
|
|
|
this.lastValidValue = NaN;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-20 10:52:35 +08:00
|
|
|
|
_createClass(WeightDataFilter, [{
|
|
|
|
|
key: "filter",
|
|
|
|
|
value: function filter(value) {
|
|
|
|
|
if (this.dataBuffer.length > this.windowSize) {
|
|
|
|
|
this.dataBuffer.shift();
|
|
|
|
|
}
|
2024-02-01 10:44:54 +08:00
|
|
|
|
this.dataBuffer.push(value);
|
|
|
|
|
let filteredValue = this.getAverageValue();
|
2023-10-20 10:52:35 +08:00
|
|
|
|
if (isNaN(this.lastValidValue) || Math.abs(filteredValue - this.lastValidValue) <= this.maxDeviation) {
|
|
|
|
|
this.lastValidValue = filteredValue;
|
|
|
|
|
return filteredValue;
|
|
|
|
|
} else {
|
|
|
|
|
return this.lastValidValue;
|
|
|
|
|
}
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
2023-10-20 10:52:35 +08:00
|
|
|
|
}, {
|
|
|
|
|
key: "getAverageValue",
|
|
|
|
|
value: function getAverageValue() {
|
2024-02-01 10:44:54 +08:00
|
|
|
|
let sum = this.dataBuffer.reduce(function (total, value) {
|
2023-10-20 10:52:35 +08:00
|
|
|
|
return total + value;
|
|
|
|
|
}, 0);
|
|
|
|
|
return sum / this.dataBuffer.length;
|
2023-10-19 15:00:17 +08:00
|
|
|
|
}
|
2023-10-20 10:52:35 +08:00
|
|
|
|
}]);
|
2023-10-19 15:00:17 +08:00
|
|
|
|
|
2023-10-20 10:52:35 +08:00
|
|
|
|
return WeightDataFilter;
|
|
|
|
|
}();
|