You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
459 lines
13 KiB
459 lines
13 KiB
|
|
const dataResolve = function () {
|
|
return function (ret) {
|
|
const {
|
|
context, service, nodeId, dataPointStr, dynamicFlag,
|
|
dataSource, deviceCode, devices, enableDataHandle, deviceAttrs, calcRules, uniquePoint, dataPoint, attrs, callBacks
|
|
} = this.info
|
|
|
|
if (!dataPoint)
|
|
return
|
|
|
|
// 寻找匹配的设备和属性
|
|
const info = ret.data?.result.info || {}
|
|
const apiValues = ret.data?.result.values || []
|
|
let dataPointValue = ''
|
|
const dataPointArr = dataPoint.split(',')
|
|
const devicesArr = devices.split(',')
|
|
const deviceIdCodeMap = {}
|
|
const thingCodeArr = Object.keys(info).filter((code) => {
|
|
if (devicesArr.includes(info[code].entityId)) {
|
|
deviceIdCodeMap[info[code].entityId] = code
|
|
return true
|
|
}
|
|
else {
|
|
return false
|
|
}
|
|
})
|
|
if (dataPointArr.length > 0) {
|
|
const gotValues = apiValues.filter((val) => thingCodeArr.includes(val.thingCode) && dataPointArr.includes(val.attrKey))
|
|
if (enableDataHandle) {
|
|
dataPointValue = window.dataProcessFn({ info: this.info, apiid: this.apiid, defaultValueIndex: this.defaultValueIndex, values: gotValues, deviceIdCodeMap })
|
|
} else {
|
|
dataPointValue = JSON.stringify(gotValues)
|
|
}
|
|
}
|
|
if (dataPointValue && dataPointValue === '[]') {
|
|
return
|
|
}
|
|
const properties = context.getProperties(nodeId)
|
|
// console.log('dataPointValue', dataPointValue)
|
|
const defaultValueIndex = this.defaultValueIndex
|
|
if (defaultValueIndex !== undefined) {
|
|
const comboFlag = dynamicFlag === 'animationData' ? 'animationCombo' : 'hiddenCombo'
|
|
if (properties.dynamic[dynamicFlag][comboFlag]) {
|
|
properties.dynamic[dynamicFlag][comboFlag] = properties.dynamic[dynamicFlag][comboFlag].map((combo, idx) => {
|
|
if (idx === defaultValueIndex) {
|
|
combo.defaultValue = dataPointValue
|
|
combo.dataPointArr = dataPointArr
|
|
combo.thingCodeArr = thingCodeArr
|
|
}
|
|
|
|
return combo
|
|
})
|
|
context.setProperties(nodeId, {
|
|
...properties,
|
|
apiid: this.apiid,
|
|
dynamic: {
|
|
...properties.dynamic,
|
|
[dynamicFlag]: {
|
|
...properties.dynamic[dynamicFlag],
|
|
},
|
|
},
|
|
})
|
|
}
|
|
}
|
|
else {
|
|
context.setProperties(nodeId, {
|
|
...properties,
|
|
apiid: this.apiid,
|
|
dynamic: {
|
|
...properties.dynamic,
|
|
[dynamicFlag]: {
|
|
...properties.dynamic[dynamicFlag],
|
|
defaultValue: dataPointValue,
|
|
dataPointArr,
|
|
thingCodeArr,
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
callBacks.forEach(fn => {
|
|
fn(window.lf, nodeId)
|
|
});
|
|
}
|
|
}
|
|
|
|
// 绑定数据点处理到socket
|
|
let socketMap = {};
|
|
const bindSocket = (apiid, info, eventHandler) => {
|
|
if (!socketMap[apiid])
|
|
socketMap[apiid] = {}
|
|
|
|
if (socketMap[apiid]) {
|
|
if (!socketMap[apiid][info.nodeId])
|
|
socketMap[apiid][info.nodeId] = {}
|
|
|
|
socketMap[apiid][info.nodeId][info.dynamicFlag] = eventHandler.bind({ defaultValueIndex: info.defaultValueIndex, apiid, info })
|
|
}
|
|
}
|
|
|
|
// 处理socket 推送
|
|
const handleSocket = (Handlers, parsedData) => {
|
|
for (const nodeKey in Handlers) {
|
|
const nodeHandler = Handlers[nodeKey]
|
|
for (const dynamicKey in nodeHandler) {
|
|
const dataHandler = nodeHandler[dynamicKey]
|
|
if (typeof dataHandler === 'function') {
|
|
try {
|
|
dataHandler(parsedData)
|
|
}
|
|
catch (err) {
|
|
// console.log('err', err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 开启socket
|
|
const totalGlobalDatas = {};
|
|
window.totalHistoryDatas = {};
|
|
window.totalApiParams = {};
|
|
window.totalDeviceInfos = {};
|
|
window.historyDataApiIds = [];
|
|
|
|
// 用历史数据给文本部件赋值(某些业务场景,socket 数据不适用)
|
|
const filterHistoryDataToNode = function () {
|
|
return (apiid, info, apiValues, devices, enableDataHandle, dataPoint, nodeInfo) => {
|
|
if (!dataPoint)
|
|
return
|
|
|
|
if (!apiValues) {
|
|
return;
|
|
}
|
|
|
|
// 寻找匹配的设备和属性
|
|
let dataPointValue = '';
|
|
const dataPointArr = dataPoint.split(',')
|
|
const devicesArr = devices.split(',')
|
|
const deviceIdCodeMap = {};
|
|
const thingCodeArr = Object.keys(info).filter((code) => {
|
|
if (devicesArr.includes(info[code].entityId)) {
|
|
deviceIdCodeMap[info[code].entityId] = code
|
|
return true
|
|
}
|
|
else {
|
|
return false
|
|
}
|
|
})
|
|
if (dataPointArr.length > 0) {
|
|
const gotValues = apiValues.filter((val) => thingCodeArr.includes(val.thingCode) && dataPointArr.includes(val.attrKey))
|
|
if (enableDataHandle)
|
|
dataPointValue = (window).dataProcessFn({ info: nodeInfo, apiid, defaultValueIndex: 0, values: gotValues, deviceIdCodeMap })
|
|
|
|
else
|
|
dataPointValue = JSON.stringify(gotValues)
|
|
}
|
|
if (dataPointValue && dataPointValue === '[]')
|
|
return
|
|
|
|
return {
|
|
dataPointValue,
|
|
thingCodeArr,
|
|
dataPointArr,
|
|
}
|
|
}
|
|
}
|
|
|
|
// 设置历史数据给部件
|
|
var setHistoryData = function (apidid, context, nodeId, values, info, devices, enableDataHandle, dataPoint, nodeInfo) {
|
|
const ret = filterHistoryDataToNode()(apidid, info, values, devices, enableDataHandle, dataPoint, nodeInfo)
|
|
if(ret) {
|
|
const { dataPointValue: dataPointVal, thingCodeArr, dataPointArr } = ret
|
|
if (dataPointVal) {
|
|
const properties = context.getProperties(nodeId)
|
|
context.setProperties(nodeId, {
|
|
...properties,
|
|
apiid: apidid,
|
|
dynamic: {
|
|
...properties.dynamic,
|
|
[nodeInfo.dynamicFlag]: {
|
|
...properties.dynamic[nodeInfo.dynamicFlag],
|
|
defaultValue: dataPointVal,
|
|
thingCodeArr,
|
|
dataPointArr,
|
|
},
|
|
},
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
// 获取历史数据
|
|
var getHistoryDatas = async (apidid, service) => {
|
|
const ret = await service.get(`/v1/api/telemetryById?id=${apidid}`);
|
|
if (ret.data) {
|
|
window.totalHistoryDatas[apidid] = ret.data.result.values;
|
|
if (!window.totalApiParams[apidid]) {
|
|
window.totalApiParams[apidid] = ret.data.param;
|
|
}
|
|
window.totalDeviceInfos[apidid] = ret.data.result.info;
|
|
return ret.data.result.values;
|
|
}
|
|
}
|
|
|
|
var startSocket = (apiid, scriptCallbacks, service, isHistoryData) => {
|
|
if (!isHistoryData) {
|
|
if (socketMap[apiid]) {
|
|
return;
|
|
}
|
|
const host = window.isDeveloping ? '192.168.8.91:8080' : window.location.host;
|
|
const token = sessionStorage.getItem('token') || '';
|
|
const socketUrl = `ws://${host}/thing/websocket?token=${token}&apiId=${apiid}`;
|
|
const socket = new WebSocket(socketUrl);
|
|
|
|
socket.onopen = function (e) {
|
|
if (!socketMap[apiid]) {
|
|
socketMap[apiid] = {};
|
|
};
|
|
};
|
|
|
|
socket.onmessage = function (event) {
|
|
if (!event.data) {
|
|
return;
|
|
}
|
|
const parsedData = JSON.parse(event.data);
|
|
for (const apiKey in socketMap) {
|
|
if (apiKey === apiid) {
|
|
const Handlers = socketMap[apiKey]
|
|
handleSocket(Handlers, parsedData)
|
|
if (Object.keys(Handlers).length === 0) {
|
|
setTimeout(() => {
|
|
handleSocket(socketMap[apiKey], parsedData)
|
|
}, 1000)
|
|
}
|
|
}
|
|
}
|
|
Promise.resolve().then(() => {
|
|
totalGlobalDatas[apiid] = parsedData.data.result;
|
|
// 全局设备信息挂载
|
|
window.globalDashboardDatas = totalGlobalDatas;
|
|
scriptCallbacks.forEach((callBack) => {
|
|
callBack(totalGlobalDatas)
|
|
})
|
|
})
|
|
};
|
|
|
|
socket.onclose = function (event) {
|
|
socketMap[apiid] = 0;
|
|
if (event.wasClean) {
|
|
// alert(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`)
|
|
}
|
|
else {
|
|
// 例如服务器进程被杀死或网络中断
|
|
// 在这种情况下,event.code 通常为 1006
|
|
// alert('[close] Connection died')
|
|
}
|
|
};
|
|
|
|
socket.onerror = function (error) {
|
|
socketMap[apiid] = 0
|
|
// alert(`[error] ${error.message}`)
|
|
};
|
|
} else {
|
|
window.historyDataApiIds.push(apiid);
|
|
getHistoryDatas(apiid, service);
|
|
|
|
setInterval(() => {
|
|
getHistoryDatas(apiid, service)
|
|
}, 30000)
|
|
}
|
|
}
|
|
|
|
// 绑定 api 请求(下拉选择框请求会用到,或其它类似有api 请求的部件)
|
|
const bindApiRequest = async (info) => {
|
|
const { context, nodeId, service, dataPoint, dataFilterFn, requestMethod, requestParams = 'return {};' } = info
|
|
if (!dataPoint)
|
|
return
|
|
|
|
// eslint-disable-next-line no-new-func
|
|
const paramFn = new Function('', requestParams)
|
|
const paramObj = paramFn()
|
|
let ret = null
|
|
|
|
if (!paramObj || window._.isEmpty(paramObj)) {
|
|
ret = await service[requestMethod || 'get'](dataPoint)
|
|
} else {
|
|
ret = await service[requestMethod || 'get'](dataPoint, paramObj)
|
|
}
|
|
|
|
if (ret.code === 0 && (ret.data || ret.data.list)) {
|
|
const datas = ret.data || ret.data.list
|
|
if (datas) {
|
|
try {
|
|
let newDatas = []
|
|
if (datas.length > 0) {
|
|
// eslint-disable-next-line no-new-func
|
|
const filterFn = new Function('datas', dataFilterFn)
|
|
newDatas = filterFn(datas)
|
|
} else if (datas.result && datas.result.info) {
|
|
// eslint-disable-next-line no-new-func
|
|
const filterFn = new Function('datas', dataFilterFn)
|
|
newDatas = filterFn(datas.result.info)
|
|
} else if (Object.prototype.toString.call(datas) === '[object Object]') {
|
|
// eslint-disable-next-line no-new-func
|
|
const filterFn = new Function('datas', dataFilterFn)
|
|
newDatas = filterFn(datas)
|
|
}
|
|
const isEmptyData = (window)._.isEmpty(newDatas)
|
|
if (!isEmptyData) {
|
|
const properties = context.getProperties(nodeId)
|
|
context.setProperties(nodeId, {
|
|
...properties,
|
|
dynamic: {
|
|
...properties.dynamic,
|
|
normalData: {
|
|
...properties.dynamic.normalData,
|
|
defaultOptions: JSON.stringify(newDatas),
|
|
customApiDatas: newDatas
|
|
},
|
|
},
|
|
})
|
|
}
|
|
}
|
|
catch (error) {
|
|
}
|
|
}
|
|
} else {
|
|
if (ret.code === 401) {
|
|
window.createLoginDialog();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
var dataPointsHandlers = async (context, service, nodeId, dataPointStr, dynamicFlag = 'normalData', callBacks, index) => {
|
|
if (!dataPointStr)
|
|
return
|
|
|
|
if (window.isJSON(dataPointStr)) {
|
|
const dataPointStrParsed = JSON.parse(dataPointStr || '{}')
|
|
const { dataSource, deviceCode, dataPoint, attrs, devices, enableDataHandle, deviceAttrs, calcRules, uniquePoint } = dataPointStrParsed;
|
|
|
|
const nodeInfo = {
|
|
context,
|
|
service,
|
|
nodeId,
|
|
dataPointStr,
|
|
dynamicFlag,
|
|
dataSource,
|
|
deviceCode,
|
|
devices,
|
|
enableDataHandle,
|
|
deviceAttrs,
|
|
calcRules,
|
|
uniquePoint,
|
|
dataPoint,
|
|
attrs,
|
|
callBacks,
|
|
defaultValueIndex: index,
|
|
};
|
|
|
|
// 如果是历史数据, 则直接请求数据
|
|
if (window.historyDataApiIds.includes(dataSource)) {
|
|
const values = window.totalHistoryDatas[dataSource]
|
|
if (window.totalHistoryDatas[dataSource]) {
|
|
const info = window.totalDeviceInfos[dataSource];
|
|
setHistoryData(dataSource, context, nodeId, values, info, devices, enableDataHandle, dataPoint, nodeInfo);
|
|
} else {
|
|
const values = await getHistoryDatas(dataSource, service);
|
|
const info = window.totalDeviceInfos[dataSource];
|
|
setHistoryData(dataSource, context, nodeId, values, info, devices, enableDataHandle, dataPoint, nodeInfo)
|
|
}
|
|
} else {
|
|
bindSocket(dataSource, nodeInfo, dataResolve())
|
|
}
|
|
|
|
} else {
|
|
// 绑定 api 请求。
|
|
const props = context.getProperties(nodeId);
|
|
if (!props) return;
|
|
const { normalData } = props.dynamic || {}
|
|
if (normalData) {
|
|
const { dataPoint, dataFilterFn, requestMethod, requestParams } = normalData;
|
|
if (window.isJSON(dataPoint)) {
|
|
return;
|
|
}
|
|
bindApiRequest({
|
|
context,
|
|
nodeId,
|
|
service,
|
|
dataPoint,
|
|
dataFilterFn,
|
|
requestMethod,
|
|
requestParams,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// 连线数据解析
|
|
var edgeDataResolve = function () {
|
|
return function (ret) {
|
|
const {
|
|
context, service, edgeId, dataPointStr, dynamicFlag,
|
|
dataSource, deviceCode, dataPoint, attrs, callBacks,
|
|
} = (this).info
|
|
|
|
if (!dataPoint)
|
|
return
|
|
|
|
// 寻找匹配的设备和属性
|
|
const apiValues = ret.data?.result.values || []
|
|
let dataPointValue = ''
|
|
|
|
if (dataPoint.length > 0) {
|
|
const gotValues = apiValues.filter((val) => val.thingCode === deviceCode && dataPoint.includes(val.attrKey))
|
|
dataPointValue = JSON.stringify(gotValues)
|
|
}
|
|
if (dataPointValue && dataPointValue === '[]')
|
|
return
|
|
|
|
const properties = context.getProperties(edgeId)
|
|
context.setProperties(edgeId, {
|
|
...properties,
|
|
defaultValue: dataPointValue,
|
|
})
|
|
}
|
|
}
|
|
|
|
// 连线数据处理
|
|
var edgeDataPointHandler = (context, service, edgeId, dataPointStr, dynamicFlag) => {
|
|
if (!edgeId)
|
|
return
|
|
if (!dataPointStr)
|
|
return
|
|
const dataPointStrParsed = JSON.parse(dataPointStr || '{}')
|
|
const { dataSource, deviceCode, dataPoint, attrs, devices, enableDataHandle, deviceAttrs, calcRules, uniquePoint } = dataPointStrParsed
|
|
|
|
bindSocket(dataSource, {
|
|
context,
|
|
service,
|
|
edgeId,
|
|
dataPointStr,
|
|
dynamicFlag,
|
|
dataSource,
|
|
deviceCode,
|
|
devices,
|
|
enableDataHandle,
|
|
deviceAttrs,
|
|
calcRules,
|
|
uniquePoint,
|
|
dataPoint,
|
|
attrs,
|
|
defaultValueIndex: 0,
|
|
}, edgeDataResolve())
|
|
}
|