jsy-app/pages/dev-ops/device.vue
2025-01-13 12:02:37 +08:00

477 lines
14 KiB
Vue

<template>
<z-paging ref="paging" @query="queryList" v-model="dataList" :auto-show-system-loading="true"
empty-view-text="抱歉,暂时还没有相关数据!">
<template #top>
<custom-nav-bar :left="true" title="基站"></custom-nav-bar>
</template>
<uni-collapse accordion>
<uni-collapse-item title="基站" v-if="dataList[0]">
<view class="index-container">
<view class="item-container" v-for="item in dataList[0]">
<view style="display: flex; align-items: center; justify-content: space-between;">
<view class="flex-text" style="margin: 15px;">
<view class="flex-text-one" style="color: black;">基站:</view>
<view>{{ item.deviceCode}}</view>
<view style="margin-left: 10px;">
<u-tag text="在线" type="success" plain v-if="dc.dataObj[item.deviceCode]?.online" />
<u-tag text="离线" type="error" plain v-else />
</view>
</view>
<view style="margin-right: 5px;">
<u-button type="success" text="刷新" icon="reload"
:loading="dc.dataObj[item.deviceCode]?.refresh"
@click="dc.refreshDeviceItem(item.deviceCode, item)" />
</view>
</view>
<u-gap height="1" bgColor="#D2D2D2"></u-gap>
<view style="display: flex;justify-content: space-between;align-items: center;">
<uni-row class="data">
<uni-col :span="12">
<view class="flex-text global-font-size-1">
<view class="flex-text-one">软/硬件版本:</view>
<view>{{ dataObj[item.deviceCode]?.sv || item.softVer}} /
{{ dataObj[item.deviceCode]?.dv || item.deviceVersion}}
</view>
</view>
</uni-col>
<uni-col :span="12">
<view class="flex-text global-font-size-1">
<view class="flex-text-one">频段:</view>
<view>{{ dataObj[item.deviceCode]?.lf || item.rolaFrequency}}</view>
</view>
</uni-col>
<uni-col :span="8">
<u-button type="success" @click="changeStation(item)" disabled>
更换基站
</u-button>
</uni-col>
<uni-col :span="8" v-hasPermi="['iot:dev-ops:gvl']">
<u-button type="success" @click="sendTopoList(item)">
下发列表
</u-button>
</uni-col>
<uni-col :span="8" v-hasPermi="['iot:dev-ops:slf']">
<u-button type="success" @click="SLF(item)">
修改频段
</u-button>
</uni-col>
<uni-col :span="8" v-hasPermi="['iot:dev-ops:gsc']">
<u-button type="success" @click="getStationConfig(item)">
获取配置
</u-button>
</uni-col>
<uni-col :span="8">
<u-button type="success" @click="pressureCalibrationTopo(item)" disabled>
压力校准
</u-button>
</uni-col>
<uni-col :span="8">
<u-button type="success" @click="stationRestart(item)" disabled>
重启
</u-button>
</uni-col>
<uni-col :span="8" v-hasPermi="['iot:dev-ops:valve']">
<u-button type="success" @click="topoDevice(item)">
子设备<u-badge type="primary" max="999" :value="item.topoCount" />
</u-button>
</uni-col>
<uni-col :span="8" v-if="item.newDeviceVersionId">
<u-button type="success" @click="upgradeStation(item)">
基站升级
</u-button>
</uni-col>
<uni-col :span="8">
<u-button type="success" @click="upgradeTopoValve(item)" disabled>
阀门升级
</u-button>
</uni-col>
</uni-row>
</view>
</view>
</view>
</uni-collapse-item>
<uni-collapse-item title="蝶阀" v-if="dataList[1] && false"></uni-collapse-item>
<uni-collapse-item title="4G阀门" v-if="dataList[2]">
<view class="index-container">
<view class="item-container" v-for="item in dataList[2]">
<view style="display: flex; align-items: center; justify-content: space-between;">
<view class="flex-text" style="margin: 15px;">
<view class="flex-text-one" style="color: black;">三通阀:</view>
<view>{{ item.device.deviceCode}}</view>
<view style="margin-left: 10px;">
<u-tag text="在线" type="success" plain
v-if="dc.dataObj[item.device.deviceCode]?.online" />
<u-tag text="离线" type="error" plain v-else />
</view>
</view>
<view style="margin-right: 5px;">
<u-button type="success" text="刷新" icon="reload"
:loading="dc.dataObj[item.device.deviceCode]?.refresh"
@click="dc.refreshDeviceItem(item.device.deviceCode, item)" />
</view>
</view>
<u-gap height="1" bgColor="#D2D2D2"></u-gap>
<view style="display: flex;justify-content: space-between;align-items: center;">
<uni-row class="data">
<uni-col :span="12">
<view class="flex-text global-font-size-1">
<view class="flex-text-one">软/硬件版本:</view>
<view>{{ dataObj[item.device.deviceCode]?.sv || item.device.deviceCode.softVer}}
/
{{ dataObj[item.device.deviceCode]?.dv || item.device.deviceVersion}}
</view>
</view>
</uni-col>
<uni-col :span="12">
<view class="flex-text global-font-size-1">
<view class="flex-text-one">信号强度:</view>
<view>{{ dc.dataObj[item.device.deviceCode]?.comm.rssi || '-' }}</view>
</view>
</uni-col>
<uni-col :span="12">
<view class="flex-text global-font-size-1">
<view class="flex-text-one">电量:</view>
<view>{{ dc.dataObj[item.device.deviceCode]?.adc.b || '-' }}%</view>
</view>
</uni-col>
<uni-col :span="12">
<view class="flex-text global-font-size-1">
<view class="flex-text-one">压力:</view>
<view>{{ dc.dataObj[item.device.deviceCode]?.adc.p || '-' }}</view>
</view>
</uni-col>
<uni-col :span="8" v-hasPermi="['iot:dev-ops:gvc']">
<u-button type="success" @click="getValve4Config(item.device)" disabled>
获取配置
</u-button>
</uni-col>
<uni-col :span="8">
<u-button type="success" @click="restartValve4(item.device)" disabled>
重启
</u-button>
</uni-col>
<uni-col :span="8" v-if="item.device.newDeviceVersionId">
<u-button type="success" @click="upgradeValve4(item.device)">
升级
</u-button>
</uni-col>
<uni-col :span="12">
<u-button type="success" @click="pressureCalibrationValve4(item.device)" disabled>
压力校准
</u-button>
</uni-col>
<uni-col :span="12">
<u-button type="success" @click="pressureSelect(item.device)" disabled>
压力查询
</u-button>
</uni-col>
</uni-row>
</view>
</view>
</view>
</uni-collapse-item>
</uni-collapse>
</z-paging>
<!-- 修改基站频段 -->
<custom-popup ref="refFrequency" :title="rolaFrequency.item?.deviceCode" :footer="true"
@confirm="rolaFrequencyHandler">
<view class="jz-info" style="width: 80vw;height:150px;padding: 10px;">
<uni-forms ref="baseForm" style="padding-top: 10px;">
<uni-forms-item label="原频段" required>
<uni-data-select v-model="rolaFrequency.old" :localdata="rolaFrequency.range" :clear="false" />
</uni-forms-item>
<uni-forms-item label="新频段" required>
<uni-data-select v-model="rolaFrequency.new" :localdata="rolaFrequency.range" :clear="false" />
</uni-forms-item>
</uni-forms>
</view>
</custom-popup>
</template>
<script>
import * as DevOpsApi from "@/api/dev-ops/index.js"
export default {
data() {
return {
landId: null,
dataList: [],
dc: getApp().dc, // 设备控制公共代码
dataObj: {},
topics: [],
rolaFrequency: {
item: null,
old: null,
new: null,
range: [],
},
}
},
onLoad(par) {
if (getApp().ijs.land) {
this.landId = getApp().ijs.land.id;
} else {
this.landId = -1;
}
// 频段
let list = [];
for (let i = 410; i < 491; i++) {
let lfObj = {
value: i,
text: i.toString()
}
list.push(lfObj);
}
this.rolaFrequency.range = list;
const that = this;
getApp().on("mqtt", "mqtt_devOps_station", function(e) {
if (e.type == "state") {
// that.mqttConnected = e.connected;
} else if (e.type == "msg") {
if (e.topic.includes("jsy/iot/deviceConfig/1/")) {
const arr = e.topic.split("/");
const deviceCode = arr[4];
let obj = that.dataObj[deviceCode] || {};
if (e.data.type == "gsc") {
obj = Object.assign(obj, {
dv: e.data.data.dv,
sv: e.data.data.sv,
lf: e.data.data.lf,
})
}
if (e.data.type == "lf") {
obj = Object.assign(obj, {
lf: e.data.data,
})
}
that.dataObj[deviceCode] = obj;
}
}
});
},
onShow() {},
mounted() {},
onUnload() {
getApp().mqttUnsubscribes(this.topics);
getApp().off("mqtt", "mqtt_devOps_station")
},
methods: {
queryList(pageNo, pageSize) {
DevOpsApi.getList(this.landId).then(res => {
console.error("res:", res);
let station = [],
butterflyValve = [],
valve = [];
if (res.data.station) {
station = res.data.station;
}
if (res.data.butterflyValve) {
butterflyValve = res.data.butterflyValve;
}
if (res.data.valve) {
valve = res.data.valve;
}
let data = [];
if (station.length == 0 && butterflyValve.length == 0 && valve.length == 0) {
data = [];
} else {
data = [station, butterflyValve, valve];
}
this.$refs.paging.completeByTotal(data);
this.mqttSubscribes(data);
});
},
mqttSubscribes(rows) {
if (rows && rows.length) {
let topics = [];
rows.forEach((x, index) => {
let topic = "jsy/iot/deviceConfig";
x.forEach(item => {
if (index == 0) {
topics.push(`${topic}/${item.deviceTypeId}/${item.deviceCode}`);
} else {
topics.push(
`${topic}/${item.device.deviceTypeId}/${item.device.deviceCode}`);
}
});
});
this.topics = topics;
getApp().mqttSubscribes(this.topics);
}
},
/************************************************** 基站 **************************************************/
// 更换基站
changeStation(item) {
console.error("更换基站:", item);
},
// 下发列表
sendTopoList(item) {
this.$showConfirm("下发列表").then(res => {
if (res.confirm) {
DevOpsApi.gvl(item.deviceCode).then(res => {
this.$toast(res.msg)
})
}
})
},
// 修改频段
SLF(item) {
this.$refs.refFrequency.show();
this.rolaFrequency.item = item;
this.rolaFrequency.old = item.rolaFrequency;
this.rolaFrequency.new = item.rolaFrequency;
},
// 获取配置
getStationConfig(item) {
this.$showConfirm("获取配置").then(res => {
if (res.confirm) {
DevOpsApi.gsc(item.deviceCode).then(res => {
this.$toast(res.msg)
})
}
})
},
// 压力校准
pressureCalibrationTopo(item) {
console.error("压力校准:", item);
},
// 重启
restartStation(item) {
console.error("重启:", item);
},
// 子设备
topoDevice(item) {
uni.navigateTo({
url: '/pages/dev-ops/valve?station=' + JSON.stringify(item)
});
},
// 升级
upgradeStation(item) {
this.$showConfirm(`升级"${item.deviceCode}"到"${item.newVersionName}"版本?`).then(res => {
if (res.confirm) {
DevOpsApi.upgradeStation(item.deviceCode, item.newDeviceVersionId).then(res => {
this.$toast(res.msg)
})
}
})
},
// 设备升级
upgradeTopoValve(item) {
console.error("设备升级:", item);
},
/************************************************** 基站接口 **************************************************/
loraFrequencyHandler(e) {
if (!e) {
return;
}
// if (this.rolaFrequency.item.rolaFrequency == this.rolaFrequency.rolaFrequency) {
// this.$toast("新旧频段不能相同!")
// return;
// }
let msg = `您确定要修改【${this.rolaFrequency.item.deviceCode }】的频段为【${this.rolaFrequency.new}】?`;
this.$showConfirm(msg).then(res => {
if (res.confirm) {
DevOpsApi.slf({
deviceCode: this.rolaFrequency.item.deviceCode,
oldFrequency: this.rolaFrequency.old,
newFrequency: this.rolaFrequency.new
}).then(res => {
this.$toast(res.msg)
})
} else {
this.pop.rolaFrequency = true;
}
})
},
/************************************************** 4G阀门 **************************************************/
// 获取配置
getValve4Config(item) {
console.error("获取配置:", item);
},
// 重启
restartValve4(item) {
console.error("重启:", item);
},
// 设备升级
upgradeValve4(item) {
console.error("设备升级:", item);
this.$showConfirm(`升级"${item.deviceCode}"到"${item.newVersionName}"版本?`).then(res => {
if (res.confirm) {
DevOpsApi.upgradeValve4G(item.deviceCode, item.newDeviceVersionId).then(res => {
this.$toast(res.msg)
})
}
})
},
// 压力校准
pressureCalibrationValve4(item) {
console.error("压力校准:", item);
},
// 压力查询
pressureSelect(item) {
console.error("压力查询:", item);
},
/************************************************** 公共 **************************************************/
// 关闭弹出层
close() {
for (var key in this.pop) {
this.pop[key] = false;
}
},
}
}
</script>
<style lang="scss" scoped>
.index-container {
.list {
margin: 0px 10px;
}
.list-size {
display: flex;
padding: 5px 5px;
background: white;
justify-content: center;
}
.search {
background-color: white;
padding: 10px;
}
.item-container {
margin: 10px 10px;
background-color: white;
padding-bottom: 10px;
border-radius: 10px;
box-shadow: 1px 1px 2px 2px rgba(0, 0, 0, 0.05);
}
.flex-text {
display: flex;
align-items: center;
.flex-text-one {
color: #939393;
font-weight: bold;
}
}
.data {
margin: 10px 20px !important;
width: 100%;
.uni-col {
margin-bottom: 5px;
}
}
}
</style>