1437 lines
59 KiB
Vue
Raw Permalink Normal View History

2025-05-22 16:24:05 +08:00
<template>
<view class="container">
<u-loading-page :loading="loading" bg-color="#eef3f7" loadingText="ZYC.cn"></u-loading-page>
<view class="card" v-show="!loading">
<view :style="bgStyle">
<u--text prefixIcon="grid-fill" iconStyle="font-size: 16px;color:#fff;margin-right:5px;" :text="title"
bold color="#fff"></u--text>
</view>
<view style="padding:10px;">
<u--form labelPosition="left" labelWidth="100"
:labelStyle="{ marginRight: '16px', lineHeight: '32px', width: '50px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }">
<u-form-item :label="$tt('status.deviceVersion')" leftIcon="/static/upgrade.png">
<u-row>
<u-col span="8">
<u--text :text="'Version' + deviceInfo.firmwareVersion"></u--text>
</u-col>
<u-col span="4">
<u-modal :title="$tt('status.deviceFirmware')" :show="show" :showCancelButton="true"
:showConfirmButton="Object.keys(firmware).length !== 0 && deviceInfo.firmwareVersion < firmware.version"
:confirmText="$tt('status.grade')" @confirm="confirmUpgrade"
@cancel="cancelUpgrade">
<view style="margin-top:10px;">
<u--text
v-if="Object.keys(firmware).length === 0 || deviceInfo.firmwareVersion >= firmware.version"
lineHeight="80" align="center" prefixIcon="checkmark-circle"
iconStyle="color:#5ac725;margin-right:5px;" type="info"
:text="$tt('status.noNeedToUpgrade')"></u--text>
<u--form labelPosition="left" labelWidth="45"
v-if="Object.keys(firmware).length !== 0 && deviceInfo.firmwareVersion < firmware.version">
<u--text type="success" prefixIcon="checkmark-circle"
iconStyle="color:#5ac725;margin-right:5px;"
:text="$tt('status.upgraded')"></u--text>
<u-form-item :label="$tt('status.name')">
<u--text type="info" :text="firmware.firmwareName"></u--text>
</u-form-item>
<u-form-item :label="$tt('status.version')">
<u--text type="info" :text="'Version ' + firmware.version"></u--text>
</u-form-item>
<u-form-item :label="$tt('status.description')">
<u--text type="info" :text="firmware.remark"
customStyle="font-size:14px;"></u--text>
</u-form-item>
</u--form>
</view>
</u-modal>
<!-- <u-button :disabled="deviceInfo.status != 3" @click="selectUpgrade" type="success"
text="检查更新" customStyle="width:60px;margin:0;" size="mini"></u-button> -->
</u-col>
</u-row>
</u-form-item>
</u--form>
</view>
</view>
<!-- 属性列表-->
<view class="card" v-if="this.attributeList.length!=0">
<view style="padding:10px;">
<u--text prefixIcon="grid-fill" iconStyle="font-size: 16px; color: #606266;" text="属性" bold
color="#606266"></u--text>
<view v-for="item in attributeList" :key="item.id">
<u-form labelPosition="left" labelWidth="100">
<u-form-item v-if="item.datatype.type=='bool'" leftIcon="/static/switch.png" :label="item.name">
<u-switch v-model="item.shadow" @change="mqttPublish(deviceInfo, item)"
:disabled="(shadowUnEnable || item.isReadonly==1)" inactiveValue="0" activeValue="1"
activeColor="#3c9cff" inactiveColor="#c4c6c9" size="20"></u-switch>
</u-form-item>
<u-form-item v-if="item.datatype.type=='enum'" leftIcon="list" :label="item.name">
<view class="enum-button-wrap"
v-if="item.datatype.showWay && item.datatype.showWay === 'button'">
<view class="enum-button" v-for="subItem in item.datatype.enumList"
:key="subItem.value">
<u-button size="mini" :disabled="(shadowUnEnable || item.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, item, subItem.value)"></u-button>
</view>
</view>
<uni-data-select v-else :class="(shadowUnEnable || item.isReadonly==1) ? 'disabled' : ''"
:clear="false" v-model="item.shadow" :localdata="item.datatype.enumList"
@change="dropdownChange(deviceInfo, item, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="item.datatype.type=='string'" leftIcon="email" :label="item.name">
<u-input v-model="item.shadow"
:placeholder="$tt('status.inputString')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="(shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, item)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='decimal'" leftIcon="email" :label="item.name">
<u-input v-model="item.shadow"
:placeholder="$tt('status.decimals')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || item.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, item)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='integer'" leftIcon="email" :label="item.name">
<u-input v-model="item.shadow"
:placeholder="$tt('status.integer')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || item.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, item)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type === 'object'">
<view class="object-wrap">
<u--text class="object-title" prefixIcon="attach"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view class="object-content">
<u-form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="param in item.datatype.params" :key="param.id">
<u-form-item v-if="param.datatype.type === 'bool'" :label="param.name">
<u-switch v-model="param.shadow"
@change="mqttPublish(deviceInfo, param)"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
inactiveValue="0" activeValue="1" activeColor="#3c9cff"
inactiveColor="#c4c6c9" size="20">
</u-switch>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'enum'" :label="param.name">
<view class="enum-button-wrap"
v-if="param.datatype.showWay && param.datatype.showWay === 'button'">
<view class="enum-button" v-for="subItem in param.datatype.enumList"
:key="subItem.value">
<u-button size="mini"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, param, subItem.value)"></u-button>
</view>
</view>
<uni-data-select v-else
:class="(shadowUnEnable || param.isReadonly === 1) ? 'disabled' : ''"
:clear="false" v-model="param.shadow"
:localdata="param.datatype.enumList"
@change="dropdownChange(deviceInfo, param, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'string'" :label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.inputString')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="(shadowUnEnable || param.isReadonly === 1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'decimal'" :label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.decimals')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly === 1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || param.isReadonly==1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'integer'" :label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.integer')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly === 1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)"></u-button>
</u-input>
</u-form-item>
</view>
</u-form>
</view>
</view>
</u-form-item>
<u-form-item v-if="item.datatype.type === 'array'">
<view class="object-wrap" v-if="item.datatype.arrayType !== 'object'">
<u--text class="object-title" prefixIcon="order"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view class="object-content">
<u--form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="(model,index) in item.datatype.arrayModel" :key="model.id">
<u-form-item v-if="item.datatype.arrayType=='string'"
:label="item.name+(index+1)">
<u-input v-model="model.shadow" :placeholder="$tt('status.inputString')
:disabled=" (shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, model)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.arrayType=='decimal'"
:label="item.name+(index+1)">
<u-input v-model="model.shadow" :placeholder="$tt('status.inputString')
:disabled=" (shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, model)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.arrayType=='integer'"
:label="item.name+(index+1)">
<u-input v-model="model.shadow" :placeholder="$tt('status.integer')"
:disabled="(shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, model)"></u-button>
</u-input>
</u-form-item>
</view>
</u--form>
</view>
</view>
<view class="object-wrap" v-if="item.datatype.arrayType === 'object'">
<u--text class="object-title" prefixIcon="order"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view style="padding: 0px 4.5px;" class="object-content">
<u-collapse :border="true">
<u-collapse-item v-for="(arrayParam,index) in item.datatype.arrayParams"
:key="getKey(item.id, index+1)" :title="item.name+(index+1)"
:name="item.id+(index+1)">
<u--form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="param in arrayParam" :key="param.id">
<u-form-item v-if="param.datatype.type=='bool'" :label="param.name">
<u-switch v-model="param.shadow"
@change="mqttPublish(deviceInfo, param)"
:disabled="(shadowUnEnable || param.isReadonly==1)"
inactiveValue="0" activeValue="1" activeColor="#3c9cff"
inactiveColor="#c4c6c9" size="20">
</u-switch>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'enum'"
:label="param.name">
<view class="enum-button-wrap"
v-if="param.datatype.showWay && param.datatype.showWay === 'button'">
<view class="enum-button"
v-for="subItem in param.datatype.enumList"
:key="subItem.value">
<u-button size="mini"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, param, subItem.value)"></u-button>
</view>
</view>
<uni-data-select v-else
:class="(shadowUnEnable || param.isReadonly==1) ? 'disabled' : ''"
:clear="false" v-model="param.shadow"
:localdata="param.datatype.enumList"
@change="dropdownChange(deviceInfo, param, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="param.datatype.type=='string'"
:label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.inputString')+(param.datatype.unit?''+$tt('status.unit')+''+param.datatype.unit:'')"
:disabled="(shadowUnEnable || param.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')"
size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)">
</u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='decimal'"
:label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.decimals')+(param.datatype.unit?''+$tt('status.unit')+''+param.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')"
size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)">
</u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='integer'"
:label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.integer')+(param.datatype.unit?''+$tt('status.unit')+''+param.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')"
size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)">
</u-button>
</u-input>
</u-form-item>
</view>
</u--form>
</u-collapse-item>
</u-collapse>
</view>
</view>
</u-form-item>
</u-form>
</view>
</view>
</view>
<!-- 操作列表-->
<view class="card" v-if="this.operateList.length!=0">
<view style="padding:10px;">
<u--text prefixIcon="grid-fill" iconStyle="font-size: 16px; color: #606266; margin-right: 5px;"
text="操作" bold color="#606266"></u--text>
<view v-for="item in operateList" :key="item.id">
<u-form labelPosition="left" labelWidth="100">
<u-form-item v-if="item.datatype.type=='bool'" leftIcon="/static/switch.png" :label="item.name">
<u-switch v-model="item.shadow" @change="mqttPublish(deviceInfo, item)"
:disabled="(shadowUnEnable || item.isReadonly==1)" inactiveValue="0" activeValue="1"
activeColor="#3c9cff" inactiveColor="#c4c6c9" size="20"></u-switch>
</u-form-item>
<u-form-item v-if="item.datatype.type=='enum'" leftIcon="list" :label="item.name">
<view class="enum-button-wrap"
v-if="item.datatype.showWay && item.datatype.showWay === 'button'">
<view class="enum-button" v-for="subItem in item.datatype.enumList"
:key="subItem.value">
<u-button size="mini" :disabled="(shadowUnEnable || item.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, item, subItem.value)"></u-button>
</view>
</view>
<uni-data-select v-else :class="(shadowUnEnable || item.isReadonly==1) ? 'disabled' : ''"
:clear="false" v-model="item.shadow" :localdata="item.datatype.enumList"
@change="dropdownChange(deviceInfo, item, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="item.datatype.type=='string'" leftIcon="email" :label="item.name">
<u-input v-model="item.shadow"
:placeholder="$tt('status.inputString')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="(shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, item)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='decimal'" leftIcon="email" :label="item.name">
<u-input v-model="item.shadow"
:placeholder="$tt('status.decimals')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || item.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, item)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='integer'" leftIcon="email" :label="item.name">
<u-input v-model="item.shadow"
:placeholder="$tt('status.integer')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || item.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, item)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type === 'object'">
<view class="object-wrap">
<u--text class="object-title" prefixIcon="attach"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view class="object-content">
<u-form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="param in item.datatype.params" :key="param.id">
<u-form-item v-if="param.datatype.type === 'bool'" :label="param.name">
<u-switch v-model="param.shadow"
@change="mqttPublish(deviceInfo, param)"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
inactiveValue="0" activeValue="1" activeColor="#3c9cff"
inactiveColor="#c4c6c9" size="20">
</u-switch>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'enum'" :label="param.name">
<view class="enum-button-wrap"
v-if="param.datatype.showWay && param.datatype.showWay === 'button'">
<view class="enum-button" v-for="subItem in param.datatype.enumList"
:key="subItem.value">
<u-button size="mini"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, param, subItem.value)"></u-button>
</view>
</view>
<uni-data-select v-else
:class="(shadowUnEnable || param.isReadonly === 1) ? 'disabled' : ''"
:clear="false" v-model="param.shadow"
:localdata="param.datatype.enumList"
@change="dropdownChange(deviceInfo, param, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'string'" :label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.inputString')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="(shadowUnEnable || param.isReadonly === 1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'decimal'" :label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.decimals')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly === 1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || param.isReadonly==1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'integer'" :label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.integer')+(item.datatype.unit?''+$tt('status.unit')+''+item.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly === 1">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)"></u-button>
</u-input>
</u-form-item>
</view>
</u-form>
</view>
</view>
</u-form-item>
<u-form-item v-if="item.datatype.type === 'array'">
<view class="object-wrap" v-if="item.datatype.arrayType !== 'object'">
<u--text class="object-title" prefixIcon="order"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view class="object-content">
<u--form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="(model,index) in item.datatype.arrayModel" :key="model.id">
<u-form-item v-if="item.datatype.arrayType=='string'"
:label="item.name+(index+1)">
<u-input v-model="model.shadow" :placeholder="$tt('status.inputString')"
:disabled="(shadowUnEnable
|| item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, model)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.arrayType=='decimal'"
:label="item.name+(index+1)">
<u-input v-model="model.shadow" :placeholder="$tt('status.inputString')"
:disabled=" (shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, model)"></u-button>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.arrayType=='integer'"
:label="item.name+(index+1)">
<u-input v-model="model.shadow" :placeholder="$tt('status.integer')"
:disabled="(shadowUnEnable || item.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')" size="mini"
:slot="(shadowUnEnable || item.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, model)"></u-button>
</u-input>
</u-form-item>
</view>
</u--form>
</view>
</view>
<view class="object-wrap" v-if="item.datatype.arrayType === 'object'">
<u--text class="object-title" prefixIcon="order"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view style="padding: 0px 4.5px;" class="object-content">
<u-collapse :border="true">
<u-collapse-item v-for="(arrayParam,index) in item.datatype.arrayParams"
:key="getKey(item.id, index+1)" :title="item.name+(index+1)"
:name="item.id+(index+1)">
<u--form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="param in arrayParam" :key="param.id">
<u-form-item v-if="param.datatype.type=='bool'" :label="param.name">
<u-switch v-model="param.shadow"
@change="mqttPublish(deviceInfo, param)"
:disabled="(shadowUnEnable || param.isReadonly==1)"
inactiveValue="0" activeValue="1" activeColor="#3c9cff"
inactiveColor="#c4c6c9" size="20">
</u-switch>
</u-form-item>
<u-form-item v-if="param.datatype.type === 'enum'"
:label="param.name">
<view class="enum-button-wrap"
v-if="param.datatype.showWay && param.datatype.showWay === 'button'">
<view class="enum-button"
v-for="subItem in param.datatype.enumList"
:key="subItem.value">
<u-button size="mini"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, param, subItem.value)"></u-button>
</view>
</view>
<uni-data-select v-else
:class="(shadowUnEnable || param.isReadonly==1) ? 'disabled' : ''"
:clear="false" v-model="param.shadow"
:localdata="param.datatype.enumList"
@change="dropdownChange(deviceInfo, param, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="param.datatype.type=='string'"
:label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.inputString')+(param.datatype.unit?''+$tt('status.unit')+''+param.datatype.unit:'')"
:disabled="(shadowUnEnable || param.isReadonly==1)">
<u-button type="primary" :text="$tt('status.send')"
size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)">
</u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='decimal'"
:label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.decimals')+(param.datatype.unit?''+$tt('status.unit')+''+param.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')"
size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)">
</u-button>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='integer'"
:label="param.name">
<u-input v-model="param.shadow"
:placeholder="$tt('status.integer')+(param.datatype.unit?''+$tt('status.unit')+''+param.datatype.unit:'')"
:disabled="shadowUnEnable || param.isReadonly==1">
<u-button type="primary" :text="$tt('status.send')"
size="mini"
:slot="(shadowUnEnable || param.isReadonly === 1) ? '' : 'suffix'"
@click="mqttPublish(deviceInfo, param)">
</u-button>
</u-input>
</u-form-item>
</view>
</u--form>
</u-collapse-item>
</u-collapse>
</view>
</view>
</u-form-item>
</u-form>
</view>
</view>
</view>
<view class="card" :style="loading ? 'visibility:hidden' : 'visibility:visible'"
v-if="monitorChart.length != 0">
<view style="padding:10px;">
<u--text prefixIcon="grid-fill" iconStyle="font-size: 16px; color: #606266; margin-right: 5px;"
:text="$tt('status.monitior')" bold color="#606266"></u--text>
</view>
<view class="wrapper">
<view class="item" v-for="(chart, index) in monitorChart" :key="index">
<view class="dashboard">
<qiun-data-charts type="gauge" :opts="chart.opts" :chartData="chart.data" :canvas2d="false" />
</view>
</view>
</view>
</view>
<view class="card" v-if="!loading && deviceInfo.isShadow == 1 && deviceInfo.status != 3">
<view style="padding:10px;">
<u--text prefixIcon="grid-fill" iconStyle="font-size: 16px;color:#606266;margin-right:5px;"
:text="$tt('status.offline')" bold color="#606266"></u--text>
</view>
<view style="background-color:#fff;padding:10px;">
<u--form labelPosition="left" labelWidth="100"
:labelStyle="{ marginRight: '16px', width: '50px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="item in deviceInfo.thingsModels" :key="item.id">
<u-form-item v-if="item.datatype.type=='bool'" leftIcon="/static/switch.png" :label="item.name">
<u-switch v-model="item.value" @change="mqttPublish(deviceInfo, item)" inactiveValue="0"
activeValue="1" activeColor="#3c9cff" inactiveColor="#c4c6c9" size="20"
disabled></u-switch>
</u-form-item>
<u-form-item v-if="item.datatype.type=='enum'" leftIcon="list" :label="item.name">
<view class="enum-button-wrap"
v-if="item.datatype.showWay && item.datatype.showWay === 'button'">
<view class="enum-button" v-for="subItem in item.datatype.enumList"
:key="subItem.value">
<u-button size="mini" :disabled="(shadowUnEnable || item.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, item, subItem.value)" disabled></u-button>
</view>
</view>
<uni-data-select v-else class="disabled" :clear="false" v-model="item.value"
:localdata="item.datatype.enumList" @change="dropdownChange(deviceInfo, item, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="item.datatype.type=='string'" leftIcon="email" :label="item.name">
<u-input v-model="item.value" :placeholder="$tt('status.inputString')" disabled>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='decimal'" leftIcon="email" :label="item.name">
<u-input v-model="item.value" :placeholder="$tt('status.decimals')" disabled>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='integer'" leftIcon="email" :label="item.name">
<u-input v-model="item.value" :placeholder="$tt('status.integer')" disabled>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.type=='object'">
<view class="object-wrap">
<u--text class="object-title" prefixIcon="attach"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view class="object-content">
<u-form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="param in item.datatype.params" :key="param.id">
<u-form-item v-if="param.datatype.type=='bool'" :label="param.name">
<u-switch v-model="param.value" @change="mqttPublish(deviceInfo, param)"
inactiveValue="0" activeValue="1" activeColor="#3c9cff"
inactiveColor="#c4c6c9" size="20" disabled>
</u-switch>
</u-form-item>
<u-form-item v-if="param.datatype.type=='enum'" :label="param.name">
<view class="enum-button-wrap"
v-if="param.datatype.showWay && param.datatype.showWay === 'button'">
<view class="enum-button" v-for="subItem in param.datatype.enumList"
:key="subItem.value">
<u-button size="mini"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, param, subItem.value)"
disabled></u-button>
</view>
</view>
<uni-data-select v-else class="disabled" :clear="false"
v-model="param.value" :localdata="param.datatype.enumList"
@change="dropdownChange(deviceInfo, param, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="param.datatype.type=='string'" :label="param.name">
<u-input v-model="param.value" :placeholder="$tt('status.inputString')"
disabled>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='decimal'" :label="param.name">
<u-input v-model="param.value" :placeholder="$tt('status.decimals')"
disabled>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='integer'" :label="param.name">
<u-input v-model="param.value" :placeholder="$tt('status.integer')"
disabled>
</u-input>
</u-form-item>
</view>
</u-form>
</view>
</view>
</u-form-item>
<u-form-item v-if="item.datatype.type=='array'">
<view class="object-wrap" v-if="item.datatype.arrayType!='object'">
<u--text class="object-title" prefixIcon="order"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view class="object-content">
<u--form labelPosition="left" labelWidth="110"
:labelStyle="{ lineHeight: '32px', width: '110px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }">
<view v-for="(model,index) in item.datatype.arrayModel" :key="model.id">
<u-form-item v-if="item.datatype.arrayType=='string'"
:label="item.name+(index+1)">
<u-input v-model="model.value" :placeholder="$tt('status.inputString')"
disabled>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.arrayType=='decimal'"
:label="item.name+(index+1)">
<u-input v-model="model.value" :placeholder="$tt('status.decimals')"
disabled>
</u-input>
</u-form-item>
<u-form-item v-if="item.datatype.arrayType=='integer'"
:label="item.name+(index+1)">
<u-input v-model="model.value" :placeholder="$tt('status.integer')"
disabled>
</u-input>
</u-form-item>
</view>
</u--form>
</view>
</view>
<view class="object-wrap" v-if="item.datatype.arrayType=='object'">
<u--text class="object-title" prefixIcon="order"
iconStyle="font-size: 16px; margin-right: 4px" bold lineHeight="30"
:text="item.name"></u--text>
<view style="padding: 0px 4.5px;" class="object-content">
<u-collapse :border="true">
<u-collapse-item v-for="(arrayParam,index) in item.datatype.arrayParams"
:key="getKey(item.id, index+1)" :title="item.name+(index+1)"
:name="item.id+(index+1)">
<u--form labelPosition="left" labelWidth="110"
:labelStyle="{marginRight:'16px',lineHeight:'32px',width:'110px',overflow:'hidden',textOverflow:'ellipsis'}">
<view v-for="param in arrayParam" :key="param.id">
<u-form-item v-if="param.datatype.type=='bool'" :label="param.name">
<u-switch v-model="param.value"
@change="mqttPublish(deviceInfo, param)" inactiveValue="0"
activeValue="1" activeColor="#3c9cff"
inactiveColor="#c4c6c9" size="20" disabled>
</u-switch>
</u-form-item>
<u-form-item v-if="param.datatype.type=='enum'" :label="param.name">
<view class="enum-button-wrap"
v-if="param.datatype.showWay && param.datatype.showWay === 'button'">
<view class="enum-button"
v-for="subItem in param.datatype.enumList"
:key="subItem.value">
<u-button size="mini"
:disabled="(shadowUnEnable || param.isReadonly === 1)"
type="primary" :plain="true" :text="subItem.text"
@click="enumButtonClick(deviceInfo, param, subItem.value)"
disabled></u-button>
</view>
</view>
<uni-data-select v-else class="disabled" :clear="false"
v-model="param.value" :localdata="param.datatype.enumList"
@change="dropdownChange(deviceInfo, param, $event)">
</uni-data-select>
</u-form-item>
<u-form-item v-if="param.datatype.type=='string'"
:label="param.name">
<u-input v-model="param.value"
:placeholder="$tt('status.inputString')" disabled>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='decimal'"
:label="param.name">
<u-input v-model="param.value"
:placeholder="$tt('status.decimals')" disabled>
</u-input>
</u-form-item>
<u-form-item v-if="param.datatype.type=='integer'"
:label="param.name">
<u-input v-model="param.value"
:placeholder="$tt('status.integer')" disabled>
</u-input>
</u-form-item>
</view>
</u--form>
</u-collapse-item>
</u-collapse>
</view>
</view>
</u-form-item>
</view>
</u--form>
</view>
</view>
</view>
</template>
<script>
import projectConfig from '@/env.config.js';
import {
getLatestFirmware,
relateChannelList
} from '@/apis/modules/device.js';
import {
serviceInvoke
} from '@/apis/modules/runtime.js';
import {
getSipStatusInfo,
getLocationWayInfo
} from '@/helpers/common.js'
export default {
name: 'baseStatus',
props: {
device: {
type: Object,
default: null,
required: true
}
},
watch: {
// 兼容小程序
device: function(newVal, oldVal) {
if (newVal.deviceName !== '') {
this.deviceInfo = newVal;
if (this.deviceInfo.deviceType != 3) {
//分-属性和操作
this.operateList = this.deviceInfo.thingsModels && this.deviceInfo.thingsModels.filter((
item) =>
item.isReadonly == '0');
this.attributeList = this.deviceInfo.thingsModels && this.deviceInfo.thingsModels.filter((
item) =>
item.isReadonly == '1');
//排序
this.attributeList = this.attributeList.sort((a, b) => a.order - b.order);
this.operateList = this.operateList.sort((a, b) => a.order - b.order);
}
this.updateDeviceStatus(this.deviceInfo);
this.initChart();
}
}
},
data() {
return {
// 设备升级模态窗
show: false,
// 固件
firmware: {},
// 加载图标
loading: true,
// 图表数据集合
monitorChart: [{
opts: {},
data: {
categories: [],
series: [],
},
id: '',
}],
// 控制模块标题
title: this.$tt('status.control'),
// 未启用设备影子
shadowUnEnable: false,
// 控制项标题背景
statusColor: {
background: '#67C23A',
color: '#fff'
},
// 模块背景色
bgStyle: '',
// 设备信息
deviceInfo: {
chartList: [],
},
//通道列表
channelList: [],
// 设备通道
channelLoadStatus: 'nomore',
queryParams: {
deviceSipId: '', //设备sipid
},
//属性列表
attributeList: [],
//动作列表
operateList: [],
};
},
created() {
// 获取设备状态(兼容H5和APP)
if (this.device !== null && Object.keys(this.device).length !== 0) {
this.deviceInfo = this.device;
this.updateDeviceStatus(this.deviceInfo);
this.initChart();
};
// 回调处理
this.mqttCallback();
},
methods: {
/* Mqtt回调处理 */
mqttCallback() {
this.$mqttTool.client.on('message', (topic, message, buffer) => {
let topics = topic.split('/');
let productId = topics[1];
let deviceNum = topics[2];
message = JSON.parse(message.toString());
if (topics[3] == 'status') {
console.log('接收到【设备状态-运行】主题:', topic);
console.log('接收到【设备状态-运行】内容:', message);
// 更新列表中设备的状态
if (this.deviceInfo.serialNumber == deviceNum) {
this.deviceInfo.status = message.status;
this.deviceInfo.isShadow = message.isShadow;
this.deviceInfo.rssi = message.rssi;
this.updateDeviceStatus(this.deviceInfo);
}
}
//兼容设备回复
if (topics[4] == 'reply') {
uni.showToast({
icon: 'none',
title: message,
})
}
if (topics[3] == 'property' || topics[3] == 'function' || topic.endsWith(
'ws/service')) {
console.log('接收到【物模型】主题:', topic);
console.log('接收到【物模型】内容:', message);
// 更新列表中设备的属性
if (this.deviceInfo.serialNumber == deviceNum) {
for (let j = 0; j < message.message.length; j++) {
let isComplete = false;
// 设备状态
for (let k = 0; k < this.deviceInfo.thingsModels.length && !
isComplete; k++) {
if (this.deviceInfo.thingsModels[k].id == message.message[j].id) {
// 普通类型
this.deviceInfo.thingsModels[k].shadow = message.message[j].value;
isComplete = true;
break;
} else if (this.deviceInfo.thingsModels[k].datatype.type ==
"object") {
// 对象类型
for (let n = 0; n < this.deviceInfo.thingsModels[k]
.datatype.params
.length; n++) {
if (this.deviceInfo.thingsModels[k].datatype.params[n]
.id == message.message[j]
.id) {
this.deviceInfo.thingsModels[k].datatype.params[n]
.shadow =
message.message[j].value;
isComplete = true;
break;
}
}
} else if (this.deviceInfo.thingsModels[k].datatype.type ==
"array") {
// 数组类型
if (this.deviceInfo.thingsModels[k].datatype.arrayType ==
"object") {
// 1.对象类型数组,id为数组中一个元素,例如array_01_gateway_temperature
if (String(message.message[j].id).indexOf("array_") == 0) {
for (let n = 0; n < this.deviceInfo.thingsModels[k]
.datatype
.arrayParams.length; n++) {
for (let m = 0; m < this.deviceInfo
.thingsModels[k].datatype
.arrayParams[n].length; m++) {
if (this.deviceInfo.thingsModels[k]
.datatype.arrayParams[n]
[m].id == message.message[j].id) {
this.deviceInfo.thingsModels[k]
.datatype.arrayParams[n]
[m].shadow = message.message[j].value;
isComplete = true;
break;
}
}
if (isComplete) {
break;
}
}
} else {
// 2.对象类型数组例如gateway_temperature,消息ID添加前缀后匹配
for (let n = 0; n < this.deviceInfo.thingsModels[k]
.datatype
.arrayParams.length; n++) {
for (let m = 0; m < this.deviceInfo
.thingsModels[k].datatype
.arrayParams[n].length; m++) {
let index = n > 9 ? String(n) : '0' + k;
let prefix = 'array_' + index + '_';
if (this.deviceInfo.thingsModels[k]
.datatype.arrayParams[n]
[m].id == prefix + message.message[j].id) {
this.deviceInfo.thingsModels[k]
.datatype.arrayParams[n]
[m].shadow = message.message[j].value;
isComplete = true;
}
}
if (isComplete) {
break;
}
}
}
} else {
// 整数、小数和字符串类型数组
for (let n = 0; n < this.deviceInfo.thingsModels[k]
.datatype.arrayModel
.length; n++) {
if (this.deviceInfo.thingsModels[k].datatype
.arrayModel[n].id ==
message.message[j].id) {
this.deviceInfo.thingsModels[k].datatype
.arrayModel[n].shadow =
message.message[j].value;
isComplete = true;
break;
}
}
}
}
};
// 监测数据
for (let k = 0; k < this.deviceInfo.chartList.length && !
isComplete; k++) {
if (this.deviceInfo.chartList[k].id.indexOf("array_") == 0) {
// 数组类型匹配,例如array_00_gateway_temperature
if (this.deviceInfo.chartList[k].id == message.message[j].id) {
// let shadows = message[j].value.split(",");
this.deviceInfo.chartList[k].shadow = message.message[j].value;
// 更新图表
for (let m = 0; m < this.monitorChart.length; m++) {
if (this.deviceInfo.chartList[k].id == this
.monitorChart[m].id) {
// uchart中data取值范围0-1需要最小数+监测值,然后除于区间值
let value = (Number(message.message[j].value) + Math
.abs(this
.deviceInfo.chartList[k].datatype
.min)) / (Math.abs(
this.deviceInfo.chartList[k]
.datatype.min) + Math
.abs(this.deviceInfo.chartList[k]
.datatype.max));
this.monitorChart[m].data.series[0].data =
value;
this.monitorChart[m].opts.title.name = message.message[
j].value + ' ' +
this.deviceInfo.chartList[k].datatype.unit;
break;
}
}
isComplete = true;
break;
}
} else {
// 普通类型匹配
if (this.deviceInfo.chartList[k].id == message.message[j].id) {
this.deviceInfo.chartList[k].shadow = message.message[j].value;
// 更新图表
for (let m = 0; m < this.monitorChart.length; m++) {
if (this.deviceInfo.chartList[k].id == this
.monitorChart[m].id) {
// uchart中data取值范围0-1需要最小数+监测值,然后除于区间值
let value = (Number(message.message[j].value) + Math
.abs(this
.deviceInfo.chartList[k].datatype
.min)) / (Math.abs(
this.deviceInfo.chartList[k]
.datatype.min) + Math
.abs(this.deviceInfo.chartList[k]
.datatype.max));
this.monitorChart[m].data.series[0].data =
value;
this.monitorChart[m].opts.title.name = message.message[
j].value + ' ' +
this.deviceInfo.chartList[k].datatype.unit;
break;
}
}
isComplete = true;
break;
}
}
if (isComplete) {
break;
}
};
}
}
}
});
},
//发送指令
mqttPublish(device, model) {
const command = {};
command[model.id] = model.shadow;
const data = {
serialNumber: device.serialNumber,
productId: device.productId,
remoteCommand: command,
identifier: model.id,
modelName: model.name,
isShadow: device.status != 3,
type: model.type,
}
serviceInvoke(data).then(response => {
if (response.code === 200) {
uni.showToast({
icon: 'none',
title: this.$tt('status.service')
});
}
})
},
/**
* Mqtt发布消息
* @device 设备
* @model 物模型(id/name/type/name/isReadonly/value/shadow)type 类型(1=属性2=功能3=OTA升级4=实时监测)
* */
// mqttPublish (device, model) {
// let topic = "";
// let message = ""
// if (model.type == 1) {
// if (device.status == 3) {
// // 属性,在线模式
// topic = "/" + device.productId + "/" + device.serialNumber + "/property-online/get";
// } else if (device.isShadow) {
// // 属性,离线模式
// topic = "/" + device.productId + "/" + device.serialNumber + "/property-offline/post";
// }
// message = '[{"id":"' + model.id + '","value":"' + model.shadow + '"}]';
// } else if (model.type == 2) {
// if (device.status == 3) {
// // 功能,在线模式
// topic = "/" + device.productId + "/" + device.serialNumber + "/function-online/get";
// } else if (device.isShadow) {
// // 功能,离线模式
// topic = "/" + device.productId + "/" + device.serialNumber + "/function-offline/post";
// }
// message = '[{"id":"' + model.id + '","value":"' + model.shadow + '"}]';
// } else if (model.type == 3) {
// // OTA升级
// topic = "/" + device.productId + "/" + device.serialNumber + "/ota/get";
// message = '{"version":' + this.firmware.version + ',"downloadUrl":"' + this.getDownloadUrl(this
// .firmware.filePath) + '"}';
// } else {
// return;
// }
// if (topic !== "") {
// this.$mqttTool.publish(topic, message, model.name); // 发布
// }
// },
// 获取下载路径前缀
getDownloadUrl(path) {
return projectConfig.baseUrl + path;
},
/** 检查升级 */
selectUpgrade() {
// 获取升级固件
getLatestFirmware(this.deviceInfo.deviceId).then(response => {
this.firmware = response.data || {};
this.show = true;
});
this.show = true;
},
// 确认升级
confirmUpgrade() {
let model = {};
model.name = this.$tt('status.equip');
model.type = 3;
this.mqttPublish(this.deviceInfo, model);
this.show = false;
},
// 取消升级
cancelUpgrade() {
this.show = false;
},
/** 更新设备状态 */
updateDeviceStatus(device) {
if (device.status === 3) {
this.title = this.$tt('status.online');
this.bgStyle =
'background-color:#5ac725;border-top-left-radius:6px;border-top-right-radius:6px;padding:10px;';
this.shadowUnEnable = false;
} else {
if (device.isShadow === 1) {
this.bgStyle =
'background-color:#3c9cff;border-top-left-radius:6px;border-top-right-radius:6px;padding:10px;';
this.title = this.$tt('status.shadow');
this.shadowUnEnable = false;
} else {
this.bgStyle =
'background-color:#909399;border-top-left-radius:6px;border-top-right-radius:6px;padding:10px;';
this.title = this.$tt('status.deviceOffline');
this.shadowUnEnable = true;
}
}
},
/** 下拉菜单改变事件*/
dropdownChange(device, model, eventData) {
model.shadow = eventData;
// 防止uni-data-select在初始化的时候也触发change产生不必要的错误
if (eventData !== "") {
// 发布物模型
this.mqttPublish(device, model);
}
},
// 设备通道
getRelateChannelList() {
return new Promise((resolve, reject) => {
relateChannelList(this.deviceInfo.deviceId).then(response => {
this.channelList = response.data;
response.data.map(item => {
item.statusInfo = getSipStatusInfo(item.status);
return item;
})
resolve(response.data);
}).catch(error => {
reject(error);
});
});
},
gotoDevicePlayer(deviceSipId, channelSipId, status) {
let statusInfo = getSipStatusInfo(status)
if (status !== 3) {
uni.showToast({
icon: 'none',
title: `无法查看${getSipStatusInfo(status).name}数据`
});
return;
}
// #ifdef H5
uni.$u.route('/pages_player/list/devicePlayer', {
deviceId: deviceSipId,
channelSipId: channelSipId,
});
//#endif
// #ifdef APP-PLUS
uni.$u.route('/pages_player/list/devicePlayerApp', {
deviceId: deviceSipId,
channelSipId: channelSipId,
});
//#endif
// #ifdef MP-WEIXIN
uni.showToast({
icon: 'none',
title: this.$tt('timing.nosupported')
});
//#endif
},
/**监测图表*/
initChart() {
this.monitorChart = [];
if (this.deviceInfo.chartList && this.deviceInfo.chartList.length !== 0) {
for (let i = 0; i < this.deviceInfo.chartList.length; i++) {
let data = {};
let res = {
categories: [{
value: 0.2,
color: '#409EFF'
}, {
value: 0.8,
color: '#12d09f'
}, {
value: 1,
color: '#F56C6C'
}],
series: [{
name: this.deviceInfo.chartList[i].name,
// uchart中data取值范围0-1需要最小数+监测值,然后除于区间值
data: (Number(this.deviceInfo.chartList[i].shadow) + Math.abs(
this.deviceInfo
.chartList[i].datatype.min)) /
(Math.abs(this.deviceInfo.chartList[i].datatype.min) + Math
.abs(this
.deviceInfo
.chartList[i].datatype.max))
}]
};
data = JSON.parse(JSON.stringify(res));
//这里的 opts 是图表类型 type="gauge" 的全部配置参数,您可以将此配置复制到 config-ucharts.js 文件中下标为 ['gauge'] 的节点中来覆盖全局默认参数。实际应用过程中 opts 只需传入与全局默认参数中不一致的【某一个属性】即可实现同类型的图表显示不同的样式,达到页面简洁的需求。
let opts = {
update: true,
timing: 'easeOut',
duration: 1000,
rotate: false,
rotateLock: false,
color: ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272',
'#FC8452',
'#9A60B4',
'#ea7ccc'
],
padding: undefined,
fontSize: 13,
fontColor: '#666666',
dataLabel: true,
dataPointShape: true,
dataPointShapeType: 'solid',
touchMoveLimit: 60,
enableScroll: false,
enableMarkLine: false,
title: {
name: `${!this.deviceInfo.chartList[i].shadow || this.deviceInfo.chartList[i].shadow == ' ' ? 0 : this.deviceInfo.chartList[i].shadow} ${this.deviceInfo.chartList[i].datatype.unit}`,
fontSize: 24,
color: '#2fc25b',
offsetY: 95,
offsetX: 0
},
subtitle: {
name: this.deviceInfo.chartList[i].name,
fontSize: 14,
color: '#333',
offsetY: 10,
offsetX: 0
},
extra: {
gauge: {
type: 'default',
width: 10,
labelColor: '#666666',
startAngle: 0.75,
endAngle: 0.25,
startNumber: this.deviceInfo.chartList[i].datatype.min,
endNumber: this.deviceInfo.chartList[i].datatype.max,
format: 'dashboardKeepTwoDecimals',
labelFormat: '',
splitLine: {
fixRadius: 0,
splitNumber: 10,
width: 30,
color: '#FFFFFF',
childNumber: 5,
childWidth: 10
},
pointer: {
width: 12,
color: 'auto'
},
labelOffset: 16
}
}
};
this.monitorChart.push({
opts: opts,
data: data,
id: this.deviceInfo.chartList[i].id
});
}
};
// 延时1秒执行
setTimeout(x => {
this.loading = false;
}, 1000);
},
// 下拉刷新
deviceStatusRefresh() {
this.updateDeviceStatus(this.deviceInfo);
this.monitorChart = [];
this.initChart();
uni.stopPullDownRefresh();
},
/** 枚举类型按钮单击 */
enumButtonClick(device, model, value) {
model.shadow = value;
this.mqttPublish(device, model);
},
getKey(id, index) {
if (index || index === 0) {
return `${id}-${index}`;
} else {
return id;
}
},
}
};
</script>
<style lang="scss" scoped>
.container {}
.wrapper {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-content: flex-start;
margin-bottom: 20rpx;
padding: 20rpx;
}
.wrapper .item {
width: 100%;
height: 250px;
text-align: center;
border-top: 1px solid #efefef;
}
.wrapper .item .dashboard {
width: 60%;
margin: auto;
}
.card {
box-shadow: 0 1px 0px 0 rgba(0, 0, 0, 0.1);
border-radius: 6px;
background-color: #fff;
margin: 10px;
padding: 0;
}
.disabled {
pointer-events: none;
cursor: default;
background-color: rgb(245, 247, 250);
}
.object-wrap {
width: 100%;
.object-title {}
.object-content {
// border: 1px #f1f3f4 solid;
padding: 0px 18px;
border-radius: 5px;
::v-deep .u-line:first-child {
border-bottom: transparent !important;
}
}
}
.enum-button-wrap {
.enum-button {
display: inline-block;
margin-right: 10px;
&:not(:first-child) {
margin-top: 10px
}
}
}
.channel_wrap {
padding: 6px 0;
.item_body {
position: relative;
display: flex;
align-items: center;
margin-bottom: 6px;
background: #fff;
.img {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 5px;
width: 90px;
height: 60px;
background: #e5e5e5;
margin: 10px;
}
.status {
position: absolute;
right: 13px;
top: 13px;
}
}
}
</style>