Files
smart_storage_web/src/views/dashboardtest/components/top-center/triad.vue
2025-06-30 10:17:15 +08:00

584 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

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

<template>
<ItemBox :title="$t('dashboard.stationTopo')" style="min-height: 560px;">
<div ref="svgLine" class="center-box">
<div v-loading="loading">
<svg
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve"
class="circle-load-rect-svg"
viewBox="0 0 800 500"
>
<defs>
<defs>
<radialGradient id="RadialGradient1">
<stop offset="0%" stop-color="#fff" />
<stop offset="30%" stop-color="#0171c1" />
<stop offset="50%" stop-color="#035088" />
<stop offset="100%" stop-color="#02395a" />
</radialGradient>
</defs>
<marker
id="markerCircle"
markerWidth="15"
markerHeight="15"
refX="5"
refY="5"
>
<circle
cx="5"
cy="5"
r="5"
style="stroke: none; fill: url(#RadialGradient1)"
/>
</marker>
<marker
id="markerArrow"
markerWidth="13"
markerHeight="13"
refX="2"
refY="6"
orient="auto"
>
<path d="M2,2 L2,11 L10,6 L2,2" style="fill: black" />
</marker>
</defs>
<!-- //线条 -->
<!-- top -->
<polyline
points="154,80 600,80"
fill="none"
class="g-rect-path"
stroke="#0094FF"
stroke-dasharray="3 3"
/>
<!-- center -->
<polyline
points="385,80 385,363"
fill="none"
class="g-rect-path"
stroke="#0094FF"
stroke-dasharray="3 3"
/>
<polyline
points="385,160 460,160"
fill="none"
class="g-rect-path"
stroke="#0094FF"
stroke-dasharray="3 3"
/>
<!-- bottom -->
<polyline
points="104,363 655,363"
fill="none"
class="g-rect-path"
stroke="#0094FF"
stroke-dasharray="3 3"
/>
<!-- top -->
<circle
cx="154"
cy="80"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
/>
<circle
cx="600"
cy="80"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
/>
<!-- 动点 -->
<circle
cx="154"
cy="80"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
>
<animateMotion
repeatCount="indefinite"
dur="4s"
begin="0s"
:path="dotData.lineTop"
/>
</circle>
<circle
cx="460"
cy="160"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
>
<!-- <animateMotion
repeatCount="indefinite"
dur="4s"
begin="0s"
:path="dotData.lineTop"
/> -->
</circle>
<!-- bottom -->
<circle
cx="104"
cy="363"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
/>
<circle
cx="385"
cy="363"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
/>
<circle
cx="655"
cy="363"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
/>
<circle
cx="104"
cy="363"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
>
<animateMotion
repeatCount="indefinite"
dur="4s"
begin="2s"
:path="dotData.lineBottomLeft"
/>
</circle>
<circle
cx="655"
cy="363"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
>
<animateMotion
repeatCount="indefinite"
dur="4s"
begin="2s"
:path="dotData.lineBottomRight"
/>
</circle>
<circle
cx="385"
cy="363"
r="8"
style="stroke: none; fill: url(#RadialGradient1)"
>
<animateMotion
repeatCount="indefinite"
dur="4s"
begin="2s"
:path="dotData.lineCenter"
/>
</circle>
<!-- 图片和文字 -->
<!-- 市电 -->
<image
:xlink:href="configData.grid"
x="70"
y="30"
width="90"
height="117"
/>
<!-- {{ $t("dashboard.load") }} -->
<image
:xlink:href="configData.house"
x="610"
y="30"
width="90"
height="117"
/>
<text x="645" y="160" fill="#ffffff" font-size="14"> {{ $t("dashboard.load") }}</text>
<!-- 1#PCS -->
<image
:xlink:href="configData.pcs2"
x="95"
y="383"
width="90"
height="90"
/>
<text x="116" y="490" fill="#ffffff" font-size="14">
1#{{ $t("dashboard.cabinet") }}
</text>
<image
:xlink:href="configData.pcs2"
x="335"
y="383"
width="90"
height="90"
/>
<text x="360" y="490" fill="#ffffff" font-size="14">
2#{{ $t("dashboard.cabinet") }}
</text>
<image
:xlink:href="configData.pcs2"
x="574"
y="383"
width="90"
height="90"
/>
<text x="604" y="490" fill="#ffffff" font-size="14">
3#{{ $t("dashboard.cabinet") }}
</text>
<!-- 变压器 -->
<image
:xlink:href="configData.gui"
x="320"
y="193"
width="140"
height="105"
/>
<!-- {{ $t("dashboard.ammeter") }} -->
<image
:xlink:href="ammeterImg"
x="455"
y="130"
width="100"
height="60"
/>
<!-- 瞬时总有功 -->
<text x="435" y="220" fill="#ffffff" font-size="14">
{{ $t("dashboard.totalP") }}(kW)
</text>
<text x="545" y="220" fill="#ffb800" font-size="14">
{{ activePowerTotal.activePower }}
</text>
<!-- 左侧 -->
<!-- 1#PCS -->
<text x="85" y="280" fill="#ffffff" font-size="14">SOC(%)</text>
<text x="155" y="280" fill="#ffb800" font-size="14">
{{ partList.length > 0 ? partList[0].soc : 0 }}
</text>
<text x="85" y="300" fill="#ffffff" font-size="14">SOH(%)</text>
<text x="155" y="300" fill="#ffb800" font-size="14">
{{ partList.length > 0 ? partList[0].soh : 0 }}
</text>
<text x="85" y="320" fill="#ffffff" font-size="14">
{{ $t("dashboard.workStatus") }}
</text>
<text x="175" y="320" fill="#ffb800" font-size="14">
{{ workStatus(partList[0].activePowerPCS, 0) }}
</text>
<text x="85" y="340" fill="#ffffff" font-size="14">
{{ $t("dashboard.activePower") }}({{
partList.length > 0
? partList[0].activePowerPCS
: 0 | kwUnitFormat
}})
</text>
<text x="185" y="340" fill="#ffb800" font-size="14">
{{
partList.length > 0
? partList[0].activePowerPCS
: 0 | kWFormat(2)
}}
</text>
<!-- 中间 2PCS -->
<text x="420" y="280" fill="#ffffff" font-size="14">
SOC(%)
</text>
<text x="492" y="280" fill="#ffb800" font-size="14">
{{ partList.length > 0 ? partList[1].soc : 0 }}
</text>
<text x="420" y="300" fill="#ffffff" font-size="14">
SOH(%)
</text>
<text x="492" y="300" fill="#ffb800" font-size="14">
{{ partList.length > 0 ? partList[1].soh : 0 }}
</text>
<text x="420" y="320" fill="#ffffff" font-size="14">
{{ $t("dashboard.workStatus") }}
</text>
<text x="512" y="320" fill="#ffb800" font-size="14">
{{ workStatus(partList[1].activePowerPCS, 1) }}
</text>
<text x="420" y="340" fill="#ffffff" font-size="14">
{{ $t("dashboard.activePower") }}({{
partList.length > 0
? partList[1].activePowerPCS
: 0 | kwUnitFormat
}})
</text>
<text x="520" y="340" fill="#ffb800" font-size="14">
{{
partList.length > 0
? partList[1].activePowerPCS
: 0 | kWFormat(2)
}}
</text>
<!-- 右侧 -->
<text x="602" y="280" fill="#ffffff" font-size="14">
SOC(%)
</text>
<text x="672" y="280" fill="#ffb800" font-size="14">
{{ partList.length > 0 ? partList[2].soc : 0 }}
</text>
<text x="602" y="300" fill="#ffffff" font-size="14">
SOH(%)
</text>
<text x="672" y="300" fill="#ffb800" font-size="14">
{{ partList.length > 0 ? partList[2].soh : 0 }}
</text>
<text x="602" y="320" fill="#ffffff" font-size="14">
{{ $t("dashboard.workStatus") }}
</text>
<text x="692" y="320" fill="#ffb800" font-size="14">
{{ workStatus(partList[2].activePowerPCS, 2) }}
</text>
<text x="602" y="340" fill="#ffffff" font-size="14">
{{ $t("dashboard.activePower") }}({{
partList.length > 0
? partList[2].activePowerPCS
: 0 | kwUnitFormat
}})
</text>
<text x="702" y="340" fill="#ffb800" font-size="14">
{{
partList.length > 0
? partList[2].activePowerPCS
: 0 | kWFormat(2)
}}
</text>
</svg>
</div>
</div>
</ItemBox>
</template>
<script>
import gridImg from '@/assets/images/wxjd/grid.png'
import ammeterImg from '@/assets/images/wxjd/ammeter.png'
import cabinetImg from '@/assets/images/wxjd/pcs-energy.png'
import chargingPileImg from '@/assets/images/home-office.png'
import distributionCabinetImg from '@/assets/images/wxjd/guiImg.png'
import frameImg from '@/assets/images/wxjd/frame.png'
import cangImg from '@/assets/images/home-cang.png'
import config from './config'
import { changeTheme } from '@/utils/index'
import {
GetOpenStationMiddle,
GetOpenStationMiddlePart,
GetTotalPower
} from '@/api/home-page/index'
export default {
name: 'Index',
props: {
stationType: {
type: Number,
default: 0
},
stationId: {
type: Number,
default: 0
}
},
data() {
return {
gridImg,
ammeterImg,
cabinetImg,
chargingPileImg,
distributionCabinetImg,
cangImg,
frameImg,
dotData: {
lineTop: 'M 0,0 0,0',
lineBottomLeft: 'M 0,0 0,0 0,0',
lineBottomRight: 'M 0,0 0,0 0,0',
lineCenter: 'M 0,0 0,0 0,0'
},
partList: [
{ soc: 0, soh: 0, activePowerPCS: 0.0, reactivePowerPCS: 0.0 },
{ soc: 0, soh: 0, activePowerPCS: 0.0, reactivePowerPCS: 0.0 },
{ soc: 0, soh: 0, activePowerPCS: 0.0, reactivePowerPCS: 0.0 }
],
loading: false,
activePowerTotal: {},
configData: {}
}
},
computed: {},
watch: {},
created() {
const result = changeTheme()
this.configData = config[result]
},
mounted() {},
methods: {
workStatus(val, index) {
if (this.partList[index].flowDirection === 1) {
if (+val > +1) {
return this.$t('dashboard.charging')
}
if (+val < -1) {
return this.$t('dashboard.disCharging')
}
if (val < 1 || +val.abs < 1) {
return this.$t('dashboard.standing')
}
} else {
if (+val > +1) {
return this.$t('dashboard.disCharging')
}
if (+val < -1) {
return this.$t('dashboard.charging')
}
if (val < 1 || +val.abs < 1) {
return this.$t('dashboard.standing')
}
}
},
getData() {
this.GetMiddleActive()
this.GetOpenStationMiddle()
this.GetOpenStationMiddlePart()
},
async GetMiddleActive() {
this.loading = true
try {
const params = {
stationId: this.stationId
}
const res = await GetTotalPower(params)
this.activePowerTotal = res.data
} catch (error) {
// console.log(error);
} finally {
this.loading = false
}
},
flowDirection(data) {
this.dotData.lineTop = 'M 0,0 412,0'
if (data[0].flowDirection === 1) {
if (data[0].activePowerPCS > 1) {
this.dotData.lineBottomLeft = 'M 283,-280, 280, 0, 0 ,0'
} else if (data[0].activePowerPCS < -1) {
this.dotData.lineBottomLeft = 'M 0,0 281,0 281,-283'
} else if (data[0].activePowerPCS === 0 || !data[0].activePowerPCS || (data[0].activePowerPCS > -1 && data[0].activePowerPCS < 1)) {
this.dotData.lineBottomLeft = ''
}
if (data[1].activePowerPCS > 1) {
this.dotData.lineCenter = 'M 0,-283,0,0,0,0'
} else if (data[1].activePowerPCS < -1) {
this.dotData.lineCenter = 'M 0,0,0,0,0,-283'
} else if (data[1].activePowerPCS === 0 || !data[1].activePowerPCS || (data[1].activePowerPCS > -1 && data[1].activePowerPCS < 1)) {
this.dotData.lineCenter = ''
}
if (data[2].activePowerPCS > 1) {
this.dotData.lineBottomRight = 'M -271, -280 , -271 , 0 , 0 , 0'
} else if (data[2].activePowerPCS < -1) {
this.dotData.lineBottomRight = 'M 0,0 -271,0 -271,-283'
} else if (data[2].activePowerPCS === 0 || !data[2].activePowerPCS || (data[2].activePowerPCS > -1 && data[2].activePowerPCS < 1)) {
this.dotData.lineBottomRight = ''
}
} else {
if (data[0].activePowerPCS > 1) {
this.dotData.lineBottomLeft = 'M 0,0 281,0 281,-283'
} else if (data[0].activePowerPCS < -1) {
this.dotData.lineBottomLeft = 'M 283,-280, 280, 0, 0 ,0'
} else if (data[0].activePowerPCS === 0 || !data[0].activePowerPCS || (data[0].activePowerPCS > -1 && data[0].activePowerPCS < 1)) {
this.dotData.lineBottomLeft = ''
}
if (data[1].activePowerPCS > 1) {
this.dotData.lineCenter = 'M 0,0,0,0,0,-283'
} else if (data[1].activePowerPCS < -1) {
this.dotData.lineCenter = 'M 0,-283,0,0,0,0'
} else if (data[1].activePowerPCS === 0 || !data[1].activePowerPCS || (data[1].activePowerPCS > -1 && data[1].activePowerPCS < 1)) {
this.dotData.lineCenter = ''
}
if (data[2].activePowerPCS > 1) {
this.dotData.lineBottomRight = 'M 0,0 -271,0 -271,-283'
} else if (data[2].activePowerPCS < -1) {
this.dotData.lineBottomRight = 'M -271, -280 , -271 , 0 , 0 , 0'
} else if (data[2].activePowerPCS === 0 || !data[2].activePowerPCS || (data[2].activePowerPCS > -1 && data[2].activePowerPCS < 1)) {
this.dotData.lineBottomRight = ''
}
}
},
async GetOpenStationMiddlePart() {
this.loading = true
try {
const params = {
stationId: this.stationId
}
const res = await GetOpenStationMiddlePart(params)
this.partList = res.data
this.flowDirection(this.partList)
} catch (error) {
// console.log(error);
} finally {
this.loading = false
}
},
async GetOpenStationMiddle() {
this.loading = true
try {
const params = {
stationId: this.stationId
}
await GetOpenStationMiddle(params)
} catch (error) {
// console.log(error);
} finally {
this.loading = false
}
}
}
}
</script>
<style lang="scss" scoped>
.center-box {
width: 100%;
height: 100%;
}
@mixin move-round($duration, $delay) {
fill: none;
stroke-width: 5;
stroke-linejoin: round;
stroke-linecap: round;
stroke-dasharray: 3, 900;
stroke-dashoffset: 0;
animation: lineMove $duration $delay cubic-bezier(0, 0, 0.74, 0.74) infinite;
}
@keyframes lineMove {
0% {
stroke-dashoffset: -850;
}
100% {
stroke-dashoffset: -0;
}
}
.g-rect-fill-two {
@include move-round(3.5s, 1s);
}
</style>