光伏功能

This commit is contained in:
huangjp
2025-11-07 15:23:08 +08:00
parent 6b4e5cd036
commit c6ea4a8c52
18 changed files with 1256 additions and 132 deletions

View File

@ -61,6 +61,8 @@
.label {
font-size: 24rpx;
color: #5A5A5A;
text-align: center;
white-space: pre-wrap;
}
.rightMark {
position: absolute;

View File

@ -1652,9 +1652,32 @@
<circle id="myCircle" cx="220" cy="64" r="16" fill="#0DA17D"></circle>
<circle id="myCircle" cx="960" cy="64" r="16" fill="#FB4444"></circle>
<!-- 动画元素 -->
<circle id="myCircle" cx="280" cy="64" r="10" fill="#FFFFFF">
<animate attributeName="cx" from="280" to="940" dur="800ms" fill="freeze" repeatCount="indefinite" />
</circle>
<circle id="myCircle" cx="280" cy="64" r="15" fill="#0DA17D">
<animate attributeName="cx" from="280" to="940" dur="3000ms" fill="freeze" repeatCount="indefinite" />
</circle>
<!-- pv1 -->
<circle cx="160" cy="680" r="16" fill="#338EFE" />
<circle class="anim-pv1" cx="160" cy="680" r="15" fill="#338EFE" />
<!-- pv2 -->
<circle cx="560" cy="680" r="16" fill="#338EFE" />
<circle class="anim-pv2" cx="560" cy="680" r="15" fill="#338EFE" />
<!-- pcs1 -->
<circle cx="925" cy="680" r="16" fill="#58D86B" />
<circle class="anim-elebox1" cx="925" cy="680" r="15" fill="#58D86B" />
<!-- pv3 -->
<circle cx="160" cy="1230" r="16" fill="#338EFE" />
<circle class="anim-pv3" cx="160" cy="1230" r="15" fill="#338EFE" />
<!-- pv4 -->
<circle cx="560" cy="1230" r="16" fill="#338EFE" />
<circle class="anim-pv4" cx="560" cy="1230" r="15" fill="#338EFE" />
<!-- pcs2 -->
<circle cx="925" cy="1230" r="16" fill="#58D86B" />
<circle class="anim-elebox2" cx="925" cy="1230" r="15" fill="#58D86B" />
<!-- 往负载方向 -->
<!-- <circle cx="573" cy="500" r="16" fill="#338EFE" /> -->
<circle class="animation anim-pvele" cx="300" cy="400" r="15" fill="#338EFE" />
<!-- <circle cx="573" cy="500" r="16" fill="#58D86B" /> -->
<circle class="animation anim-boxele" cx="300" cy="400" r="15" fill="#58D86B" />
</svg>
</view>
</template>
@ -1675,17 +1698,17 @@
y: 194
},
{
text: '计量电表功率(kW):100',
text: this.$t('homePage.home.workStatus') + this.$t('homePage.home.standing'),
x: 535,
y: 370
},
{
text: '计量电表功率(kW):120',
text: this.$t('homePage.home.activePower') + '120',
x: 535,
y: 420
},
{
text: '运行功率',
text: this.$t('homePage.home.operatingPower'),
x: 58,
y: 860
},
@ -1695,7 +1718,7 @@
y: 920
},
{
text: '累计电量',
text: this.$t('homePage.home.accumulatedElectricityConsumption'),
x: 58,
y: 990
},
@ -1705,7 +1728,7 @@
y: 1050
},
{
text: '运行功率',
text: this.$t('homePage.home.operatingPower'),
x: 460,
y: 860
},
@ -1715,7 +1738,7 @@
y: 920
},
{
text: '累计电量',
text: this.$t('homePage.home.accumulatedElectricityConsumption'),
x: 460,
y: 990
},
@ -1727,28 +1750,15 @@
{
text: 'SOC(%):100',
x: 810,
y: 860
y: 910
},
{
text: 'SOH(%):100',
x: 810,
y: 920
y: 960
},
{
text: '有机功率',
x: 840,
y: 990
},
{
text: '(kWh):100',
x: 810,
y: 1050
},
{
text: '运行功率',
text: this.$t('homePage.home.operatingPower'),
x: 58,
y: 1420
},
@ -1758,7 +1768,7 @@
y: 1480
},
{
text: '累计电量',
text: this.$t('homePage.home.accumulatedElectricityConsumption'),
x: 58,
y: 1550
},
@ -1768,7 +1778,7 @@
y: 1610
},
{
text: '运行功率',
text: this.$t('homePage.home.operatingPower'),
x: 460,
y: 1420
},
@ -1778,7 +1788,7 @@
y: 1480
},
{
text: '累计电量',
text: this.$t('homePage.home.accumulatedElectricityConsumption'),
x: 460,
y: 1550
},
@ -1790,23 +1800,13 @@
{
text: 'SOC(%):100',
x: 810,
y: 1420
y: 1470
},
{
text: 'SOH(%):100',
x: 810,
y: 1480
},
{
text: '有机功率',
x: 840,
y: 1550
},
{
text: '(kWh):100',
x: 810,
y: 1610
},
y: 1530
}
]
}
},
@ -1837,4 +1837,86 @@
font-size: 40px;
fill: #7F7F7F;
}
.anim-pv1{
animation: moveToplfetpv1 3s linear 0s infinite both;
}
@keyframes moveToplfetpv1 {
0% { cx: 160; cy: 680; }
10% { cx: 160; cy: 600; }
37.5% { cx: 10; cy: 600; }
67.5% { cx: 10; cy: 405; }
99.9999% { cx: 180; cy: 405; }
100% { cx: 160; cy: 680; }
}
.anim-pv2{
animation: moveToplfetpv2 3.8s linear 0s infinite both;
}
@keyframes moveToplfetpv2 {
0% { cx: 560; cy: 680; }
10% { cx: 560; cy: 600; }
57.5% { cx: 10; cy: 600; }
77.5% { cx: 10; cy: 405; }
99.9999% { cx: 180; cy: 405; }
100% { cx: 560; cy: 680; }
}
.anim-pv3{
animation: moveToplfetpv3 5s linear 0s infinite both;
}
@keyframes moveToplfetpv3 {
0% { cx: 160; cy: 1230; }
7% { cx: 160; cy: 1160; }
21% { cx: 10; cy: 1160; }
70% { cx: 10; cy: 405; }
99.9999% { cx: 180; cy: 405; }
100% { cx: 160; cy: 1230; }
}
.anim-pv4{
animation: moveToplfetpv4 6.5s linear 0s infinite both;
}
@keyframes moveToplfetpv4 {
0% { cx: 560; cy: 1230; }
5% { cx: 560; cy: 1160; }
45% { cx: 10; cy: 1160; }
85% { cx: 10; cy: 405; }
99.9999% { cx: 180; cy: 405; }
100% { cx: 560; cy: 1230; }
}
.anim-elebox1{
animation: moveToplfetbox1 5s linear 0s infinite both;
}
@keyframes moveToplfetbox1 {
0% { cx: 925; cy: 680; }
10% { cx: 925; cy: 600; }
67.5% { cx: 10; cy: 600; }
82.5% { cx: 10; cy: 405; }
99.9999% { cx: 180; cy: 405; }
100% { cx: 925; cy: 680; }
}
.anim-elebox2{
animation: moveToplfetbox2 8s linear 0s infinite both;
}
@keyframes moveToplfetbox2 {
0% { cx: 925; cy: 1230; }
5% { cx: 925; cy: 1160; }
55% { cx: 10; cy: 1160; }
90% { cx: 10; cy: 405; }
99.9999% { cx: 180; cy: 405; }
100% { cx: 925; cy: 1230; }
}
.animation{
animation: moveRightTopRight 5s linear 0s infinite both;
}
.anim-pvele{
animation-delay: 0s;
}
@keyframes moveRightTopRight {
0% { cx: 300; cy: 400; }
15% { cx: 435; cy: 400; }
50% { cx: 435; cy: 64; }
99.9999% { cx: 940; cy: 64; }
100% { cx: 300; cy: 400; }
}
.anim-boxele{
animation-delay: 1s;
}
</style>

View File

@ -550,11 +550,21 @@
<path d="M 1020,964L 1018,964L 1018,990L 1020,990L 1020,989L 1019,989L 1019,965L 1020,965Z"
style="fill:rgb(144,188,174);" />
<path d="M 1035,982L 1034,982L 1034,989L 1032,989L 1032,990L 1035,990Z" style="fill:rgb(144,188,174);" />
<circle cx="155" cy="920" r="16" fill="#338EFE" />
<circle class="anim-pv1" cx="155" cy="920" r="16" fill="#338EFE" />
<circle cx="570" cy="920" r="16" fill="#338EFE" />
<circle class="anim-pv2" cx="570" cy="920" r="16" fill="#338EFE" />
<circle cx="1000" cy="920" r="16" fill="#58D86B" />
<circle class="anim-elebox1" cx="1000" cy="920" r="16" fill="#58D86B" />
<!-- <circle cx="573" cy="500" r="16" fill="#338EFE" /> -->
<circle class="anim-topright anim-pvele" cx="573" cy="500" r="16" fill="#338EFE" />
<!-- <circle cx="573" cy="500" r="16" fill="#58D86B" /> -->
<circle class="anim-topright anim-boxele" cx="573" cy="500" r="16" fill="#58D86B" />
<!-- 动画元素 -->
<circle id="myCircle" cx="280" cy="64" r="10" fill="#FFFFFF">
<animate attributeName="cx" from="280" to="1000" dur="800ms" fill="freeze" repeatCount="indefinite" />
</circle>
<circle id="myCircle" cx="280" cy="67" r="15" fill="#0DA17D">
<animate attributeName="cx" from="280" to="1000" dur="3000ms" fill="freeze" repeatCount="indefinite" />
</circle>
</svg>
</view>
@ -566,57 +576,57 @@
return {
tags: [
{
text: '100kW',
text: '',
x: 68,
y: 194
},
{
text: '100kW',
text: '',
x: 1060,
y: 194
},
{
text: '计量电表功率(kW):100',
text: this.$t('homePage.home.workStatus') + this.$t('homePage.home.standing'),
x: 655,
y: 400
},
{
text: '计量电表功率(kW):120',
text: this.$t('homePage.home.activePower') + '120',
x: 655,
y: 460
},
{
text: '运行功率',
text: this.$t('homePage.home.operatingPower'),
x: 48,
y: 1110
},
{
text: '(kW):100',
text: '(kW):50',
x: 48,
y: 1170
},
{
text: '累计电量',
text: this.$t('homePage.home.accumulatedElectricityConsumption'),
x: 48,
y: 1240
},
{
text: '(kWh):100',
text: '(kWh):220',
x: 48,
y: 1300
},
{
text: '运行功率',
text: this.$t('homePage.home.operatingPower'),
x: 470,
y: 1110
},
{
text: '(kW):100',
text: '(kW):50',
x: 470,
y: 1170
},
{
text: '累计电量',
text: this.$t('homePage.home.accumulatedElectricityConsumption'),
x: 470,
y: 1240
},
@ -626,25 +636,15 @@
y: 1300
},
{
text: 'SOC(%):100',
text: 'SOC(%):73',
x: 880,
y: 1110
y: 1160
},
{
text: 'SOH(%):100',
text: 'SOH(%):99',
x: 880,
y: 1170
},
{
text: '有机功率',
x: 920,
y: 1230
},
{
text: '(kWh):100',
x: 900,
y: 1300
},
y: 1220
}
]
}
},
@ -675,4 +675,86 @@
font-size: 40px;
fill: #7F7F7F;
}
/* 通用动画点样式 */
.anim-pv1 {
r: 15; /* 半径 */
fill: #338EFE; /* 颜色 */
/* CSS 动画核心配置:动画名称 时长 时间函数 延迟 循环次数 填充模式 */
animation: moveTopRightTop 3s linear 0s infinite both;
}
.anim-pv2 {
r: 15;
fill: #338EFE;
animation: moveTop 2s linear 0s infinite both;
}
.anim-elebox1 {
r: 15;
fill: #58D86B;
animation: moveTopleftTop 3s linear 0s infinite both;
}
/* 关键帧:定义运动轨迹(向右→向下→复位) */
@keyframes moveTopRightTop {
/* 0%初始位置cx=280, cy=67 */
0% {
cx: 155;
cy: 920;
}
10% {
cx: 155;
cy: 845;
}
/* 65%向右移动2s 完成,对应总时长 3.1s 的 65% */
65% {
cx: 570; /* 横向终点 */
cy: 845; /* 纵向保持初始 */
}
/* 97%向下移动1s 完成,对应总时长 3.1s 的 97% */
99.99% {
cx: 570; /* 横向保持终点 */
cy: 680; /* 纵向终点 */
}
/* 100%:瞬间复位(避免卡顿) */
100% {
cx: 155;
cy: 920;
}
}
@keyframes moveTop {
0% {
cx: 570;
cy: 920;
}
99.99% {
cx: 570;
cy: 680;
}
100% {
cx: 570;
cy: 920;
}
}
@keyframes moveTopleftTop {
0% { cx: 1000; cy: 920; }
10% { cx: 1000; cy: 845; }
65% { cx: 570; cy: 845; }
99.99% { cx: 570; cy: 680; }
100% { cx: 1000; cy: 920; }
}
.anim-topright{
animation: moveTopRight 4s linear 0s infinite both;
}
.anim-pvele{
animation-delay: 0s;
}
.anim-boxele{
animation-delay: 1s;
}
@keyframes moveTopRight {
0% { cx: 573; cy: 500; }
50% { cx: 573; cy: 67; }
99.99% { cx: 1000; cy: 67; }
100% { cx: 573; cy: 500; }
}
</style>

View File

@ -48,10 +48,10 @@
<runda215 v-else-if="topologyType === 12" ref="tuopu" />
<third v-else-if="topologyType === 13" ref="tuopu" />
<mdPviese v-else-if="topologyType === 14" ref="tuopu" />
<ceshi-t v-else-if="topologyType === 1" />
<standard v-else ref="tuopu" />
</view>
<view class="box">
<!-- <view class="box">
<Section title="测试01" />
<view class="marginT20">
<ceshi-t />
@ -65,11 +65,11 @@
</view>
<view class="box">
<Section title="测试03" />
<!-- 当前组件有数据处理示例 -->
当前组件有数据处理示例
<view class="marginT20">
<ceshi-s />
</view>
</view>
</view> -->
<view v-if="topologyType === 9" class="box">
<Section :title="$t('homePage.home.deviceMonitor')" />
<devicemonitoring ref="deviceFire" />
@ -105,19 +105,19 @@
<zzhbStationData v-else-if="topologyType === 6" />
<commonStationData v-else />
</view>
<view class="box">
<Section title="光伏KPI" />
<view class="box" v-if="topologyType === 1">
<Section :title="$t('homePage.home.pvKpi')" />
<view class="">
<my-grid imgHeight="40rpx" imgWidth="40rpx" :list="lightArr" />
</view>
</view>
<view class="box" v-if="topologyType !== 9">
<view class="box" v-if="topologyType === 1">
<Section :title="$t('homePage.home.environmentalData')" />
<environmentalControlPosition v-if="rightCenter === 'dispositionRightCenter'" />
<environmentalControl v-else />
</view>
<view class="box">
<Section title="社会贡献" />
<Section :title="$t('homePage.home.socialContribution')" />
<view class="">
<my-grid :col="3" imgHeight="72rpx" imgWidth="82rpx" :list="society" />
</view>
@ -207,40 +207,40 @@
tuopuTimer: null,
rightCenter: null,
society: [{
label: '充放电数据',
value: '85.00',
label: this.$t('homePage.home.saveStandardCoal'),
value: '15.00',
image: require('@/static/aidex/images/ll01.png'),
},
{
label: 'CO2减排(吨)',
value: '85.00',
label: this.$t('homePage.home.equivalentCo2Reduction'),
value: '20.50',
image: require('@/static/aidex/images/ll02.png'),
},
{
label: '等效植树(万棵)',
value: '85.00',
label: this.$t('homePage.home.equivalentTreePlantings'),
value: '1.50',
image: require('@/static/aidex/images/ll03.png'),
},
],
lightArr: [{
label: '装机总容量(kWh)',
value: '85.00',
label: this.$t('homePage.home.totalCapacity') + '(kW)',
value: '100.00',
image: require('@/static/aidex/images/ll05.png'),
},
{
label: '当前功率(kW)',
value: '85.00',
label: this.$t('homePage.home.currentPower') + '(kW)',
value: '47.00',
image: require('@/static/aidex/images/ll06.png'),
},
{
label: '日发电量(kWh)',
label: this.$t('homePage.home.dailyPowerGeneration') + '(kWh)',
value: '85.00',
image: require('@/static/aidex/images/ll07.png'),
showMark: true
},
{
label: '总发电量(MWh)',
value: '85.00',
label: this.$t('homePage.home.cumulativePowerGeneration') + '(kWh)',
value: '496.00',
image: require('@/static/aidex/images/ll07.png'),
showMark: true
},
@ -273,7 +273,7 @@
this.stationId = val.id
this.userId = this.userData.userId
console.log(val.topologyType)
console.log('拓扑图',val)
this.topologyType = val.topologyType
this.getComponents()
this.$nextTick(() => {