646 lines
18 KiB
JavaScript
646 lines
18 KiB
JavaScript
var prId = -1;
|
||
var serverId = -1;
|
||
var serverIp; //实时数据服务器的ip
|
||
var rtDataServerAddr;
|
||
var rtDataServerAddrTemplate = "ws://{ip}:{port}/GetFrameViewRTDataRapidly";
|
||
var websocket;
|
||
var varList; // 保留原始的点信息
|
||
var varInfoList; //实时值的索引
|
||
var varValueList; //实时值的dom元素
|
||
|
||
var locName; //高压侧
|
||
var ctValue; //1:高压侧、2:低压侧、3:变压器、4:直流屏
|
||
var ddNumber; //201
|
||
var varType; //AI DI
|
||
var varTypeName; //遥测 遥信
|
||
var isDi = false;
|
||
var currentType = { // 当前点击查看曲线的数据类型
|
||
index: 1, // 索引
|
||
type: null, // 类型 eg频率
|
||
unit: '', // 单位i
|
||
};
|
||
var cusId = $api.getStorage('cusId');
|
||
var prIdList = [];
|
||
times: []; // 存放图表时间轴的值
|
||
values: []; // 存放图表每个时刻的历史值
|
||
realChart: {}; // 实时数据的图表
|
||
realChartOption: {}; // 实时数据图表配置项
|
||
/**
|
||
* 显示右侧边栏
|
||
*/
|
||
function showRightPanel() {
|
||
api.openDrawerPane({
|
||
type: 'right'
|
||
});
|
||
}
|
||
/**
|
||
* 界面显示完成后的回调
|
||
*/
|
||
function viewAppear(ret, err) {
|
||
//获取prId
|
||
var powerRoom = $api.getStorage('powerRoom');
|
||
if (powerRoom) {
|
||
// 获取服务器配置
|
||
prId = powerRoom.prId;
|
||
var configId = powerRoom.configId;
|
||
|
||
if (!configId || configId < 0) {
|
||
toast("获取配电室信息失败");
|
||
return false;
|
||
}
|
||
//获取serverId
|
||
var url = "/admin/rest/api/config/server/" + configId;
|
||
$api.get(url, {}, function(data, err) {
|
||
if (err) {
|
||
toast("网络请求失败");
|
||
} else {
|
||
if (!data.code || data.code != 200) {
|
||
toast("服务器响应错误" + (data.code ? (",错误码:" + data.code) : ""));
|
||
} else {
|
||
// edit start 2019/12/16 kangzhi
|
||
// serverIp = data.body.dataServiceIp;
|
||
// serverPort = data.body.rtPort;
|
||
serverIp = data.body.realTimeIp;
|
||
serverPort = data.body.realTimePort;
|
||
// edit end 2019/12/16 kangzhi
|
||
rtDataServerAddr = rtDataServerAddrTemplate.replace("{ip}", serverIp).replace("{port}", serverPort);
|
||
//通知侧栏开始加载数据
|
||
api.sendEvent({
|
||
name: "rtDataLoadData"
|
||
});
|
||
// 初始化图表
|
||
initChart();
|
||
}
|
||
}
|
||
});
|
||
|
||
} else {
|
||
toast("无法获取配电室相关信息");
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 右侧边栏的筛选条件发生变化
|
||
*/
|
||
function filterSelectionChanged(ret, err) {
|
||
var result = ret.value;
|
||
locName = result.locName;
|
||
ctValue = result.ctValue;
|
||
ddNumber = result.ddNumber;
|
||
varType = result.varType;
|
||
varTypeName = result.varTypeName;
|
||
|
||
$("#btn-location").attr("value", locName);
|
||
$("#btn-ddnumber").attr("value", (ddNumber ? ddNumber : "-"));
|
||
|
||
if (varType == "1") {
|
||
isDi = false;
|
||
$('.chart-content').show();
|
||
} else {
|
||
isDi = true;
|
||
$('.chart-content').hide();
|
||
}
|
||
|
||
$("#btn-type").attr("value", varTypeName);
|
||
|
||
if (ddNumber) {
|
||
//加载实时值的列表
|
||
initVarList();
|
||
} else {
|
||
//该分类下唔调度号
|
||
toast("请选择查询条件");
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/**
|
||
* 弹出提示框
|
||
*/
|
||
function toast(msg) {
|
||
api.toast({
|
||
msg: msg,
|
||
duration: 3000,
|
||
locaiton: 'top'
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 根据id清空所有子元素
|
||
*/
|
||
function clearAllChildren(id) {
|
||
var tobeRemoved = $("#" + id);
|
||
tobeRemoved.empty();
|
||
}
|
||
|
||
/**
|
||
* 初始化变量列表
|
||
*/
|
||
function initVarList() {
|
||
var tmpVarInfoList = [];
|
||
var tmpVarValueList = [];
|
||
//清空界面上的变量列表
|
||
clearAllChildren("rtlist");
|
||
|
||
if (prId < 0) {
|
||
return;
|
||
}
|
||
var url = '/ems/rest/var/page';
|
||
var args;
|
||
if (varType == "1") { //AI
|
||
$("#data-table").removeClass("di-table").addClass("ai-table");
|
||
$("#table-header").removeClass("di-table").addClass("ai-table");
|
||
args = {
|
||
prId: prId,
|
||
ddNum: ddNumber,
|
||
location: ctValue,
|
||
varType: varType,
|
||
page: 1,
|
||
pageSize: 999999
|
||
};
|
||
|
||
} else {
|
||
$("#data-table").removeClass("ai-table").addClass("di-table");
|
||
$("#table-header").removeClass("ai-table").addClass("di-table");
|
||
args = {
|
||
prId: prId,
|
||
ddNum: ddNumber,
|
||
location: ctValue,
|
||
varType: varType,
|
||
page: 1,
|
||
pageSize: 999999,
|
||
filterDI: true // 筛选DI点
|
||
};
|
||
}
|
||
api.showProgress({
|
||
title: '数据加载中',
|
||
text: '请稍等',
|
||
modal: true
|
||
});
|
||
|
||
$api.get(url, args, function(data, err) {
|
||
api.hideProgress();
|
||
if (err) {
|
||
toast("网络请求失败");
|
||
} else {
|
||
if (!data.code || data.code != "200") {
|
||
toast("服务器响应错误" + (data.code ? (",错误码:" + data.code) : ""));
|
||
} else {
|
||
var tbody = $("#rtlist"); //表格主体
|
||
if (data.body && data.body.records.length) {
|
||
$('#empty-tips').hide();
|
||
varList = data.body.records;
|
||
var purpose = null;
|
||
for (var i = 0; i < varList.length; i++) {
|
||
var element = varList[i];
|
||
var trDom = '<tr data-index=' + i + '></tr>'
|
||
var tr = $(trDom);
|
||
var tdValue = $("<td></td>");
|
||
var tagName;
|
||
|
||
var cname = element.varCnName;
|
||
try {
|
||
|
||
var lastSpaceIndex = cname.lastIndexOf(' ');
|
||
tagName = cname.slice(lastSpaceIndex + 1);
|
||
|
||
if (!purpose) {
|
||
|
||
purpose = cname.slice(0, lastSpaceIndex);
|
||
//修改用途的名称
|
||
$("#purpose").text(purpose);
|
||
}
|
||
|
||
} catch (e) {
|
||
tagName = '';
|
||
}
|
||
|
||
tr.append("<td>" + tagName + "</td>");
|
||
tr.append(tdValue);
|
||
tr.append("<td>" + (element.unit ? element.unit : "") + "</td>");
|
||
tr.append("<td class='enableClick view-chart'>点击查看</td>");
|
||
tbody.append(tr);
|
||
|
||
//保留变量的索引及类型
|
||
// tmpVarInfoList.push({
|
||
// index: element.varIndex,
|
||
// type: element.varType
|
||
// });
|
||
// add s 2023/8/25
|
||
var flag = prIdList.indexOf(prId + '') == -1? false : true;
|
||
if (flag) {
|
||
tmpVarInfoList.push({
|
||
index: element.varName,
|
||
type: element.varType
|
||
});
|
||
} else {
|
||
tmpVarInfoList.push({
|
||
index: element.varIndex,
|
||
type: element.varType
|
||
});
|
||
}
|
||
// add e 2023/8/25
|
||
//保留这个dom元素,当接收实时值的时候使用
|
||
tmpVarValueList.push(tdValue);
|
||
|
||
|
||
}
|
||
varInfoList = tmpVarInfoList;
|
||
varValueList = tmpVarValueList;
|
||
// 默认选中表格中的第一行(AI点)
|
||
if (varType == 1) {
|
||
var currentTd = tbody.find('.enableClick').eq(0);
|
||
currentTd.addClass('disableClick');
|
||
getCurrentTrData(currentTd);
|
||
}
|
||
|
||
//初始化WebSocket
|
||
if (websocket) {
|
||
//初始化webSocket的索引
|
||
sendVarInfoList();
|
||
} else {
|
||
connectAndInitParams();
|
||
}
|
||
|
||
}else{
|
||
|
||
$('#empty-tips').show();
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 建立WebSocket连接并初始化索引参数
|
||
*/
|
||
function connectAndInitParams() {
|
||
shutdownWebSocket();
|
||
// add start 2023/8/25
|
||
var flag = prIdList.indexOf(prId + '') == -1? false : true;
|
||
if (flag) { // MQTT 客户使用新实时数据
|
||
rtDataServerAddr = 'wss://cdyapi.saas.dianwutong.com/mqtt/websocket'
|
||
}
|
||
// add end 2023/8/25
|
||
setTimeout(function() {
|
||
websocket = new WebSocket(rtDataServerAddr);
|
||
websocket.binaryType = 'arraybuffer';
|
||
websocket.onopen = onOpen;
|
||
websocket.onerror = onError;
|
||
websocket.onmessage = onMessage;
|
||
websocket.onclose = onClose;
|
||
}.bind(this), 0);
|
||
}
|
||
|
||
/**
|
||
* 断开WebSocket连接
|
||
*/
|
||
function shutdownWebSocket() {
|
||
try {
|
||
if (websocket) {
|
||
websocket.close();
|
||
}
|
||
} catch (error) {
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 发送初始化webSocket的索引的请求
|
||
*/
|
||
function sendVarInfoList() {
|
||
try {
|
||
websocket.send(JSON.stringify({
|
||
code: 0,
|
||
Indexs: varInfoList
|
||
}));
|
||
} catch (error) {
|
||
toast(JSON.stringify(error));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 发送获取变量值的请求
|
||
*/
|
||
function sendGetVarValueRequset() {
|
||
try {
|
||
websocket.send(JSON.stringify({
|
||
code: 1
|
||
}));
|
||
} catch (error) {
|
||
toast(JSON.stringify(error));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* WebSocket连接建立成功,初始化索引
|
||
* @param {*} evt
|
||
*/
|
||
function onOpen(evt) {
|
||
times = [];
|
||
values = [];
|
||
sendVarInfoList();
|
||
}
|
||
|
||
/**
|
||
* 对实时数据服务器返回的数据进行解析
|
||
* @param {*} evt
|
||
*/
|
||
function onMessage(evt) {
|
||
var response = JSON.parse(evt.data);
|
||
if (response.code == 0) {
|
||
for (var i = 0; i < varValueList.length && i < response.Values.length; i++) {
|
||
var domVarValue = varValueList[i];
|
||
if (response.Values[i] != null) {
|
||
if (isDi) {
|
||
//0是分,1是合
|
||
|
||
domVarValue.html(response.Values[i] < 0.5 ? varList.zeroDefine || '分' : varList.oneDefine || '合');
|
||
} else {
|
||
domVarValue.html(response.Values[i].toFixed(2));
|
||
}
|
||
} else {
|
||
domVarValue.html("-");
|
||
}
|
||
|
||
}
|
||
if(!isDi) {
|
||
// 此时选中类型的value值
|
||
var value = response.Values[currentType.index];
|
||
// 获取图表需要的数据
|
||
getChartData(value);
|
||
}
|
||
setTimeout(sendGetVarValueRequset, 5000); //5秒后再次请求数据
|
||
} else {
|
||
toast("实时数据服务器报告了一个错误,错误码:" + response.code + ",原因:" + response.result);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 连接断开,5秒后重试连接
|
||
* @param {*} evt
|
||
*/
|
||
function onError(evt) {
|
||
toast("实时数据连接意外断开,正在重新连接...");
|
||
setTimeout(function() {
|
||
connectAndInitParams();
|
||
}, 5000);
|
||
}
|
||
|
||
function onClose(evt) {
|
||
|
||
}
|
||
|
||
/**
|
||
* 应用程序进入后台
|
||
* 断开WebSocket连接
|
||
*/
|
||
function onPause(ret, err) {
|
||
shutdownWebSocket();
|
||
}
|
||
|
||
/**
|
||
* 应用程序恢复前台
|
||
* 重新连接WebSocket
|
||
*/
|
||
function onResume(ret, err) {
|
||
connectAndInitParams();
|
||
}
|
||
// 初始化图表
|
||
function initChart() {
|
||
realChartOption = {
|
||
title: {
|
||
show: true,
|
||
text: '',
|
||
left: 'center',
|
||
top: 'top',
|
||
textStyle: {
|
||
fontSize: 14,
|
||
fontWeight: 'normal'
|
||
}
|
||
},
|
||
grid: {
|
||
left: '3%',
|
||
right: '9%',
|
||
bottom: '10%',
|
||
top: "15%",
|
||
containLabel: true
|
||
},
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
axisPointer: {
|
||
animation: false
|
||
},
|
||
position: function(pos, params, el, elRect, size) {
|
||
var obj = {
|
||
top: 10
|
||
};
|
||
obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30;
|
||
return obj;
|
||
}
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
splitLine: {
|
||
show: true
|
||
},
|
||
axisTick: {
|
||
inside: true
|
||
},
|
||
boundaryGap: ['0%', '100%'],
|
||
axisLabel: {
|
||
margin:12
|
||
},
|
||
data: []
|
||
},
|
||
yAxis: {
|
||
name: '',
|
||
nameTextStyle: {
|
||
color: '#5a5a5a'
|
||
},
|
||
type: 'value',
|
||
splitLine: {
|
||
show: true
|
||
},
|
||
axisTick: false,
|
||
min: 'dataMin'
|
||
},
|
||
series: []
|
||
}
|
||
realChart = echarts.init(document.getElementById('chart'));
|
||
realChart.setOption(realChartOption);
|
||
}
|
||
|
||
// 根据点击查看曲线按钮 获取相应的索引,类型,单位
|
||
function getCurrentTrData(td) {
|
||
values = [];
|
||
times = [];
|
||
var currentTr = td.parent();
|
||
var index = $(currentTr).data('index');
|
||
var tds = $(currentTr).children();
|
||
if (currentType[index] == index) {
|
||
return;
|
||
}
|
||
currentType = {
|
||
index: index,
|
||
type: tds.eq(0).text(),
|
||
unit: tds.eq(2).text()
|
||
}
|
||
}
|
||
|
||
function getChartData(currentValue) {
|
||
if (isNaN(currentValue)) {
|
||
currentValue = 0;
|
||
}
|
||
var time = new Date().getTime();
|
||
var dateUtil = new DateUtils();
|
||
var now = dateUtil.getFormattedDate('MM-dd hh:mm:ss', time);
|
||
now = now.toString();
|
||
var nowArr = now.split(' ');
|
||
now = nowArr[1] +'\n' + nowArr[0];
|
||
// y轴的值
|
||
var data = {
|
||
name: now.toString(),
|
||
value: currentValue
|
||
}
|
||
// 设置title
|
||
realChartOption.title.text = currentType.type;
|
||
// 设置单位
|
||
realChartOption.yAxis.name = '单位: ' + (currentType.unit ? currentType.unit : '无');
|
||
// 设置y轴
|
||
values.push(data);
|
||
realChartOption.series = [{
|
||
name: currentType.type,
|
||
type: 'line',
|
||
showSymbol: false,
|
||
hoverAnimation: false,
|
||
data: values,
|
||
lineStyle: {
|
||
width:1
|
||
}
|
||
}]
|
||
|
||
// 设置x轴
|
||
times.push(now);
|
||
realChartOption.xAxis.data = times;
|
||
api.hideProgress();
|
||
realChart.setOption(realChartOption);
|
||
}
|
||
|
||
apiready = function() {
|
||
var ctrl = {
|
||
init: {},
|
||
bind: {}
|
||
}
|
||
|
||
ctrl.init = function() {
|
||
this.initLayout();
|
||
// 适配安卓状态栏
|
||
CommonModel.fitInStatusBar();
|
||
ctrl.bind();
|
||
|
||
// 获取 MQTT 上线配电室列表
|
||
var url = '/mqtt/tb-mqtt-client/getMqttPr';
|
||
|
||
$api.get(url, function(res, err) {
|
||
if (err) {
|
||
ctrl.toast("网络请求失败");
|
||
api.hideProgress();
|
||
} else {
|
||
if (!res.code || res.code != "200") {
|
||
ctrl.toast("服务器响应错误");
|
||
api.hideProgress();
|
||
} else {
|
||
prIdList = res.data.split(',');
|
||
|
||
//初始化与边栏的通信事件机制
|
||
//筛选条件发生变化
|
||
api.addEventListener({
|
||
name: 'filterSelectionChanged'
|
||
}, filterSelectionChanged);
|
||
//界面显示完成后的回调
|
||
api.addEventListener({
|
||
name: 'viewappear'
|
||
}, viewAppear);
|
||
api.addEventListener({
|
||
name: 'pause'
|
||
}, onPause);
|
||
api.addEventListener({
|
||
name: 'resume'
|
||
}, onResume);
|
||
}
|
||
}
|
||
});
|
||
|
||
//初始化与边栏的通信事件机制
|
||
//筛选条件发生变化
|
||
// api.addEventListener({
|
||
// name: 'filterSelectionChanged'
|
||
// }, filterSelectionChanged);
|
||
// //界面显示完成后的回调
|
||
// api.addEventListener({
|
||
// name: 'viewappear'
|
||
// }, viewAppear);
|
||
// api.addEventListener({
|
||
// name: 'pause'
|
||
// }, onPause);
|
||
// api.addEventListener({
|
||
// name: 'resume'
|
||
// }, onResume);
|
||
}
|
||
ctrl.initLayout = function() {
|
||
var panelHeight = $('#heightHeader').height();
|
||
$('.panel-height').css('height', panelHeight);
|
||
var headerHeight = $('#table-header').height();
|
||
$('.header-height').css('height', headerHeight);
|
||
}
|
||
ctrl.bind = function() {
|
||
//用户点击了返回按钮
|
||
$(".back").on("touchend", function() {
|
||
shutdownWebSocket();
|
||
api.closeWin();
|
||
});
|
||
|
||
//用户点击了手机的返回按键
|
||
api.addEventListener({
|
||
name: 'keyback'
|
||
}, function(ret, err) {
|
||
shutdownWebSocket();
|
||
api.closeWin();
|
||
});
|
||
|
||
//用户点击了位置按钮
|
||
$("#btn-location").on("touchend", function() {
|
||
showRightPanel();
|
||
});
|
||
|
||
//用户点击了调度号按钮
|
||
$("#btn-ddnumber").on("touchend", function() {
|
||
showRightPanel();
|
||
});
|
||
|
||
//用户点击了类型按钮
|
||
$("#btn-type").on("touchend", function() {
|
||
showRightPanel();
|
||
});
|
||
|
||
//用户点击了筛选按钮
|
||
$("#btn-filter").on("touchend", function() {
|
||
showRightPanel();
|
||
});
|
||
$('#rtlist').on('touchend', '.enableClick', function() {
|
||
$('.view-chart').removeClass('disableClick');
|
||
$(this).addClass('disableClick');
|
||
api.showProgress({
|
||
title: '数据加载中',
|
||
text: '请稍等',
|
||
modal: true
|
||
});
|
||
|
||
getCurrentTrData($(this));
|
||
})
|
||
}
|
||
|
||
ctrl.init();
|
||
}
|