app-xiangsonghua/app-saas-src/script/feature/rtData.js
2024-12-26 17:00:06 +08:00

646 lines
18 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}