235 lines
7.3 KiB
Vue
235 lines
7.3 KiB
Vue
<template>
|
||
<page-meta>
|
||
<navigation-bar :title="title" title-align="center" background-color="#007AFF" />
|
||
</page-meta>
|
||
<view class="modbus-status-wrap">
|
||
<u-sticky bgColor="#FFF" customStyle="border-bottom:1px solid #eee;">
|
||
<u-tabs class="tabs-wrap" :list="tabsList" :scrollable="false" lineWidth="80" lineHeight="2" :duration="100"
|
||
@click="handleTabsClick"></u-tabs>
|
||
</u-sticky>
|
||
<view class="attribute-report-wrap" v-if="tabsIndex === 0">
|
||
<view class="cell-wrap">
|
||
<u-cell v-for="(item,index) in runningstatusDatas" :key="index">
|
||
<view slot="title" class="cell-title">
|
||
<text class="cell-name">{{ item.name }}({{item.id}})</text>
|
||
<text class="cell-value">
|
||
<text class="cell-value-num">{{ !item.value || item.value === ' ' ? 0 : item.value }}</text>
|
||
{{item.datatype.unit || item.datatype.unitName || ''}}
|
||
</text>
|
||
<text class="cell-time">{{$tt('modbus.time')}}:{{ item.ts || $tt('modbus.unknown')}}</text>
|
||
</view>
|
||
</u-cell>
|
||
</view>
|
||
<u-empty v-if="runningstatusDatas.length === 0" mode="list" marginTop="20"
|
||
icon="http://cdn.uviewui.com/uview/empty/list.png"></u-empty>
|
||
</view>
|
||
<view class="service-issue-wrap" v-if="tabsIndex === 1">
|
||
<view class="cell-wrap">
|
||
<u-cell v-for="(item,index) in functionStatusData" :key="index">
|
||
<view slot="title" class="cell-title">
|
||
<text class="cell-name">{{ item.name }}</text>
|
||
<view class="cell-value">
|
||
<u--input
|
||
v-if="item.datatype.type == 'integer'|| item.datatype.type == 'decimal' || item.datatype.type == 'string'"
|
||
customStyle="display: inline-block; width: 56px;padding: 0px; margin-right: 10px;"
|
||
color="#0f73ee" border="bottom" v-model="item.value"></u--input>
|
||
<uni-data-select v-if="item.datatype.type == 'enum'"
|
||
style="width: 360rpx; margin-left: -2rpx;" v-model="item.value"
|
||
:localdata="item.datatype.enumList"></uni-data-select>
|
||
<u-switch v-if="item.datatype.type === 'bool'" v-model="item.value" inactiveValue="0"
|
||
activeValue="1" activeColor="#486FF2" inactiveColor="#c4c6c9" size="20">
|
||
</u-switch>
|
||
<text
|
||
v-if="(item.datatype.type == 'integer' || item.datatype.type == 'decimal') && item.datatype.type.unit && item.datatype.type.unit != 'un' && item.datatype.type.unit != '/'">({{ item.unit }})</text>
|
||
{{ item.datatype.unit || item.datatype.unitName || ''}}
|
||
</view>
|
||
<view class="cell-value-unit"
|
||
v-if="item.datatype.type == 'integer' || item.datatype.type == 'decimal'">
|
||
{{$tt('modbus.range')}}:{{ item.datatype.max === null ? item.datatype.type === 'bool' ? 0 : "" : item.datatype.min }}
|
||
~
|
||
{{ item.datatype.max === null ? item.datatype.type === 'bool' ? 1 : "" : item.datatype.max }}
|
||
</view>
|
||
<text class="cell-time">{{$tt('modbus.time')}}:{{ item.ts || ''}}</text>
|
||
</view>
|
||
<view class="cell-val" slot="value">
|
||
<u-button type="primary" size="mini" :text="$tt('status.send')" @click="handelSendClick(item)"></u-button>
|
||
</view>
|
||
</u-cell>
|
||
</view>
|
||
<u-empty v-if="functionStatusData.length === 0" mode="list" marginTop="20"
|
||
icon="http://cdn.uviewui.com/uview/empty/list.png"></u-empty>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import { getDevice, getRunningStatus } from '@/apis/modules/device';
|
||
import { serviceInvoke } from '@/apis/modules/runtime.js';
|
||
|
||
export default {
|
||
data () {
|
||
return {
|
||
title: this.$tt('navBar.running'),
|
||
tabsIndex: 0,
|
||
tabsList: [{ name: this.$tt('log.attribute') }, { name: this.$tt('log.service') }],
|
||
deviceId: 0,
|
||
slaveId: 0,
|
||
productId: 0,
|
||
status: 0,
|
||
serialNumber: '',
|
||
subDeviceId: 0,
|
||
runningstatusDatas: [],
|
||
functionStatusData: []
|
||
};
|
||
},
|
||
onLoad: function (option) {
|
||
this.deviceId = Number(option.deviceId);
|
||
this.slaveId = Number(option.slaveId);
|
||
this.subDeviceId = Number(option.subDeviceId);
|
||
this.getDevice();
|
||
this.$bus.$on("updateDeviceStatus", (params) => {
|
||
this.updateDeviceStatus(params);
|
||
});
|
||
},
|
||
methods: {
|
||
getDevice () {
|
||
getDevice(this.subDeviceId).then(res => {
|
||
const { data } = res;
|
||
this.title = data.deviceName;
|
||
const { serialNumber, productId } = data;
|
||
this.productId = productId;
|
||
this.serialNumber = serialNumber;
|
||
this.getDeviceStatus(); // 获取运行状态数据
|
||
}).catch(err => {
|
||
console.log(err);
|
||
});
|
||
},
|
||
// 单击选显卡
|
||
handleTabsClick (item) {
|
||
this.tabsIndex = item.index;
|
||
},
|
||
getDeviceStatus () {
|
||
getRunningStatus(this.deviceId, this.slaveId, this.tabsIndex + 1, this.productId, this.serialNumber).then(
|
||
res => {
|
||
const { data } = res;
|
||
this.status = data.status;
|
||
this.runningstatusDatas = data.thingsModels;
|
||
this.functionStatusData = data.thingsModels.filter(item => item.isReadonly == 0);
|
||
}).catch(err => {
|
||
console.log(err);
|
||
})
|
||
},
|
||
// 更新设备状态数据
|
||
updateDeviceStatus (msg) {
|
||
if (msg.data) {
|
||
msg.data.forEach(item => {
|
||
this.runningstatusDatas.some((old, index) => {
|
||
if (item.slaveId === old.slaveId && item.id == old.id) {
|
||
const template = this.runningstatusDatas[index];
|
||
template.ts = item.ts;
|
||
template.value = item.value;
|
||
if (old.datatype.type == 'enum') {
|
||
old.datatype.enumList.forEach(val => {
|
||
if (val.value == template.value) {
|
||
template.text = val.text;
|
||
}
|
||
})
|
||
} else if (old.datatype.type == 'bool') {
|
||
template.text = template.value === 0 ? old.datatype.falseText : old
|
||
.datatype.trueText;
|
||
template.value = template.value === 0 ? 0 : 1;
|
||
}
|
||
this.$set(this.runningstatusDatas, index, template);
|
||
}
|
||
});
|
||
});
|
||
}
|
||
},
|
||
// 发送指令
|
||
handelSendClick (item) {
|
||
//判断输入是否超过范围
|
||
if (item.datatype.type == 'integer' || item.datatype.type == 'decimal') {
|
||
if (item.datatype.max < item.value || item.datatype.min > item.value) {
|
||
uni.showToast({
|
||
icon: 'error',
|
||
title: this.$tt('status.pleaseEnter')
|
||
})
|
||
return;
|
||
}
|
||
}
|
||
if (item.datatype.type == 'enum') {
|
||
if (!item.value) {
|
||
uni.showToast({
|
||
icon: 'error',
|
||
title: this.$tt('status.pleaseSelect')
|
||
})
|
||
return;
|
||
}
|
||
}
|
||
const funVal = {
|
||
[item.id]: item.value,
|
||
}
|
||
let serialNumber = String(this.serialNumber).split('_')[0];
|
||
const data = {
|
||
serialNumber: serialNumber,
|
||
productId: this.productId,
|
||
remoteCommand: funVal,
|
||
identifier: item.id,
|
||
slaveId: this.slaveId,
|
||
modelName: item.name,
|
||
isShadow: this.status != 3,
|
||
type: item.type,
|
||
}
|
||
serviceInvoke(data).then(response => {
|
||
if (response.code == 200) {
|
||
uni.showToast({
|
||
icon: 'none',
|
||
title: this.$tt('status.service')
|
||
})
|
||
}
|
||
});
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.modbus-status-wrap {
|
||
.tabs-wrap {
|
||
width: 100%;
|
||
}
|
||
|
||
.attribute-report-wrap {}
|
||
|
||
.service-issue-wrap {}
|
||
|
||
.cell-wrap {
|
||
padding: 5px 10px;
|
||
|
||
.cell-title {
|
||
.cell-name {
|
||
display: block;
|
||
}
|
||
|
||
.cell-value {
|
||
margin-top: 5px;
|
||
display: block;
|
||
|
||
.cell-value-num {
|
||
margin-right: 3px;
|
||
color: #0f73ee;
|
||
}
|
||
}
|
||
|
||
.cell-value-unit {
|
||
margin-top: 5px;
|
||
}
|
||
|
||
.cell-time {
|
||
margin-top: 5px;
|
||
display: block;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style> |