Files
zm_OM/src/views/historyDetail/historyDetail.vue

447 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script setup lang="ts">
import moment from 'moment';
import * as echarts from 'echarts';
import { ref } from 'vue';
import { useProgram } from '@/store/modules/program';
const route = useRoute();
const router = useRouter();
const useStore = useProgram();
const detail = ref();
const activeName = ref();
const myChart1 = ref(null);
const myChart2 = ref(null);
const myChart3 = ref(null);
const myChart4 = ref(null);
const myChart5 = ref(null);
const myChart6 = ref(null);
function dealData() {
detail.value = {
...detail.value,
dataTimestamp: moment(Number(detail.value.dataTimestamp)).format('YYYY-MM-DD HH:mm:ss'),
stateChinese: detail.value.state === 1 ? '在线' : detail.value.state === 2 ? '离线' : '报警',
warningInfoData: detail.value.warningInfoData === 0 ? '无' : detail.value.state === 1 ? '异常' : '报警',
updateShelfEndTime: moment(Number(detail.value.updateShelfEndTime)).format('YYYY-MM-DD HH:mm:ss')
};
}
function initChart(a: any, b: any, c: any, d: any, e?: any, f?: any) {
const instance = echarts.getInstanceByDom(c);
if (instance) {
echarts.dispose(instance);
}
const chart1 = echarts.init(c);
const option = {
tooltip: {
trigger: 'axis',
valueFormatter: function (value) {
return value + f;
}
},
dataZoom: [
{
type: 'slider', // 滑动条
show: true,
xAxisIndex: [0], // 控制哪个x轴
start: 0, // 初始显示范围的起始百分比
end: 100, // 初始显示范围的结束百分比
handleIcon:
'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
handleSize: '80%',
handleStyle: {
color: '#fff',
shadowBlur: 3,
shadowColor: 'rgba(0, 0, 0, 0.6)',
shadowOffsetX: 2,
shadowOffsetY: 2,
height: 10
},
labelFormatter: function (value) {
return value;
},
// 阻止事件冒泡
handleMove: function (params) {
if (params.event.event) {
params.event.event.stopPropagation();
}
},
bottom: '8%',
height: 10
},
{
type: 'inside', // 内置型dataZoom组件允许用户通过鼠标滚轮或触控缩放
xAxisIndex: [0],
start: 0,
end: 100
}
],
grid: {
left: '7%',
right: '10%',
bottom: '-100%',
top: '5%',
height: '82%'
},
xAxis: {
type: 'category',
data: b,
boundaryGap: true, // 坐标轴两边留白策略
axisTick: {
show: false
}
},
yAxis: {
type: 'value',
name: d + '(单位' + f + ')',
nameTextStyle: {
padding: [0, 0, e, 0],
verticalAlign: 'bottom'
},
nameLocation: 'center'
},
series: [
{
data: a,
type: 'bar',
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{ offset: 0, color: '#ff7f50' }, // 0% 处的颜色
{ offset: 1, color: '#87cefa' } // 100% 处的颜色
],
global: false // 缺省为 false
}
}
}
]
};
chart1 && chart1.setOption(option);
}
function handleClick(a) {
const nv = a.props.name;
if (nv === 'first') {
setTimeout(() => {
initChart(detail.value.chart1Value, detail.value.chart1Index, myChart1.value, '直流电流参数', 25, 'A');
}, 500);
} else if (nv === 'second') {
setTimeout(() => {
initChart(detail.value.chart2Value, detail.value.chart2Index, myChart2.value, '直流电压参数', 25, 'V');
}, 500);
} else if (nv === 'third') {
setTimeout(() => {
initChart(detail.value.chart3Value, detail.value.chart3Index, myChart3.value, '直流功率参数', 25, 'kwh');
}, 500);
} else if (nv === 'fourth') {
setTimeout(() => {
initChart(detail.value.chart4Value, detail.value.chart4Index, myChart4.value, 'mppt电流参数', 25, 'A');
}, 500);
} else if (nv === 'fifth') {
setTimeout(() => {
initChart(detail.value.chart5Value, detail.value.chart5Index, myChart5.value, 'mppt电压参数', 25, 'V');
}, 500);
} else if (nv === 'sixth') {
setTimeout(() => {
initChart(detail.value.chart6Value, detail.value.chart6Index, myChart6.value, 'mppt功率参数', 25, 'kwh');
}, 500);
}
}
watch(
activeName,
(nv) => {
if (nv === 'first') {
setTimeout(() => {
initChart(detail.value.chart1Value, detail.value.chart1Index, myChart1.value, '直流电流参数', 25, 'A');
}, 500);
}
},
{ immediate: false }
);
onBeforeMount(() => {
if (!JSON.parse(localStorage.getItem('detail'))) {
detail.value = useStore.details;
} else {
detail.value = JSON.parse(localStorage.getItem('detail'));
}
dealData();
activeName.value = 'first';
});
onBeforeUnmount(() => {
localStorage.removeItem('detail');
});
</script>
<template>
<div class="container">
<div class="head flex-c">
<div class="row1 flex-a">
<div class="nbqName">{{ detail.name }}</div>
<div class="stationId">电站ID{{ detail.stationId }}</div>
<el-button icon="RefreshRight"></el-button>
</div>
<div class="row2">数据上报时间:{{ detail.dataTimestamp }}</div>
</div>
<el-card class="base-info">
<div class="title">基本信息</div>
<el-form style="margin-left: 20px">
<el-row>
<el-col :span="8">
<el-form-item label="名称:" prop="name">
<div>{{ detail.name }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="SN" prop="sn">
<div>{{ detail.sn }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="状态:" prop="stateChinese">
<div class="dot dot-g" v-if="detail.stateChinese === '在线'"></div>
<div class="dot dot-r" v-if="detail.stateChinese === '报警'"></div>
<div class="dot dot-o" v-if="detail.stateChinese === '离线'"></div>
<div>{{ detail.stateChinese }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item :prop="detail.model" label="型号:">
<div>{{ detail.model }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :prop="detail.stationName" label="所属电站:">
<div>{{ detail.stationName }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :prop="detail.updateShelfEndTime" label="质保结束时间:">
<div>{{ detail.updateShelfEndTime }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item :prop="detail.type" label="逆变器类型:">
<div>{{ detail.type || '暂无' }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :prop="detail.nationalStandardstr" label="国家标准:">
<div>{{ detail.nationalStandardstr }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item :prop="detail.collectorId" label="所属采集器:">
<div>{{ detail.collectorId }}</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<div class="block-2 flex">
<el-card class="in-time">
<div class="title">实时数据</div>
<el-form label-position="top" class="intime-form">
<el-row>
<el-col :span="12">
<el-form-item label="实时功率" prop="pac">
<div>{{ detail.pac }}{{ detail.pacStr }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当日能量" prop="eToday">
<div>{{ detail.eToday }}{{ detail.eTodayStr }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="满发小时数" prop="fullHour">
<div>{{ detail.fullHour }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当月能量" prop="eMonth">
<div>{{ detail.eMonth }}{{ detail.eMonthStr }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="报警信息" prop="warningInfoData">
<div>{{ detail.warningInfoData }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当年能量" prop="eYear">
<div>{{ detail.eYear }}{{ detail.eYearStr }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="逆变器温度" prop="inverterTemperature">
<div>{{ detail.inverterTemperature }}</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="总能量" prop="eTotal">
<div>{{ detail.eTotal }}{{ detail.eTotalStr }}</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="in-time">
<div class="title">功率数据</div>
<el-form label-position="top" class="intime-form">
<el-row>
<el-col :span="8">
<el-form-item label="逆变器无功功率" prop="reactivePower">
<div>{{ detail.reactivePower }}{{ detail.reactivePowerStr }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="逆变器视在功率" prop="apparentPower">
<div>{{ detail.apparentPower }}{{ detail.apparentPowerStr }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="逆变器总直流输入功率" prop="dcPac">
<div>{{ detail.dcPac }}{{ detail.dcPacStr }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="电网总有功功率" prop="pSum">
<div>{{ detail.psum }}{{ detail.psumStr }}</div>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="功率百分比" prop="pacPec">
<div>{{ detail.pacPec }}%</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
<el-card class="chart-block">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="直流电流参数" name="first">
<div class="chartDom" ref="myChart1"></div>
</el-tab-pane>
<el-tab-pane label="直流电压参数" name="second">
<div class="chartDom" ref="myChart2"></div>
</el-tab-pane>
<el-tab-pane label="直流功率参数" name="third">
<div class="chartDom" ref="myChart3"></div>
</el-tab-pane>
<el-tab-pane label="mppt电流参数" name="fourth">
<div class="chartDom" ref="myChart4"></div>
</el-tab-pane>
<el-tab-pane label="mppt电压参数" name="fifth">
<div class="chartDom" ref="myChart5"></div>
</el-tab-pane>
<el-tab-pane label="mppt功率参数" name="sixth">
<div class="chartDom" ref="myChart6"></div>
</el-tab-pane>
</el-tabs>
</el-card>
</div>
</template>
<style scoped lang="scss">
.container {
.head {
margin-top: 10px;
margin-left: 40px;
font-size: 16px;
.row1 {
.stationId {
margin-left: 10px;
font-size: 12px;
color: rgba(0, 0, 0, 0.5);
}
.el-button {
width: 30px;
height: 30px;
margin-left: 10px;
}
}
}
.base-info {
width: 100%;
min-height: 100px;
margin-left: 40px;
margin-top: 10px;
.title {
margin-bottom: 10px;
}
.dot {
width: 10px;
height: 10px;
border-radius: 100%;
margin-right: 5px;
&-g {
background-color: #1ab394;
}
&-r {
background-color: red;
}
&-o {
background-color: gray;
}
}
}
.block-2 {
width: 100%;
height: 280px;
margin-left: 40px;
margin-top: 10px;
justify-content: space-between;
.el-card {
width: 49.7%;
height: 100%;
}
.in-time {
.title {
margin-bottom: 15px;
}
:deep(.intime-form) {
margin-left: 20px;
.el-form-item {
.el-form-item__label {
margin-bottom: 0;
}
.el-form-item__content {
height: 12px;
}
}
}
}
}
.chart-block {
width: 50%;
height: 280px;
margin-left: 40px;
margin-top: 10px;
.chartDom {
width: 800px;
height: 200px;
}
}
}
</style>