Files
energy_storage/web/src/views/monitor.vue

320 lines
8.0 KiB
Vue
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.
<template>
<div class="monitor">
<div class="search">
<div class="left">
<div class="search-item">
<span>场站切换</span>
<a-select v-model:value="selectStationId" style="width: 300px" @change="getStationChange">
<a-select-option v-for="station in stations" :value="station['station_id']"
>{{ station.name }}
</a-select-option>
</a-select>
<a-button type="primary" @click="handleMessage" style="margin-left: 20px">查看预制舱参数</a-button>
</div>
</div>
<div class="right">
<div class="search-item">
<span>运行模式</span>
<a-select v-model:value="workMode" style="width: 220px">
<a-select-option :value="item.value" v-for="item in workModes">{{
item.label
}}</a-select-option>
</a-select>
</div>
<div class="search-item">
<a-button type="primary" @click="handleDispatch">下发</a-button>
</div>
</div>
</div>
<div class="content">
<div class="stations">
<div
class="station-item"
v-for="system in systems"
:key="system.name"
@click="chooseStation(system)"
:class="systemType == system.systemType ? 'active' : ''"
>
<span class="name">{{ system.name }}</span>
<span class="des" v-for="title in system.titles" :key="title.v"
>{{ title.v }}{{ system[title.key] }}{{ title.sufix }}
</span>
</div>
</div>
<div class="container">
<videos v-if="systemType == 4" :station-id="selectStationId" @updateGatewayData="updateGatewayData" />
<device v-else :station-id="selectStationId" :system-type="systemType" @updateGatewayData="updateGatewayData" />
</div>
</div>
<a-modal
v-model:open="msgModal"
width="700px"
style="top: 80px"
:footer="null"
:destroy-on-close="true"
>
<div style="color: #fff;padding: 20px" v-html="message"></div>
</a-modal>
</div>
</template>
<script>
import device from '@/components/monitor/device.vue'
import videos from '@/components/monitor/videos.vue'
import { postReq, getReq } from '@/request/api'
export default {
name: 'MonitorView',
components: {
device,
videos
},
data() {
return {
// currentKey: '储能系统',
systemType: 1,
value: [],
stations: [],
selectStationId: '',
message:'',
msgModal:false,
systems: [
{
name: '储能系统',
titles: [
{ v: '运行模式', key: 'workmode' },
{ v: '储能EMU状态', key: 'emu' },
{ v: '充电桩状态', key: 'cdz' },
//{ v: '总有功功率(台区)', key: 'power', sufix: 'kW' }
],
power: 60,
num: 62,
systemType: 1
},
{
name: '充电系统',
power: 60,
num: 62,
systemType: 2,
titles: [
//{ v: '总功率', key: 'power', sufix: 'kW' },
{ v: '数量', key: 'num' }
]
},
{
name: '光伏系统',
power: 60,
num: 62,
systemType: 3,
titles: [
//{ v: '总功率', key: 'power', sufix: 'kW' },
{ v: '数量', key: 'num' }
]
},
{
name: '安防系统',
power: 60,
num: 62,
systemType: 4,
titles: [
// { v: '总功率', key: 'power', sufix: 'kW' },
{ v: '数量', key: 'num' }
]
}
// {
// name: "储能系统4",
// }
],
workMode: '',
workModes: [
// 0手动1峰谷套利2增网配容3应急供电4并网保电5自定时段
{
value: 0,
label: '手动'
},
{
value: 1,
label: '峰谷套利'
},
{
value: 2,
label: '增网配容'
},
{
value: 3,
label: '应急供电'
},
{
value: 4,
label: '并网保电'
},
{
value: 5,
label: '自定时段'
}
],
deviceGroup: []
}
},
mounted() {
this.getStations()
},
methods: {
updateGatewayData(gatewayData) {
this.systems[0].workmode = gatewayData.workmode
this.systems[0].emu = gatewayData.emu
this.systems[0].cdz = gatewayData.cdz
this.message = gatewayData.msg
},
handleMessage(){
this.msgModal=true
},
//下发
async handleDispatch() {
console.log(this.workMode)
try {
const res = await postReq('/updateStation', {
station_id: this.selectStationId,
work_mode: this.workMode
})
if (res.errcode == 0) {
this.$message.success('下发成功')
}
} catch (error) {
this.$message.error('下发失败')
}
},
//场站切换
getStationChange(val) {
console.log(val)
this.getStationAttr()
},
//查询场站列表
async getStations() {
try {
const res = await getReq('/queryStationList', { page: 0, page_size: 10000 })
this.stations = res.data
this.selectStationId = this.stations[0]['station_id']
this.getStationAttr()
} catch (error) {
this.stations = []
this.selectStationId = ''
this.$message.error(error.message)
}
},
// 查询场站的参数
async getStationAttr() {
try {
const res = await getReq('/queryStationOverview', { station_id: this.selectStationId })
res.data.device_group.forEach((Element, index) => {
this.systems[index].num = Element.count
this.systems[index].power = Element.power
this.systems[index].workmode = Element.workmode
if(Element.category==1){
this.message=Element.msg
}
})
this.workMode = res.data.work_mode
} catch (error) {
this.deviceGroup = []
this.workMode = ''
// this.$message.error(error.errmsg)
}
},
chooseStation(system) {
console.log(system, 'system')
this.systemType = system.systemType
}
}
}
</script>
<style scoped lang="scss">
@import url(@/style/color.scss);
.monitor {
// width: 100%;
// height: calc(100% - 40px);
height: 100%;
padding: 20px;
background: $bg1-color;
border-radius: 15px;
.search {
display: flex;
justify-content: space-between;
.search-item {
span {
margin-right: 20px;
}
color: #fff;
margin-left: 30px;
&:first-child {
margin-left: 0;
}
}
.left,
.right {
display: flex;
}
}
.content {
width: 100%;
height: calc(100% - 32px - 20px);
margin-top: 20px;
display: flex;
justify-content: space-between;
.stations {
display: grid;
border-radius: 12px;
background: $bg2-color;
padding-top: 15px;
grid-template-rows: repeat(auto-fit, minmax(140px, 4fr));
.station-item {
flex: 1;
margin: 0 15px 15px 15px;
border-radius: 12px;
width: 180px;
display: flex;
flex-direction: column;
color: #fff;
padding: 10px 10px;
cursor: pointer;
&:hover{
background: $table-bg;
}
.name {
font-size: 20px;
font-weight: 700;
line-height: 50px;
}
.des {
font-size: 14px;
font-weight: 600;
line-height: 30px;
display: inline-block;
max-width: 160px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.active {
background: $bg3-color;
}
}
.container {
width: calc(100% - 200px);
display: flex;
justify-content: space-between;
}
}
}
</style>