合并develop最新代码

This commit is contained in:
白菜
2025-11-28 15:18:27 +08:00
22 changed files with 886 additions and 206 deletions

View File

@ -90,6 +90,23 @@ export function getCoolingDataList(siteId) {
}) })
} }
//获取动环数据
export function getDhDataList(siteId) {
return request({
url: `/ems/siteMonitor/getDhDataList?siteId=${siteId}`,
method: 'get'
})
}
//获取消防数据
export function getXfDataList(siteId) {
return request({
url: `/ems/siteMonitor/getXfDataList?siteId=${siteId}`,
method: 'get'
})
}
//获取电表数据 //获取电表数据
export function getAmmeterDataList(siteId) { export function getAmmeterDataList(siteId) {
return request({ return request({
@ -154,30 +171,30 @@ export function getClusterData({siteId,stackId,clusterId,dateTime,pageNum,pageSi
// 实时运行 // 实时运行
//储能 //储能
export function storagePower(siteId) { export function storagePower(siteId,startTime,endTime) {
return request({ return request({
url: `/ems/siteMonitor/runningGraph/storagePower?siteId=${siteId}`, url: `/ems/siteMonitor/runningGraph/storagePower?siteId=${siteId}&startDate=${startTime}&endDate=${endTime}`,
method: 'get' method: 'get'
}) })
} }
//poc温度 //poc温度
export function pcsMaxTemp(siteId) { export function pcsMaxTemp(siteId,startTime,endTime) {
return request({ return request({
url: `/ems/siteMonitor/runningGraph/pcsMaxTemp?siteId=${siteId}`, url: `/ems/siteMonitor/runningGraph/pcsMaxTemp?siteId=${siteId}&startDate=${startTime}&endDate=${endTime}`,
method: 'get' method: 'get'
}) })
} }
// 电池平均soc // 电池平均soc
export function batteryAveSoc(siteId) { export function batteryAveSoc(siteId,startTime,endTime) {
return request({ return request({
url: `/ems/siteMonitor/runningGraph/batteryAveSoc?siteId=${siteId}`, url: `/ems/siteMonitor/runningGraph/batteryAveSoc?siteId=${siteId}&startDate=${startTime}&endDate=${endTime}`,
method: 'get' method: 'get'
}) })
} }
// 电池平均温度 // 电池平均温度
export function batteryAveTemp(siteId) { export function batteryAveTemp(siteId,startTime,endTime) {
return request({ return request({
url: `/ems/siteMonitor/runningGraph/batteryAveTemp?siteId=${siteId}`, url: `/ems/siteMonitor/runningGraph/batteryAveTemp?siteId=${siteId}&startDate=${startTime}&endDate=${endTime}`,
method: 'get' method: 'get'
}) })
} }

View File

@ -51,12 +51,12 @@
.sbjk-card-container{ .sbjk-card-container{
.el-card__header { .el-card__header {
background-color: transparent; background-color: transparent;
padding: 10px 14px; padding: 5px 14px;
color: #ffffff; color: #ffffff;
position: relative; position: relative;
border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0;
.large-title{ .large-title{
font-size: 20px; font-size: 18px;
font-weight: 500; font-weight: 500;
line-height: 40px; line-height: 40px;
padding: 0 50px 0 11px; padding: 0 50px 0 11px;
@ -78,6 +78,12 @@
right: 25px; right: 25px;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
.alarm-icon{
font-size: 22px;
color: #fff;
display: block;
cursor: pointer;
}
} }
} }
//红色背景颜色标题 //红色背景颜色标题
@ -157,6 +163,31 @@
} }
} }
} }
//电表、液冷公共样式
.device-info-row{
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
border-left: 1px solid #eee;
border-top: 1px solid #eee;
.device-info-col{
padding: 10px 0;
text-align: center;
font-size:12px;
color:#666666;
line-height: 14px;
border-bottom: 1px solid #eee;
border-right: 1px solid #eee;
.left{
}
.right{
display: block;
font-weight: 500;
font-size:16px;
line-height: 18px;
margin-top:10px;
}
}
}
//公共表格样式 //公共表格样式
.common-table.el-table{ .common-table.el-table{

View File

@ -80,6 +80,20 @@ export const dzjk=[
name: 'DzjkSbjkYl', name: 'DzjkSbjkYl',
hidden: true, hidden: true,
meta: { title: '液冷',breadcrumb: false,activeMenu: '/dzjk/sbjk',activeSecondMenuName:'DzjkSbjk',deviceCategory:'COOLING'}, meta: { title: '液冷',breadcrumb: false,activeMenu: '/dzjk/sbjk',activeSecondMenuName:'DzjkSbjk',deviceCategory:'COOLING'},
},
{
path: 'dh',
component: () => import('@/views/ems/dzjk/sbjk/dh/index.vue'),
name: 'DzjkSbjkDh',
hidden: true,
meta: { title: '动环',breadcrumb: false,activeMenu: '/dzjk',activeSecondMenuName:'DzjkSbjk',deviceCategory:'DH'},
},
{
path: 'xf',
component: () => import('@/views/ems/dzjk/sbjk/xf/index.vue'),
name: 'DzjkSbjkXf',
hidden: true,
meta: { title: '消防',breadcrumb: false,activeMenu: '/dzjk',activeSecondMenuName:'DzjkSbjk',deviceCategory:'XF'},
} }
] ]
}, },

View File

@ -68,6 +68,7 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.dzjk-ems-content-container{ .dzjk-ems-content-container{
margin-top:0; margin-top:0;
min-height: 60vh;
} }
.lighting{ .lighting{
position: relative; position: relative;

View File

@ -8,7 +8,19 @@
'running-card-container':baseInfo.workStatus === '0' 'running-card-container':baseInfo.workStatus === '0'
}"> }">
<div slot="header"> <div slot="header">
<span class="large-title">{{index+1}}#{{baseInfo.parentDeviceName?`${baseInfo.parentDeviceName} > ` : ''}}{{baseInfo.deviceName}}</span> <span class="large-title">{{baseInfo.parentDeviceName?`${baseInfo.parentDeviceName} -> ` : ''}}{{baseInfo.deviceName}}</span>
<div class="info">
<div>数据更新时间{{ baseInfo.dataUpdateTime || '-'}}</div>
</div>
<div class="alarm">
<el-button type="primary" size="small" style="margin-right:20px;" @click="pointDetail(baseInfo,'point')">详细</el-button>
<el-badge :value="baseInfo.alarmNum || 0" class="item">
<i
class="el-icon-message-solid alarm-icon"
@click="pointDetail(baseInfo,'alarmPoint')"
></i>
</el-badge>
</div>
</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">
@ -80,19 +92,21 @@
</div> </div>
<el-empty v-show="baseInfoList.length<=0" :image-size="200"></el-empty> <el-empty v-show="baseInfoList.length<=0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId"/> <point-chart ref="pointChart" :site-id="siteId"/>
<point-table ref="pointTable"/>
</div> </div>
</template> </template>
<script> <script>
import pointChart from "./../PointChart.vue"; import pointChart from "./../PointChart.vue";
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";
export default { export default {
name:'DzjkSbjkBmsdcc', name:'DzjkSbjkBmsdcc',
mixins:[getQuerySiteId,intervalUpdate], mixins:[getQuerySiteId,intervalUpdate],
components:{pointChart}, components:{PointTable, pointChart},
data() { data() {
return { return {
loading:false, loading:false,
@ -127,6 +141,11 @@ export default {
} }
}, },
methods:{ methods:{
// 查看设备电位表格
pointDetail(row,dataType){
const {siteId,deviceId} = row
this.$refs.pointTable.showTable({siteId,deviceId,deviceCategory:'CLUSTER'},dataType)
},
showChart(pointName,deviceId){ showChart(pointName,deviceId){
pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'CLUSTER',deviceId}) pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'CLUSTER',deviceId})
}, },

View File

@ -8,7 +8,19 @@
}" 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">
<div slot="header"> <div slot="header">
<span class="large-title">{{index+1}}#{{baseInfo.deviceName}}</span> <span class="large-title">{{baseInfo.deviceName}}</span>
<div class="info">
<div>数据更新时间{{ baseInfo.dataUpdateTime || '-'}}</div>
</div>
<div class="alarm">
<el-button type="primary" size="small" style="margin-right:20px;" @click="pointDetail(baseInfo,'point')">详细</el-button>
<el-badge :value="baseInfo.alarmNum || 0" class="item">
<i
class="el-icon-message-solid alarm-icon"
@click="pointDetail(baseInfo,'alarmPoint')"
></i>
</el-badge>
</div>
</div> </div>
<div class="descriptions-main"> <div class="descriptions-main">
<el-descriptions :colon="false" :column="3" direction="vertical"> <el-descriptions :colon="false" :column="3" direction="vertical">
@ -111,6 +123,7 @@
</div> </div>
<el-empty v-show="baseInfoList.length<=0" :image-size="200"></el-empty> <el-empty v-show="baseInfoList.length<=0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId"/> <point-chart ref="pointChart" :site-id="siteId"/>
<point-table ref="pointTable"/>
</div> </div>
</template> </template>
@ -119,9 +132,10 @@ import {getBMSOverView} 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 pointChart from "./../PointChart.vue"; import pointChart from "./../PointChart.vue";
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
export default { export default {
name:'DzjkSbjkBmszl', name:'DzjkSbjkBmszl',
components: {pointChart,}, components: {pointChart,PointTable},
mixins:[getQuerySiteId,intervalUpdate], mixins:[getQuerySiteId,intervalUpdate],
data() { data() {
return { return {
@ -141,6 +155,11 @@ export default {
} }
}, },
methods:{ methods:{
// 查看设备电位表格
pointDetail(row,dataType){
const {siteId,deviceId} = row
this.$refs.pointTable.showTable({siteId,deviceId,deviceCategory:'STACK'},dataType)
},
showChart(pointName,deviceId,deviceCategory = 'STACK'){ showChart(pointName,deviceId,deviceCategory = 'STACK'){
pointName && this.$refs.pointChart.showChart({pointName,deviceCategory,deviceId}) pointName && this.$refs.pointChart.showChart({pointName,deviceCategory,deviceId})
}, },

View File

@ -11,7 +11,7 @@
}" }"
> >
<div slot="header"> <div slot="header">
<span class="large-title">{{index+1}}#{{ item.deviceName }}</span> <span class="large-title">{{ item.deviceName }}</span>
<div class="info"> <div class="info">
<div> <div>
{{ {{
@ -22,17 +22,27 @@
</div> </div>
<div>数据更新时间{{ item.dataUpdateTime }}</div> <div>数据更新时间{{ item.dataUpdateTime }}</div>
</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>
<el-row> </div>
<el-col v-for="(tempDataItem,tempDataIndex) in deviceIdTypeMsg[item.deviceId]" :key="tempDataIndex+'dbTempData'" :span="8"> <el-row class="device-info-row">
<el-col v-for="(tempDataItem,tempDataIndex) in deviceIdTypeMsg[item.deviceId]" :key="tempDataIndex+'dbTempData'" :span="8" class="device-info-col">
<span class="pointer" @click="showChart(tempDataItem.pointName,item.deviceId)"> <span class="pointer" @click="showChart(tempDataItem.pointName,item.deviceId)">
{{tempDataItem.name}}{{item[tempDataItem.attr]}}<span v-html="tempDataItem.unit"></span> <span class="left">{{tempDataItem.name}}</span> <span class="right">{{item[tempDataItem.attr]}}<span v-html="tempDataItem.unit"></span></span>
</span> </span>
</el-col> </el-col>
</el-row> </el-row>
</el-card> </el-card>
<el-empty v-show="list.length<=0" :image-size="200"></el-empty> <el-empty v-show="list.length<=0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId"/> <point-chart ref="pointChart" :site-id="siteId"/>
<point-table ref="pointTable"/>
</div> </div>
</template> </template>
@ -41,10 +51,11 @@ import pointChart from "./../PointChart.vue";
import getQuerySiteId from "@/mixins/ems/getQuerySiteId"; 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";
export default { export default {
name: "DzjkSbjkDb", name: "DzjkSbjkDb",
mixins: [getQuerySiteId,intervalUpdate], mixins: [getQuerySiteId,intervalUpdate],
components:{pointChart}, components:{PointTable, pointChart},
data() { data() {
return { return {
loading: false, loading: false,
@ -140,6 +151,11 @@ export default {
}; };
}, },
methods: { methods: {
// 查看设备电位表格
pointDetail(row,dataType){
const {deviceId} = row
this.$refs.pointTable.showTable({siteId:this.siteId,deviceId,deviceCategory:'AMMETER'},dataType)
},
showChart(pointName,deviceId){ showChart(pointName,deviceId){
pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'AMMETER',deviceId}) pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'AMMETER',deviceId})
}, },
@ -167,24 +183,6 @@ export default {
&.list:not(:last-child){ &.list:not(:last-child){
margin-bottom: 25px; margin-bottom: 25px;
} }
.el-row{
background-color: #ffffff;
border:1px solid #eeeeee;
font-size: 14px;
line-height: 16px;
color: #333333;
.el-col{
padding:12px 0;
text-align: center;
position: relative;
}
.el-col{
border-bottom: 1px solid #eeeeee;
}
.el-col:not(:nth-child(3n)){
border-right: 1px solid #eeeeee;
}
}
} }
</style> </style>

View File

@ -0,0 +1,109 @@
<template>
<div v-loading="loading">
<el-card
v-for="(item,index) in list"
:key="index+'ylLise'"
class="sbjk-card-container running-card-container"
shadow="always">
<div slot="header">
<span class="large-title">{{item.deviceName}}</span>
<div class="info">
<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>
<el-row class="device-info-row">
<el-col v-for="(tempDataItem,tempDataIndex) in tempData" :key="tempDataIndex+'hdTempData'" :span="12" class="device-info-col">
<span class="pointer" @click="showChart(tempDataItem.title,item.deviceId)">
<span class="left">{{tempDataItem.title}}</span> <span class="right">{{item[tempDataItem.attr]}}<span v-html="tempDataItem.unit"></span></span>
</span>
</el-col>
</el-row>
</el-card>
<el-empty v-show="list.length<=0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId"/>
<point-table ref="pointTable"/>
</div>
</template>
<script>
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
import {getDhDataList} from '@/api/ems/dzjk'
import intervalUpdate from "@/mixins/ems/intervalUpdate";
import pointChart from "./../PointChart.vue";
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
export default {
name:'DzjkSbjkDh',
mixins:[getQuerySiteId,intervalUpdate],
components:{pointChart,PointTable},
data() {
return {
loading:false,
list:[],
tempData:[
{title:'湿度',attr:'humidity',unit:'&#8451;'},
{title:'温度',attr:'temperature',unit:''},
]
}
},
methods:{
// 查看设备电位表格
pointDetail(row,dataType){
const {deviceId} = row
this.$refs.pointTable.showTable({siteId:this.siteId,deviceId,deviceCategory:'DH'},dataType)
},
showChart(pointName,deviceId){
pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'DH',deviceId})
},
updateData(){
this.loading = true
getDhDataList(this.siteId).then(response => {
this.list = JSON.parse(JSON.stringify(response?.data || []));
}).finally(() => {this.loading = false})
},
init(){
this.updateData()
this.updateInterval(this.updateData)
}
},
mounted(){
}
}
</script>
<style scoped lang="scss">
.sbjk-card-container{
&:not(:last-child){
margin-bottom: 25px;
}
.el-row{
background-color: #ffffff;
border:1px solid #eeeeee;
font-size: 14px;
line-height: 16px;
color: #333333;
.el-col{
padding:12px 0;
text-align: center;
position: relative;
}
.el-col{
border-bottom: 1px solid #eeeeee;
}
.el-col:not(:nth-child(3n)){
border-right: 1px solid #eeeeee;
}
}
}
</style>

View File

@ -52,13 +52,16 @@
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="曲线图"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button @click="chartDetail(scope.row)" type="text" size="small"> <el-button @click="$emit('pointDetail',scope.row,'point')" type="text" size="small">
展示 详细
</el-button>
<el-button @click="$emit('pointDetail',scope.row,'alarmPoint')" type="text" size="small">
报警点位详细
</el-button> </el-button>
</template> </template>
</el-table-column> --> </el-table-column>
</el-table> </el-table>
<!-- <el-pagination <!-- <el-pagination
v-show="tableData.length > 0" v-show="tableData.length > 0"
@ -115,7 +118,6 @@ export default {
methods: { methods: {
//查看表格行图表 //查看表格行图表
chartDetail(row, dataType = "") { chartDetail(row, dataType = "") {
const { clusterDeviceId, deviceId } = row;
this.$emit("chart", { ...row, dataType }); this.$emit("chart", { ...row, dataType });
}, },
}, },

View File

@ -88,6 +88,7 @@
:totalSize="totalSize" :totalSize="totalSize"
:pointIdList="pointIdList" :pointIdList="pointIdList"
@chart="chartDetail" @chart="chartDetail"
@pointDetail="pointDetail"
></component> ></component>
<el-pagination <el-pagination
v-show="tableData.length > 0" v-show="tableData.length > 0"
@ -104,6 +105,7 @@
</el-pagination> </el-pagination>
<chart-detail ref="chartDetail" /> <chart-detail ref="chartDetail" />
<point-chart ref="pointChart" :site-id="siteId" /> <point-chart ref="pointChart" :site-id="siteId" />
<point-table ref="pointTable"/>
</el-card> </el-card>
</template> </template>
@ -119,10 +121,12 @@ import ChartDetail from "./ChartDetail.vue";
import Table from "./Table.vue"; import Table from "./Table.vue";
import List from "./List.vue"; import List from "./List.vue";
import pointChart from "./../PointChart.vue"; import pointChart from "./../PointChart.vue";
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
export default { export default {
name: "DzjkSbjkDtdc", name: "DzjkSbjkDtdc",
mixins: [getQuerySiteId], mixins: [getQuerySiteId],
components: { components: {
PointTable,
BarChart, BarChart,
ChartDetail, ChartDetail,
DtdcTable: Table, DtdcTable: Table,
@ -165,6 +169,11 @@ export default {
}; };
}, },
methods: { methods: {
// 查看设备电位表格
pointDetail(row,dataType){
const {deviceId,clusterDeviceId} = row
this.$refs.pointTable.showTable({siteId:this.siteId,deviceId,deviceCategory:'BATTERY',parentId:clusterDeviceId},dataType)
},
changeMenu(menu) { changeMenu(menu) {
const { activeBtn } = this; const { activeBtn } = this;
activeBtn !== menu && (this.activeBtn = menu); activeBtn !== menu && (this.activeBtn = menu);

View File

@ -18,7 +18,7 @@
> >
<div slot="header"> <div slot="header">
<span class="large-title" <span class="large-title"
>{{ pcsIndex + 1 }}#{{ pcsItem.deviceName }}</span >{{ pcsItem.deviceName }}</span
> >
<div class="info"> <div class="info">
<div> <div>
@ -31,10 +31,11 @@
<div>数据更新时间{{ pcsItem.dataUpdateTime }}</div> <div>数据更新时间{{ pcsItem.dataUpdateTime }}</div>
</div> </div>
<div class="alarm"> <div class="alarm">
<el-button type="primary" size="small" style="margin-right:20px;" @click="pointDetail(pcsItem,'point')">详细</el-button>
<el-badge :value="pcsItem.alarmNum || 0" class="item"> <el-badge :value="pcsItem.alarmNum || 0" class="item">
<i <i
class="el-icon-message-solid" class="el-icon-message-solid alarm-icon"
style="font-size: 26px; color: #fff; display: block" @click="pointDetail(pcsItem,'alarmPoint')"
></i> ></i>
</el-badge> </el-badge>
</div> </div>
@ -170,18 +171,20 @@
</div> </div>
<el-empty v-show="pcsList.length <= 0" :image-size="200"></el-empty> <el-empty v-show="pcsList.length <= 0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId" /> <point-chart ref="pointChart" :site-id="siteId" />
<point-table ref="pointTable"/>
</div> </div>
</template> </template>
<script> <script>
import pointChart from "./../PointChart.vue"; import pointChart from "./../PointChart.vue";
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
import RealTimeBaseInfo from "./../RealTimeBaseInfo.vue"; import RealTimeBaseInfo from "./../RealTimeBaseInfo.vue";
import getQuerySiteId from "@/mixins/ems/getQuerySiteId"; import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
import { getRunningHeadInfo, getPcsDetailInfo } from "@/api/ems/dzjk"; import { getRunningHeadInfo, getPcsDetailInfo } from "@/api/ems/dzjk";
import intervalUpdate from "@/mixins/ems/intervalUpdate"; import intervalUpdate from "@/mixins/ems/intervalUpdate";
export default { export default {
name: "DzjkSbjkPcs", name: "DzjkSbjkPcs",
components: { RealTimeBaseInfo, pointChart }, components: { RealTimeBaseInfo, pointChart ,PointTable},
mixins: [getQuerySiteId, intervalUpdate], mixins: [getQuerySiteId, intervalUpdate],
data() { data() {
return { return {
@ -269,6 +272,11 @@ export default {
}; };
}, },
methods: { methods: {
// 查看设备电位表格
pointDetail(row,dataType){
const {deviceId} = row
this.$refs.pointTable.showTable({siteId:this.siteId,deviceId,deviceCategory:'PCS'},dataType)
},
showChart(pointName, deviceId,isBranch=false) { showChart(pointName, deviceId,isBranch=false) {
pointName && pointName &&
this.$refs.pointChart.showChart({ pointName,deviceCategory:isBranch ? 'BRANCH' : 'PCS', deviceId }); this.$refs.pointChart.showChart({ pointName,deviceCategory:isBranch ? 'BRANCH' : 'PCS', deviceId });

View File

@ -14,7 +14,6 @@
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
import resize from "@/mixins/ems/resize"; import resize from "@/mixins/ems/resize";
import { formatDate } from "@/filters/ems";
import { storagePower } from "@/api/ems/dzjk"; import { storagePower } from "@/api/ems/dzjk";
export default { export default {
@ -35,12 +34,10 @@ export default {
this.chart = null; this.chart = null;
}, },
methods: { methods: {
init(siteId) { init(siteId, timeRange) {
this.chart.showLoading(); this.chart.showLoading();
const x = []; const [startTime='', endTime=''] = timeRange;
const data1 = [], storagePower(siteId,startTime,endTime)
data2 = [];
storagePower(siteId)
.then((response) => { .then((response) => {
this.setOption(response?.data?.pcsPowerList || []); this.setOption(response?.data?.pcsPowerList || []);
}) })
@ -49,7 +46,6 @@ export default {
}); });
}, },
setOption(data) { setOption(data) {
// data=[{deviceId:'pcs1',energyStoragePowList:[{createDate,deviceId,pcsTotalActPower,pcsTotalReactivePower}]}]
let xdata = [], let xdata = [],
series = []; series = [];
data.forEach((element, index) => { data.forEach((element, index) => {
@ -64,8 +60,13 @@ export default {
// color:'#FFBD00' // color:'#FFBD00'
}, },
data: (element.energyStoragePowList || []).map( data: (element.energyStoragePowList || []).map(
(i) => i.pcsTotalActPower (i) => {
), return {
value:i.pcsTotalActPower,
year:i.dateDay || ''
}
}
)
}, },
{ {
type: "line", type: "line",
@ -74,7 +75,12 @@ export default {
// color:'#FFBD00' // color:'#FFBD00'
}, },
data: (element.energyStoragePowList || []).map( data: (element.energyStoragePowList || []).map(
(i) => i.pcsTotalReactivePower (i) => {
return {
value: i.pcsTotalReactivePower,
year:i.dateDay || ''
}
}
), ),
} }
); );
@ -93,11 +99,24 @@ export default {
containLabel: true, containLabel: true,
}, },
tooltip: { tooltip: {
show:true,
trigger: "axis", trigger: "axis",
axisPointer: { axisPointer: {
// 坐标轴指示器,坐标轴触发有效 // 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow' type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
}, },
formatter :(params)=>{
if(params.length <= 0) return
let result = (params[0].data.year || '')+' '+ params[0].name + '<div>'
params.forEach(item=>{
const {color,seriesName,value} = item
result += `<div style="position: relative;padding-left:20px;line-height: 20px;">
<div style="position: absolute;top:50%;left:0;width:12px;height:12px;border-radius:100%;background: ${color};transform: translateY(-50%)"></div>
<span>${seriesName}</span><span style="margin-left:20px;font-weight: 700">${value}</span></div>`
})
result+='</div>'
return result
}
}, },
textStyle: { textStyle: {
color: "#333333", color: "#333333",

View File

@ -14,7 +14,6 @@
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
import resize from "@/mixins/ems/resize"; import resize from "@/mixins/ems/resize";
import { formatDate } from "@/filters/ems";
import { batteryAveSoc } from "@/api/ems/dzjk"; import { batteryAveSoc } from "@/api/ems/dzjk";
export default { export default {
mixins: [resize], mixins: [resize],
@ -34,9 +33,10 @@ export default {
this.chart = null; this.chart = null;
}, },
methods: { methods: {
init(siteId) { init(siteId,timeRange) {
this.chart.showLoading(); this.chart.showLoading();
batteryAveSoc(siteId) const [startTime='', endTime=''] = timeRange;
batteryAveSoc(siteId,startTime,endTime)
.then((response) => { .then((response) => {
this.setOption(response?.data?.batteryAveSOCList || []); this.setOption(response?.data?.batteryAveSOCList || []);
}) })
@ -49,7 +49,10 @@ export default {
ydata = []; ydata = [];
data.forEach((element) => { data.forEach((element) => {
xdata.push(element.createDate); xdata.push(element.createDate);
ydata.push(element.batterySOC); ydata.push({
value:element.batterySOC,
year:element.dateDay,
});
}); });
xdata = this.chart.setOption({ xdata = this.chart.setOption({
legend: { legend: {
@ -65,11 +68,24 @@ export default {
containLabel: true, containLabel: true,
}, },
tooltip: { tooltip: {
show:true,
trigger: "axis", trigger: "axis",
axisPointer: { axisPointer: {
// 坐标轴指示器,坐标轴触发有效 // 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow' type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
}, },
formatter :(params)=>{
if(params.length <= 0) return
let result = (params[0].data.year || '')+' '+params[0].name + '<div>'
params.forEach(item=>{
const {color,seriesName,value} = item
result += `<div style="position: relative;padding-left:20px;line-height: 20px;">
<div style="position: absolute;top:50%;left:0;width:12px;height:12px;border-radius:100%;background: ${color};transform: translateY(-50%)"></div>
<span>${seriesName}</span><span style="margin-left:20px;font-weight: 700">${value}</span></div>`
})
result+='</div>'
return result
}
}, },
textStyle: { textStyle: {
color: "#333333", color: "#333333",

View File

@ -14,7 +14,6 @@
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
import resize from "@/mixins/ems/resize"; import resize from "@/mixins/ems/resize";
import { formatDate } from "@/filters/ems";
import { batteryAveTemp } from "@/api/ems/dzjk"; import { batteryAveTemp } from "@/api/ems/dzjk";
export default { export default {
@ -35,12 +34,10 @@ export default {
this.chart = null; this.chart = null;
}, },
methods: { methods: {
init(siteId) { init(siteId,timeRange) {
this.chart.showLoading(); this.chart.showLoading();
const x = []; const [startTime='', endTime=''] = timeRange;
const data1 = [], batteryAveTemp(siteId,startTime,endTime)
data2 = [];
batteryAveTemp(siteId)
.then((response) => { .then((response) => {
this.setOption(response?.data?.batteryAveTempList || []); this.setOption(response?.data?.batteryAveTempList || []);
}) })
@ -53,7 +50,12 @@ export default {
ydata = []; ydata = [];
data.forEach((element) => { data.forEach((element) => {
xdata.push(element.createDate); xdata.push(element.createDate);
ydata.push(element.batteryTemp); ydata.push(
{
value: element.batteryTemp,
year: element.dateDay
}
);
}); });
xdata = this.chart.setOption({ xdata = this.chart.setOption({
legend: { legend: {
@ -69,11 +71,24 @@ export default {
containLabel: true, containLabel: true,
}, },
tooltip: { tooltip: {
show:true,
trigger: "axis", trigger: "axis",
axisPointer: { axisPointer: {
// 坐标轴指示器,坐标轴触发有效 // 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow' type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
}, },
formatter :(params)=>{
if(params.length <= 0) return
let result = (params[0].data.year || '')+' '+params[0].name + '<div>'
params.forEach(item=>{
const {color,seriesName,value} = item
result += `<div style="position: relative;padding-left:20px;line-height: 20px;">
<div style="position: absolute;top:50%;left:0;width:12px;height:12px;border-radius:100%;background: ${color};transform: translateY(-50%)"></div>
<span>${seriesName}</span><span style="margin-left:20px;font-weight: 700">${value}</span></div>`
})
result+='</div>'
return result
}
}, },
textStyle: { textStyle: {
color: "#333333", color: "#333333",

View File

@ -14,7 +14,6 @@
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
import resize from "@/mixins/ems/resize"; import resize from "@/mixins/ems/resize";
import { formatDate } from "@/filters/ems";
import { pcsMaxTemp } from "@/api/ems/dzjk"; import { pcsMaxTemp } from "@/api/ems/dzjk";
export default { export default {
@ -35,11 +34,10 @@ export default {
this.chart = null; this.chart = null;
}, },
methods: { methods: {
init(siteId) { init(siteId,timeRange) {
this.chart.showLoading(); this.chart.showLoading();
const x = []; const [startTime='', endTime=''] = timeRange;
const data = []; pcsMaxTemp(siteId,startTime,endTime)
pcsMaxTemp(siteId)
.then((response) => { .then((response) => {
this.setOption(response?.data?.pcsMaxTempList || []); this.setOption(response?.data?.pcsMaxTempList || []);
}) })
@ -60,7 +58,12 @@ export default {
areaStyle: { areaStyle: {
// color:'#FFBD00' // color:'#FFBD00'
}, },
data: (element.maxTempVoList || []).map((i) => i.temp), data: (element.maxTempVoList || []).map((i) => {
return {
value: i.temp,
year: i.dateDay
}
}),
}); });
}); });
this.chart.setOption({ this.chart.setOption({
@ -77,11 +80,24 @@ export default {
containLabel: true, containLabel: true,
}, },
tooltip: { tooltip: {
show:true,
trigger: "axis", trigger: "axis",
axisPointer: { axisPointer: {
// 坐标轴指示器,坐标轴触发有效 // 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow' type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
}, },
formatter :(params)=>{
if(params.length <= 0) return
let result = (params[0].data.year || '')+' '+params[0].name + '<div>'
params.forEach(item=>{
const {color,seriesName,value} = item
result += `<div style="position: relative;padding-left:20px;line-height: 20px;">
<div style="position: absolute;top:50%;left:0;width:12px;height:12px;border-radius:100%;background: ${color};transform: translateY(-50%)"></div>
<span>${seriesName}</span><span style="margin-left:20px;font-weight: 700">${value}</span></div>`
})
result+='</div>'
return result
}
}, },
textStyle: { textStyle: {
color: "#333333", color: "#333333",

View File

@ -3,6 +3,8 @@
<div class="ssyx-ems-dashboard-editor-container"> <div class="ssyx-ems-dashboard-editor-container">
<!-- 6个方块--> <!-- 6个方块-->
<real-time-base-info :data="runningHeadData"/> <real-time-base-info :data="runningHeadData"/>
<!-- 时间选择 -->
<date-range-select ref="dateRangeSelect" @updateDate="updateDate" style="margin-top:20px;"/>
<!-- echart图表--> <!-- echart图表-->
<el-row :gutter="32" style="background:#fff;margin:30px 0;"> <el-row :gutter="32" style="background:#fff;margin:30px 0;">
<el-col :xs="24" :sm="12" :lg="12"> <el-col :xs="24" :sm="12" :lg="12">
@ -27,6 +29,7 @@
</style> </style>
<script> <script>
import DateRangeSelect from '@/components/Ems/DateRangeSelect/index.vue'
import RealTimeBaseInfo from "./../RealTimeBaseInfo.vue"; import RealTimeBaseInfo from "./../RealTimeBaseInfo.vue";
import CnglqxChart from './CnglqxChart.vue' import CnglqxChart from './CnglqxChart.vue'
import PocpjwdChart from './PocpjwdChart.vue' import PocpjwdChart from './PocpjwdChart.vue'
@ -38,11 +41,13 @@ import intervalUpdate from "@/mixins/ems/intervalUpdate";
export default { export default {
name:'DzjkSbjkSsyx', name:'DzjkSbjkSsyx',
components:{RealTimeBaseInfo,CnglqxChart,PocpjwdChart,DcpjwdChart,DcpjsocChart}, components:{RealTimeBaseInfo,CnglqxChart,PocpjwdChart,DcpjwdChart,DcpjsocChart,DateRangeSelect},
mixins:[getQuerySiteId,intervalUpdate], mixins:[getQuerySiteId,intervalUpdate],
data() { data() {
return { return {
runningHeadData:{},//运行信息 runningHeadData:{},//运行信息
timeRange:[],
isInit:true
} }
}, },
methods:{ methods:{
@ -52,17 +57,27 @@ export default {
this.runningHeadData = response?.data || {} this.runningHeadData = response?.data || {}
}) })
}, },
// 更新时间范围 重置图表
updateDate(data){
this.timeRange=data
!this.isInit && this.updateChart()
this.isInit = false
},
updateChart(){
this.$refs.cnglqx.init(this.siteId,this.timeRange||[])
this.$refs.pocpjwd.init(this.siteId,this.timeRange||[])
this.$refs.dcpjsoc.init(this.siteId,this.timeRange||[])
this.$refs.dcpjwd.init(this.siteId,this.timeRange||[])
this.updateInterval(this.updateData)
},
updateData(){ updateData(){
this.getRunningHeadData() this.getRunningHeadData()
this.$refs.cnglqx.init(this.siteId) this.updateChart()
this.$refs.pocpjwd.init(this.siteId)
this.$refs.dcpjsoc.init(this.siteId)
this.$refs.dcpjwd.init(this.siteId)
}, },
init(){ init(){
this.$refs.dateRangeSelect.init(true)
this.$nextTick(()=>{ this.$nextTick(()=>{
this.updateData() this.updateData()
this.updateInterval(this.updateData)
}) })
} }
} }

View File

@ -0,0 +1,122 @@
<template>
<div v-loading="loading">
<el-card
v-for="(item,index) in list"
:key="index+'ylLise'"
class="sbjk-card-container running-card-container"
:class="{
'warning-card-container':item.emsCommunicationStatus && item.emsCommunicationStatus !== '0',
'running-card-container':item.emsCommunicationStatus === '0'
}"
shadow="always">
<div slot="header">
<span class="large-title">{{item.deviceName}}</span>
<div class="info">
<div>
{{
$store.state.ems.communicationStatusOptions[
item.emsCommunicationStatus
]
}}
</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>
<el-row class="device-info-row">
<el-col v-for="(tempDataItem,tempDataIndex) in tempData" :key="tempDataIndex+'hdTempData'" :span="12" class="device-info-col">
<span class="pointer" @click="showChart(tempDataItem.title,item.deviceId)">
<span class="left">{{tempDataItem.title}}</span> <span class="right">{{item[tempDataItem.attr] || ''}}<span v-html="tempDataItem.unit"></span></span>
</span>
</el-col>
</el-row>
</el-card>
<el-empty v-show="list.length<=0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId"/>
<point-table ref="pointTable"/>
</div>
</template>
<script>
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
import {getXfDataList} from '@/api/ems/dzjk'
import intervalUpdate from "@/mixins/ems/intervalUpdate";
import pointChart from "./../PointChart.vue";
import PointTable from "@/views/ems/site/sblb/PointTable.vue";
export default {
name:'DzjkSbjkXf',
mixins:[getQuerySiteId,intervalUpdate],
components:{pointChart,PointTable},
data() {
return {
loading:false,
list:[],
tempData:[
{title:'主电源备用电池状态',attr:'dczt',unit:''},
{title:'手自动状态延时状态',attr:'yszt',unit:''},
{title:'启动喷洒气体喷洒状态',attr:'pszt',unit:''},
{title:'压力开关状态电磁阀状态',attr:'dcfzt',unit:''},
]
}
},
methods:{
// 查看设备电位表格
pointDetail(row,dataType){
const {deviceId} = row
this.$refs.pointTable.showTable({siteId:this.siteId,deviceId,deviceCategory:'XF'},dataType)
},
showChart(pointName,deviceId){
pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'XF',deviceId})
},
updateData(){
this.loading = true
getXfDataList(this.siteId).then(response => {
this.list = JSON.parse(JSON.stringify(response?.data || []));
}).finally(() => {this.loading = false})
},
init(){
this.updateData()
this.updateInterval(this.updateData)
}
},
mounted(){
}
}
</script>
<style scoped lang="scss">
.sbjk-card-container{
&:not(:last-child){
margin-bottom: 25px;
}
.el-row{
background-color: #ffffff;
border:1px solid #eeeeee;
font-size: 14px;
line-height: 16px;
color: #333333;
.el-col{
padding:12px 0;
text-align: center;
position: relative;
}
.el-col{
border-bottom: 1px solid #eeeeee;
}
.el-col:not(:nth-child(3n)){
border-right: 1px solid #eeeeee;
}
}
}
</style>

View File

@ -7,18 +7,31 @@
class="sbjk-card-container running-card-container" class="sbjk-card-container running-card-container"
shadow="always"> shadow="always">
<div slot="header"> <div slot="header">
<span class="large-title">{{index+1}}#{{item.deviceName}}</span> <span class="large-title">{{item.deviceName}}</span>
<div class="info">
<div>数据更新时间{{ item.dataUpdateTime || '-'}}</div>
</div> </div>
<el-row> <div class="alarm">
<el-col v-for="(tempDataItem,tempDataIndex) in tempData" :key="tempDataIndex+'ylTempData'" :span="8"> <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>
<el-row class="device-info-row">
<el-col v-for="(tempDataItem,tempDataIndex) in tempData" :key="tempDataIndex+'ylTempData'" :span="8" class="device-info-col">
<span class="pointer" @click="showChart(tempDataItem.title,item.deviceId)"> <span class="pointer" @click="showChart(tempDataItem.title,item.deviceId)">
{{tempDataItem.title}}{{item[tempDataItem.attr]}}<span v-html="tempDataItem.unit"></span> <span class="left">{{tempDataItem.title}}</span> <span class="right">{{item[tempDataItem.attr]}}<span v-html="tempDataItem.unit"></span></span>
</span> </span>
</el-col> </el-col>
</el-row> </el-row>
</el-card> </el-card>
<el-empty v-show="list.length<=0" :image-size="200"></el-empty> <el-empty v-show="list.length<=0" :image-size="200"></el-empty>
<point-chart ref="pointChart" :site-id="siteId"/> <point-chart ref="pointChart" :site-id="siteId"/>
<point-table ref="pointTable"/>
</div> </div>
</template> </template>
@ -28,10 +41,11 @@ import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
import {getCoolingDataList} from '@/api/ems/dzjk' import {getCoolingDataList} from '@/api/ems/dzjk'
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";
export default { export default {
name:'DzjkSbjkYl', name:'DzjkSbjkYl',
mixins:[getQuerySiteId,intervalUpdate], mixins:[getQuerySiteId,intervalUpdate],
components:{pointChart}, components:{pointChart,PointTable},
data() { data() {
return { return {
loading:false, loading:false,
@ -48,6 +62,11 @@ export default {
} }
}, },
methods:{ methods:{
// 查看设备电位表格
pointDetail(row,dataType){
const {deviceId} = row
this.$refs.pointTable.showTable({siteId:this.siteId,deviceId,deviceCategory:'COOLING'},dataType)
},
showChart(pointName,deviceId){ showChart(pointName,deviceId){
pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'COOLING',deviceId}) pointName && this.$refs.pointChart.showChart({pointName,deviceCategory:'COOLING',deviceId})
}, },
@ -73,23 +92,5 @@ export default {
&:not(:last-child){ &:not(:last-child){
margin-bottom: 25px; margin-bottom: 25px;
} }
.el-row{
background-color: #ffffff;
border:1px solid #eeeeee;
font-size: 14px;
line-height: 16px;
color: #333333;
.el-col{
padding:12px 0;
text-align: center;
position: relative;
}
.el-col{
border-bottom: 1px solid #eeeeee;
}
.el-col:not(:nth-child(3n)){
border-right: 1px solid #eeeeee;
}
}
} }
</style> </style>

View File

@ -0,0 +1,204 @@
<template>
<div style="width:100%" v-loading="loading">
<!-- 搜索栏-->
<el-form :inline="true" class="select-container">
<el-form-item label="时间选择">
<el-date-picker
v-model="dateRange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd"
:clearable="false"
:picker-options="pickerOptions"
:default-value="defaultDateRange"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSearch" native-type="button">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button @click="onReset" native-type="button">重置</el-button>
</el-form-item>
</el-form>
<!--表格-->
<el-table
class="common-table"
:data="tableData"
stripe
style="width: 100%;margin-top:25px;">
<!-- 汇总列-->
<el-table-column label="汇总">
<el-table-column
prop="dataTime"
label="日期"
width="120">
</el-table-column>
</el-table-column>
<!--充电量列-->
<el-table-column label="充电价格" align="center">
<el-table-column
align="center"
prop="activePeakKwh"
label="尖">
</el-table-column>
<el-table-column
align="center"
prop="activeHighKwh"
label="峰">
</el-table-column>
<el-table-column
align="center"
prop="activeFlatKwh"
label="平">
</el-table-column>
<el-table-column
align="center"
prop="activeValleyKwh"
label="谷">
</el-table-column>
<el-table-column
align="center"
prop="activeTotalKwh"
label="总">
</el-table-column>
</el-table-column>
<!--充电量列-->
<el-table-column label="放电价格" align="center">
<el-table-column
align="center"
prop="reActivePeakKwh"
label="尖">
</el-table-column>
<el-table-column
align="center"
prop="reActiveHighKwh"
label="峰">
</el-table-column>
<el-table-column
align="center"
prop="reActiveFlatKwh"
label="平">
</el-table-column>
<el-table-column
align="center"
prop="reActiveValleyKwh"
label="谷">
</el-table-column>
<el-table-column
align="center"
prop="reActiveTotalKwh"
label="总">
</el-table-column>
</el-table-column>
<!-- 效率-->
<!-- <el-table-column label="效率(%)" align="center">-->
<!-- <el-table-column-->
<!-- align="center"-->
<!-- prop="effect">-->
<!-- </el-table-column>-->
<!-- </el-table-column>-->
</el-table>
<el-pagination
v-show="tableData.length>0"
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNum"
:page-size="pageSize"
:page-sizes="[10, 20, 30, 40]"
layout="total, sizes, prev, pager, next, jumper"
:total="totalSize"
style="margin-top:15px;text-align: center"
>
</el-pagination>
</div>
</template>
<script>
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
import { getAmmeterData} from '@/api/ems/dzjk'
import {formatDate} from "@/filters/ems";
export default {
name:'DzjkTjbbSybb',
mixins: [getQuerySiteId],
data() {
return {
loading:false,
pickerOptions:{
disabledDate(time) {
return time.getTime() > Date.now();
},
},
defaultDateRange:[],//默认展示的时间
dateRange:[],
tableData:[],
pageSize:10,//分页栏当前每个数据总数
pageNum:1,//分页栏当前页数
totalSize:0,//table表格数据总数
}
},
methods:{
// 搜索
onSearch(){
this.pageNum =1//每次搜索从1开始搜索
this.getData()
},
// 重置
onReset(){
this.dateRange=this.defaultDateRange
this.pageNum =1//每次搜索从1开始搜索
this.getData()
},
// 分页
handleSizeChange(val) {
this.pageSize = val;
this.$nextTick(()=>{
this.getData()
})
},
handleCurrentChange(val) {
this.pageNum = val
this.$nextTick(()=>{
this.getData()
})
},
// 获取数据
getData(){
this.loading=true
const {siteId,pageNum,pageSize} =this
const [startTime='',endTime='']=(this.dateRange || [])
getAmmeterData({siteId:siteId,startTime,endTime,pageSize,pageNum}).then(response=>{
this.tableData=response?.rows || [];
this.totalSize = response?.total || 0
}).finally(()=> {
this.loading = false
})
},
init(){
this.dateRange=[]
this.tableData=[]
this.totalSize=0
this.pageSize=10
this.pageNum = 1
const now = new Date().getTime();
const lastMonth = new Date(now-30 * 24 * 60 * 60 * 1000).getTime();
this.defaultDateRange = [formatDate(lastMonth), formatDate(now)];
this.dateRange=[formatDate(lastMonth), formatDate(now)];
this.getData()
},
},
}
</script>
<style scoped lang="scss">
::v-deep{
.common-table.el-table .el-table__header-wrapper th, .common-table.el-table .el-table__fixed-header-wrapper th{
border-bottom: 1px solid #dfe6ec;
}
}
</style>

View File

@ -10,7 +10,7 @@
destroy-on-close destroy-on-close
lock-scroll lock-scroll
show-close show-close
title="点位清单" :title="dataType === 'point' ? '点位清单' : '报警点位'"
width="950px" width="950px"
> >
<el-form :inline="true" label-width="100px"> <el-form :inline="true" label-width="100px">
@ -30,14 +30,15 @@
style="width: 150px" style="width: 150px"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="modbus ip"> <!-- <el-form-item label="modbus ip">-->
<el-input <!-- <el-input-->
v-model="form.ipAddress" <!-- v-model="form.ipAddress"-->
clearable <!-- clearable-->
placeholder="请输入ip" <!-- placeholder="请输入ip"-->
style="width: 150px" <!-- style="width: 150px"-->
></el-input> <!-- ></el-input>-->
</el-form-item> <!-- </el-form-item>-->
<br>
<el-form-item label="最小值"> <el-form-item label="最小值">
<el-input <el-input
v-model="form.lower" v-model="form.lower"
@ -54,14 +55,14 @@
style="width: 150px" style="width: 150px"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="modbus 端口"> <!-- <el-form-item label="modbus 端口">-->
<el-input <!-- <el-input-->
v-model="form.ipPort" <!-- v-model="form.ipPort"-->
clearable <!-- clearable-->
placeholder="请输入端口" <!-- placeholder="请输入端口"-->
style="width: 150px" <!-- style="width: 150px"-->
></el-input> <!-- ></el-input>-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item style="margin-left: 20px"> <el-form-item style="margin-left: 20px">
<el-button type="primary" @click="search">搜索</el-button> <el-button type="primary" @click="search">搜索</el-button>
</el-form-item> </el-form-item>
@ -77,14 +78,18 @@
@sort-change="handleSortChange" @sort-change="handleSortChange"
> >
<el-table-column label="数据点位" prop="dataPoint"> </el-table-column> <el-table-column label="数据点位" prop="dataPoint"> </el-table-column>
<el-table-column label="数据点位名称" prop="pointName"></el-table-column>
<el-table-column <el-table-column
label="modbus地址" label="数据点位名称"
> prop="pointName"
<template slot-scope="scope"> ></el-table-column>
<span>{{`${scope.row.ipAddress || ''} ${scope.row.ipPort || ''}`}}</span> <!-- <el-table-column label="modbus地址">-->
</template> <!-- <template slot-scope="scope">-->
</el-table-column> <!-- <span>{{-->
<!-- `${scope.row.ipAddress || ""} ${scope.row.ipPort || ""}`-->
<!-- }}</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="寄存器地址" prop="寄存器地址"></el-table-column>
<el-table-column <el-table-column
label="最新值" label="最新值"
prop="pointValue" prop="pointValue"
@ -92,19 +97,18 @@
sortable="custom" sortable="custom"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span <span class="pointer" @click="showChart(scope.row)">{{
class="pointer" scope.row.pointValue
@click=" }}</span>
showChart(
scope.row
)
"
>{{ scope.row.pointValue }}</span
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="单位" prop="dataUnit"></el-table-column> <el-table-column label="单位" prop="dataUnit"></el-table-column>
<el-table-column label="更新时间" min-width="160px" prop="updateTime" sortable="custom"> <el-table-column
label="更新时间"
min-width="160px"
prop="updateTime"
sortable="custom"
>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-pagination <el-pagination
@ -137,11 +141,12 @@ export default {
if (!val) { if (!val) {
this.tableData = []; this.tableData = [];
this.deviceId = ""; this.deviceId = "";
this.parentId=''; this.parentId = "";
this.siteId = ""; this.siteId = "";
this.pageSize = 10; this.pageSize = 10;
this.pageNum = 1; this.pageNum = 1;
this.totalSize = 0; this.totalSize = 0;
this.dataType = '';
this.form = { this.form = {
sortMethod: "desc", //升序不传或者asc、降序desc sortMethod: "desc", //升序不传或者asc、降序desc
sortData: this.defaultSort.prop, sortData: this.defaultSort.prop,
@ -149,8 +154,8 @@ export default {
dataPoint: "", //点位名称 dataPoint: "", //点位名称
lower: "", // lower: "", //
upper: "", // upper: "", //
ipAddress:'', // ipAddress: "",
ipPort:'' // ipPort: "",
}; };
this.loading = false; this.loading = false;
} }
@ -158,8 +163,8 @@ export default {
}, },
computed: { computed: {
isDtdc() { isDtdc() {
return this.deviceCategory === 'BATTERY' return this.deviceCategory === "BATTERY";
} },
}, },
data() { data() {
return { return {
@ -167,6 +172,7 @@ export default {
defaultSort: { prop: "updateTime", order: "descending" }, defaultSort: { prop: "updateTime", order: "descending" },
show: false, show: false,
loading: false, loading: false,
dataType:'',//展示的数据类型 point点位/alarmPoint报警点位
form: { form: {
sortData: "updateTime", //最新值升序不传或者asc、降序desc sortData: "updateTime", //最新值升序不传或者asc、降序desc
sortMethod: "desc", //升序不传或者asc、降序desc sortMethod: "desc", //升序不传或者asc、降序desc
@ -174,12 +180,12 @@ export default {
dataPoint: "", //点位名称 dataPoint: "", //点位名称
lower: "", // lower: "", //
upper: "", // upper: "", //
ipAddress:'', // ipAddress: "",
ipPort:'' // ipPort: "",
}, },
deviceCategory: "", deviceCategory: "",
deviceId: "", deviceId: "",
parentId:'', parentId: "",
siteId: "", siteId: "",
tableData: [], tableData: [],
pageSize: 10, //分页栏当前每个数据总数 pageSize: 10, //分页栏当前每个数据总数
@ -190,31 +196,77 @@ export default {
methods: { methods: {
showChart({ pointName }) { showChart({ pointName }) {
if (pointName) { if (pointName) {
const {deviceCategory,deviceId}=this const { deviceCategory, deviceId } = this;
if(this.isDtdc) this.$refs.pointChart.showChart({ pointName, deviceCategory, deviceId:this.parentId,child:[deviceId] }); if (this.isDtdc)
else this.$refs.pointChart.showChart({ pointName, deviceCategory, deviceId }); this.$refs.pointChart.showChart({
pointName,
deviceCategory,
deviceId: this.parentId,
child: [deviceId],
});
else
this.$refs.pointChart.showChart({
pointName,
deviceCategory,
deviceId,
});
} }
}, },
handleSortChange(column) { handleSortChange(column) {
this.form.sortData = column.prop this.form.sortData = column.prop;
this.form.sortMethod = column.order === "descending" ? "desc" : "asc"; this.form.sortMethod = column.order === "descending" ? "desc" : "asc";
console.log("切换排序方式", column, this.form); console.log("切换排序方式", column, this.form);
this.getData(); this.getData()
}, },
search() { search() {
this.pageNum = 1; this.pageNum = 1;
this.getData(); this.getData()
}, },
showTable({ deviceCategory, siteId, deviceId ,parentId=''}) { // 分页
handleSizeChange(val) {
this.pageSize = val;
this.$nextTick(() => {
this.getData()
});
},
handleCurrentChange(val) {
this.pageNum = val;
this.$nextTick(() => {
this.getData()
});
},
showTable({ deviceCategory, siteId, deviceId, parentId = "" },dataType) {
this.dataType = dataType;
this.deviceCategory = deviceCategory; this.deviceCategory = deviceCategory;
this.siteId = siteId; this.siteId = siteId;
this.deviceId = deviceId; this.deviceId = deviceId;
this.parentId=deviceCategory === 'BATTERY' ? parentId : ''//只有单体电池需要这个值 this.parentId = deviceCategory === "BATTERY" ? parentId : ""; //只有单体电池需要这个值
this.show = true; this.show = true;
this.getData(); this.getData()
},
getAlarmPointData(param){
this.loading = true;
getDevicePointList(param)
.then((response) => {
this.tableData = response?.rows || [];
this.totalSize = response?.total || 0;
})
.finally(() => {
this.loading = false;
});
},
getPointData(param){
this.loading = true;
getDevicePointList(param)
.then((response) => {
this.tableData = response?.rows || [];
this.totalSize = response?.total || 0;
})
.finally(() => {
this.loading = false;
});
}, },
getData() { getData() {
this.loading = true;
const { const {
siteId, siteId,
deviceId, deviceId,
@ -229,11 +281,11 @@ export default {
dataPoint, dataPoint,
lower, lower,
upper, upper,
ipAddress, // ipAddress,
ipPort // ipPort,
}, },
} = this; } = this;
getDevicePointList({ const params = {
siteId, siteId,
deviceId, deviceId,
deviceCategory, deviceCategory,
@ -246,29 +298,10 @@ export default {
dataPoint, dataPoint,
lower, lower,
upper, upper,
ipAddress, ipAddress:'',
ipPort ipPort:'',
}) }
.then((response) => { this.dataType === 'point' ? this.getPointData(params) : this.getAlarmPointData(params)
this.tableData = response?.rows || [];
this.totalSize = response?.total || 0;
})
.finally(() => {
this.loading = false;
});
},
// 分页
handleSizeChange(val) {
this.pageSize = val;
this.$nextTick(() => {
this.getData();
});
},
handleCurrentChange(val) {
this.pageNum = val;
this.$nextTick(() => {
this.getData();
});
}, },
}, },
}; };

View File

@ -1,7 +1,7 @@
<template> <template>
<el-dialog :visible.sync="show" class="ems-dialog" title="点位上传" width="400px" append-to-body :close-on-click-modal="false" :close-on-press-escape="false"> <el-dialog :visible.sync="show" class="ems-dialog" title="点位上传" width="400px" append-to-body :close-on-click-modal="false" :close-on-press-escape="false">
<!-- <file-upload :fileType='["xls", "xlsx"]' value="String" :limit="1" :drag="false" @input="updateFile"/>--> <!-- <file-upload :fileType='["xls", "xlsx"]' value="String" :limit="1" :drag="false" @input="updateFile"/>-->
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag> <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url" :data="upload.data" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<i class="el-icon-upload"></i> <i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div> <div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip"> <div class="el-upload__tip text-center" slot="tip">
@ -27,22 +27,25 @@ export default {
show:false, show:false,
// 用户导入参数 // 用户导入参数
upload: { upload: {
data:{},
// 是否禁用上传 // 是否禁用上传
isUploading: false, isUploading: false,
// 设置上传的请求头部 // 设置上传的请求头部
headers: { Authorization: "Bearer " + getToken() }, headers: { Authorization: "Bearer " + getToken() },
// 上传的地址 // 上传的地址
url: process.env.VUE_APP_BASE_API + "/ems/pointMatch/importData" url: process.env.VUE_APP_BASE_API + "/ems/pointMatch/importDataByDevice"
}, },
} }
}, },
methods:{ methods:{
showDialog(){ showDialog({siteId,deviceId,deviceCategory}){
this.upload.data={siteId,deviceId,deviceCategory}
this.show = true; this.show = true;
}, },
//关闭弹窗 重置数据 //关闭弹窗 重置数据
handleClosed(){ handleClosed(){
this.$refs.upload.clearFiles()//写在before-closed无效 this.$refs.upload.clearFiles()//写在before-closed无效
this.upload.data={}
this.show=false this.show=false
}, },
// updateFile(data){ // updateFile(data){
@ -51,12 +54,12 @@ export default {
// saveDialog(){ // saveDialog(){
// this.show=true // this.show=true
// }, // },
// 文件上传中处理 // 文件上传中处理 返回参数event, file, fileList
handleFileUploadProgress(event, file, fileList) { handleFileUploadProgress() {
this.upload.isUploading = true this.upload.isUploading = true
}, },
// 文件上传成功处理 // 文件上传成功处理 返回参数response, file, fileList
handleFileSuccess(response, file, fileList) { handleFileSuccess(response) {
console.log('上传文件结果',response) console.log('上传文件结果',response)
this.upload.isUploading = false this.upload.isUploading = false
if(response.code === 500 && !response.msg) response.msg = '上传失败' if(response.code === 500 && !response.msg) response.msg = '上传失败'

View File

@ -13,12 +13,6 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-button type="primary" @click="addDevice" native-type="button">新增设备</el-button> <el-button type="primary" @click="addDevice" native-type="button">新增设备</el-button>
<el-button
@click="uploadPointDetail"
type="success"
plain>
上传点位清单
</el-button>
<el-table <el-table
class="common-table" class="common-table"
:data="tableData" :data="tableData"
@ -59,18 +53,34 @@
width="250"> width="250">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@click="pointDetail(scope.row)" @click="pointDetail(scope.row,'point')"
type="primary" type="primary"
size="mini"> size="mini">
点位清单 点位清单
</el-button> </el-button>
<el-button
@click="pointDetail(scope.row,'alarmPoint')"
type="primary"
size="mini">
报警点位清单
</el-button>
<br>
<el-button <el-button
@click="downloadPointDetail(scope.row)" @click="downloadPointDetail(scope.row)"
style="margin-top:10px;"
type="primary" type="primary"
plain plain
size="mini"> size="mini">
下载点位清单 下载点位清单
</el-button> </el-button>
<el-button
@click="uploadPointDetail(scope.row)"
style="margin-top:10px;"
type="success"
plain
size="mini">
上传点位清单
</el-button>
<br> <br>
<el-button <el-button
@click="editDevice(scope.row)" @click="editDevice(scope.row)"
@ -116,13 +126,12 @@
</template> </template>
<script> <script>
import {getDeviceInfoList,getDeviceDetailInfo,deleteService,exportPointList,importPointList} from'@/api/ems/site' import {getDeviceInfoList,getDeviceDetailInfo,deleteService} from'@/api/ems/site'
import {getAllSites} from '@/api/ems/zddt' import {getAllSites} from '@/api/ems/zddt'
import {formatNumber} from "@/filters/ems"; import {formatNumber} from "@/filters/ems";
import PointTable from './PointTable.vue' import PointTable from './PointTable.vue'
import AddDevice from "./AddDevice.vue"; import AddDevice from "./AddDevice.vue";
import PointUpload from "./PointUpload.vue"; import PointUpload from "./PointUpload.vue";
import {download} from "@/utils/request";
export default { export default {
name: "Sblb", name: "Sblb",
components:{AddDevice,PointTable,PointUpload}, components:{AddDevice,PointTable,PointUpload},
@ -164,8 +173,8 @@ export default {
}, },
methods:{ methods:{
// 查看设备电位表格 // 查看设备电位表格
pointDetail(row){ pointDetail(row,dataType){
this.$refs.pointTable.showTable(row) this.$refs.pointTable.showTable(row,dataType)
}, },
// 下载点位清单 // 下载点位清单
downloadPointDetail({siteId,deviceCategory,deviceName}){ downloadPointDetail({siteId,deviceCategory,deviceName}){
@ -175,8 +184,8 @@ export default {
}, `点位清单_${deviceName}_${new Date().getTime()}.xlsx`) }, `点位清单_${deviceName}_${new Date().getTime()}.xlsx`)
}, },
// 上传点位清单 // 上传点位清单
uploadPointDetail(){ uploadPointDetail(row){
this.$refs.pointUpload.showDialog() this.$refs.pointUpload.showDialog(row)
}, },
clearEditDeviceData(){ clearEditDeviceData(){
this.mode = ''; this.mode = '';