Compare commits
37 Commits
1b712a70f6
...
main-local
| Author | SHA1 | Date | |
|---|---|---|---|
| 2765bcab10 | |||
| b55d9e2d5c | |||
| 29ab53056a | |||
| 0c32439146 | |||
| 5250db915f | |||
| 814103c881 | |||
| 55b7fba021 | |||
| da4ecc4792 | |||
| 498dc117f2 | |||
| 058879ec45 | |||
| 4d29de93a1 | |||
| 445e9dfc9f | |||
| 3a26f6312b | |||
| 138b0753af | |||
| ac1d1ae154 | |||
| 825243e741 | |||
| 0389ed85f3 | |||
| aef94f406a | |||
| 95d69fb7b1 | |||
| 684002ffc8 | |||
| 098dfa05f8 | |||
| d6c9310e50 | |||
| 085f6fd252 | |||
| 142de3102b | |||
| d3e51322ab | |||
| 9b5806a2c0 | |||
| 2b6697fa5a | |||
| 3bb859b693 | |||
| 5b3701afd0 | |||
| f531075853 | |||
| 81f8f75d7e | |||
| fccddab04a | |||
| 8cb6fbee3e | |||
| f454b02c99 | |||
| bfe72cf2c3 | |||
| fb90d81bb3 | |||
| 823c0949d0 |
BIN
src/assets/images/ems/bigData-1.png
Normal file
BIN
src/assets/images/ems/bigData-1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.2 MiB |
BIN
src/assets/images/ems/bigData-2.png
Normal file
BIN
src/assets/images/ems/bigData-2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.1 MiB |
BIN
src/assets/images/ems/bigData-3.png
Normal file
BIN
src/assets/images/ems/bigData-3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 MiB |
@ -104,6 +104,10 @@
|
|||||||
.el-card__header {
|
.el-card__header {
|
||||||
background-color: #b64040; //#fc6b69;
|
background-color: #b64040; //#fc6b69;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.work-status {
|
||||||
|
color: #b64040 !important;;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//绿色背景颜色标题
|
//绿色背景颜色标题
|
||||||
@ -111,6 +115,10 @@
|
|||||||
.el-card__header {
|
.el-card__header {
|
||||||
background-color: #40b6a5; //#05aea3;
|
background-color: #40b6a5; //#05aea3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.work-status {
|
||||||
|
color: #40b6a5 !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//灰色背景颜色标题
|
//灰色背景颜色标题
|
||||||
@ -118,6 +126,10 @@
|
|||||||
.el-card__header {
|
.el-card__header {
|
||||||
background-color: #666666;
|
background-color: #666666;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.work-status {
|
||||||
|
color: #666666 !important;;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
137
src/components/BigDataPopup/index.vue
Normal file
137
src/components/BigDataPopup/index.vue
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
:fullscreen="true"
|
||||||
|
:append-to-body="true"
|
||||||
|
:visible.sync="show"
|
||||||
|
:show-close="false"
|
||||||
|
top="0"
|
||||||
|
custom-class="big-data-dialog"
|
||||||
|
>
|
||||||
|
<div class="swiper-container">
|
||||||
|
<div class="swiper-icon left-icon" v-show="imgIndex > 0">
|
||||||
|
<i class="el-icon-d-arrow-left icon" @click="toLeft"></i>
|
||||||
|
</div>
|
||||||
|
<div v-show="showRightIcon" class="swiper-icon right-icon">
|
||||||
|
<i class="el-icon-d-arrow-right icon" @click="toRight"></i>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="img-container"
|
||||||
|
:style="{ transform: 'translateX(' + imgIndex * -100 + 'vw)' }"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
v-for="index in maxImgNumber"
|
||||||
|
:key="'swiperImg' + index"
|
||||||
|
:src="require(`@/assets/images/ems/bigData-${index}.png`)"
|
||||||
|
alt=""
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="close-btn" @click="show = false">
|
||||||
|
<i class="el-icon-close"></i>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.close-btn {
|
||||||
|
position: absolute;
|
||||||
|
right: 10px;
|
||||||
|
top: 10px;
|
||||||
|
font-size: 23px;
|
||||||
|
line-height: 20px;
|
||||||
|
color: rgba(217, 242, 255, 1);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.swiper-container {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
.swiper-icon {
|
||||||
|
color: rgba(217, 242, 255, 1);
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
z-index: 20;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 30px;
|
||||||
|
padding: 20px;
|
||||||
|
background: transparent;
|
||||||
|
&.left-icon {
|
||||||
|
left: 20px;
|
||||||
|
}
|
||||||
|
&.right-icon {
|
||||||
|
right: 20px;
|
||||||
|
}
|
||||||
|
&:hover {
|
||||||
|
.icon {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.icon {
|
||||||
|
transition: all 0.6s;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.img-container {
|
||||||
|
height: 100%;
|
||||||
|
transition: all 1s;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
z-index: 0;
|
||||||
|
img {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
display: block;
|
||||||
|
margin: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss">
|
||||||
|
.big-data-dialog {
|
||||||
|
.el-dialog__header {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-dialog__body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
show: false,
|
||||||
|
imgIndex: 0,
|
||||||
|
maxImgNumber: 3,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
showRightIcon() {
|
||||||
|
return this.imgIndex < this.maxImgNumber - 1;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
show: {
|
||||||
|
handler(newValue) {
|
||||||
|
if (!newValue) this.imgIndex = 0;
|
||||||
|
},
|
||||||
|
immediate: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
toLeft() {
|
||||||
|
if (this.imgIndex === 0) return;
|
||||||
|
this.imgIndex -= 1;
|
||||||
|
},
|
||||||
|
toRight() {
|
||||||
|
if (this.imgIndex >= this.maxImgNumber - 1) return;
|
||||||
|
this.imgIndex += 1;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@ -2,6 +2,7 @@
|
|||||||
<div class="time-range">
|
<div class="time-range">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="dateRange"
|
v-model="dateRange"
|
||||||
|
:class="miniTimePicker ? 'mini-date-picker' : ''"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
range-separator="至"
|
range-separator="至"
|
||||||
start-placeholder="开始时间"
|
start-placeholder="开始时间"
|
||||||
@ -10,16 +11,47 @@
|
|||||||
:picker-options="pickerOptions"
|
:picker-options="pickerOptions"
|
||||||
end-placeholder="结束时间">
|
end-placeholder="结束时间">
|
||||||
</el-date-picker>
|
</el-date-picker>
|
||||||
|
<template v-if="!showIcon">
|
||||||
<el-button size="mini" style="margin-left: 10px;" :loading="loading" @click="reset">重置</el-button>
|
<el-button size="mini" style="margin-left: 10px;" :loading="loading" @click="reset">重置</el-button>
|
||||||
<el-button type="primary" size="mini" :loading="loading" @click="search">搜索</el-button>
|
<el-button type="primary" size="mini" :loading="loading" @click="search">搜索</el-button>
|
||||||
<el-button type="primary" size="mini" :loading="loading" @click="timeLine('before')">上一时段</el-button>
|
<el-button type="primary" size="mini" :loading="loading" @click="timeLine('before')">上一时段</el-button>
|
||||||
<el-button type="primary" size="mini" :loading="loading" @click="timeLine('next')" :disabled="disabledNextBtn">下一时段</el-button>
|
<el-button type="primary" size="mini" :loading="loading" @click="timeLine('next')" :disabled="disabledNextBtn">
|
||||||
|
下一时段
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<el-button class="btn-icon" icon="el-icon-refresh-right" circle size="mini" style="margin-left: 8px;"
|
||||||
|
:loading="loading"
|
||||||
|
@click="reset"></el-button>
|
||||||
|
<el-button class="btn-icon" type="primary" size="mini" icon="el-icon-search" circle :loading="loading"
|
||||||
|
@click="search"></el-button>
|
||||||
|
<el-button class="btn-icon" type="primary" size="mini" icon="el-icon-d-arrow-left" circle :loading="loading"
|
||||||
|
@click="timeLine('before')"></el-button>
|
||||||
|
<el-button class="btn-icon" type="primary" size="mini" icon="el-icon-d-arrow-right" circle :loading="loading"
|
||||||
|
@click="timeLine('next')"
|
||||||
|
:disabled="disabledNextBtn"></el-button>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {formatDate} from '@/filters/ems'
|
import {formatDate} from '@/filters/ems'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
props: {
|
||||||
|
showIcon: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
miniTimePicker: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
disabledNextBtn() {
|
disabledNextBtn() {
|
||||||
return new Date(this.dateRange[1]) >= new Date(this.defaultDateRange[1])
|
return new Date(this.dateRange[1]) >= new Date(this.defaultDateRange[1])
|
||||||
@ -63,7 +95,8 @@ export default {
|
|||||||
},
|
},
|
||||||
timeLine(type) {
|
timeLine(type) {
|
||||||
if (!this.dateRange || !this.dateRange[0] || !this.dateRange[1]) return
|
if (!this.dateRange || !this.dateRange[0] || !this.dateRange[1]) return
|
||||||
const nowStartTimes = new Date(this.dateRange[0]).getTime(),nowEndTimes = new Date(this.dateRange[1]).getTime(),maxTime = new Date(this.defaultDateRange[1]).getTime()
|
const nowStartTimes = new Date(this.dateRange[0]).getTime(), nowEndTimes = new Date(this.dateRange[1]).getTime(),
|
||||||
|
maxTime = new Date(this.defaultDateRange[1]).getTime()
|
||||||
const nowDis = nowEndTimes - nowStartTimes//用户当前选择时间差 可能=0
|
const nowDis = nowEndTimes - nowStartTimes//用户当前选择时间差 可能=0
|
||||||
//baseTime,maxTime 毫秒数
|
//baseTime,maxTime 毫秒数
|
||||||
const baseDis = 24 * 60 * 60 * 1000
|
const baseDis = 24 * 60 * 60 * 1000
|
||||||
@ -82,19 +115,35 @@ export default {
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.time-range {
|
.time-range {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
::v-deep {
|
::v-deep {
|
||||||
|
|
||||||
.el-range-editor--medium .el-range__icon, .el-range-editor--medium .el-range__close-icon {
|
.el-range-editor--medium .el-range__icon, .el-range-editor--medium .el-range__close-icon {
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-range-editor--medium.el-input__inner {
|
.el-range-editor--medium.el-input__inner {
|
||||||
height: 30px;
|
height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-range-editor--medium .el-range-separator {
|
.el-range-editor--medium .el-range-separator {
|
||||||
line-height: 24px;
|
line-height: 22px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-button--mini {
|
.el-button--mini {
|
||||||
padding: 3px 10px;
|
padding: 3px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 展示icon的小组件
|
||||||
|
.btn-icon.el-button--mini {
|
||||||
|
padding: 3px 8px;
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
//小宽度时间选择框
|
||||||
|
.mini-date-picker {
|
||||||
|
width: 250px !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,13 +32,13 @@ export default {
|
|||||||
attr:'installCapacity'
|
attr:'installCapacity'
|
||||||
|
|
||||||
},{
|
},{
|
||||||
title:'总充电量(MWh)',
|
title:'总充电量(KWh)',
|
||||||
num:'',
|
num:'',
|
||||||
color:'#A696FF',
|
color:'#A696FF',
|
||||||
attr:'totalChargedCap'
|
attr:'totalChargedCap'
|
||||||
|
|
||||||
},{
|
},{
|
||||||
title:'总放电量(MWh)',
|
title:'总放电量(KWh)',
|
||||||
num:'',
|
num:'',
|
||||||
color:'#A696FF',
|
color:'#A696FF',
|
||||||
attr:'totalDischargedCap'
|
attr:'totalDischargedCap'
|
||||||
|
|||||||
@ -1,12 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="navbar">
|
<div class="navbar">
|
||||||
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
|
<hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container"
|
||||||
|
@toggleClick="toggleSideBar"/>
|
||||||
|
|
||||||
<breadcrumb v-if="!topNav" id="breadcrumb-container" class="breadcrumb-container"/>
|
<breadcrumb v-if="!topNav" id="breadcrumb-container" class="breadcrumb-container"/>
|
||||||
<top-nav v-if="topNav" id="topmenu-container" class="topmenu-container"/>
|
<top-nav v-if="topNav" id="topmenu-container" class="topmenu-container"/>
|
||||||
|
|
||||||
<div class="right-menu">
|
<div class="right-menu">
|
||||||
<template v-if="device!=='mobile'">
|
<template v-if="device!=='mobile'">
|
||||||
|
<div class="big-data-container">
|
||||||
|
<i class="el-icon-s-marketing big-data-icon" @click.stop="showBigDataImg"></i>
|
||||||
|
</div>
|
||||||
|
|
||||||
<search id="header-search" class="right-menu-item"/>
|
<search id="header-search" class="right-menu-item"/>
|
||||||
|
|
||||||
|
|
||||||
@ -32,11 +37,11 @@
|
|||||||
</el-dropdown-item>
|
</el-dropdown-item>
|
||||||
</el-dropdown-menu>
|
</el-dropdown-menu>
|
||||||
</el-dropdown>
|
</el-dropdown>
|
||||||
|
|
||||||
<div class="right-menu-item hover-effect setting" @click="setLayout" v-if="setting">
|
<div class="right-menu-item hover-effect setting" @click="setLayout" v-if="setting">
|
||||||
<svg-icon icon-class="more-up"/>
|
<svg-icon icon-class="more-up"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<BigDataPopup ref="bigDataPopup"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -48,6 +53,7 @@ import Hamburger from '@/components/Hamburger'
|
|||||||
import Screenfull from '@/components/Screenfull'
|
import Screenfull from '@/components/Screenfull'
|
||||||
import SizeSelect from '@/components/SizeSelect'
|
import SizeSelect from '@/components/SizeSelect'
|
||||||
import Search from '@/components/HeaderSearch'
|
import Search from '@/components/HeaderSearch'
|
||||||
|
import BigDataPopup from '@/components/BigDataPopup'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
emits: ['setLayout'],
|
emits: ['setLayout'],
|
||||||
@ -57,7 +63,8 @@ export default {
|
|||||||
Hamburger,
|
Hamburger,
|
||||||
Screenfull,
|
Screenfull,
|
||||||
SizeSelect,
|
SizeSelect,
|
||||||
Search
|
Search,
|
||||||
|
BigDataPopup
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters([
|
...mapGetters([
|
||||||
@ -78,6 +85,9 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
showBigDataImg() {
|
||||||
|
this.$refs.bigDataPopup.show = true
|
||||||
|
},
|
||||||
toggleSideBar() {
|
toggleSideBar() {
|
||||||
this.$store.dispatch('app/toggleSideBar')
|
this.$store.dispatch('app/toggleSideBar')
|
||||||
},
|
},
|
||||||
@ -93,7 +103,8 @@ export default {
|
|||||||
this.$store.dispatch('LogOut').then(() => {
|
this.$store.dispatch('LogOut').then(() => {
|
||||||
location.href = '/index'
|
location.href = '/index'
|
||||||
})
|
})
|
||||||
}).catch(() => {})
|
}).catch(() => {
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,6 +150,17 @@ export default {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
line-height: 50px;
|
line-height: 50px;
|
||||||
|
|
||||||
|
.big-data-container {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 8px;
|
||||||
|
height: 100%;
|
||||||
|
font-size: 24px;
|
||||||
|
color: #5a5e66;
|
||||||
|
vertical-align: text-bottom;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,17 @@ const ems = {
|
|||||||
dzjkAlarmLighting: false,//单站监控 告警统计红点标志
|
dzjkAlarmLighting: false,//单站监控 告警统计红点标志
|
||||||
zdList: [],
|
zdList: [],
|
||||||
zdDeviceCategoryOptions: {},//站点各个站点包含的设备种类 {021_DDS_01:["BATTERY","CLUSTER","STACK", "DH", "AMMETER", "PCS", "XF"],021_DDS_02:[]...}
|
zdDeviceCategoryOptions: {},//站点各个站点包含的设备种类 {021_DDS_01:["BATTERY","CLUSTER","STACK", "DH", "AMMETER", "PCS", "XF"],021_DDS_02:[]...}
|
||||||
workStatusOptions: {'0': '运行', '1': '停机', '2': '故障'},//工作状态
|
CLUSTERWorkStatusOptions: {'0': '静置', '1': '充电', '2': '放电', '3': '待机', '5': '运行', '9': "故障"},//电池簇工作状态
|
||||||
|
PCSWorkStatusOptions: {'0': '运行', '1': '停机', '2': '故障', '3': '待机', '4': '充电', '5': '放电'},//PCS工作状态
|
||||||
|
STACKWorkStatusOptions: {
|
||||||
|
"0": "静置",
|
||||||
|
"1": "充电",
|
||||||
|
"2": "放电",
|
||||||
|
"3": "浮充",
|
||||||
|
'4': '待机',
|
||||||
|
'5': '运行',
|
||||||
|
'9': "故障"
|
||||||
|
},//STACKBMS总览工作状态
|
||||||
deviceStatusOptions: {'0': '离线', '1': '在线'},//设备状态
|
deviceStatusOptions: {'0': '离线', '1': '在线'},//设备状态
|
||||||
gridStatusOptions: {'0': '并网', '1': '未并网'},//并网状态
|
gridStatusOptions: {'0': '并网', '1': '未并网'},//并网状态
|
||||||
controlModeOptions: {'0': '远程', '1': '本地'},//控制模式
|
controlModeOptions: {'0': '远程', '1': '本地'},//控制模式
|
||||||
|
|||||||
@ -1,16 +1,19 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" class="ems-dashboard-editor-container ems-content-container-padding">
|
<div v-loading="loading" class="ems-dashboard-editor-container ems-content-container-padding">
|
||||||
<!-- 搜索栏-->
|
<!-- 搜索栏-->
|
||||||
<el-form :inline="true" class="select-container">
|
<el-form :inline="true" class="select-container">
|
||||||
<el-form-item label="设备清单">
|
<el-form-item label="设备清单">
|
||||||
<el-select v-model="search.deviceId" clearable placeholder="请选择" :loading="loading" loading-text="正在加载数据">
|
<el-select v-model="search.deviceId" clearable placeholder="请选择" :loading="loading"
|
||||||
<el-option :label="item.deviceName" :value="item.deviceId" v-for="(item,key) in deviceOptions" :key="key+'deviceIdOptions'"></el-option>
|
loading-text="正在加载数据">
|
||||||
|
<el-option :label="item.deviceName" :value="item.deviceId" v-for="(item,key) in deviceOptions"
|
||||||
|
:key="key+'deviceIdOptions'"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="告警等级">
|
<el-form-item label="告警等级">
|
||||||
<el-select v-model="search.alarmLevel" clearable placeholder="请选择" :loading="loading" loading-text="正在加载数据">
|
<el-select v-model="search.alarmLevel" clearable placeholder="请选择" :loading="loading"
|
||||||
<el-option :label="value" :value="key" v-for="(value,key) in $store.state.ems.alarmLevelOptions" :key="key+'alarmLevelOptions'"></el-option>
|
loading-text="正在加载数据" style="width: 130px">
|
||||||
|
<el-option :label="value" :value="key" v-for="(value,key) in $store.state.ems.alarmLevelOptions"
|
||||||
|
:key="key+'alarmLevelOptions'"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="时间选择">
|
<el-form-item label="时间选择">
|
||||||
@ -36,7 +39,9 @@
|
|||||||
<el-row style="">
|
<el-row style="">
|
||||||
<el-col :xs="24" :sm="24" :lg="24">
|
<el-col :xs="24" :sm="24" :lg="24">
|
||||||
<el-button-group class="ems-btns-group">
|
<el-button-group class="ems-btns-group">
|
||||||
<el-button v-for="(item,index) in btnList" :key="index+'dtdcBtns'" :class="{'activeBtn' : activeBtn === item.id}" @click="changeDataType(item.id)">{{item.name}}</el-button>
|
<el-button v-for="(item,index) in btnList" :key="index+'dtdcBtns'"
|
||||||
|
:class="{'activeBtn' : activeBtn === item.id}" @click="changeDataType(item.id)">{{ item.name }}
|
||||||
|
</el-button>
|
||||||
</el-button-group>
|
</el-button-group>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -80,7 +85,8 @@
|
|||||||
<el-table-column
|
<el-table-column
|
||||||
label="状态">
|
label="状态">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span :class="['0','2'].includes(scope.row.status) ? 'warning-status' : ''">{{$store.state.ems.alarmStatusOptions[scope.row.status]}}</span>
|
<span
|
||||||
|
:class="['0','2'].includes(scope.row.status) ? 'warning-status' : ''">{{ $store.state.ems.alarmStatusOptions[scope.row.status] }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
@ -89,7 +95,9 @@
|
|||||||
width="250"
|
width="250"
|
||||||
>
|
>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button type="text" size="mini" v-if="scope.row.ticketNo" @click="toTicket">已生成工单(工单号:{{scope.row.ticketNo}})</el-button>
|
<el-button type="text" size="mini" v-if="scope.row.ticketNo" @click="toTicket">
|
||||||
|
已生成工单(工单号:{{ scope.row.ticketNo }})
|
||||||
|
</el-button>
|
||||||
<el-button type="primary" size="mini" v-else @click="createTicket(scope.row.id)">生成工单</el-button>
|
<el-button type="primary" size="mini" v-else @click="createTicket(scope.row.id)">生成工单</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -113,10 +121,11 @@
|
|||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {getAlarmDetailList,createTicketNo} from'@/api/ems/dzjk'
|
import {createTicketNo, getAlarmDetailList} from '@/api/ems/dzjk'
|
||||||
import {getDeviceList} from '@/api/ems/site'
|
import {getDeviceList} from '@/api/ems/site'
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
||||||
import {formatDate} from '@/filters/ems'
|
import {formatDate} from '@/filters/ems'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DzjkGzgj',
|
name: 'DzjkGzgj',
|
||||||
mixins: [getQuerySiteId],
|
mixins: [getQuerySiteId],
|
||||||
@ -154,7 +163,9 @@ export default {
|
|||||||
this.loading = true
|
this.loading = true
|
||||||
createTicketNo({id}).then(response => {
|
createTicketNo({id}).then(response => {
|
||||||
response?.data && this.toTicket()
|
response?.data && this.toTicket()
|
||||||
}).finally(()=>{this.loading = false})
|
}).finally(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
},
|
},
|
||||||
// 判断是否是同一天
|
// 判断是否是同一天
|
||||||
isSameDay(day1, day2) {
|
isSameDay(day1, day2) {
|
||||||
@ -204,10 +215,21 @@ export default {
|
|||||||
const {siteId, pageNum, pageSize, activeBtn} = this
|
const {siteId, pageNum, pageSize, activeBtn} = this
|
||||||
const [alarmStartTime = '', alarmEndTime = ''] = (this.dateRange || [])
|
const [alarmStartTime = '', alarmEndTime = ''] = (this.dateRange || [])
|
||||||
let status = activeBtn === 'today' ? '0' : '1,2'
|
let status = activeBtn === 'today' ? '0' : '1,2'
|
||||||
getAlarmDetailList({status,deviceId,alarmLevel,siteId,pageSize,pageNum,alarmStartTime:formatDate(alarmStartTime),alarmEndTime:formatDate(alarmEndTime)}).then(response => {
|
getAlarmDetailList({
|
||||||
|
status,
|
||||||
|
deviceId,
|
||||||
|
alarmLevel,
|
||||||
|
siteId,
|
||||||
|
pageSize,
|
||||||
|
pageNum,
|
||||||
|
alarmStartTime: formatDate(alarmStartTime),
|
||||||
|
alarmEndTime: formatDate(alarmEndTime)
|
||||||
|
}).then(response => {
|
||||||
this.tableData = response?.rows || [];
|
this.tableData = response?.rows || [];
|
||||||
this.totalSize = response?.total || 0
|
this.totalSize = response?.total || 0
|
||||||
}).finally(() => {this.loading=false})
|
}).finally(() => {
|
||||||
|
this.loading = false
|
||||||
|
})
|
||||||
},
|
},
|
||||||
getDeviceOptions() {
|
getDeviceOptions() {
|
||||||
getDeviceList(this.siteId).then(response => {
|
getDeviceList(this.siteId).then(response => {
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-card shadow="always" class="common-card-container common-card-container-body-no-padding time-range-card">
|
<el-card shadow="always" class="common-card-container common-card-container-body-no-padding time-range-card">
|
||||||
<div slot="header" class="time-range-header">
|
<div slot="header" class="time-range-header">
|
||||||
<span class="card-title">当日功率曲线</span>
|
<span class="card-title">当日功率曲线</span>
|
||||||
<date-range-select ref="dateRangeSelect" @updateDate="updateDate"/>
|
<date-range-select ref="dateRangeSelect" :showIcon="true" :mini-time-picker="true" @updateDate="updateDate"/>
|
||||||
</div>
|
</div>
|
||||||
<div style="height: 310px" id="activeChart"></div>
|
<div style="height: 310px" id="activeChart"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@ -108,7 +107,13 @@ export default {
|
|||||||
dataset: {source},
|
dataset: {source},
|
||||||
series: source[0].slice(1).map((item, index) => {
|
series: source[0].slice(1).map((item, index) => {
|
||||||
return {
|
return {
|
||||||
type: 'line',
|
type: 'line',//index === 5 ? 'bar' : 'line',
|
||||||
|
showSymbol: false,
|
||||||
|
symbolSize: 2,
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.5,
|
||||||
|
},
|
||||||
yAxisIndex: index <= 4 ? 0 : 1
|
yAxisIndex: index <= 4 ? 0 : 1
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<el-card shadow="always" class="common-card-container common-card-container-body-no-padding time-range-card">
|
<el-card shadow="always" class="common-card-container common-card-container-body-no-padding time-range-card">
|
||||||
<div slot="header" class="time-range-header">
|
<div slot="header" class="time-range-header">
|
||||||
<span class="card-title">一周充放曲线</span>
|
<span class="card-title">一周充放曲线</span>
|
||||||
<date-range-select ref="dateRangeSelect" @updateDate="updateDate"/>
|
<date-range-select ref="dateRangeSelect" :showIcon="true" :mini-time-picker="true" @updateDate="updateDate"/>
|
||||||
</div>
|
</div>
|
||||||
<div style="height: 310px" id="weekChart"></div>
|
<div style="height: 310px" id="weekChart"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@ -14,6 +13,7 @@ import * as echarts from 'echarts'
|
|||||||
import resize from '@/mixins/ems/resize'
|
import resize from '@/mixins/ems/resize'
|
||||||
import DateRangeSelect from '@/components/Ems/DateRangeSelect/index.vue'
|
import DateRangeSelect from '@/components/Ems/DateRangeSelect/index.vue'
|
||||||
import {getSevenChargeData} from '@/api/ems/dzjk'
|
import {getSevenChargeData} from '@/api/ems/dzjk'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: [resize],
|
mixins: [resize],
|
||||||
components: {DateRangeSelect},
|
components: {DateRangeSelect},
|
||||||
@ -45,7 +45,6 @@ export default {
|
|||||||
getWeekKData() {
|
getWeekKData() {
|
||||||
this.showLoading()
|
this.showLoading()
|
||||||
const {siteId, timeRange} = this
|
const {siteId, timeRange} = this
|
||||||
this.hideLoading()
|
|
||||||
getSevenChargeData({siteId, startDate: timeRange[0], endDate: timeRange[1]}).then(response => {
|
getSevenChargeData({siteId, startDate: timeRange[0], endDate: timeRange[1]}).then(response => {
|
||||||
this.setOption(response?.data || [])
|
this.setOption(response?.data || [])
|
||||||
}).finally(() => this.hideLoading())
|
}).finally(() => this.hideLoading())
|
||||||
|
|||||||
@ -4,7 +4,8 @@
|
|||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
>
|
>
|
||||||
<el-row style="background: #fff" class="row-container" :gutter="15">
|
<el-row style="background: #fff" class="row-container" :gutter="15">
|
||||||
<el-col :xs="24" :sm="24" :lg="8">
|
<el-col :xs="24" :sm="24" :lg="5">
|
||||||
|
<!-- 站点信息-->
|
||||||
<el-card
|
<el-card
|
||||||
shadow="always"
|
shadow="always"
|
||||||
class="common-card-container common-card-container-body-no-padding"
|
class="common-card-container common-card-container-body-no-padding"
|
||||||
@ -12,87 +13,92 @@
|
|||||||
<div slot="header">
|
<div slot="header">
|
||||||
<span class="card-title">站点信息</span>
|
<span class="card-title">站点信息</span>
|
||||||
<div class="alarm-msg" v-if="tableData.length > 0" @click="toAlarm">
|
<div class="alarm-msg" v-if="tableData.length > 0" @click="toAlarm">
|
||||||
<i class="el-icon-message-solid"></i>
|
<i class="el-icon-message-solid"></i> 设备告警
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
style="box-sizing: border-box; height: 250px; padding: 20px 15px"
|
style="box-sizing: border-box; height: 218px; padding: 20px 15px"
|
||||||
>
|
>
|
||||||
<el-descriptions class="home-normal-info" :column="1">
|
<!-- 地址、运行时间-->
|
||||||
<el-descriptions-item
|
<div class="site-info site-info-address">
|
||||||
size="mini"
|
<div class="title">
|
||||||
v-for="(item, index) in singleZdInfo"
|
<i class="el-icon-location"></i>
|
||||||
:key="index + 'singleZdInfo'"
|
</div>
|
||||||
:label="item.title"
|
<div class="value">{{ info.siteAddress }}</div>
|
||||||
>{{ info[item.attr] | formatNumber }}
|
</div>
|
||||||
</el-descriptions-item
|
<div class="site-info">
|
||||||
|
<div class="title">
|
||||||
|
<i class="el-icon-date"></i>
|
||||||
|
</div>
|
||||||
|
<div class="value">{{ info.runningTime || '-' }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- 装机功率、容量 -->
|
||||||
|
<el-row :gutter="10" style="margin-top:20px;">
|
||||||
|
<el-col
|
||||||
|
:span="12"
|
||||||
|
class="sjgl-col power-col"
|
||||||
>
|
>
|
||||||
</el-descriptions>
|
<div class="sjgl-wrapper">
|
||||||
|
<div class="sjgl-title">装机功率(MW)</div>
|
||||||
|
<div class="sjgl-value">
|
||||||
|
{{ info.installPower | formatNumber }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col
|
||||||
|
:span="12"
|
||||||
|
class="sjgl-col power-col"
|
||||||
|
>
|
||||||
|
<div class="sjgl-wrapper">
|
||||||
|
<div class="sjgl-title">装机容量(MW)</div>
|
||||||
|
<div class="sjgl-value">
|
||||||
|
{{ info.installCapacity | formatNumber }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="24" :sm="24" :lg="16">
|
<!-- 总累计运行数据-->
|
||||||
<cl-info :info="runningInfo.strategyTempInfo"/>
|
<el-col :xs="24" :sm="24" :lg="19">
|
||||||
</el-col>
|
|
||||||
<el-col :xs="24" :sm="24" :lg="12">
|
|
||||||
<el-card
|
<el-card
|
||||||
shadow="always"
|
shadow="always"
|
||||||
class="common-card-container common-card-container-body-no-padding"
|
class="common-card-container common-card-container-body-no-padding"
|
||||||
>
|
>
|
||||||
<div slot="header">
|
<div slot="header">
|
||||||
<span class="card-title">总累计运行数据</span>
|
<span class="card-title">总累计运行数据</span>
|
||||||
|
<div class="total-count">
|
||||||
|
<span class="title">总收入</span>
|
||||||
|
<span class="value">{{ runningInfo.totalRevenue | formatNumber }}</span>
|
||||||
|
<span class="unit">元</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
style="box-sizing: border-box; height: 250px; padding: 20px 15px"
|
style="box-sizing: border-box; height: 218px; padding: 20px 15px"
|
||||||
>
|
>
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="10">
|
||||||
<el-col
|
<el-col
|
||||||
:span="12"
|
:span="6"
|
||||||
v-for="(item, index) in sjglData"
|
v-for="(item, index) in sjglData"
|
||||||
:key="index + 'sjglData'"
|
:key="index + 'sjglData'"
|
||||||
class="sjgl-data"
|
class="sjgl-col"
|
||||||
>
|
>
|
||||||
|
<div class="sjgl-wrapper">
|
||||||
<div class="sjgl-title">{{ item.title }}</div>
|
<div class="sjgl-title">{{ item.title }}</div>
|
||||||
<div class="sjgl-value">
|
<div class="sjgl-value" :style="{color:item.color}">
|
||||||
{{ runningInfo[item.attr] | formatNumber }}
|
{{ runningInfo[item.attr] | formatNumber }}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="24" :sm="24" :lg="12">
|
<el-col :xs="24" :sm="24" :lg="12">
|
||||||
<el-card
|
|
||||||
shadow="always"
|
|
||||||
class="common-card-container common-card-container-body-no-padding"
|
|
||||||
>
|
|
||||||
<div slot="header">
|
|
||||||
<span class="card-title">收入对比数据</span>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
style="box-sizing: border-box; height: 250px; padding: 20px 15px"
|
|
||||||
>
|
|
||||||
<el-row :gutter="20">
|
|
||||||
<el-col
|
|
||||||
v-for="(item, index) in revenueData"
|
|
||||||
:key="index + 'revenueData'"
|
|
||||||
:span="index === 2 ? 24 : 12"
|
|
||||||
class="sjgl-data"
|
|
||||||
:style="{marginTop:index === 2 ? '40px' : 0}"
|
|
||||||
>
|
|
||||||
<div class="sjgl-title">{{ item.title }}</div>
|
|
||||||
<div class="sjgl-value">
|
|
||||||
{{ runningInfo[item.attr] | formatNumber }}
|
|
||||||
</div>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</div>
|
|
||||||
</el-card>
|
|
||||||
</el-col>
|
|
||||||
<el-col :xs="24" :sm="24" :lg="24">
|
|
||||||
<week-chart ref="weekChart"/>
|
<week-chart ref="weekChart"/>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :xs="24" :sm="24" :lg="24">
|
<el-col :xs="24" :sm="24" :lg="12">
|
||||||
<active-chart ref="activeChart"/>
|
<active-chart ref="activeChart"/>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -116,62 +122,46 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
singleZdInfo: [
|
|
||||||
{
|
|
||||||
title: "电站位置",
|
|
||||||
attr: "siteAddress",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "投运时间",
|
|
||||||
attr: "runningTime",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "装机功率(MW)",
|
|
||||||
attr: "installPower",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "装机容量(MW)",
|
|
||||||
attr: "installCapacity",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
sjglData: [
|
sjglData: [
|
||||||
{
|
{
|
||||||
title: "今日充电量(kWh)",
|
title: "今日充电量(kWh)",
|
||||||
attr: "dayChargedCap",
|
attr: "dayChargedCap",
|
||||||
|
color: '#4472c4'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "今日放电量(kWh)",
|
title: "今日放电量(kWh)",
|
||||||
attr: "dayDisChargedCap",
|
attr: "dayDisChargedCap",
|
||||||
},
|
color: '#70ad47'
|
||||||
{
|
|
||||||
title: "昨日充电量(kWh)",
|
|
||||||
attr: "todo",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "昨日放电量(kWh)",
|
|
||||||
attr: "todo",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "总充电量(kWh)",
|
title: "总充电量(kWh)",
|
||||||
attr: "totalChargedCap",
|
attr: "totalChargedCap",
|
||||||
|
color: '#4472c4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "今日实时收入(元)",
|
||||||
|
attr: "dayRevenue",
|
||||||
|
color: '#f67438'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "昨日充电量(kWh)",
|
||||||
|
attr: "yesterdayChargedCap",
|
||||||
|
color: '#4472c4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "昨日放电量(kWh)",
|
||||||
|
attr: "yesterdayDisChargedCap",
|
||||||
|
color: '#70ad47'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "总放电量(kWh)",
|
title: "总放电量(kWh)",
|
||||||
attr: "totalDischargedCap",
|
attr: "totalDischargedCap",
|
||||||
},
|
color: '#70ad47'
|
||||||
],
|
|
||||||
revenueData: [
|
|
||||||
{
|
|
||||||
title: "当日实时收入(元)",
|
|
||||||
attr: "dayRevenue",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "昨日实时收入(元)",
|
title: "昨日实时收入(元)",
|
||||||
attr: "todo",
|
attr: "yesterdayRevenue",
|
||||||
},
|
color: '#f67438'
|
||||||
{
|
|
||||||
title: "总收入(元)",
|
|
||||||
attr: "totalRevenue",
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
info: {}, //基本信息
|
info: {}, //基本信息
|
||||||
@ -180,10 +170,6 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
tableData() {
|
tableData() {
|
||||||
console.log(
|
|
||||||
"this.runningInfo?.siteMonitorHomeAlarmVo ",
|
|
||||||
this.runningInfo?.siteMonitorHomeAlarmVo
|
|
||||||
);
|
|
||||||
return this.runningInfo?.siteMonitorHomeAlarmVo || [];
|
return this.runningInfo?.siteMonitorHomeAlarmVo || [];
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -220,21 +206,73 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
//设备告警
|
||||||
.alarm-msg {
|
.alarm-msg {
|
||||||
background: #ffcec6;
|
background: #ff4949;
|
||||||
width: 32px;
|
padding: 2px 5px;
|
||||||
border-radius: 17px;
|
font-size: 10px;
|
||||||
text-align: center;
|
font-weight: bolder;
|
||||||
font-size: 22px;
|
border-radius: 3px;
|
||||||
line-height: 30px;
|
line-height: 20px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
color: #ff4949;
|
color: #fff;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 20px;
|
right: 10px;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//基本信息-地址 运行️时间
|
||||||
|
.site-info {
|
||||||
|
display: flex;
|
||||||
|
font-size: 12px;
|
||||||
|
line-height: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
&.site-info-address {
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
color: #1791ff;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 20px;
|
||||||
|
margin-right: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
color: #000;
|
||||||
|
font-size: 12px;
|
||||||
|
max-height: 40px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//总收入
|
||||||
|
.total-count {
|
||||||
|
position: absolute;
|
||||||
|
right: 10px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bolder;
|
||||||
|
color: #333;
|
||||||
|
line-height: 14px;
|
||||||
|
|
||||||
|
.unit {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: bolder;
|
||||||
|
color: #ed2f1d;
|
||||||
|
font-style: italic;
|
||||||
|
padding: 0 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.row-container {
|
.row-container {
|
||||||
& > .el-col {
|
& > .el-col {
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
@ -242,28 +280,47 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//数据概览
|
//数据概览
|
||||||
.sjgl-data {
|
.sjgl-col {
|
||||||
text-align: center;
|
.sjgl-wrapper {
|
||||||
|
text-align: left;
|
||||||
|
padding: 15px 20px;
|
||||||
|
background-color: #f2f7fb;
|
||||||
|
}
|
||||||
|
|
||||||
&:nth-child(1),
|
&.power-col {
|
||||||
|
.sjgl-wrapper {
|
||||||
|
padding: 10px;
|
||||||
|
|
||||||
|
.sjgl-value {
|
||||||
|
color: #c44444;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(4),
|
||||||
&:nth-child(2),
|
&:nth-child(2),
|
||||||
&:nth-child(3),
|
&:nth-child(3),
|
||||||
&:nth-child(4) {
|
&:nth-child(4) {
|
||||||
margin-bottom: 25px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sjgl-title {
|
.sjgl-title {
|
||||||
color: #666666;
|
color: #717171;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sjgl-value {
|
.sjgl-value {
|
||||||
color: rgba(51, 51, 51, 1);
|
color: rgba(51, 51, 51, 1);
|
||||||
font-size: 26px;
|
font-size: 22px;
|
||||||
line-height: 26px;
|
line-height: 26px;
|
||||||
font-weight: 500;
|
font-weight: bolder;
|
||||||
|
font-style: italic;
|
||||||
margin-top: 14px;
|
margin-top: 14px;
|
||||||
word-wrap: break-word;
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -3,11 +3,7 @@
|
|||||||
<div v-for="(baseInfo,index) in baseInfoList" :key="index+'bmsdccContainer'" style="margin-bottom:25px;">
|
<div v-for="(baseInfo,index) in baseInfoList" :key="index+'bmsdccContainer'" style="margin-bottom:25px;">
|
||||||
<el-card shadow="always"
|
<el-card shadow="always"
|
||||||
class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"
|
class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"
|
||||||
:class="{
|
:class="handleCardClass(baseInfo)">
|
||||||
'timing-card-container':!['0','2'].includes(baseInfo.workStatus),
|
|
||||||
'warning-card-container':baseInfo.workStatus === '2',
|
|
||||||
'running-card-container':baseInfo.workStatus === '0'
|
|
||||||
}">
|
|
||||||
<div slot="header">
|
<div slot="header">
|
||||||
<span
|
<span
|
||||||
class="large-title">{{
|
class="large-title">{{
|
||||||
@ -20,7 +16,7 @@
|
|||||||
<el-button type="primary" round size="small" style="margin-right:20px;"
|
<el-button type="primary" round size="small" style="margin-right:20px;"
|
||||||
@click="pointDetail(baseInfo,'point')">详细
|
@click="pointDetail(baseInfo,'point')">详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="baseInfo.alarmNum || 0" class="item">
|
<el-badge :hidden="!baseInfo.alarmNum" :value="baseInfo.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(baseInfo,'alarmPoint')"
|
@click="pointDetail(baseInfo,'alarmPoint')"
|
||||||
@ -30,16 +26,16 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="descriptions-main">
|
<div class="descriptions-main">
|
||||||
<el-descriptions direction="vertical" :column="3" :colon="false">
|
<el-descriptions direction="vertical" :column="3" :colon="false">
|
||||||
<el-descriptions-item labelClassName="descriptions-label"
|
<el-descriptions-item
|
||||||
:contentClassName="`descriptions-direction ${baseInfo.workStatus === '0' ? 'save' :'danger'}`"
|
contentClassName="descriptions-direction work-status"
|
||||||
:span="1" label="工作状态">
|
:span="1" label="工作状态">
|
||||||
{{ $store.state.ems.workStatusOptions[baseInfo.workStatus] }}
|
{{ CLUSTERWorkStatusOptions[baseInfo.workStatus] }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item labelClassName="descriptions-label" contentClassName="descriptions-direction"
|
<el-descriptions-item contentClassName="descriptions-direction"
|
||||||
:span="1" label="与PCS通信">
|
:span="1" label="与PCS通信">
|
||||||
{{ $store.state.ems.communicationStatusOptions[baseInfo.pcsCommunicationStatus] }}
|
{{ $store.state.ems.communicationStatusOptions[baseInfo.pcsCommunicationStatus] }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item labelClassName="descriptions-label" contentClassName="descriptions-direction"
|
<el-descriptions-item contentClassName="descriptions-direction"
|
||||||
:span="1" label="与EMS通信">
|
:span="1" label="与EMS通信">
|
||||||
{{ $store.state.ems.communicationStatusOptions[baseInfo.emsCommunicationStatus] }}
|
{{ $store.state.ems.communicationStatusOptions[baseInfo.emsCommunicationStatus] }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
@ -132,11 +128,17 @@ import PointTable from "@/views/ems/site/sblb/PointTable.vue";
|
|||||||
import {getBMSBatteryCluster} from '@/api/ems/dzjk'
|
import {getBMSBatteryCluster} from '@/api/ems/dzjk'
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
||||||
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DzjkSbjkBmsdcc',
|
name: 'DzjkSbjkBmsdcc',
|
||||||
mixins: [getQuerySiteId, intervalUpdate],
|
mixins: [getQuerySiteId, intervalUpdate],
|
||||||
components: {PointTable, pointChart},
|
components: {PointTable, pointChart},
|
||||||
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
CLUSTERWorkStatusOptions: state => state?.ems?.CLUSTERWorkStatusOptions || {},
|
||||||
|
})
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
@ -171,6 +173,10 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleCardClass(item) {
|
||||||
|
const {workStatus = ''} = item
|
||||||
|
return !(Object.keys(this.CLUSTERWorkStatusOptions).includes(item.workStatus)) ? "timing-card-container" : workStatus === '9' ? 'warning-card-container' : 'running-card-container'
|
||||||
|
},
|
||||||
// 查看设备电位表格
|
// 查看设备电位表格
|
||||||
pointDetail(row, dataType) {
|
pointDetail(row, dataType) {
|
||||||
const {siteId, deviceId} = row
|
const {siteId, deviceId} = row
|
||||||
|
|||||||
@ -1,11 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<div v-for="(baseInfo,index) in baseInfoList" :key="index+'bmszlContainer'" style="margin-bottom:25px;">
|
<div v-for="(baseInfo,index) in baseInfoList" :key="index+'bmszlContainer'" style="margin-bottom:25px;">
|
||||||
<el-card :class="{
|
<el-card
|
||||||
'timing-card-container':!['0','2'].includes(baseInfo.workStatus),
|
:class="handleCardClass(baseInfo)"
|
||||||
'warning-card-container':baseInfo.workStatus === '2',
|
class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"
|
||||||
'running-card-container':baseInfo.workStatus === '0'
|
|
||||||
}" class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"
|
|
||||||
shadow="always">
|
shadow="always">
|
||||||
<div slot="header">
|
<div slot="header">
|
||||||
<span class="large-title">{{ baseInfo.deviceName }}</span>
|
<span class="large-title">{{ baseInfo.deviceName }}</span>
|
||||||
@ -16,7 +14,7 @@
|
|||||||
<el-button type="primary" round size="small" style="margin-right:20px;"
|
<el-button type="primary" round size="small" style="margin-right:20px;"
|
||||||
@click="pointDetail(baseInfo,'point')">详细
|
@click="pointDetail(baseInfo,'point')">详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="baseInfo.alarmNum || 0" class="item">
|
<el-badge :hidden="!baseInfo.alarmNum" :value="baseInfo.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(baseInfo,'alarmPoint')"
|
@click="pointDetail(baseInfo,'alarmPoint')"
|
||||||
@ -27,9 +25,9 @@
|
|||||||
<div class="descriptions-main">
|
<div class="descriptions-main">
|
||||||
<el-descriptions :colon="false" :column="3" direction="vertical">
|
<el-descriptions :colon="false" :column="3" direction="vertical">
|
||||||
<el-descriptions-item
|
<el-descriptions-item
|
||||||
:contentClassName="`descriptions-direction ${baseInfo.workStatus === '0' ? 'save' :'danger'}`" :span="1"
|
contentClassName="descriptions-direction work-status"
|
||||||
label="工作状态" labelClassName="descriptions-label">
|
label="工作状态" labelClassName="descriptions-label">
|
||||||
{{ $store.state.ems.workStatusOptions[baseInfo.workStatus] }}
|
{{ STACKWorkStatusOptions[baseInfo.workStatus] }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item :span="1" contentClassName="descriptions-direction" label="与PCS通信"
|
<el-descriptions-item :span="1" contentClassName="descriptions-direction" label="与PCS通信"
|
||||||
labelClassName="descriptions-label">
|
labelClassName="descriptions-label">
|
||||||
@ -164,11 +162,17 @@ import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
|||||||
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
||||||
import pointChart from "./../PointChart.vue";
|
import pointChart from "./../PointChart.vue";
|
||||||
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
|
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DzjkSbjkBmszl',
|
name: 'DzjkSbjkBmszl',
|
||||||
components: {pointChart, PointTable},
|
components: {pointChart, PointTable},
|
||||||
mixins: [getQuerySiteId, intervalUpdate],
|
mixins: [getQuerySiteId, intervalUpdate],
|
||||||
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
STACKWorkStatusOptions: state => state?.ems?.STACKWorkStatusOptions || {},
|
||||||
|
})
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
@ -187,6 +191,11 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleCardClass(item) {
|
||||||
|
const {workStatus = ''} = item
|
||||||
|
return !Object.keys(this.STACKWorkStatusOptions).find(i => i === workStatus) ? "timing-card-container" : workStatus === '9' ? 'warning-card-container' : 'running-card-container'
|
||||||
|
},
|
||||||
|
|
||||||
// 查看设备电位表格
|
// 查看设备电位表格
|
||||||
pointDetail(row, dataType) {
|
pointDetail(row, dataType) {
|
||||||
const {siteId, deviceId} = row
|
const {siteId, deviceId} = row
|
||||||
|
|||||||
@ -6,7 +6,8 @@
|
|||||||
shadow="always"
|
shadow="always"
|
||||||
class="sbjk-card-container list"
|
class="sbjk-card-container list"
|
||||||
:class="{
|
:class="{
|
||||||
'warning-card-container':item.emsCommunicationStatus && item.emsCommunicationStatus !== '0',
|
'timing-card-container':!['0','2'].includes(item.emsCommunicationStatus),
|
||||||
|
'warning-card-container':item.emsCommunicationStatus === '2',
|
||||||
'running-card-container':item.emsCommunicationStatus === '0'
|
'running-card-container':item.emsCommunicationStatus === '0'
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
@ -15,18 +16,16 @@
|
|||||||
<div class="info">
|
<div class="info">
|
||||||
<div>
|
<div>
|
||||||
{{
|
{{
|
||||||
$store.state.ems.communicationStatusOptions[
|
communicationStatusOptions[item.emsCommunicationStatus] || '-'
|
||||||
item.emsCommunicationStatus
|
|
||||||
]
|
|
||||||
}}
|
}}
|
||||||
</div>
|
</div>
|
||||||
<div>数据更新时间:{{ item.dataUpdateTime }}</div>
|
<div>数据更新时间:{{ item.dataUpdateTime || '-' }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="alarm">
|
<div class="alarm">
|
||||||
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
||||||
详细
|
详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="item.alarmNum || 0" class="item">
|
<el-badge :hidden="!item.alarmNum" :value="item.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(item,'alarmPoint')"
|
@click="pointDetail(item,'alarmPoint')"
|
||||||
@ -35,7 +34,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-row class="device-info-row">
|
<el-row class="device-info-row">
|
||||||
<el-col v-for="(tempDataItem,tempDataIndex) in deviceIdTypeMsg[item.deviceId]" :key="tempDataIndex+'dbTempData'"
|
<el-col v-for="(tempDataItem,tempDataIndex) in (deviceIdTypeMsg[item.deviceId] || otherTypeMsg)"
|
||||||
|
:key="tempDataIndex+'dbTempData'"
|
||||||
:span="8" class="device-info-col">
|
:span="8" class="device-info-col">
|
||||||
<span class="pointer" @click="showChart(tempDataItem.pointName,item.deviceId)">
|
<span class="pointer" @click="showChart(tempDataItem.pointName,item.deviceId)">
|
||||||
<span class="left">{{ tempDataItem.name }}</span> <span class="right">{{ item[tempDataItem.attr] || '-' }}<span
|
<span class="left">{{ tempDataItem.name }}</span> <span class="right">{{ item[tempDataItem.attr] || '-' }}<span
|
||||||
@ -56,11 +56,18 @@ import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
|||||||
import {getAmmeterDataList} from "@/api/ems/dzjk";
|
import {getAmmeterDataList} from "@/api/ems/dzjk";
|
||||||
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
||||||
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
|
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DzjkSbjkDb",
|
name: "DzjkSbjkDb",
|
||||||
mixins: [getQuerySiteId, intervalUpdate],
|
mixins: [getQuerySiteId, intervalUpdate],
|
||||||
components: {PointTable, pointChart},
|
components: {PointTable, pointChart},
|
||||||
|
computed: {
|
||||||
|
|
||||||
|
...mapState({
|
||||||
|
communicationStatusOptions: state => state?.ems?.communicationStatusOptions || {},
|
||||||
|
})
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
@ -70,89 +77,125 @@ export default {
|
|||||||
{
|
{
|
||||||
name: '正向有功电能',
|
name: '正向有功电能',
|
||||||
attr: 'forwardActive',
|
attr: 'forwardActive',
|
||||||
pointName: '正向有功电能'
|
pointName: '正向有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '反向有功电能',
|
name: '反向有功电能',
|
||||||
attr: 'reverseActive',
|
attr: 'reverseActive',
|
||||||
pointName: '反向有功电能'
|
pointName: '反向有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '正向无功电能',
|
name: '正向无功电能',
|
||||||
attr: 'forwardReactive',
|
attr: 'forwardReactive',
|
||||||
pointName: '正向无功电能'
|
pointName: '正向无功电能',
|
||||||
|
unit: 'kvarh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '反向无功电能',
|
name: '反向无功电能',
|
||||||
attr: 'reverseReactive',
|
attr: 'reverseReactive',
|
||||||
pointName: '反向无功电能'
|
pointName: '反向无功电能',
|
||||||
|
unit: 'kvarh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '有功功率',
|
name: '有功功率',
|
||||||
attr: 'activePower',
|
attr: 'activePower',
|
||||||
pointName: '总有功功率'
|
pointName: '总有功功率',
|
||||||
|
unit: 'kW'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '无功功率',
|
name: '无功功率',
|
||||||
attr: 'reactivePower',
|
attr: 'reactivePower',
|
||||||
pointName: '总无功功率'
|
pointName: '总无功功率',
|
||||||
|
unit: 'kvar'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
'METE': [
|
'METE': [
|
||||||
{
|
{
|
||||||
name: '正向有功电能',
|
name: '正向有功电能',
|
||||||
attr: 'forwardActive',
|
attr: 'forwardActive',
|
||||||
pointName: '正向有功电能'
|
pointName: '正向有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '反向有功电能',
|
name: '反向有功电能',
|
||||||
attr: 'reverseActive',
|
attr: 'reverseActive',
|
||||||
pointName: '反向有功电能'
|
pointName: '反向有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '正向无功电能',
|
name: '正向无功电能',
|
||||||
attr: 'forwardReactive',
|
attr: 'forwardReactive',
|
||||||
pointName: '正向无功电能'
|
pointName: '正向无功电能',
|
||||||
|
unit: 'kvarh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '反向无功电能',
|
name: '反向无功电能',
|
||||||
attr: 'reverseReactive',
|
attr: 'reverseReactive',
|
||||||
pointName: '反向无功电能'
|
pointName: '反向无功电能',
|
||||||
|
unit: 'kvarh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '有功功率',
|
name: '有功功率',
|
||||||
attr: 'activePower',
|
attr: 'activePower',
|
||||||
pointName: '总有功功率'
|
pointName: '总有功功率',
|
||||||
|
unit: 'kW'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '无功功率',
|
name: '无功功率',
|
||||||
attr: 'reactivePower',
|
attr: 'reactivePower',
|
||||||
pointName: '总无功功率'
|
pointName: '总无功功率',
|
||||||
|
unit: 'kvar'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
'METEGF': [
|
'METEGF': [
|
||||||
{
|
{
|
||||||
name: '有功电能',
|
name: '有功电能',
|
||||||
attr: 'activeEnergy',
|
attr: 'activeEnergy',
|
||||||
pointName: '有功电能'
|
pointName: '有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '无功电能',
|
name: '无功电能',
|
||||||
attr: 'reactiveEnergy',
|
attr: 'reactiveEnergy',
|
||||||
pointName: '无功电能'
|
pointName: '无功电能',
|
||||||
|
unit: 'kvarh'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '有功功率',
|
name: '有功功率',
|
||||||
attr: 'activePower',
|
attr: 'activePower',
|
||||||
pointName: '总有功功率'
|
pointName: '总有功功率',
|
||||||
|
unit: 'kW'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '无功功率',
|
name: '无功功率',
|
||||||
attr: 'reactivePower',
|
attr: 'reactivePower',
|
||||||
pointName: '总无功功率'
|
pointName: '总无功功率',
|
||||||
|
unit: 'kvar'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
otherTypeMsg: [
|
||||||
|
{
|
||||||
|
name: '正向有功电能',
|
||||||
|
attr: 'forwardActive',
|
||||||
|
pointName: '正向有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '反向有功电能',
|
||||||
|
attr: 'reverseActive',
|
||||||
|
pointName: '反向有功电能',
|
||||||
|
unit: 'kWh'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '有功功率',
|
||||||
|
attr: 'activePower',
|
||||||
|
pointName: '总有功功率',
|
||||||
|
unit: 'kW'
|
||||||
|
},
|
||||||
|
]
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
||||||
详细
|
详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="item.alarmNum || 0" class="item">
|
<el-badge :hidden="!item.alarmNum" :value="item.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(item,'alarmPoint')"
|
@click="pointDetail(item,'alarmPoint')"
|
||||||
|
|||||||
@ -1,206 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading" class="ems">
|
<div v-loading="loading" class="ems">
|
||||||
<!-- <div-->
|
|
||||||
<!-- v-for="(item, index) in list"-->
|
|
||||||
<!-- :key="index + 'PcsHome'"-->
|
|
||||||
<!-- style="margin-bottom: 25px"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-card-->
|
|
||||||
<!-- :class="{-->
|
|
||||||
<!-- 'warning-card-container': item.workStatus === '1',-->
|
|
||||||
<!-- 'timing-card-container': item.workStatus === '2',-->
|
|
||||||
<!-- 'running-card-container': !['1', '2'].includes(item.workStatus),-->
|
|
||||||
<!-- }"-->
|
|
||||||
<!-- class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"-->
|
|
||||||
<!-- shadow="always"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <!– 标题–>-->
|
|
||||||
<!-- <div slot="header">-->
|
|
||||||
<!-- <span class="large-title"-->
|
|
||||||
<!-- >{{ item.deviceName }}</span-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <div class="info">-->
|
|
||||||
<!-- <div>-->
|
|
||||||
<!-- {{-->
|
|
||||||
<!-- $store.state.ems.workStatusOptions[item.workStatus]-->
|
|
||||||
<!-- }}-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <div>数据更新时间:{{ item.dataUpdateTime }}</div>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <div class="alarm">-->
|
|
||||||
<!-- <el-button type="primary" size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">-->
|
|
||||||
<!-- 详细-->
|
|
||||||
<!-- </el-button>-->
|
|
||||||
<!-- <el-badge :value="item.alarmNum || 0" class="item">-->
|
|
||||||
<!-- <i-->
|
|
||||||
<!-- class="el-icon-message-solid alarm-icon"-->
|
|
||||||
<!-- @click="pointDetail(item,'alarmPoint')"-->
|
|
||||||
<!-- ></i>-->
|
|
||||||
<!-- </el-badge>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <!– 工作状态–>-->
|
|
||||||
<!-- <div class="descriptions-main">-->
|
|
||||||
<!-- <el-descriptions :colon="false" :column="5" direction="vertical">-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :contentClassName="`descriptions-direction ${-->
|
|
||||||
<!-- item.workStatus === '0' ? 'save' : 'danger'-->
|
|
||||||
<!-- }`"-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- label="工作状态"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >{{-->
|
|
||||||
<!-- $store.state.ems.workStatusOptions[item.workStatus]-->
|
|
||||||
<!-- }}-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="工作模式"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- todo 手动/自动-->
|
|
||||||
<!-- {{-->
|
|
||||||
<!-- $store.state.ems.gridStatusOptions[item.gridStatus]-->
|
|
||||||
<!-- }}-->
|
|
||||||
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="并网状态"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >{{-->
|
|
||||||
<!-- $store.state.ems.gridStatusOptions[item.gridStatus]-->
|
|
||||||
<!-- }}-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="告警状态"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- todo-->
|
|
||||||
<!-- <!–-->
|
|
||||||
<!-- {{-->
|
|
||||||
<!-- $store.state.ems.warnOptions[item.warnMode]-->
|
|
||||||
<!-- }}–>-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :contentClassName="`descriptions-direction ${-->
|
|
||||||
<!-- item.deviceStatus === '2' ? 'save' : 'danger'-->
|
|
||||||
<!-- }`"-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- label="设备状态"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >{{-->
|
|
||||||
<!-- $store.state.ems.deviceStatusOptions[item.deviceStatus]-->
|
|
||||||
<!-- }}-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <!– 用电量–>-->
|
|
||||||
<!-- <div class="descriptions-main descriptions-main-bg-color">-->
|
|
||||||
<!-- <el-descriptions :colon="false" :column="5" direction="vertical">-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="5"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="当日用电量:"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="电网用电量"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="储能放电量"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="储能充电量"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="负荷用电量"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <el-descriptions-item-->
|
|
||||||
<!-- :span="1"-->
|
|
||||||
<!-- contentClassName="descriptions-direction"-->
|
|
||||||
<!-- label="光伏发电量"-->
|
|
||||||
<!-- labelClassName="descriptions-label"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions-item-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </el-descriptions>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <!– 表格–>-->
|
|
||||||
<!-- <el-table-->
|
|
||||||
<!-- class="common-table"-->
|
|
||||||
<!-- stripe-->
|
|
||||||
<!-- style="width: 100%;margin-top:25px;">-->
|
|
||||||
<!-- <el-table-column-->
|
|
||||||
<!-- label="功率"-->
|
|
||||||
<!-- prop="type">-->
|
|
||||||
<!-- </el-table-column>-->
|
|
||||||
<!-- <el-table-column-->
|
|
||||||
<!-- label="电网"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- <template slot-scope="scope">-->
|
|
||||||
<!-- <span class="pointer"-->
|
|
||||||
<!-- @click="showChart('簇电压',scope.row.clusterId)">{{ scope.row.clusterVoltage }} V</span>-->
|
|
||||||
<!-- </template>-->
|
|
||||||
<!-- </el-table-column>-->
|
|
||||||
<!-- <el-table-column-->
|
|
||||||
<!-- label="储能">-->
|
|
||||||
<!-- <template slot-scope="scope">-->
|
|
||||||
<!-- <span class="pointer"-->
|
|
||||||
<!-- @click="showChart('簇电流',scope.row.clusterId)">{{ scope.row.clusterCurrent }} A</span>-->
|
|
||||||
<!-- </template>-->
|
|
||||||
<!-- </el-table-column>-->
|
|
||||||
<!-- <el-table-column-->
|
|
||||||
<!-- label="负荷">-->
|
|
||||||
<!-- <template slot-scope="scope">-->
|
|
||||||
<!-- <span class="pointer"-->
|
|
||||||
<!-- @click="showChart('簇电流',scope.row.clusterId)">{{ scope.row.clusterCurrent }} A</span>-->
|
|
||||||
<!-- </template>-->
|
|
||||||
<!-- </el-table-column>-->
|
|
||||||
<!-- <el-table-column-->
|
|
||||||
<!-- label="光伏">-->
|
|
||||||
<!-- <template slot-scope="scope">-->
|
|
||||||
<!-- <span class="pointer"-->
|
|
||||||
<!-- @click="showChart('当前SOC',scope.row.clusterId)">{{ scope.row.currentSoc }} %</span>-->
|
|
||||||
<!-- </template>-->
|
|
||||||
<!-- </el-table-column>-->
|
|
||||||
<!-- </el-table>-->
|
|
||||||
<!-- <!– 图表–>-->
|
|
||||||
<!-- <div id="emsChart" style="height: 350px"></div>-->
|
|
||||||
<!-- </el-card>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<el-card
|
<el-card
|
||||||
v-for="(item,index) in list"
|
v-for="(item,index) in list"
|
||||||
:key="index+'emsList'"
|
:key="index+'emsList'"
|
||||||
@ -220,7 +19,7 @@
|
|||||||
<div class="alarm">
|
<div class="alarm">
|
||||||
<el-button size="small" round style="margin-right:20px;" type="primary" @click="pointDetail(item,'point')">详细
|
<el-button size="small" round style="margin-right:20px;" type="primary" @click="pointDetail(item,'point')">详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="item.alarmNum || 0" class="item">
|
<el-badge :hidden="!item.alarmNum" :value="item.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(item,'alarmPoint')"
|
@click="pointDetail(item,'alarmPoint')"
|
||||||
|
|||||||
@ -8,11 +8,7 @@
|
|||||||
style="margin-bottom: 25px"
|
style="margin-bottom: 25px"
|
||||||
>
|
>
|
||||||
<el-card
|
<el-card
|
||||||
:class="{
|
:class="handleCardClass(pcsItem)"
|
||||||
'timing-card-container':!['0','2'].includes(pcsItem.workStatus),
|
|
||||||
'warning-card-container':pcsItem.workStatus === '2',
|
|
||||||
'running-card-container':pcsItem.workStatus === '0'
|
|
||||||
}"
|
|
||||||
class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"
|
class="sbjk-card-container common-card-container-body-no-padding common-card-container-no-title-bg"
|
||||||
shadow="always"
|
shadow="always"
|
||||||
>
|
>
|
||||||
@ -41,7 +37,7 @@
|
|||||||
@click="pointDetail(pcsItem,'point')">
|
@click="pointDetail(pcsItem,'point')">
|
||||||
详细
|
详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="pcsItem.alarmNum || 0" class="item">
|
<el-badge :hidden="!pcsItem.alarmNum" :value="pcsItem.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(pcsItem,'alarmPoint')"
|
@click="pointDetail(pcsItem,'alarmPoint')"
|
||||||
@ -52,14 +48,12 @@
|
|||||||
<div class="descriptions-main">
|
<div class="descriptions-main">
|
||||||
<el-descriptions :colon="false" :column="4" direction="vertical">
|
<el-descriptions :colon="false" :column="4" direction="vertical">
|
||||||
<el-descriptions-item
|
<el-descriptions-item
|
||||||
:contentClassName="`descriptions-direction ${
|
contentClassName="descriptions-direction work-status"
|
||||||
pcsItem.workStatus === '0' ? 'save' : 'danger'
|
|
||||||
}`"
|
|
||||||
:span="1"
|
:span="1"
|
||||||
label="工作状态"
|
label="工作状态"
|
||||||
labelClassName="descriptions-label"
|
labelClassName="descriptions-label"
|
||||||
>{{
|
>{{
|
||||||
$store.state.ems.workStatusOptions[pcsItem.workStatus]
|
PCSWorkStatusOptions[pcsItem.workStatus]
|
||||||
}}
|
}}
|
||||||
</el-descriptions-item
|
</el-descriptions-item
|
||||||
>
|
>
|
||||||
@ -197,11 +191,17 @@ import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
|||||||
import {getPcsDetailInfo, getRunningHeadInfo} from "@/api/ems/dzjk";
|
import {getPcsDetailInfo, getRunningHeadInfo} from "@/api/ems/dzjk";
|
||||||
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
import intervalUpdate from "@/mixins/ems/intervalUpdate";
|
||||||
import PcsSwitch from "@/views/ems/site/sblb/PcsSwitch.vue";
|
import PcsSwitch from "@/views/ems/site/sblb/PcsSwitch.vue";
|
||||||
|
import {mapState} from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DzjkSbjkPcs",
|
name: "DzjkSbjkPcs",
|
||||||
components: {RealTimeBaseInfo, pointChart, PointTable, PcsSwitch},
|
components: {RealTimeBaseInfo, pointChart, PointTable, PcsSwitch},
|
||||||
mixins: [getQuerySiteId, intervalUpdate],
|
mixins: [getQuerySiteId, intervalUpdate],
|
||||||
|
computed: {
|
||||||
|
...mapState({
|
||||||
|
PCSWorkStatusOptions: state => state?.ems?.PCSWorkStatusOptions || {},
|
||||||
|
})
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: false,
|
loading: false,
|
||||||
@ -288,6 +288,10 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
handleCardClass(item) {
|
||||||
|
const {workStatus = ''} = item
|
||||||
|
return workStatus === '1' || !Object.keys(this.PCSWorkStatusOptions).find(i => i === workStatus) ? "timing-card-container" : workStatus === '2' ? 'warning-card-container' : 'running-card-container'
|
||||||
|
},
|
||||||
// 查看设备电位表格
|
// 查看设备电位表格
|
||||||
pointDetail(row, dataType) {
|
pointDetail(row, dataType) {
|
||||||
const {deviceId} = row
|
const {deviceId} = row
|
||||||
|
|||||||
@ -85,7 +85,7 @@ export default {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
this.chart.setOption({
|
this.chart && this.chart.setOption({
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
top: "5",
|
top: "5",
|
||||||
@ -137,7 +137,7 @@ export default {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
series,
|
series,
|
||||||
});
|
}, true);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -54,7 +54,7 @@ export default {
|
|||||||
year:element.dateDay,
|
year:element.dateDay,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
xdata = this.chart.setOption({
|
this.chart && this.chart.setOption({
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
top: "5",
|
top: "5",
|
||||||
@ -115,7 +115,7 @@ export default {
|
|||||||
data: ydata,
|
data: ydata,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
},true);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -57,7 +57,7 @@ export default {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
xdata = this.chart.setOption({
|
this.chart && this.chart.setOption({
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
top: "5",
|
top: "5",
|
||||||
@ -118,7 +118,7 @@ export default {
|
|||||||
data: ydata,
|
data: ydata,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
},true);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -66,7 +66,7 @@ export default {
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
this.chart.setOption({
|
this.chart && this.chart.setOption({
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
top: "5",
|
top: "5",
|
||||||
@ -118,7 +118,7 @@ export default {
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
series,
|
series,
|
||||||
});
|
},true);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -25,7 +25,7 @@
|
|||||||
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
||||||
详细
|
详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="item.alarmNum || 0" class="item">
|
<el-badge :hidden="!item.alarmNum" :value="item.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(item,'alarmPoint')"
|
@click="pointDetail(item,'alarmPoint')"
|
||||||
|
|||||||
@ -14,7 +14,7 @@
|
|||||||
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
<el-button type="primary" round size="small" style="margin-right:20px;" @click="pointDetail(item,'point')">
|
||||||
详细
|
详细
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-badge :value="item.alarmNum || 0" class="item">
|
<el-badge :hidden="!item.alarmNum" :value="item.alarmNum || 0" class="item">
|
||||||
<i
|
<i
|
||||||
class="el-icon-message-solid alarm-icon"
|
class="el-icon-message-solid alarm-icon"
|
||||||
@click="pointDetail(item,'alarmPoint')"
|
@click="pointDetail(item,'alarmPoint')"
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div style="width:100%" v-loading="loading">
|
<div style="width:100%" v-loading="loading">
|
||||||
<!-- 搜索栏-->
|
<!-- 搜索栏-->
|
||||||
@ -22,6 +21,9 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button @click="onReset" native-type="button">重置</el-button>
|
<el-button @click="onReset" native-type="button">重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="exportTable" native-type="button">导出</el-button>
|
||||||
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<!--表格-->
|
<!--表格-->
|
||||||
<el-table
|
<el-table
|
||||||
@ -122,6 +124,7 @@
|
|||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
||||||
import {getAmmeterData} from '@/api/ems/dzjk'
|
import {getAmmeterData} from '@/api/ems/dzjk'
|
||||||
import {formatDate} from "@/filters/ems";
|
import {formatDate} from "@/filters/ems";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DzjkTjbbDbbb',
|
name: 'DzjkTjbbDbbb',
|
||||||
mixins: [getQuerySiteId],
|
mixins: [getQuerySiteId],
|
||||||
@ -142,6 +145,16 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
// 导出表格
|
||||||
|
exportTable() {
|
||||||
|
if (!this.dateRange?.length) return
|
||||||
|
const [startTime, endTime] = this.dateRange
|
||||||
|
this.download('ems/statsReport/exportAmmeterData', {
|
||||||
|
siteId: this.siteId,
|
||||||
|
startTime,
|
||||||
|
endTime,
|
||||||
|
}, `电表报表_${startTime}-${endTime}.xlsx`)
|
||||||
|
},
|
||||||
// 搜索
|
// 搜索
|
||||||
onSearch() {
|
onSearch() {
|
||||||
this.pageNum = 1//每次搜索从1开始搜索
|
this.pageNum = 1//每次搜索从1开始搜索
|
||||||
@ -184,10 +197,9 @@ export default {
|
|||||||
this.totalSize = 0
|
this.totalSize = 0
|
||||||
this.pageSize = 10
|
this.pageSize = 10
|
||||||
this.pageNum = 1
|
this.pageNum = 1
|
||||||
const now = new Date().getTime();
|
let now = new Date(), lastDay = now.getTime(), firstDay = new Date(now.setDate(1)).getTime();
|
||||||
const lastMonth = new Date(now-30 * 24 * 60 * 60 * 1000).getTime();
|
this.defaultDateRange = [formatDate(firstDay), formatDate(lastDay)];
|
||||||
this.defaultDateRange = [formatDate(lastMonth), formatDate(now)];
|
this.dateRange = [formatDate(firstDay), formatDate(lastDay)];
|
||||||
this.dateRange=[formatDate(lastMonth), formatDate(now)];
|
|
||||||
this.getData()
|
this.getData()
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -16,7 +16,8 @@
|
|||||||
size="mini"
|
size="mini"
|
||||||
:class="{ activeBtn: activeBtn === item.id }"
|
:class="{ activeBtn: activeBtn === item.id }"
|
||||||
@click="changeDataType(item.id)"
|
@click="changeDataType(item.id)"
|
||||||
>{{ item.name }}</el-button
|
>{{ item.name }}
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
</el-button-group>
|
</el-button-group>
|
||||||
<div id="dcdEchart" style="height: 310px"></div>
|
<div id="dcdEchart" style="height: 310px"></div>
|
||||||
@ -28,9 +29,10 @@
|
|||||||
import * as echarts from "echarts";
|
import * as echarts from "echarts";
|
||||||
import resize from "@/mixins/ems/resize";
|
import resize from "@/mixins/ems/resize";
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
||||||
import { getStackData, getStackNameList } from "@/api/ems/dzjk";
|
import {getStackData} from "@/api/ems/dzjk";
|
||||||
import {formatDate} from "@/filters/ems";
|
import {formatDate} from "@/filters/ems";
|
||||||
import DateRangeSelect from "@/components/Ems/DateRangeSelect/index.vue";
|
import DateRangeSelect from "@/components/Ems/DateRangeSelect/index.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DzjkTjbbDcdqx",
|
name: "DzjkTjbbDcdqx",
|
||||||
components: {DateRangeSelect},
|
components: {DateRangeSelect},
|
||||||
@ -142,7 +144,7 @@ export default {
|
|||||||
},
|
},
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
bottom: "15",
|
top: "10",
|
||||||
},
|
},
|
||||||
tooltip: {
|
tooltip: {
|
||||||
trigger: "axis",
|
trigger: "axis",
|
||||||
@ -160,10 +162,25 @@ export default {
|
|||||||
yAxis: {
|
yAxis: {
|
||||||
type: "value",
|
type: "value",
|
||||||
},
|
},
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
type: "inside",
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
dataset: {source},
|
dataset: {source},
|
||||||
series: source[0].slice(1).map((item) => {
|
series: source[0].slice(1).map((item) => {
|
||||||
return {
|
return {
|
||||||
type: "line",
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.7,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
@ -176,7 +193,7 @@ export default {
|
|||||||
init() {
|
init() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.initChart();
|
this.initChart();
|
||||||
this.$refs.dateRangeSelect.init();
|
this.$refs.dateRangeSelect.init(true);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -8,7 +8,6 @@
|
|||||||
<span class="card-title">功率曲线</span>
|
<span class="card-title">功率曲线</span>
|
||||||
<date-range-select
|
<date-range-select
|
||||||
ref="dateRangeSelect"
|
ref="dateRangeSelect"
|
||||||
@reset="resetTime"
|
|
||||||
@updateDate="updateDate"
|
@updateDate="updateDate"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -22,9 +21,10 @@
|
|||||||
import * as echarts from "echarts";
|
import * as echarts from "echarts";
|
||||||
import resize from "@/mixins/ems/resize";
|
import resize from "@/mixins/ems/resize";
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
||||||
import { getPcsNameList, getPowerData } from "@/api/ems/dzjk";
|
import {getPowerData} from "@/api/ems/dzjk";
|
||||||
import {formatDate} from "@/filters/ems";
|
import {formatDate} from "@/filters/ems";
|
||||||
import DateRangeSelect from "@/components/Ems/DateRangeSelect/index.vue";
|
import DateRangeSelect from "@/components/Ems/DateRangeSelect/index.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DzjkTjbbGlqx",
|
name: "DzjkTjbbGlqx",
|
||||||
components: {DateRangeSelect},
|
components: {DateRangeSelect},
|
||||||
@ -38,7 +38,6 @@ export default {
|
|||||||
},
|
},
|
||||||
dateRange: [],
|
dateRange: [],
|
||||||
loading: false,
|
loading: false,
|
||||||
dateRangeInit: true,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -47,19 +46,11 @@ export default {
|
|||||||
this.dateRange = data || [];
|
this.dateRange = data || [];
|
||||||
this.getData();
|
this.getData();
|
||||||
},
|
},
|
||||||
resetTime() {
|
|
||||||
this.dateRangeInit = true;
|
|
||||||
},
|
|
||||||
getData() {
|
getData() {
|
||||||
const {siteId} = this;
|
const {siteId} = this;
|
||||||
let [start = "", end = ""] = this.dateRange || [];
|
let [start = "", end = ""] = this.dateRange || [];
|
||||||
//接口调用完成之后 设置图表、结束loading
|
//接口调用完成之后 设置图表、结束loading
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
if (this.dateRangeInit) {
|
|
||||||
start = "";
|
|
||||||
end = "";
|
|
||||||
this.dateRangeInit = false;
|
|
||||||
}
|
|
||||||
getPowerData({
|
getPowerData({
|
||||||
siteId,
|
siteId,
|
||||||
startDate: formatDate(start),
|
startDate: formatDate(start),
|
||||||
@ -90,7 +81,7 @@ export default {
|
|||||||
},
|
},
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
bottom: "15",
|
top: "10",
|
||||||
},
|
},
|
||||||
tooltip: {
|
tooltip: {
|
||||||
trigger: "axis",
|
trigger: "axis",
|
||||||
@ -109,18 +100,45 @@ export default {
|
|||||||
type: "value",
|
type: "value",
|
||||||
},
|
},
|
||||||
dataset: {source},
|
dataset: {source},
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
type: "inside",
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
series: [
|
series: [
|
||||||
{
|
{
|
||||||
type: "line",
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.7,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "line",
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.7,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "line",
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.7,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "line",
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.7,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@ -133,7 +151,6 @@ export default {
|
|||||||
},
|
},
|
||||||
init() {
|
init() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.dateRangeInit = true;
|
|
||||||
this.initChart();
|
this.initChart();
|
||||||
this.$refs.dateRangeSelect.init();
|
this.$refs.dateRangeSelect.init();
|
||||||
});
|
});
|
||||||
|
|||||||
@ -16,7 +16,8 @@
|
|||||||
size="mini"
|
size="mini"
|
||||||
:class="{ activeBtn: activeBtn === item.id }"
|
:class="{ activeBtn: activeBtn === item.id }"
|
||||||
@click="changeDataType(item.id)"
|
@click="changeDataType(item.id)"
|
||||||
>{{ item.name }}</el-button
|
>{{ item.name }}
|
||||||
|
</el-button
|
||||||
>
|
>
|
||||||
</el-button-group>
|
</el-button-group>
|
||||||
<div id="pcsEchart" style="height: 310px"></div>
|
<div id="pcsEchart" style="height: 310px"></div>
|
||||||
@ -28,9 +29,10 @@
|
|||||||
import * as echarts from "echarts";
|
import * as echarts from "echarts";
|
||||||
import resize from "@/mixins/ems/resize";
|
import resize from "@/mixins/ems/resize";
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
||||||
import { getPCSData, getPcsNameList } from "@/api/ems/dzjk";
|
import {getPCSData} from "@/api/ems/dzjk";
|
||||||
import {formatDate} from "@/filters/ems";
|
import {formatDate} from "@/filters/ems";
|
||||||
import DateRangeSelect from "@/components/Ems/DateRangeSelect/index.vue";
|
import DateRangeSelect from "@/components/Ems/DateRangeSelect/index.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DzjkTjbbPcsqx",
|
name: "DzjkTjbbPcsqx",
|
||||||
components: {DateRangeSelect},
|
components: {DateRangeSelect},
|
||||||
@ -158,7 +160,7 @@ export default {
|
|||||||
},
|
},
|
||||||
legend: {
|
legend: {
|
||||||
left: "center",
|
left: "center",
|
||||||
bottom: "15",
|
top: "10",
|
||||||
},
|
},
|
||||||
tooltip: {
|
tooltip: {
|
||||||
trigger: "axis",
|
trigger: "axis",
|
||||||
@ -176,10 +178,25 @@ export default {
|
|||||||
yAxis: {
|
yAxis: {
|
||||||
type: "value",
|
type: "value",
|
||||||
},
|
},
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
type: "inside",
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
start: 0,
|
||||||
|
end: 100,
|
||||||
|
},
|
||||||
|
],
|
||||||
dataset: {source},
|
dataset: {source},
|
||||||
series: source[0].slice(1).map((item) => {
|
series: source[0].slice(1).map((item) => {
|
||||||
return {
|
return {
|
||||||
type: "line",
|
type: "line",
|
||||||
|
smooth: true,
|
||||||
|
areaStyle: {
|
||||||
|
opacity: 0.7,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
@ -192,7 +209,7 @@ export default {
|
|||||||
init() {
|
init() {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.initChart();
|
this.initChart();
|
||||||
this.$refs.dateRangeSelect.init();
|
this.$refs.dateRangeSelect.init(true);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -21,21 +21,23 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button @click="onReset" native-type="button">重置</el-button>
|
<el-button @click="onReset" native-type="button">重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="exportTable" native-type="button">导出</el-button>
|
||||||
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<!--表格-->
|
<!--表格-->
|
||||||
<el-table
|
<el-table
|
||||||
class="common-table"
|
class="common-table"
|
||||||
:data="tableData"
|
:data="tableData"
|
||||||
show-summary
|
show-summary
|
||||||
:summary-method="getSummaries"
|
|
||||||
stripe
|
stripe
|
||||||
style="width: 100%;margin-top:25px;">
|
style="width: 100%;margin-top:25px;">
|
||||||
<!-- 汇总列-->
|
<!-- 汇总列-->
|
||||||
<el-table-column label="汇总" min-width="180px" align="center">
|
<el-table-column label="汇总" min-width="100px" align="center">
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="dataTime"
|
prop="dataTime"
|
||||||
label="日期"
|
label="日期"
|
||||||
min-width="180px" align="center">
|
min-width="100px" align="center">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!--充电量列-->
|
<!--充电量列-->
|
||||||
@ -94,6 +96,14 @@
|
|||||||
label="总">
|
label="总">
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<!-- 实际收益-->
|
||||||
|
<el-table-column label="" align="center" fixed="right">
|
||||||
|
<el-table-column
|
||||||
|
prop="actualRevenue"
|
||||||
|
label="实际收益"
|
||||||
|
align="center">
|
||||||
|
</el-table-column>
|
||||||
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<el-pagination
|
<el-pagination
|
||||||
v-show="tableData.length>0"
|
v-show="tableData.length>0"
|
||||||
@ -137,45 +147,15 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
//表格汇总
|
// 导出表格
|
||||||
getSummaries(param) {
|
exportTable() {
|
||||||
const {columns, data} = param;
|
if (!this.dateRange?.length) return
|
||||||
const sums = [];
|
const [startTime, endTime] = this.dateRange
|
||||||
|
this.download('ems/statsReport/exportAmmeterRevenueData', {
|
||||||
columns.forEach((column, index) => {
|
siteId: this.siteId,
|
||||||
if (index === 0) {
|
startTime,
|
||||||
const activeTotal = data.map(item => item.activeTotalPrice).reduce((prev, curr) => {
|
endTime,
|
||||||
const value = Number(curr);
|
}, `收益报表_${startTime}-${endTime}.xlsx`)
|
||||||
if (!isNaN(value)) {
|
|
||||||
return prev + curr;
|
|
||||||
} else {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
const reActiveTotal = data.map(item => item.reActiveTotalPrice).reduce((prev, curr) => {
|
|
||||||
const value = Number(curr);
|
|
||||||
if (!isNaN(value)) {
|
|
||||||
return prev + curr;
|
|
||||||
} else {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
sums[index] = '价差收入 : ' + (reActiveTotal - activeTotal);
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const values = data.map(item => Number(item[column.property]));
|
|
||||||
if (!values.every(value => isNaN(value))) {
|
|
||||||
sums[index] = values.reduce((prev, curr) => {
|
|
||||||
const value = Number(curr);
|
|
||||||
if (!isNaN(value)) {
|
|
||||||
return prev + curr;
|
|
||||||
} else {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return sums
|
|
||||||
},
|
},
|
||||||
// 搜索
|
// 搜索
|
||||||
onSearch() {
|
onSearch() {
|
||||||
|
|||||||
@ -1,577 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="ems-dashboard-editor-container" v-loading="loading">
|
|
||||||
<div class="container" v-show="!empty">
|
|
||||||
<!-- 云、电脑 -->
|
|
||||||
<div class="top">
|
|
||||||
<div class="cloud-container">
|
|
||||||
<div class="cloud">
|
|
||||||
<span style="z-index: 2; position: relative">云</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="double-arrows">
|
|
||||||
<div class="top-arrows"></div>
|
|
||||||
<div class="bottom-arrows"></div>
|
|
||||||
</div>
|
|
||||||
<div class="computer">
|
|
||||||
<img src="@/assets/images/ems/computer.png" alt="" />
|
|
||||||
<span style="z-index: 2; position: relative">ems</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="outer-border">
|
|
||||||
<!-- 电表-->
|
|
||||||
<div class="row-lists-container" v-if="showDb">
|
|
||||||
<div class="row-title">电表({{ db.length }})</div>
|
|
||||||
<div class="row-lists">
|
|
||||||
<div v-for="item in db" :key="item.deviceId" class="row-items">
|
|
||||||
<div
|
|
||||||
class="status"
|
|
||||||
:class="
|
|
||||||
item.communicationStatus === '0' ? 'status-running' : ''
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ communicationStatusOptions[item.communicationStatus] }}
|
|
||||||
</div>
|
|
||||||
<div class="row-items-img">
|
|
||||||
<img
|
|
||||||
class="img-db"
|
|
||||||
:src="require('@/assets/images/ems/db.png')"
|
|
||||||
/>
|
|
||||||
<div class="name">{{ item.deviceName }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 液冷-->
|
|
||||||
<div class="row-lists-container" v-if="showLq">
|
|
||||||
<div class="row-title">冷却({{ lq.length }})</div>
|
|
||||||
<div class="row-lists">
|
|
||||||
<div v-for="item in lq" :key="item.deviceId" class="row-items">
|
|
||||||
<div
|
|
||||||
class="status"
|
|
||||||
:class="
|
|
||||||
item.communicationStatus === '0' ? 'status-running' : ''
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ communicationStatusOptions[item.communicationStatus] }}
|
|
||||||
</div>
|
|
||||||
<div class="row-items-img">
|
|
||||||
<img
|
|
||||||
class="img-lq"
|
|
||||||
:src="require('@/assets/images/ems/lq.png')"
|
|
||||||
/>
|
|
||||||
<div class="name">{{ item.deviceName }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- PCS-->
|
|
||||||
<div class="row-lists-container" v-if="showPcs">
|
|
||||||
<div class="row-lists">
|
|
||||||
<div class="row-title">PCS({{ pcs.length }})</div>
|
|
||||||
<div
|
|
||||||
v-for="(item, index) in pcs"
|
|
||||||
:key="item.deviceId"
|
|
||||||
class="row-items row-items-pcs"
|
|
||||||
>
|
|
||||||
<!-- pcs -->
|
|
||||||
<div class="parent-dash">
|
|
||||||
<div
|
|
||||||
class="status"
|
|
||||||
:class="
|
|
||||||
item.communicationStatus === '0' ? 'status-running' : ''
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ communicationStatusOptions[item.communicationStatus] }}
|
|
||||||
</div>
|
|
||||||
<div class="row-items-img">
|
|
||||||
<img
|
|
||||||
class="img-pcs"
|
|
||||||
:src="require('@/assets/images/ems/pcs.png')"
|
|
||||||
/>
|
|
||||||
<div class="name">{{ item.deviceName }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- 子设备 bms -->
|
|
||||||
<div
|
|
||||||
v-if="item.children && item.children.length > 0"
|
|
||||||
class="children-dash"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="row-children-title"
|
|
||||||
v-if="bmsHasParentLength > 0 && index === 0"
|
|
||||||
>
|
|
||||||
BMS({{ bmsHasParentLength }})
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
v-for="(childrenItem, childrenIndex) in item.children"
|
|
||||||
:key="childrenIndex + 'childrenBms'"
|
|
||||||
class="children-dash-items"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
class="status"
|
|
||||||
:class="
|
|
||||||
childrenItem.communicationStatus === '0'
|
|
||||||
? 'status-running'
|
|
||||||
: ''
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{
|
|
||||||
communicationStatusOptions[
|
|
||||||
childrenItem.communicationStatus
|
|
||||||
]
|
|
||||||
}}
|
|
||||||
</div>
|
|
||||||
<div class="row-items-img">
|
|
||||||
<img
|
|
||||||
class="img-pcs"
|
|
||||||
:src="require('@/assets/images/ems/bms.png')"
|
|
||||||
/>
|
|
||||||
<div class="name">{{ childrenItem.deviceName }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row-lists-container" v-if="showPcs">
|
|
||||||
<div class="row-title">PCS({{ pcs.length }})</div>
|
|
||||||
<div class="row-lists">
|
|
||||||
<div
|
|
||||||
v-for="item in bmsNoParent"
|
|
||||||
:key="item.deviceId"
|
|
||||||
class="row-items row-items-pcs"
|
|
||||||
>
|
|
||||||
<!-- pcs -->
|
|
||||||
<div class="parent-dash">
|
|
||||||
<div
|
|
||||||
class="status"
|
|
||||||
:class="
|
|
||||||
item.communicationStatus === '0' ? 'status-running' : ''
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ communicationStatusOptions[item.communicationStatus] }}
|
|
||||||
</div>
|
|
||||||
<div class="row-items-img">
|
|
||||||
<img :src="require('@/assets/images/ems/bms.png')" />
|
|
||||||
<div class="name">{{ item.deviceName }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- bms没有上级设备-->
|
|
||||||
<div class="row-lists-container" v-if="bmsNoParent.length > 0">
|
|
||||||
<div class="row-title">BMS({{ bmsNoParent.length }})</div>
|
|
||||||
<div class="row-lists">
|
|
||||||
<div
|
|
||||||
v-for="item in bmsNoParent"
|
|
||||||
:key="item.deviceId"
|
|
||||||
class="row-items row-items-pcs"
|
|
||||||
>
|
|
||||||
<!-- pcs -->
|
|
||||||
<div class="parent-dash">
|
|
||||||
<div
|
|
||||||
class="status"
|
|
||||||
:class="
|
|
||||||
item.communicationStatus === '0' ? 'status-running' : ''
|
|
||||||
"
|
|
||||||
>
|
|
||||||
{{ communicationStatusOptions[item.communicationStatus] }}
|
|
||||||
</div>
|
|
||||||
<div class="row-items-img">
|
|
||||||
<img :src="require('@/assets/images/ems/bms.png')" />
|
|
||||||
<div class="name">{{ item.deviceName }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<el-empty v-show="empty" :image-size="200"></el-empty>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { getDeviceList } from "@/api/ems/site";
|
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
|
||||||
import { mapState } from "vuex";
|
|
||||||
export default {
|
|
||||||
name: "DzjkZxlt",
|
|
||||||
mixins: [getQuerySiteId],
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
loading: false,
|
|
||||||
pcs: [],
|
|
||||||
bms: [],
|
|
||||||
db: [],
|
|
||||||
lq: [],
|
|
||||||
pcsHasChildren: [],
|
|
||||||
pcsNoChildren: [],
|
|
||||||
bmsNoParent: [],
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
...mapState({
|
|
||||||
communicationStatusOptions: (state) =>
|
|
||||||
state.ems.communicationStatusOptions,
|
|
||||||
}),
|
|
||||||
|
|
||||||
showPcs() {
|
|
||||||
return this.pcs.length > 0;
|
|
||||||
},
|
|
||||||
showBms() {
|
|
||||||
return this.bms.length > 0;
|
|
||||||
},
|
|
||||||
showDb() {
|
|
||||||
return this.db.length > 0;
|
|
||||||
},
|
|
||||||
showLq() {
|
|
||||||
return this.lq.length > 0;
|
|
||||||
},
|
|
||||||
bmsHasParentLength() {
|
|
||||||
let count = 0;
|
|
||||||
this.pcs.forEach((item) => (count += item.children.length));
|
|
||||||
return count;
|
|
||||||
},
|
|
||||||
empty() {
|
|
||||||
return !this.showBms && !this.showPcs && !this.showDb && !this.showLq;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
init() {
|
|
||||||
this.pcs = [];
|
|
||||||
this.bms = [];
|
|
||||||
this.lq = [];
|
|
||||||
this.db = [];
|
|
||||||
this.bmsNoParent = [];
|
|
||||||
this.loading = true;
|
|
||||||
getDeviceList(this.siteId)
|
|
||||||
.then((response) => {
|
|
||||||
const data = JSON.parse(JSON.stringify(response?.data || []));
|
|
||||||
let pcs = [],
|
|
||||||
bms = [],
|
|
||||||
db = [],
|
|
||||||
lq = [],
|
|
||||||
bmsNoParent = [];
|
|
||||||
data.forEach((item) => {
|
|
||||||
// 电表
|
|
||||||
if (item.deviceCategory === "AMMETER") {
|
|
||||||
db.push({ ...item, children: [] });
|
|
||||||
} else if (item.deviceCategory === "PCS") {
|
|
||||||
// pcs
|
|
||||||
pcs.push({ ...item, children: [] });
|
|
||||||
} else if (item.deviceCategory === "STACK") {
|
|
||||||
// bms
|
|
||||||
bms.push({ ...item, children: [] });
|
|
||||||
} else if (item.deviceCategory === "COOLING") {
|
|
||||||
// 液冷
|
|
||||||
lq.push({ ...item, children: [] });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
bms.forEach((item, index) => {
|
|
||||||
if (item.parentId) {
|
|
||||||
pcs
|
|
||||||
.find((pcsItem) => pcsItem.deviceId === item.parentId)
|
|
||||||
.children.push(item);
|
|
||||||
} else {
|
|
||||||
bmsNoParent.push(item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.pcs = pcs;
|
|
||||||
this.bms = bms;
|
|
||||||
this.lq = lq;
|
|
||||||
this.db = db;
|
|
||||||
this.pcsHasChildren = pcs.filter((item) => item.children.length > 0);
|
|
||||||
this.pcsNoChildren = pcs.filter((item) => item.children.length === 0);
|
|
||||||
this.bmsNoParent = bmsNoParent;
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
this.loading = false;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
$sqDistance: 30px;
|
|
||||||
$borderColor: #174a8e;
|
|
||||||
$lineColor: #86bcc7;
|
|
||||||
|
|
||||||
.ems-dashboard-editor-container {
|
|
||||||
background-color: #ffffff;
|
|
||||||
padding: 0;
|
|
||||||
color: #666666;
|
|
||||||
|
|
||||||
.container {
|
|
||||||
display: flex;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
//云 、计算机 、箭头
|
|
||||||
.top {
|
|
||||||
z-index: 2;
|
|
||||||
width: fit-content;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
// position: absolute;
|
|
||||||
// top: 50%;
|
|
||||||
// left: 0;
|
|
||||||
// transform: translateY(-50%);
|
|
||||||
//云 样式
|
|
||||||
.cloud-container {
|
|
||||||
margin: 0 auto;
|
|
||||||
.cloud {
|
|
||||||
width: 60px;
|
|
||||||
height: 26px;
|
|
||||||
background: #cbebfd;
|
|
||||||
border-radius: 100px;
|
|
||||||
position: relative;
|
|
||||||
text-align: center;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 26px;
|
|
||||||
}
|
|
||||||
.cloud:before,
|
|
||||||
.cloud:after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
background: #cbebfd;
|
|
||||||
width: 30px;
|
|
||||||
height: 30px;
|
|
||||||
border-radius: 100%;
|
|
||||||
}
|
|
||||||
.cloud:before {
|
|
||||||
top: -9px;
|
|
||||||
left: 8px;
|
|
||||||
}
|
|
||||||
.cloud:after {
|
|
||||||
top: -6px;
|
|
||||||
right: 9px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//双箭头
|
|
||||||
.double-arrows {
|
|
||||||
height: fit-content;
|
|
||||||
margin: 0 10px;
|
|
||||||
text-align: center;
|
|
||||||
.top-arrows,
|
|
||||||
.bottom-arrows {
|
|
||||||
height: 4px;
|
|
||||||
width: 30px;
|
|
||||||
background-color: #5ea9df;
|
|
||||||
margin: 0 10px;
|
|
||||||
position: relative;
|
|
||||||
&::after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-arrows {
|
|
||||||
vertical-align: super;
|
|
||||||
}
|
|
||||||
.top-arrows::after {
|
|
||||||
top: -4px;
|
|
||||||
border-bottom: 6px solid transparent;
|
|
||||||
border-left: 6px solid transparent;
|
|
||||||
border-right: 6px solid #5ea9df;
|
|
||||||
border-top: 6px solid transparent;
|
|
||||||
left: -11px;
|
|
||||||
}
|
|
||||||
.bottom-arrows {
|
|
||||||
margin-top: 8px;
|
|
||||||
&::after {
|
|
||||||
top: -4px;
|
|
||||||
border-top: 6px solid transparent;
|
|
||||||
border-left: 6px solid #5ea9df;
|
|
||||||
border-right: 6px solid transparent;
|
|
||||||
border-bottom: 6px solid transparent;
|
|
||||||
right: -11px;
|
|
||||||
left: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//电脑
|
|
||||||
.computer {
|
|
||||||
text-align: center;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 16px;
|
|
||||||
font-weight: bold;
|
|
||||||
position: relative;
|
|
||||||
background: #fff;
|
|
||||||
img {
|
|
||||||
width: 80px;
|
|
||||||
height: auto;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.outer-border {
|
|
||||||
position: relative;
|
|
||||||
width: fit-content;
|
|
||||||
border: 1.5px solid $borderColor;
|
|
||||||
border-radius: 5px;
|
|
||||||
padding-left: 120px;
|
|
||||||
padding-right: 20px;
|
|
||||||
margin-left: -40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设备列表
|
|
||||||
.row-lists-container {
|
|
||||||
font-size: 10px;
|
|
||||||
position: relative;
|
|
||||||
padding: 10px;
|
|
||||||
.row-title {
|
|
||||||
position: absolute;
|
|
||||||
left: -$sqDistance - 30px;
|
|
||||||
top: calc(50% + 10px);
|
|
||||||
transform: translateY(-50%);
|
|
||||||
color: #000;
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
.row-lists {
|
|
||||||
display: flex;
|
|
||||||
position: relative;
|
|
||||||
.row-items {
|
|
||||||
position: relative;
|
|
||||||
padding: 5px 0;
|
|
||||||
&:not(:first-child) {
|
|
||||||
margin-left: $sqDistance; //和外层父元素上下padding一致
|
|
||||||
}
|
|
||||||
&::before {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
height: 3px;
|
|
||||||
width: $sqDistance - 2px;
|
|
||||||
background: $lineColor;
|
|
||||||
position: absolute;
|
|
||||||
left: -$sqDistance;
|
|
||||||
top: calc(50% + 10px);
|
|
||||||
transform: scale(1, 0.4);
|
|
||||||
}
|
|
||||||
// 一列 第一个设备最上面的线
|
|
||||||
&:first-child {
|
|
||||||
&::before {
|
|
||||||
width: $sqDistance + 20px;
|
|
||||||
// top: -$sqDistance - 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 一列 最后一个设备最下面的线
|
|
||||||
// &:last-child {
|
|
||||||
// &::after {
|
|
||||||
// content: "";
|
|
||||||
// display: block;
|
|
||||||
// width: 3px;
|
|
||||||
// height: $sqDistance - 2px;
|
|
||||||
// background: $lineColor;
|
|
||||||
// position: absolute;
|
|
||||||
// bottom: -$sqDistance;
|
|
||||||
// left: 50%;
|
|
||||||
// transform: scale(0.4, 1);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// 设备状态
|
|
||||||
.status {
|
|
||||||
margin: 0 auto 4px;
|
|
||||||
width: fit-content;
|
|
||||||
height: 18px;
|
|
||||||
padding: 0 8px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 8px;
|
|
||||||
line-height: 18px;
|
|
||||||
border: 1px solid #08ffff;
|
|
||||||
border-radius: 2px;
|
|
||||||
background: #aaaaaa;
|
|
||||||
color: #ffffff;
|
|
||||||
&.status-running {
|
|
||||||
background: #00c69c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 图片+设备名称
|
|
||||||
.row-items-img {
|
|
||||||
position: relative;
|
|
||||||
padding-top: 12px;
|
|
||||||
img {
|
|
||||||
width: 80px;
|
|
||||||
height: auto;
|
|
||||||
display: block;
|
|
||||||
&.img-lq {
|
|
||||||
width: 50px;
|
|
||||||
}
|
|
||||||
&.img-pcs {
|
|
||||||
width: 50px;
|
|
||||||
}
|
|
||||||
&.img-db {
|
|
||||||
width: 56px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.name {
|
|
||||||
position: absolute;
|
|
||||||
top: 1px;
|
|
||||||
left: 0;
|
|
||||||
color: #666;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//子设备
|
|
||||||
.row-lists-container-children {
|
|
||||||
margin: 10px 0 0 $sqDistance;
|
|
||||||
.parent-dash {
|
|
||||||
position: relative;
|
|
||||||
&::before {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
height: 40px;
|
|
||||||
width: 3px;
|
|
||||||
background: #ec7f8c;
|
|
||||||
position: absolute;
|
|
||||||
left: 20%;
|
|
||||||
top: -40px;
|
|
||||||
transform: scale(0.4, 1) rotate(-40deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.parent-dash {
|
|
||||||
width: fit-content;
|
|
||||||
}
|
|
||||||
.children-dash {
|
|
||||||
margin: $sqDistance 0 0 $sqDistance;
|
|
||||||
position: relative;
|
|
||||||
.row-children-title {
|
|
||||||
position: absolute;
|
|
||||||
left: -$sqDistance - 30px;
|
|
||||||
top: calc(50% + 10px);
|
|
||||||
transform: translateY(-50%);
|
|
||||||
color: #000;
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
.children-dash-items {
|
|
||||||
position: relative;
|
|
||||||
&::before {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
height: $sqDistance;
|
|
||||||
width: 3px;
|
|
||||||
background: #ec7f8c;
|
|
||||||
position: absolute;
|
|
||||||
left: 20%;
|
|
||||||
top: -$sqDistance;
|
|
||||||
transform: scale(0.4, 1) rotate(-40deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,614 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="ems-dashboard-editor-container" v-loading="loading" >
|
|
||||||
<div class="container" v-show="!empty">
|
|
||||||
<div class="top">
|
|
||||||
<div class="cloud-container">
|
|
||||||
<div class="cloud">
|
|
||||||
<span style="z-index:2;position: relative;">云</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="double-arrows">
|
|
||||||
<div class="top-arrows"></div>
|
|
||||||
<div class="bottom-arrows"></div>
|
|
||||||
</div>
|
|
||||||
<div class="computer">
|
|
||||||
<img src="@/assets/images/ems/computer.png" alt="">
|
|
||||||
<span style="z-index:2;position: relative;">ems</span>
|
|
||||||
</div>
|
|
||||||
<div class="arrow"></div>
|
|
||||||
</div>
|
|
||||||
<div class="bottom">
|
|
||||||
<!-- 四列设备-->
|
|
||||||
<div class="zxlt-row">
|
|
||||||
<!-- bms、pcs 下级和上级在一列 -->
|
|
||||||
<div class="row-lists pcs-row-lists" v-if="showPcsAndBms">
|
|
||||||
<div class="item-square">
|
|
||||||
<div class="row-lists-title" v-if="showPcs">PCS({{pcs.length}})</div>
|
|
||||||
<div class="row-lists-title" v-if="showBms">BMS({{bms.length}})</div>
|
|
||||||
</div>
|
|
||||||
<!-- 上下级块 class区分-->
|
|
||||||
<div class="item-square pcs-has-children-item-square" :class="{'no-bms-list':!showBms}" v-for="(item,index) in pcsHasChildren" :key="index+'pcsHasChildren'">
|
|
||||||
<!-- 左边的上级 上级只有一个-->
|
|
||||||
<div class="item-lists parent-item-lists">
|
|
||||||
<!-- 上级设备-->
|
|
||||||
<div class="items normal-items-arrow">
|
|
||||||
<div class="items-inner">
|
|
||||||
<div style="text-align: center;margin-bottom:10px;">
|
|
||||||
<div class="status" :class="item.communicationStatus === '0' ?'status-normal' : 'status-warn'">通讯状态:{{communicationStatusOptions[item.communicationStatus] || '-'}}</div>
|
|
||||||
</div>
|
|
||||||
<img v-if="item.pictureUrl" :src="item.pictureUrl">
|
|
||||||
<img v-else :src="require('@/assets/images/ems/pcs.png')"/>
|
|
||||||
<div class="name">{{item.deviceName}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- 右边的下级 下级有多个-->
|
|
||||||
<div class="item-lists children-item-lists">
|
|
||||||
<!-- 下级设备 循环生成-->
|
|
||||||
<div class="items children-items-arrow bms-children-arrow" v-for="children in item.children" :key="children.deviceId">
|
|
||||||
<div class="items-inner">
|
|
||||||
<div style="text-align: center;margin-bottom:10px;">
|
|
||||||
<div class="status" :class="children.communicationStatus === '0' ?'status-normal' : 'status-warn'">通讯状态:{{communicationStatusOptions[children.communicationStatus] || '-'}}</div>
|
|
||||||
</div>
|
|
||||||
<img v-if="children.pictureUrl" :src="children.pictureUrl">
|
|
||||||
<img v-else :src="require('@/assets/images/ems/bms.png')"/>
|
|
||||||
<div class="name">{{children.deviceName}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- 没有上下级关系的bms、pcs-->
|
|
||||||
<div class="item-square" :class="{'no-bms-list':!showBms}">
|
|
||||||
<!-- 左边没有下级的pcs-->
|
|
||||||
<div class="item-lists">
|
|
||||||
<div class="items normal-items-arrow" v-for="item in pcsNoChildren" :key="item.deviceId">
|
|
||||||
<div class="items-inner">
|
|
||||||
<div style="text-align: center;margin-bottom:10px;">
|
|
||||||
<div class="status" :class="item.communicationStatus === '0' ?'status-normal' : 'status-warn'">通讯状态:{{communicationStatusOptions[item.communicationStatus] || '-'}}</div>
|
|
||||||
</div>
|
|
||||||
<img v-if="item.pictureUrl" :src="item.pictureUrl">
|
|
||||||
<img v-else :src="require('@/assets/images/ems/pcs.png')"/>
|
|
||||||
<div class="name">{{item.deviceName}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- 右边没有上级的bms-->
|
|
||||||
<div class="item-lists">
|
|
||||||
<!-- 下级设备 循环生成-->
|
|
||||||
<div class="items children-items-arrow" v-for="item in bmsNoParent" :key="item.deviceId">
|
|
||||||
<div class="items-inner">
|
|
||||||
<div style="text-align: center;margin-bottom:10px;">
|
|
||||||
<div class="status" :class="item.communicationStatus === '0' ?'status-normal' : 'status-warn'">通讯状态:{{communicationStatusOptions[item.communicationStatus] || '-'}}</div>
|
|
||||||
</div>
|
|
||||||
<img v-if="item.pictureUrl" :src="item.pictureUrl">
|
|
||||||
<img v-else :src="require('@/assets/images/ems/bms.png')"/>
|
|
||||||
<div class="name">{{item.deviceName}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- 电表-->
|
|
||||||
<div class="row-lists" v-if="showDb">
|
|
||||||
<div class="item-square">
|
|
||||||
<div class="row-lists-title" style="width:100%;">电表({{db.length}})</div>
|
|
||||||
</div>
|
|
||||||
<div class="item-square">
|
|
||||||
<!-- 左边的下级 下级有多个-->
|
|
||||||
<div class="item-lists">
|
|
||||||
<!-- 下级设备 循环生成-->
|
|
||||||
<div class="items normal-items-arrow" v-for="item in db" :key="item.deviceId">
|
|
||||||
<div class="items-inner">
|
|
||||||
<div style="text-align: center;margin-bottom:10px;">
|
|
||||||
<div class="status" :class="item.communicationStatus === '0' ?'status-normal' : 'status-warn'">通讯状态:{{communicationStatusOptions[item.communicationStatus] || '-'}}</div>
|
|
||||||
</div>
|
|
||||||
<img v-if="item.pictureUrl" :src="item.pictureUrl">
|
|
||||||
<img v-else :src="require('@/assets/images/ems/bms.png')"/>
|
|
||||||
<div class="name">{{item.deviceName}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!--冷却-->
|
|
||||||
<div class="row-lists" v-if="showLq">
|
|
||||||
<div class="item-square">
|
|
||||||
<div class="row-lists-title" style="width:100%;">冷却({{lq.length}})</div>
|
|
||||||
</div>
|
|
||||||
<div class="item-square">
|
|
||||||
<div class="item-lists">
|
|
||||||
<div class="items normal-items-arrow" v-for="item in lq" :key="item.deviceId">
|
|
||||||
<div class="items-inner">
|
|
||||||
<div style="text-align: center;margin-bottom:10px;">
|
|
||||||
<div class="status" :class="item.communicationStatus === '0' ?'status-normal' : 'status-warn'">通讯状态:{{communicationStatusOptions[item.communicationStatus] || '-'}}</div>
|
|
||||||
</div>
|
|
||||||
<img v-if="item.pictureUrl" :src="item.pictureUrl">
|
|
||||||
<img v-else :src="require('@/assets/images/ems/bms.png')"/>
|
|
||||||
<div class="name">{{item.deviceName}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<el-empty v-show="empty" :image-size="200"></el-empty>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import {getDeviceList} from'@/api/ems/site'
|
|
||||||
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
|
|
||||||
import {mapState} from "vuex";
|
|
||||||
export default {
|
|
||||||
name: 'DzjkZxlt',
|
|
||||||
mixins: [getQuerySiteId],
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
loading:false,
|
|
||||||
pcs :[],
|
|
||||||
bms:[],
|
|
||||||
db:[],
|
|
||||||
lq:[],
|
|
||||||
pcsHasChildren:[],
|
|
||||||
pcsNoChildren:[],
|
|
||||||
bmsNoParent:[]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed:{
|
|
||||||
...mapState({
|
|
||||||
communicationStatusOptions:(state)=>state.ems.communicationStatusOptions
|
|
||||||
}),
|
|
||||||
|
|
||||||
showPcs(){
|
|
||||||
return this.pcs.length>0
|
|
||||||
},
|
|
||||||
showBms(){
|
|
||||||
return this.bms.length>0
|
|
||||||
},
|
|
||||||
showDb(){
|
|
||||||
return this.db.length>0
|
|
||||||
},
|
|
||||||
showLq(){
|
|
||||||
return this.lq.length>0
|
|
||||||
},
|
|
||||||
showPcsAndBms(){
|
|
||||||
return this.showPcs || this.showBms
|
|
||||||
},
|
|
||||||
empty(){
|
|
||||||
return !this.showBms && !this.showPcs && !this.showDb && !this.showLq
|
|
||||||
},
|
|
||||||
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
init(){
|
|
||||||
this.pcs = []
|
|
||||||
this.bms = []
|
|
||||||
this.lq=[]
|
|
||||||
this.db=[]
|
|
||||||
this.bmsNoParent=[]
|
|
||||||
this.loading = true
|
|
||||||
getDeviceList(this.siteId).then(response => {
|
|
||||||
const data =JSON.parse(JSON.stringify(response?.data || []))
|
|
||||||
let pcs = [],bms=[],db=[],lq=[],bmsNoParent=[]
|
|
||||||
data.forEach(item=>{
|
|
||||||
// 电表
|
|
||||||
if(item.deviceCategory === 'AMMETER'){
|
|
||||||
db.push({...item,children:[]})
|
|
||||||
}else if(item.deviceCategory === 'PCS'){
|
|
||||||
// pcs
|
|
||||||
pcs.push({...item,children:[]})
|
|
||||||
}else if(item.deviceCategory === 'STACK'){
|
|
||||||
// bms
|
|
||||||
bms.push({...item,children:[]})
|
|
||||||
}else if(item.deviceCategory === 'COOLING'){
|
|
||||||
// 液冷
|
|
||||||
lq.push({...item,children:[]})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
bms.forEach((item,index)=>{
|
|
||||||
if(item.parentId){
|
|
||||||
pcs.find(pcsItem=>pcsItem.deviceId === item.parentId).children.push(item)
|
|
||||||
}else{
|
|
||||||
bmsNoParent.push(item)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.pcs = pcs
|
|
||||||
this.bms = bms
|
|
||||||
this.lq=lq
|
|
||||||
this.db=db
|
|
||||||
this.pcsHasChildren = pcs.filter(item=>item.children.length > 0)
|
|
||||||
this.pcsNoChildren = pcs.filter(item=>item.children.length === 0)
|
|
||||||
this.bmsNoParent = bmsNoParent
|
|
||||||
}).finally(() => {
|
|
||||||
this.loading = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
$distance:60px;
|
|
||||||
$arrowDistance:80px;//margin:60+quare的padding10
|
|
||||||
$arrowColoe:#5ea9df;
|
|
||||||
$lineColoe:#5ea9df;
|
|
||||||
.ems-dashboard-editor-container {
|
|
||||||
background-color: #ffffff;
|
|
||||||
padding:0;
|
|
||||||
.container{
|
|
||||||
position: relative;
|
|
||||||
overflow-x: auto;
|
|
||||||
}
|
|
||||||
//云 、计算机 、箭头
|
|
||||||
.top{
|
|
||||||
width: 280px;
|
|
||||||
font-size: 30px;
|
|
||||||
line-height: 40px;
|
|
||||||
font-weight: 500;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
//云 样式
|
|
||||||
.cloud-container{
|
|
||||||
padding-top:40px;
|
|
||||||
margin:0 auto;
|
|
||||||
.cloud {
|
|
||||||
width: 150px;
|
|
||||||
height: 60px;
|
|
||||||
background: #cbebfd;
|
|
||||||
border-radius: 200px;
|
|
||||||
position: relative;
|
|
||||||
text-align: center;
|
|
||||||
color:#666666;
|
|
||||||
}
|
|
||||||
.cloud:before, .cloud:after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
background:#cbebfd;
|
|
||||||
width: 80px;
|
|
||||||
height: 80px;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
.cloud:before {
|
|
||||||
top: -28px;
|
|
||||||
left: 20px;
|
|
||||||
}
|
|
||||||
.cloud:after {
|
|
||||||
top: -31px;
|
|
||||||
right: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//双箭头
|
|
||||||
.double-arrows {
|
|
||||||
height: 50px;
|
|
||||||
margin:20px 0;
|
|
||||||
text-align: center;
|
|
||||||
.top-arrows,.bottom-arrows{
|
|
||||||
height: 100%;
|
|
||||||
width: 6px;
|
|
||||||
background-color: $arrowColoe;
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0 10px;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: super;
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
left:0;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.top-arrows{
|
|
||||||
vertical-align: super;
|
|
||||||
}
|
|
||||||
.top-arrows::after {
|
|
||||||
bottom: -24px;
|
|
||||||
border-bottom: 12px solid transparent;
|
|
||||||
border-left: 12px solid transparent;
|
|
||||||
border-right: 12px solid transparent;
|
|
||||||
border-top: 14px solid $arrowColoe;
|
|
||||||
left: -9px;
|
|
||||||
}
|
|
||||||
.bottom-arrows{
|
|
||||||
margin-top:12px;
|
|
||||||
&::after {
|
|
||||||
top: -24px;
|
|
||||||
border-top: 12px solid transparent;
|
|
||||||
border-left: 12px solid transparent;
|
|
||||||
border-right: 12px solid transparent;
|
|
||||||
border-bottom: 14px solid $arrowColoe;
|
|
||||||
left: -9px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//电脑
|
|
||||||
.computer{
|
|
||||||
margin:20px auto;
|
|
||||||
text-align: center;
|
|
||||||
color:#666666;
|
|
||||||
position: relative;
|
|
||||||
img {
|
|
||||||
width: auto;
|
|
||||||
height: 100px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.arrow{
|
|
||||||
height: 50px;
|
|
||||||
width: 30px;
|
|
||||||
border-radius: 5px;
|
|
||||||
background-color: $arrowColoe;
|
|
||||||
position: relative;
|
|
||||||
margin:0 auto;
|
|
||||||
&::after{
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
width: 0;
|
|
||||||
height: 0;
|
|
||||||
left: -9px;
|
|
||||||
border-top: 24px solid $arrowColoe;
|
|
||||||
border-left: 24px solid transparent;
|
|
||||||
border-bottom: 24px solid transparent;
|
|
||||||
border-right: 24px solid transparent;
|
|
||||||
bottom: -44px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.bottom{
|
|
||||||
z-index:1;
|
|
||||||
box-sizing: border-box;
|
|
||||||
margin-top:50px;
|
|
||||||
.zxlt-row{
|
|
||||||
display: flex;
|
|
||||||
padding:20px $distance;
|
|
||||||
position: relative;
|
|
||||||
width: fit-content;
|
|
||||||
&:before{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
width:calc(100% - 100px);
|
|
||||||
height:1px;
|
|
||||||
background-color: $lineColoe;
|
|
||||||
position:absolute;
|
|
||||||
top:0;
|
|
||||||
left: $distance/2;
|
|
||||||
}
|
|
||||||
.row-lists{
|
|
||||||
height: fit-content;
|
|
||||||
position: relative;
|
|
||||||
&:before{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
height: 100%;
|
|
||||||
width: 1px;
|
|
||||||
position: absolute;
|
|
||||||
left:-($distance/2);
|
|
||||||
top:-20px;
|
|
||||||
background-color: $lineColoe;
|
|
||||||
}
|
|
||||||
//pcs列 bms右侧的边框
|
|
||||||
&.pcs-row-lists{
|
|
||||||
&:after{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
height: 100%;
|
|
||||||
width: 1px;
|
|
||||||
position: absolute;
|
|
||||||
right:-(($distance/2) + 1);
|
|
||||||
top:-20px;
|
|
||||||
background-color: $lineColoe;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:not(:last-child){
|
|
||||||
margin-right: $distance;
|
|
||||||
}
|
|
||||||
.item-square{
|
|
||||||
//左右 两列
|
|
||||||
display: flex;
|
|
||||||
vertical-align: middle;
|
|
||||||
align-items: flex-start;
|
|
||||||
padding:10px;
|
|
||||||
border-radius: 5px;
|
|
||||||
&:not(:last-child){
|
|
||||||
margin-bottom: 40px;
|
|
||||||
}
|
|
||||||
.row-lists-title{
|
|
||||||
font-size: 20px;
|
|
||||||
line-height: 20px;
|
|
||||||
color: #333333;
|
|
||||||
font-weight: 500;
|
|
||||||
text-align: center;
|
|
||||||
flex: 1;
|
|
||||||
}
|
|
||||||
.item-lists{
|
|
||||||
position: relative;
|
|
||||||
&:not(:last-child){
|
|
||||||
margin-right:$distance;
|
|
||||||
}
|
|
||||||
//每个设备
|
|
||||||
.items{
|
|
||||||
background-color: #cbebfd;
|
|
||||||
position: relative;
|
|
||||||
border-radius: 5px;
|
|
||||||
padding: 10px;
|
|
||||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1), 0 0 0 rgba(0, 0, 0, 0.5);
|
|
||||||
//普通设备 箭头方向
|
|
||||||
&.normal-items-arrow{
|
|
||||||
&:before{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
width:($arrowDistance/2) - 15;
|
|
||||||
height: 4px;
|
|
||||||
background-color: $arrowColoe;
|
|
||||||
position: absolute;
|
|
||||||
top:50%;
|
|
||||||
left: -($arrowDistance/2);
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
&:after{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
width: 0;
|
|
||||||
border-left: 10px solid #5ea9df;
|
|
||||||
border-right: 10px solid transparent;
|
|
||||||
border-bottom: 10px solid transparent;
|
|
||||||
border-top: 10px solid transparent;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: -15px;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//下级的箭头
|
|
||||||
&.children-items-arrow{
|
|
||||||
&:before{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
width:($arrowDistance/2) - 15;
|
|
||||||
height: 4px;
|
|
||||||
background-color: $arrowColoe;
|
|
||||||
position: absolute;
|
|
||||||
top:50%;
|
|
||||||
right: -($arrowDistance/2);
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
&:after{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
width: 0;
|
|
||||||
border-right: 10px solid #5ea9df;
|
|
||||||
border-left: 10px solid transparent;
|
|
||||||
border-bottom: 10px solid transparent;
|
|
||||||
border-top: 10px solid transparent;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
right: -15px;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&:not(:last-child){
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.items-inner{
|
|
||||||
background-color: #ffffff;
|
|
||||||
border-radius: 5px;
|
|
||||||
padding:10px;
|
|
||||||
width:130px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
img{
|
|
||||||
width: 80px;
|
|
||||||
height: auto;
|
|
||||||
display: block;
|
|
||||||
z-index:2;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.name{
|
|
||||||
text-align: center;
|
|
||||||
margin-top:10px;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 20px;
|
|
||||||
z-index:2;
|
|
||||||
}
|
|
||||||
.status{
|
|
||||||
z-index:2;
|
|
||||||
margin-top:10px;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 20px;
|
|
||||||
position: relative;
|
|
||||||
padding-left:20px;
|
|
||||||
display: inline;
|
|
||||||
&.status-normal {
|
|
||||||
&:before {
|
|
||||||
content: "";
|
|
||||||
display: block;
|
|
||||||
width: 15px;
|
|
||||||
height: 15px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: #05AEA3;
|
|
||||||
position: absolute;
|
|
||||||
top:50%;
|
|
||||||
left:0;
|
|
||||||
transform: translate(0,-50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&.status-warn{
|
|
||||||
&:before{
|
|
||||||
content: "";
|
|
||||||
display: inline-block;
|
|
||||||
width: 15px;
|
|
||||||
height: 15px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: #FC6B69;
|
|
||||||
position: absolute;
|
|
||||||
top:50%;
|
|
||||||
left:0;
|
|
||||||
transform: translate(0,-50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.children-item-lists{
|
|
||||||
//todo 手动修改
|
|
||||||
&:before{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
width:40px;
|
|
||||||
height: 4px;
|
|
||||||
background-color: $arrowColoe;
|
|
||||||
position: absolute;
|
|
||||||
top:50%;
|
|
||||||
left: -50px;
|
|
||||||
transform:translateY(-50%);
|
|
||||||
}
|
|
||||||
&:after{
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
height: 0;
|
|
||||||
width: 0;
|
|
||||||
border-left: 10px solid #5ea9df;
|
|
||||||
border-right: 10px solid transparent;
|
|
||||||
border-bottom: 10px solid transparent;
|
|
||||||
border-top: 10px solid transparent;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: -14px;
|
|
||||||
transform:translateY(-50%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.pcs-has-children-item-square{
|
|
||||||
vertical-align: middle;
|
|
||||||
align-items: center;
|
|
||||||
background-color: #ffefad;
|
|
||||||
}
|
|
||||||
.no-bms-list{
|
|
||||||
.item-lists{
|
|
||||||
&:not(:last-child){
|
|
||||||
margin-right:0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
@ -40,14 +40,18 @@ export default {
|
|||||||
required: true
|
required: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
runningStatusMap: ['0', '3', '4', '6']
|
||||||
|
}
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
label() {
|
label() {
|
||||||
return this.data.workStatus === '0' ? '关机' : '开机'
|
return this.runningStatusMap.includes(this.data.workStatus) ? '关机' : '开机'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
switchStatus() {
|
switchStatus() {
|
||||||
console.log(this.data, 11111111)
|
|
||||||
const {workStatus, deviceId, deviceName, siteId} = this.data
|
const {workStatus, deviceId, deviceName, siteId} = this.data
|
||||||
this.$confirm(`确认要${this.label}设备${deviceName || ''}吗?`, {
|
this.$confirm(`确认要${this.label}设备${deviceName || ''}吗?`, {
|
||||||
confirmButtonText: "确定",
|
confirmButtonText: "确定",
|
||||||
@ -61,7 +65,7 @@ export default {
|
|||||||
//做开关机操作,更新成功后刷新表格
|
//做开关机操作,更新成功后刷新表格
|
||||||
updateDeviceStatus({
|
updateDeviceStatus({
|
||||||
siteId,
|
siteId,
|
||||||
workStatus: workStatus === '0' ? "1" : '0',
|
workStatus: this.runningStatusMap.includes(workStatus) ? "1" : '0',//1 关机 0开机
|
||||||
deviceId
|
deviceId
|
||||||
})
|
})
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
|
|||||||
@ -80,7 +80,7 @@
|
|||||||
<el-table-column label="数据点位" prop="dataPoint"></el-table-column>
|
<el-table-column label="数据点位" prop="dataPoint"></el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="数据点位名称"
|
label="数据点位名称"
|
||||||
prop="pointName"
|
prop="dataPointName"
|
||||||
></el-table-column>
|
></el-table-column>
|
||||||
<!-- <el-table-column label="modbus地址">-->
|
<!-- <el-table-column label="modbus地址">-->
|
||||||
<!-- <template slot-scope="scope">-->
|
<!-- <template slot-scope="scope">-->
|
||||||
@ -88,8 +88,8 @@
|
|||||||
<!-- `${scope.row.ipAddress || ""} ${scope.row.ipPort || ""}`-->
|
<!-- `${scope.row.ipAddress || ""} ${scope.row.ipPort || ""}`-->
|
||||||
<!-- }}</span>-->
|
<!-- }}</span>-->
|
||||||
<!-- </template>-->
|
<!-- </template>-->
|
||||||
<!-- </el-table-column>-->
|
<!-- </el-table-column>
|
||||||
<el-table-column label="寄存器地址" prop="寄存器地址"></el-table-column>
|
<el-table-column label="寄存器地址" prop="寄存器地址"></el-table-column>-->
|
||||||
<el-table-column
|
<el-table-column
|
||||||
label="最新值"
|
label="最新值"
|
||||||
prop="pointValue"
|
prop="pointValue"
|
||||||
|
|||||||
Reference in New Issue
Block a user