jsy-app/utils/deviceUtil/dc.js
2024-09-26 18:52:14 +08:00

1260 lines
34 KiB
JavaScript
Raw 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.

import {
alone,
presentStationData
} from "@/utils/deviceUtil/js/baseStation.js"
import {
flapValveControl,
flapValvePreload,
threeWayValveControl,
threeWayValvePreload,
fiveWayValveControl,
getValveAngleConfig,
calcEndTime
} from "@/utils/deviceUtil/js/valveNew.js"
const msgType = {
default: 0,
ok: 1,
err: -1,
}
/**
* 设备控制
*/
class deviceControl {
// 双击操作
doubleClick = true;
/**
* @param {landData} 地块信息
*/
land = {
data: [],
item: {
id: null,
name: ""
},
};
/**
* @param {stations} 基站列表
*/
stations = [];
/**
* @param {flapValves} 基站列表
*/
flapValves = [];
/**
* @param {valves} 阀门列表
*/
valves = [];
/**
* @param {adjustNumber} 调压值
*/
adjustNumber = 1;
/**
* @param {others} 其他列表
*/
others = {
header: [],
agricultural: [],
deviceMp: [],
}
/**
* @param {topics} 订阅topic
*/
topics = {
oldV: [],
newV: [],
};
/**
* 数据筛选
*/
forward = false;
screenKey = "";
screen = {
all: 0,
online: 0,
offline: 0,
watering: 0,
unwater: 0,
error: 0,
};
/**
* @param {Object} 初始化方法
*/
constructor(eventHandler, msgHandler) {
this.eventHandler = eventHandler;
this.msgHandler = msgHandler;
};
//获取消息类型
get msgType() {
return msgType;
}
get topic() {
if (this.topics.newV.length && this.topics.newV.length) {
const newV = new Set(this.topics.newV);
const oldV = this.topics.oldV.filter(x => !newV.has(x));
return {
oldV: oldV,
newV: this.topics.newV,
}
} else {
return this.topics;
}
}
/**
* 设置地块数据
* @param companys 公司
* @param lands 地块
* @param id 当前id
*/
setLandData(companys, lands, id) {
let selectItem = null;
if (companys.length && lands.length) {
const companyObj = companys.reduce((accumulator, current) => {
accumulator[current.id] = current;
return accumulator;
}, {});
let groups = {};
lands.map(item => {
let param = {
companyId: item.companyId,
companyName: companyObj[item.companyId] ? companyObj[item.companyId].label : "",
id: item.id,
name: item.landName,
landIcon: item.landIcon || '',
valueNum: item.valveNum,
controlFlag: item.controlFlag, //设备是否可控0是 1否
enableFlapValve: item.enableFlapValve == 0, //启用蝶阀
landManualOperation: item.landManualOperation == 0, //启用批量控制
mapContent: null
}
// 获取地图信息
if (item.landMap != null) {
param.mapContent = JSON.parse(decodeURIComponent(item.landMap.mapContent)) //地块地图 地图标点
}
// 判断公司是否已经分组,如果未分组,则添加分组
if (!groups[item.companyId]) {
groups[item.companyId] = [];
}
groups[item.companyId].push(param);
if (param.id == id) {
selectItem = param;
}
})
companys.forEach(item => {
item.children = groups[item.id] || [];
});
if (!selectItem) {
selectItem = landArr[0];
}
}
this.land.data = companys;
return selectItem;
}
/**
* 设置选中地块数据
* @param item 选中列表
* @param callback
*/
setLandItem(item, callback) {
if (item != this.land.item) {
this.land.item = item;
this.stations = [];
this.flapValves = [];
this.valves = [];
this.adjustNumber = 1;
this.others = {
header: [],
agricultural: [],
deviceMp: [],
}
this.topics = {
oldV: this.topics.newV,
newV: [],
};
this.forward = false;
this.screenKey = "";
this.screen = {
all: 0,
online: 0,
offline: 0,
watering: 0,
unwater: 0,
error: 0,
};
this.addTopics([`jsy/iot/control/${item.id}`]);
this.getTaskStatus();
if (typeof callback === 'function') {
callback();
}
}
}
/**
* 设置设备数据(除阀门外的设备)
* @param {Object} data
*/
setOtherDevices(data) {
if (data && data.length) {
let stations = [],
header = [],
agricultural = [],
flapValves = [];
data.forEach(item => {
if (item.deviceTypeId === 1) {
stations.push(item);
} else if (item.deviceTypeId === 4 || item.deviceTypeId === 5) {
header.push(item);
} else if (item.deviceTypeId === 6 || item.deviceTypeId === 7 || item.deviceTypeId === 8) {
agricultural.push(item);
} else if (item.deviceTypeId === 12) {
flapValves.push(item);
}
});
this.setStations(stations);
this.setFlapValves(flapValves);
this.others.header = header;
this.others.agricultural = agricultural;
}
}
/**
* 设置墒情
* @param {Object} data
*/
setDeviceMp(data) {
if (data && data.length) {
this.others.deviceMp = data;
} else {
this.others.deviceMp = []
}
}
/**
* 设置基站数据
* @param {Object} data
*/
setStations(data) {
let topic = [];
if (data && data.length) {
let stations = presentStationData(data);
stations.forEach(item => {
topic.push("jsy/iot/push/" + item.iotId);
item["hidden"] = false;
});
this.stations = stations;
} else {
this.stations = []
}
this.addTopics(topic);
}
/**
* 设置蝶阀数据
* @param {Object} data
*/
setFlapValves(data) {
let topic = [];
if (data && data.length) {
for (let i = 0; i < data.length; i++) {
data[i] = flapValveControl(data[i]);
topic.push("jsy/iot/push/" + data[i].iotId);
}
this.flapValves = data;
} else {
this.flapValves = [];
}
this.addTopics(topic);
}
/**
* 设置阀门数据
* @param landId
* @param {Object} data
*/
setValves(landId, data) {
const that = this;
let topic = [],
loadData = [];
if (data && data.length) {
// 数据排序
data.sort(commonUtil.compareDataNew("landGroup", "branchCanalCode"));
data.forEach((item, i) => {
item.isOpened = false; // 展开折叠
item.isHide = false; // 隐藏
item.presentGroup = true; // 组状态
item.rowKey = item.pipeNetworkName; // 出水口名称
item.stationCode = "无";
// 蝶阀数据设置
item.device = item.controlDevice;
if (item.deviceId && that.flapValves.length) {
const device = that.flapValves.find(x => x.id == item.deviceId);
item.device = device || null;
if (item.deviceFlapValveSub) {
item.subIndex = item.deviceFlapValveSub.subIndex;
}
}
let Controllable = false; // 蝶阀权限字段
//便利出水口设备
if (item.children && item.children.length) {
item.children.sort(commonUtil.compareDataNew("outletCode", "multiPortCode"));
item.children.forEach((x, j) => {
x.isHide = false; // 隐藏
x.rowKey = x.waterOutletName; // 出水口名称
x.stationCode = "无";
// 阀门数据设置
x.device = x.controlDevice;
if (x.device) {
topic.push("jsy/iot/push/" + x.device.iotId);
if (x.device.deviceTypeId == 2 || x.device.deviceTypeId == 3) {
x.device.deviceValve = x.deviceValve
x.device = threeWayValveControl(x.device);
that.setValveShowRate(x, null);
// 这里的状态都是本地或者根据状态判断了,所以这个预加载没有意义了
// if (x.device.loading && x.device.loading.vss) {
// x.device = threeWayValvePreload(x.device, x.device.loading.vss, x
// .device.loading.mc);
// }
if (x.device.data && x.device.data.items && x.device.data.items
.mc) {
let mc = Math.abs(Number(x.device.data.items.mc.value));
if (mc == 0 || mc > 5) {
x.device.stall = that.adjustNumber;
} else {
x.device.stall = mc;
}
} else {
x.device.stall = that.adjustNumber;
}
// 判断设备权限
const btnControllable = x.device.custom.btnControllable
if (btnControllable.closeAll || btnControllable.open1 ||
btnControllable.open2 || btnControllable.openAll) {
Controllable = true;
}
} else if (x.device.deviceTypeId == 13) {
x.device.deviceValve = x.deviceValve;
x.device = fiveWayValveControl(x.device);
that.setValveShowRate(x, 1);
x.device.stall = that.adjustNumber;
const btnControllable = x.device.custom.btnControllable
if (btnControllable.open1 || btnControllable.open2 ||
btnControllable.open3 || btnControllable.open4) {
Controllable = true;
}
}
if (that.isLoading(x.device)) {
loadData.push({
device: x.device,
arr: [i, j],
});
}
x.stationCode = x.device.deviceValve.stationName || "无";
}
});
}
item.btnControllable = Controllable;
});
if (that.valves && that.valves.length && landId == that.land.item.id) {
// 更新数据
if (data.length == that.valves.length) {
for (var i = 0; i < that.valves.length; i++) {
let item = that.valves[i];
if (item.id == data[i].id) {
item.controlDevice = data[i].controlDevice;
item.device = data[i].device;
item.deviceCode = data[i].deviceCode;
item.deviceFlapValve = data[i].deviceFlapValve;
item.deviceFlapValveSub = data[i].deviceFlapValveSub;
item.deviceId = data[i].deviceId;
item.children = data[i].children;
}
that.valves[i] = item;
}
} else {
// 替换数据
that.valves = data;
that.onMsgHandler({
success: msgType.default,
msg: "数据变动,重新加载"
})
}
} else {
// 替换数据
that.valves = data;
}
} else {
that.valves = [];
}
if (loadData.length) {
loadData.forEach(item => {
that.setLoadTimersData(item.device, item.arr);
});
}
that.addTopics(topic);
that.screenData();
that.startRunningTimer();
// // 如果数据有效,查询相关数据
// if(that.valves.length){
// //给设备匹配时间
// this.matchTime("all");
// }
}
/**
* 设置阀门显示的角度百分比
* @param {Object} item
* @param {Object} index
*/
setValveShowRate(item, index) {
if (item.device.deviceTypeId == 2 || item.device.deviceTypeId == 3) {
for (var key in item.device.custom.btnState) {
if (item.device.custom.btnState[key].color != 'info') {
if (key == 'closeAll') {
item.showRate = 0;
} else if (key == 'openAll') {
item.showRate = 100;
} else {
item.showRate = item.device.custom.aRate;
}
}
}
}
if (item.device.deviceTypeId == 13) {
item.showRate = `open${index}`;
}
}
/**
* 添加tioic
* @param {Object} topic
*/
addTopics(topic) {
this.topics.newV = this.topics.newV.concat(topic);
}
/**
* 设置调压等级
* @param {Object} number
*/
setAdjustNumber(number) {
this.adjustNumber = Number(number);
}
/****************************** 数据、操作验证 ******************************/
/**
* 获取地块轮灌状态
* @param {Object} id
*/
getTaskStatus(id) {
console.error("轮灌状态查询")
}
// 双击参数
dblClickThreshold = 500;
dblClicObj = {
time: 0,
type: undefined
};
/**
* 验证双击
* @param type 按钮类型
*/
dbClickHandle(type) {
const that = this;
if (!that.doubleClick) {
return true;
}
const timestamp = new Date().getTime();
if (that.dblClicObj.type === type) {
if ((timestamp - that.dblClicObj.time) < that.dblClickThreshold) {
that.dblClicObj.type = undefined;
that.dblClicObj.time = 0;
return true;
} else {
that.dblClicObj.type = type;
that.dblClicObj.time = timestamp;
return false;
}
} else {
that.dblClicObj.type = type;
that.dblClicObj.time = timestamp;
return false;
}
}
//点击的时候判断有没有操作权限
hasPermission(item, index) {
let msg = "";
if (item.device.deviceTypeId == 2 || item.device.deviceTypeId == 3) {
const btnOpen = item.device.custom.btnOpen;
let state = true;
for (const key in btnOpen) {
if (btnOpen[key]) {
state = item.device.custom.btnControllable[key];
}
}
if (!state) {
msg = "对方正在使用,请联系对方出水口账号人员关闭阀门后操作。"
}
} else if (item.device.deviceTypeId == 13) {
if (!item.device.custom.btnControllable[`open${index}`]) {
msg = "无操作权限!"
}
}
if (msg) {
that.onMsgHandler({
success: msgType.default,
msg: msg
})
return false;
} else {
return true;
}
}
/****************************** 设备操作 ******************************/
/**
* 刷新设备
* @param {Object} item
*/
refreshDeviceItem(item) {
if (!this.dbClickHandle("refreshDeviceItem")) return;
const that = this;
that.onMsgHandler({
success: msgType.ok,
msg: `${item.rowKey}刷新`
})
item.device.custom.ws = 1;
that.onEventHandler(that.eventType.refresh, item);
}
/**
* 设置刷新状态数据
* @param {Object} item
* @param {Object} res
*/
setRefreshDeviceState(item, res) {
item.device.status = res.data.status;
item.device.data = res.data.data;
//数据解析
if (item.device.deviceTypeId == 11 || item.device.deviceTypeId == 12) {
item.device = flapValveControl(item.device);
} else if (item.device.deviceTypeId == 2 || item.device.deviceTypeId == 3) {
item.device = threeWayValveControl(item.device);
} else if (item.device.deviceTypeId == 13) {
item.device = fiveWayValveControl(item.device);
}
item.device.custom.ws = 1;
// loadTimer(row.device, arr);
}
/**
* 控制按钮事件
* @param {Object} item
* @param {Object} index
*/
deviceControlHandle(item, index, value) {
this.setValveShowRate(item, index);
if (!this.dbClickHandle(`${item.deviceId}-${index}`)) return;
// if (!this.hasPermission(item, index)) return;
this.buildCommand(item, index, value);
}
/**
* 组织命令
* @param {Object} item
* @param {Object} index
* @param {Object} value
*/
buildCommand(item, index, value) {
const that = this;
if (item.device.deviceTypeId == 11 || item.device.deviceTypeId == 12) {
// 配置的角度参数
const config = getValveAngleConfig(item.device.deviceTypeId);
let params = {
deviceTypeId: item.device.deviceTypeId,
privateSeal: item.device.privateSeal,
deviceVersionId: item.device.deviceVerId,
angleKey: config[Number(value)],
angleSize: 0, //大角度控制,正负数未调压的大小
valveNo: index,
operationType: Number(value) > 0 ? 10 : 11,
}
item.device.custom.subData[index - 1].btnPreload = true;
item.device.custom.subData[index - 1].btnLoading.closeAll = true;
item.device.custom.subData[index - 1].btnLoading.openAll = false;
item.device.custom.subData[index - 1].btnDisable.closeAll = true;
item.device.custom.subData[index - 1].btnDisable.openAll = true;
this.onEventHandler(this.eventType.send, params, item);
} else {
if (value >= 0) {
const config = getValveAngleConfig(item.device.deviceTypeId);
const deviceValveAngles = item.device.deviceValveAngles.reduce((obj, item) => {
obj[item.angleKey] = item;
return obj;
}, {});
let angleObj = null,
angleADC = null,
operationType = undefined;
let params = null;
if (item.device.deviceTypeId == 2 || item.device.deviceTypeId == 3) {
let btnKey = "";
if (index == 0) { // 全关
angleObj = deviceValveAngles[config[0]];
angleADC = angleObj.angleAdc;
operationType = 6;
btnKey = "closeAll";
} else if (index == 1 || index == 2) { // 12开
if (value == 0) {
angleObj = deviceValveAngles[config[0]];
angleADC = angleObj.angleAdc;
operationType = 6;
btnKey = "closeAll";
} else if (value == 100) {
if (index == 1) {
angleObj = deviceValveAngles[config[2]];
angleADC = angleObj.angleAdc;
operationType = 3;
btnKey = "open1";
}
if (index == 2) {
angleObj = deviceValveAngles[config[4]];
angleADC = angleObj.angleAdc;
operationType = 4;
btnKey = "open2";
}
} else {
if (index == 1) {
angleObj = deviceValveAngles[config[3]];
let angleInterval = angleObj.angleAdcUpperLimit - angleObj.angleAdcLowerLimit;
angleADC = angleObj.angleAdcUpperLimit - Math.ceil(angleInterval * value / 100);
operationType = 7;
btnKey = "open1";
}
if (index == 2) {
angleObj = deviceValveAngles[config[5]];
let angleInterval = angleObj.angleAdcUpperLimit - angleObj.angleAdcLowerLimit;
angleADC = Math.ceil(angleInterval * value / 100) + angleObj.angleAdcLowerLimit;
operationType = 7;
btnKey = "open2";
}
}
} else if (index == 3) { // 全开
angleObj = deviceValveAngles[config[1]];
angleADC = angleObj.angleAdc;
operationType = 5;
btnKey = "openAll";
} else {
return null;
}
// 控制参数
params = {
deviceTypeId: item.device.deviceTypeId,
privateSeal: item.device.privateSeal,
deviceVersionId: item.device.deviceVerId,
angleKey: angleObj.angleKey,
// angleSize: angleSize, //大角度控制,正负数未调压的大小
valveNo: index,
angleADC: angleADC,
operationType: operationType,
};
// 更新预加载状态
item.device.custom.ct.time = 0;
item.device.custom.ct.value = 0;
item.device.custom.ct.endS = -1;
for (let key in item.device.custom.btnState) {
if (key == btnKey) {
item.device.custom.btnState[key].loading = true;
item.device.custom.btnState[key].color = item.device.custom.btnColorType.success;
} else {
item.device.custom.btnState[key].loading = false;
item.device.custom.btnState[key].color = item.device.custom.btnColorType.info;
}
for (let key in item.device.custom.btnState) {
if (key == btnKey) {
item.device.custom.btnState[key].loading = true;
item.device.custom.btnState[key].color = item.device.custom.btnColorType
.success;
} else {
item.device.custom.btnState[key].loading = false;
item.device.custom.btnState[key].color = item.device.custom.btnColorType.info;
}
}
}
} else if (item.device.deviceTypeId == 13) {
if (value == 0 || value == 100) {
angleObj = deviceValveAngles[config[value == 100 ? 1 : 0]];
angleADC = angleObj.angleAdc;
operationType = (value == 100 ? 51 : 55) + Number(index) - 1;
} else {
angleObj = deviceValveAngles[config[2]];
let angleInterval = angleObj.angleAdcUpperLimit - angleObj.angleAdcLowerLimit;
angleADC = Math.ceil(angleInterval * value / 100) + angleObj.angleAdcLowerLimit;
operationType = 59 + Number(index) - 1;
}
// 控制参数
params = {
deviceTypeId: item.device.deviceTypeId,
privateSeal: item.device.privateSeal,
deviceVersionId: item.device.deviceVerId,
angleKey: angleObj.angleKey,
// angleSize: angleSize, //大角度控制,正负数未调压的大小
valveNo: index,
angleADC: angleADC,
operationType: operationType,
};
// 更新预加载状态
let key = "open" + index;
item.device.custom.btnPreload = true;
item.device.custom.btnState[key].loading = true;
if (value == 0) {
item.device.custom.btnState[key].color = item.device.custom.btnColorType.danger;
} else {
item.device.custom.btnState[key].color = item.device.custom.btnColorType.success;
}
}
this.onEventHandler(this.eventType.send, params, item);
} else {
if ((item.device.deviceTypeId == 2 || item.device.deviceTypeId == 3) && (index == 0 || index ==
3)) {
const config = getValveAngleConfig(item.device.deviceTypeId);
let params = {
deviceTypeId: item.device.deviceTypeId,
privateSeal: item.device.privateSeal,
deviceVersionId: item.device.deviceVerId,
angleKey: index == 0 ? config[0] : config[1],
angleSize: 0, //大角度控制,正负数未调压的大小
// valveNo: swiperData.value.index,
// angleADC: angleADC,
operationType: index == 0 ? 6 : 5,
};
// 更新预加载状态
let btnKey = index == 0 ? "closeAll" : "openAll";
item.device.custom.ct.time = 0;
item.device.custom.ct.value = 0;
item.device.custom.ct.endS = -1;
for (let key in item.device.custom.btnState) {
if (key == btnKey) {
item.device.custom.btnState[key].loading = true;
item.device.custom.btnState[key].color = item.device.custom.btnColorType.success;
} else {
item.device.custom.btnState[key].loading = false;
item.device.custom.btnState[key].color = item.device.custom.btnColorType.info;
}
}
this.onEventHandler(this.eventType.send, params, item);
} else {
if (item.device.deviceTypeId == 2 || item.device.deviceTypeId == 3) {
this.onEventHandler(this.eventType.interface, {
title: item.rowKey,
extra: `${index}`,
value: item.device.custom.aRate,
other: {
item: item,
index: index,
}
}, item);
} else if (item.device.deviceTypeId == 13) {
this.onEventHandler(this.eventType.interface, {
title: item.rowKey,
extra: index,
value: item.device.custom.angle["open" + index].aRate,
other: {
item: item,
index: index,
}
}, item);
} else {
return null;
}
}
}
}
}
/****************************** 数据更新 ******************************/
/**
* 解析数据
* @param {Object} message
*/
handleMessage(message) {
const that = this;
let obj = message;
let {
iotId,
items,
status
} = obj
let deviceIndex = null;
deviceIndex = that.stations.findIndex(x => x.iotId == iotId);
if (deviceIndex != -1) {
let newData = that.stations[deviceIndex];
if (items && obj.iotId) {
obj.privateSeal = newData.privateSeal;
obj.deviceTypeId = newData.deviceTypeId;
obj.rolaFrequency = newData.rolaFrequency;
newData = alone(obj, newData.online)
newData.loading = null;
} else {
newData.online = status === "online";
newData.loading = null;
}
that.stations[deviceIndex] = newData;
} else {
let indexArr = commonUtil.findIndexByIotId(that.valves, iotId);
if (indexArr.length) {
let device = null;
if (indexArr.length == 1) {
device = that.valves[indexArr[0]].device;
} else if (indexArr.length == 2) {
device = that.valves[indexArr[0]].children[indexArr[1]].device;
}
//更新状态
if (items) {
device.data = obj
} else {
device.status = status;
}
//数据解析
if (device.deviceTypeId == 11 || device.deviceTypeId == 12) {
device = flapValveControl(device);
} else if (device.deviceTypeId == 2 || device.deviceTypeId == 3) {
device = threeWayValveControl(device);
} else if (device.deviceTypeId == 13) {
device = fiveWayValveControl(device);
}
//刷新数据
if (indexArr.length == 1) {
this.valves[indexArr[0]].device = device;
} else if (indexArr.length == 2) {
this.valves[indexArr[0]].children[indexArr[1]].device = device;
}
// 设置阀门倒计时
this.setLoadTimersData(device, indexArr);
this.screenData();
// if (items && device) {
// // 如果上报了数据,就更新一下阀门的一些时间
// this.matchTime("alone", device.id)
// }
}
}
}
/****************************** 计时器 ******************************/
loadTimerObj = {};
loadTimerState = false;
// 判断是否是控制中的设备
isLoading(device) {
let isLoading = false;
if ((device.deviceTypeId == 2 || device.deviceTypeId == 3) && device.custom.ws == 2) {
isLoading = true;
}
if (device.deviceTypeId == 13 && (device.custom.control.open1 || device.custom.control.open2 ||
device
.custom.control.open3 || device.custom.control.open4)) {
isLoading = true;
}
return isLoading;
}
/**
* 设置倒计时数据
* @param {Object} device
* @param {Object} array
*/
setLoadTimersData(device, array) {
if (!this.isLoading(device)) return;
this.loadTimerObj[device.deviceCode] = {
arr: array,
deviceTypeId: device.deviceTypeId,
ct: device.custom.ct,
};
if (!this.loadTimerState) {
this.loadTimer();
}
}
// 控制中倒计时
loadTimer() {
const that = this;
if (Object.keys(that.loadTimerObj).length) {
this.loadTimerState = true;
let loadTimerArr = Object.entries(that.loadTimerObj).map(([key, value]) => ({
key,
value
}));
loadTimerArr.forEach(item => {
let arr = item.value.arr;
let deviceTypeId = item.value.deviceTypeId;
let ct = item.value.ct;
if (deviceTypeId == 2 || deviceTypeId == 3) {
let endS = calcEndTime(ct.time, ct.value);
ct.endS = endS;
if (endS <= 0) {
delete that.loadTimerObj[item.key];
}
}
if (deviceTypeId == 13) {
let allEnd = true;
for (var key in ct) {
let endS = calcEndTime(ct[key].time, ct[key].value);
ct[key].endS = endS;
if (endS > 0) {
allEnd = false;
}
}
if (allEnd) {
delete that.loadTimerObj[item.key];
}
}
// if (arr.length == 1) {
// groupDeviceList.value[arr[0]].device.custom.ct.endS = endS;
// }
if (arr.length == 2) {
that.valves[arr[0]].children[arr[1]].device.custom.ct = ct;
}
})
setTimeout(() => {
that.loadTimer();
}, 1000);
} else {
that.clearTimer();
}
}
// 清理计时器
clearTimer() {
this.loadTimerState = false;
this.loadTimerObj = {};
}
/****************************** 数据筛选 ******************************/
/**
* @param {Object} type 筛选状态1在线 2离线 3警告 0/其他 全部
*/
showType(key = "") {
if (this.screenKey == key) return;
this.screenKey = key;
this.screenData();
}
/**
* 工作阀门
*/
workingForward(value) {
if (this.forward == value) return;
this.forward = value;
this.screenData(true);
}
/**
* 筛选设备数据
* isSort 是否需要排序默认false
*/
screenData(isSort = false) {
// 如果在线就显示 不在线就隐藏
const that = this;
let all = 0,
online = 0,
offline = 0,
watering = 0,
unwater = 0,
error = 0;
let screenKey = that.screenKey;
let forward = that.forward;
that.valves.forEach(item => {
item.isOpen = false;
if (false) {
console.log("蝶阀暂不统计");
// if (type == 1) { // 在线
// if (item.deviceId && item.device && item.device.custom && item.device.custom
// .online) {
// item.isHide = that.#workingScreen(item, work);
// } else {
// item.isHide = true;
// }
// } else if (type == 2) { // 离线
// if (item.deviceId && item.device && item.device.custom && !item.device.custom
// .online) {
// item.isHide = that.#workingScreen(item, work);
// } else {
// item.isHide = true;
// }
// } else if (type == 3) { // 警告
// if (item.deviceId && item.device && item.device.custom && (!item.device.custom
// .online ||
// item.device.custom.earlyWarning.showTips)) {
// item.isHide = that.#workingScreen(item, work);
// } else {
// item.isHide = true;
// }
// } else { // 全部
// if (work == 1 || work == 2) {
// if (item.deviceId && item.device && item.device.custom) {
// item.isHide = that.#workingScreen(item, work);
// } else {
// item.isHide = true;
// }
// } else {
// item.isHide = false;
// }
// }
}
if (item.children && item.children.length) {
item.children.forEach(item2 => {
item2.isOpen = false;
let keys = [];
// 状态数据统计
if (item2.device) {
all++;
if (item2.device.custom) {
if (item2.device.custom.online) {
online++;
keys.push('online');
} else {
offline++;
error++;
keys.push('offline');
keys.push('error');
}
if (item2.device.custom.isOpen) {
item2.isOpen = true;
item.isOpen = true;
watering++;
keys.push('watering');
} else {
unwater++;
keys.push('unwater');
}
} else {
offline++;
unwater++;
error++;
keys = ['offline', 'unwater', 'error'];
}
}
// 显示状态判断
if (screenKey == "") {
item2.isHide = false;
} else if (screenKey == "all") {
if (item2.device) {
item2.isHide = false;
} else {
item2.isHide = true;
}
} else if (keys.includes(screenKey)) {
item2.isHide = false;
} else {
item2.isHide = true;
}
});
// 如果阀门全部都不在线 就隐藏阀门组的折叠
// if (item.children.every(j => j.isHide == true) && item.isHide) {
if (item.children.every(j => j.isHide == true)) {
item.isHide = true;
} else {
item.isHide = false;
}
if (isSort) {
if (forward) {
item.children.sort((a, b) => Number(!a.isOpen) - Number(!b.isOpen));
} else {
item.children.sort(commonUtil.compareDataNew("outletCode", "multiPortCode"));
}
}
} else {
if (screenKey == "") {
item.isHide = false;
} else {
item.isHide = true;
}
}
})
if (isSort) {
if (forward) {
that.valves.sort((a, b) => Number(!a.isOpen) - Number(!b.isOpen));
} else {
that.valves.sort(commonUtil.compareDataNew("landGroup", "branchCanalCode"));
}
}
this.screen.all = all;
this.screen.online = online;
this.screen.offline = offline;
this.screen.watering = watering;
this.screen.unwater = unwater;
this.screen.error = error;
}
/**
* 筛选设备数据
* value 阀门/出水口编号
*/
screenDataByName(value) {
// 如果在线就显示 不在线就隐藏
const that = this;
that.forward = false;
that.screenKey = "";
if (value == "" || !value) {
value = null;
}
that.valves.forEach(item => {
item.isOpen = false;
if (item.children && item.children.length) {
item.children.forEach(item2 => {
if (value) {
if (item2.rowKey.includes(value)) {
item2.isHide = false;
} else {
if (item2.device) {
if (item2.device.deviceCode.includes(value)) {
item2.isHide = false;
} else {
item2.isHide = true;
}
} else {
item2.isHide = true;
}
}
} else {
item2.isHide = false;
}
});
// 如果阀门全部都不在线 就隐藏阀门组的折叠
// if (item.children.every(j => j.isHide == true) && item.isHide) {
if (item.children.every(j => j.isHide == true)) {
item.isHide = true;
} else {
item.isHide = false;
}
} else {
item.isHide = true;
}
})
}
/****************************** 自动刷新 ******************************/
runningTimer = false;
/**
* 自动刷新页面数据
*/
startRunningTimer() {
if (this.runningTimer) return;
const that = this;
that.runningTimer = true;
setTimeout(() => {
that.onEventHandler(that.eventType.refreshApi, that.land.item.id)
}, 20 * 1000);
}
// 数据解析
valveRefresh(e) {
const arr = commonUtil.findIndexByIotId(this.valves, e.data.data.iotId);
if (arr.length) {
if (arr.length == 1) {}
if (arr.length == 2) {
let row = this.valves[arr[0]].children[arr[1]];
row.device.status = e.data.status;
row.device.data = e.data.data;
//数据解析
if (row.device.deviceTypeId == 11 || row.device.deviceTypeId == 12) {
row.device = flapValveControl(row.device);
} else if (row.device.deviceTypeId == 2 || row.device.deviceTypeId == 3) {
row.device = threeWayValveControl(row.device);
} else if (row.device.deviceTypeId == 13) {
row.device = fiveWayValveControl(row.device);
}
this.valves[arr[0]].children[arr[1]].device = row.device;
this.setLoadTimersData(row.device, arr)
}
}
}
/****************************** 消息回调 ******************************/
eventType = {
interface: 0,
send: 1,
refresh: 2,
refreshApi: 3,
}
//应用类型 type:0打开操作界面1控制命令发送2刷新命令发送 3接口刷新阀门数据
onEventHandler(type, params, item = null) {
if (typeof this.eventHandler === 'function') {
this.eventHandler(type, params, item);
}
}
onMsgHandler(msg) {
if (typeof this.msgHandler === 'function') {
this.msgHandler(msg);
}
}
}
export default deviceControl
/***************************** 公共方法 *****************************/
var commonUtil = {
// 数据排序
compareDataNew(file1, file2) {
return function(b, a) {
if (b[file1] < a[file1]) {
return -1;
} else if (b[file1] > a[file1]) {
return 1;
} else {
if (b[file2] < a[file2]) {
return -1;
} else if (b[file2] > a[file2]) {
return 1;
} else {
return 0;
}
}
}
},
// 服务商
facilitator(type) {
if (type) {
if (type == "1") {
return "移动"
} else if (type == "2") {
return "电信"
} else if (type == "3") {
return "联通"
}
} else {
return "未知"
}
},
//格式化时间戳
getYMDHMS(timestamp) {
let date = new Date(parseInt(timestamp))
let Year = date.getFullYear()
let Moth = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1
let Day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate()
let Hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours()
let Minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()
let Sechond = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds()
let GMT = Year + "-" + Moth + "-" + Day + " " + Hour + ":" + Minute + ":" + Sechond
return GMT
},
findIndexByIotId(arr, iotid) {
if (arr.length) {
var index1 = arr.findIndex(x => x.device && x.device.iotId == iotid);
if (index1 != -1) {
return [index1];
} else {
let arrIndex = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i].children && arr[i].children.length) {
var j = arr[i].children.findIndex(x => x.device && x.device.iotId ==
iotid);
if (j != -1) {
arrIndex = [i, j];
break;
}
}
}
return arrIndex;
}
} else {
return [];
}
}
}