Преглед изворни кода

首页场站数据统计、生产数据统计、短期调控参考准确率改为获取上报数据的准确率

xusl пре 7 месеци
родитељ
комит
02e8e08fa9

+ 124 - 14
cpp-admin/src/main/java/com/cpp/web/controller/largeScreen/LargeScreenController.java

@@ -5,6 +5,8 @@ import com.cpp.common.core.domain.R;
 import com.cpp.system.service.ISysConfigService;
 import com.cpp.web.domain.station.*;
 import com.cpp.web.domain.station.enums.ElectricFieldTypeEnum;
+import com.cpp.web.dto.largeScreen.ElectricFieldDataTotalDto;
+import com.cpp.web.dto.largeScreen.ProductionDataTotalDto;
 import com.cpp.web.service.station.*;
 import com.cpp.web.utils.DateTimeUtil;
 import com.cpp.web.utils.LatestDataUtil;
@@ -13,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -48,16 +51,77 @@ public class LargeScreenController {
     public R getBizData() {
         // 获取所有场站
         List<ElectricField> electricFieldList = electricFieldService.list();
+        // 首页左上角场站数据统计
+        // 统计开机容量累计值
+        BigDecimal gfOpenCapacitySum = BigDecimal.ZERO;
+        BigDecimal fdOpenCapacitySum = BigDecimal.ZERO;
+        // 辐照度累计值
+        BigDecimal fzdSum = BigDecimal.ZERO;
+        BigDecimal wsSum = BigDecimal.ZERO;
+        int wsSumCount = 0;
+        int fzdSumCount = 0;
+        // 实际发电量总和
+        BigDecimal realGeneratingSum = BigDecimal.ZERO;
+        // 预测发电量总和
+        BigDecimal forecastGenerating = BigDecimal.ZERO;
+        for (ElectricField electricField:electricFieldList){
+            PowerStationStatusData powerStationStatusData = LatestDataUtil.getData(electricField.getStationCode(), PowerStationStatusData.class);
+            if (ElectricFieldTypeEnum.E1.name().equals(electricField.getElectricFieldTypeEnum())){
+                // 获取气象站辐照度
+                WeatherStationStatusData weatherStationStatusData = LatestDataUtil.getData(electricField.getStationCode(), WeatherStationStatusData.class);
+                if (weatherStationStatusData!=null){
+                    fzdSum = fzdSum.add(weatherStationStatusData.getGlobalR());
+                    fzdSumCount++;
+                }
+                // 累计开机容量
+                if (powerStationStatusData!=null){
+                    gfOpenCapacitySum = gfOpenCapacitySum.add(powerStationStatusData.getOpenCapacity());
+                }
+            }
+            else{
+                // 获取测风塔风速
+                WindTowerStatusData windTowerStatusData = LatestDataUtil.getData(electricField.getStationCode(), WindTowerStatusData.class);
+                if (windTowerStatusData!=null){
+                    wsSum = wsSum.add(windTowerStatusData.getWsHubHeight());
+                    wsSumCount++;
+                }
+                // 累计开机容量
+                if (powerStationStatusData!=null){
+                    fdOpenCapacitySum = fdOpenCapacitySum.add(powerStationStatusData.getOpenCapacity());
+                }
+            }
+
+            // 计算实际发电量和预测发电量
+        }
+        // 封装首页场站数据统计
+        ElectricFieldDataTotalDto electricFieldDataTotalDto = new ElectricFieldDataTotalDto();
+        electricFieldDataTotalDto.setGfOpenCapcitySum(gfOpenCapacitySum);
+        BigDecimal fzdAvg = BigDecimal.ZERO;
+        if (fzdSum.compareTo(BigDecimal.ZERO)==1){
+            fzdAvg = fzdSum.divide(new BigDecimal(fzdSumCount),2, BigDecimal.ROUND_HALF_UP);
+        }
+        electricFieldDataTotalDto.setFzdAvg(fzdAvg);
+        electricFieldDataTotalDto.setFdOpenCapcitySum(fdOpenCapacitySum);
+        BigDecimal wsAvg = BigDecimal.ZERO;
+        if (wsSum.compareTo(BigDecimal.ZERO)==1){
+            wsAvg = wsSum.divide(new BigDecimal(wsSumCount),2, BigDecimal.ROUND_HALF_UP);
+        }
+        electricFieldDataTotalDto.setWsAvg(wsAvg);
+        Map bizDataMap = new HashMap();
+        bizDataMap.put("electricFieldDataTotalDto",electricFieldDataTotalDto);
+
+        ProductionDataTotalDto productionDataTotalDto = calGenerating();
+        bizDataMap.put("productionDataTotalDto",productionDataTotalDto);
+
+
         // 定义首页实际功率、可用、理论总和
         BigDecimal realSum = BigDecimal.ZERO;
         BigDecimal ableSum = BigDecimal.ZERO;
         BigDecimal theorySum = BigDecimal.ZERO;
         BigDecimal cdqSum = BigDecimal.ZERO;
         BigDecimal dqSum = BigDecimal.ZERO;
-        BigDecimal fzdSum = BigDecimal.ZERO;
-        BigDecimal wsSum = BigDecimal.ZERO;
-        int fzdSumCount = 0;
-        int wsSumCount = 0;
+
+
         // 限电场站数定义
         int xdCount = 0;
         // 获取每个场站的实时功率、可用、理论、超短期、短期
@@ -98,7 +162,7 @@ public class LargeScreenController {
                 }
             }
         }
-        Map bizDataMap = new HashMap();
+
         // 定义总和map
         Map sumMap = new HashMap();
         sumMap.put("realSum",realSum);
@@ -106,17 +170,11 @@ public class LargeScreenController {
         sumMap.put("theorySum",theorySum);
         bizDataMap.put("sumMap",sumMap);
         Map envDataMap = new HashMap();
-        BigDecimal wsAvg = BigDecimal.ZERO;
-        if (wsSum.compareTo(BigDecimal.ZERO)==1){
-            wsAvg = wsAvg.divide(new BigDecimal(wsSumCount),2, BigDecimal.ROUND_HALF_UP);
-        }
+
         envDataMap.put("wsAvg",wsAvg);
-        BigDecimal fzdAvg = BigDecimal.ZERO;
-        if (fzdSum.compareTo(BigDecimal.ZERO)==1){
-            fzdAvg = fzdAvg.divide(new BigDecimal(fzdSumCount),2, BigDecimal.ROUND_HALF_UP);
-        }
+
         envDataMap.put("fzdAvg",fzdAvg);
-        bizDataMap.put("envDataMap",envDataMap);
+
 
 
         Date dayStartTime = DateTimeUtil.getDayStartTime(System.currentTimeMillis());
@@ -242,4 +300,56 @@ public class LargeScreenController {
 
         return R.ok(bizDataMap);
     }
+
+    /**
+     * 统计首页生成数据
+     * @return
+     */
+    private ProductionDataTotalDto calGenerating(){
+        // 当日零点
+        Date dayStartTime = new Date(DateTimeUtil.getMillisecondsSubDay());
+        // 获取当前时刻5分钟
+        Date dayEndTimeFor5 = DateTimeUtil.getMomentTimeFor5Minute(System.currentTimeMillis());
+        // 获取当日所有实际功率
+        QueryWrapper<PowerStationStatusData> powerStationStatusDataQueryWrapper = new QueryWrapper<>();
+        powerStationStatusDataQueryWrapper.between("time", dayStartTime, dayEndTimeFor5);
+        List<PowerStationStatusData> powerStationStatusDataList = powerStationStatusDataService.list(powerStationStatusDataQueryWrapper);
+        // 实际功率总和
+        BigDecimal realPowerSum = BigDecimal.ZERO;
+        // 理论功率总和
+        BigDecimal theoryPowerSum = BigDecimal.ZERO;
+        // 计算实际发电量
+        BigDecimal realGeneratingSum = BigDecimal.ZERO;
+        for (PowerStationStatusData powerStationStatusData : powerStationStatusDataList) {
+            // 统计实际功率总和
+            if (powerStationStatusData.getRealValue()!=null){
+                realPowerSum = realPowerSum.add(powerStationStatusData.getRealValue());
+                // 发电量 = 实际 * 0.08
+                realGeneratingSum = realGeneratingSum.add(powerStationStatusData.getRealValue().multiply(new BigDecimal("0.08")).setScale(2, RoundingMode.HALF_UP));
+            }
+            // 统计理论功率总和
+            if (powerStationStatusData.getTheoryValue()!=null){
+                theoryPowerSum = theoryPowerSum.add(powerStationStatusData.getTheoryValue());
+            }
+        }
+        // 获取当日所有短期预测功率
+        Date dayEndTimeFor15 = DateTimeUtil.getMomentTimeFor15Minute(System.currentTimeMillis());
+        QueryWrapper<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationQueryWrapper = new QueryWrapper<>();
+        forecastPowerShortTermRegulationQueryWrapper.between("time", dayStartTime, dayEndTimeFor15);
+        List<ForecastPowerShortTermRegulation> forecastPowerShortTermRegulationList = forecastPowerShortTermRegulationService.list(forecastPowerShortTermRegulationQueryWrapper);
+        // 计算短期预测发电量
+        BigDecimal forecastGeneratingSum = BigDecimal.ZERO;
+        for (ForecastPowerShortTermRegulation forecastPowerShortTermRegulation : forecastPowerShortTermRegulationList) {
+            if (forecastPowerShortTermRegulation.getFpValue()!=null){
+                // 发电量 = 预测值 * 0.25
+                forecastGeneratingSum = forecastGeneratingSum.add(forecastPowerShortTermRegulation.getFpValue().multiply(new BigDecimal("0.25")).setScale(2, RoundingMode.HALF_UP));
+            }
+        }
+        ProductionDataTotalDto productionDataTotalDto = new ProductionDataTotalDto();
+        productionDataTotalDto.setRealGeneratingSum(realGeneratingSum);
+        productionDataTotalDto.setForecastGeneratingSum(forecastGeneratingSum);
+        productionDataTotalDto.setRealPowerSum(realPowerSum);
+        productionDataTotalDto.setTheoryPowerSum(theoryPowerSum);
+        return productionDataTotalDto;
+    }
 }

+ 1 - 1
cpp-admin/src/main/java/com/cpp/web/controller/regulation/DqRegulationController.java

@@ -99,7 +99,7 @@ public class DqRegulationController {
             Date accuracyEndDate = DateUtil.offsetDay(new Date(), -1);
             Date accuracyStartDate = DateUtil.offsetDay(new Date(), -30);
 
-            List<AccuracyPassRate> accuracyPassRateList = accuracyPassRateService.findByTimeBetweenAndForecastTypeAndDataSourcesAndAgoAndForecastModelAndStationCode(DateTimeUtil.getDayStartTime(accuracyStartDate.getTime()), DateTimeUtil.getDayLastTime(accuracyEndDate.getTime()), ForecastTypeEnum.dq, DataSourcesEnum.E1, howLongAgo, null, stationCode);
+            List<AccuracyPassRate> accuracyPassRateList = accuracyPassRateService.findByTimeBetweenAndForecastTypeAndDataSourcesAndAgoAndForecastModelAndStationCode(DateTimeUtil.getDayStartTime(accuracyStartDate.getTime()), DateTimeUtil.getDayLastTime(accuracyEndDate.getTime()), ForecastTypeEnum.dq, DataSourcesEnum.E4, howLongAgo, null, stationCode);
             double accuracySum = 0;
             if (accuracyPassRateList.size()>0){
                 for (AccuracyPassRate accuracyPassRate:accuracyPassRateList){

+ 23 - 0
cpp-admin/src/main/java/com/cpp/web/dto/largeScreen/ElectricFieldDataTotalDto.java

@@ -0,0 +1,23 @@
+package com.cpp.web.dto.largeScreen;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 首页场站数据统计DTO
+ *
+ * @author jy
+ * @since 2024/11/11
+ */
+@Data
+public class ElectricFieldDataTotalDto {
+    // 风速平均
+    private BigDecimal wsAvg;
+    // 辐照度平均
+    private BigDecimal fzdAvg;
+    // 光伏开机容量累计
+    private BigDecimal gfOpenCapcitySum;
+    // 风电开机容量累计
+    private BigDecimal fdOpenCapcitySum;
+}

+ 24 - 0
cpp-admin/src/main/java/com/cpp/web/dto/largeScreen/ProductionDataTotalDto.java

@@ -0,0 +1,24 @@
+package com.cpp.web.dto.largeScreen;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 生成数据统计DTO
+ *
+ * @author jy
+ * @since 2024/11/11
+ */
+@Data
+public class ProductionDataTotalDto {
+    // 实际发电量
+    private BigDecimal realGeneratingSum;
+    // 预测发电量
+    private BigDecimal forecastGeneratingSum;
+    // 实际功率
+    private BigDecimal realPowerSum;
+    // 理论功率
+    private BigDecimal theoryPowerSum;
+}
+

+ 41 - 25
cpp-ui/src/views/largeScreen/components/left-middle.vue

@@ -2,25 +2,31 @@
   <div class="progress-bar_container">
     <div>
       <div class="bar_title">
-        <div class="flex tb_container" >
+        <div class="flex tb_container">
           <span class="tb_title">日发电量</span>
-          <span class="tb_num">{{ dayValue }}</span>
-          <span class="tb_sum_num ml-0">/{{daySum}}</span>
+          <span class="tb_num">{{ realGeneratingSum }}</span>
+          <span class="tb_sum_num ml-0">/{{ forecastGeneratingSum }}</span>
           <span class="tb_unit ml-1">万kWh</span>
         </div>
       </div>
-      <progress-bar :params="{type:0,width:getWidth(dayValue,daySum)}"/>
+      <div class="flex items-center">
+        <progress-bar :params="{type:0,width:getGeneratingRatio(realGeneratingSum,forecastGeneratingSum)}"/>
+        <span class="tb_unit ml-0">200%</span>
+      </div>
     </div>
     <div style="margin-top: 5vh">
       <div class="bar_title">
-        <div class="flex tb_container" >
+        <div class="flex tb_container">
           <span class="tb_title">实际功率</span>
-          <span class="tb_num">{{ realValue }}</span>
-          <span class="tb_sum_num ml-0">/{{realSum}}</span>
+          <span class="tb_num">{{ realPowerSum }}</span>
+          <span class="tb_sum_num ml-0">/{{ theoryPowerSum }}</span>
           <span class="tb_unit ml-1">MW</span>
         </div>
       </div>
-      <progress-bar :params="{type:1,width:getWidth(realValue,realSum)}"/>
+      <div class="flex items-center">
+        <progress-bar :params="{type:1,width:getForecastRatio(realPowerSum,theoryPowerSum)}"/>
+        <span class="tb_unit ml-0">120%</span>
+      </div>
     </div>
   </div>
 </template>
@@ -34,10 +40,10 @@ export default {
   },
   data() {
     return {
-      dayValue: 456,
-      daySum: 1000,
-      realValue: 987,
-      realSum: 10000
+      realGeneratingSum: 0,
+      forecastGeneratingSum: 0,
+      realPowerSum: 0,
+      theoryPowerSum: 0
     }
   },
   props: {
@@ -47,19 +53,27 @@ export default {
     params: {
       // immediate: true,// 第一次立即监听
       handler(value) {
-        this.dayValue = value.dayValue || 456
-        this.daySum = value.daySum || 1000
-        this.realValue = value.realValue || 987
-        this.realSum = value.realSum || 10000
+        this.realGeneratingSum = value.realGeneratingSum
+        this.forecastGeneratingSum = value.forecastGeneratingSum
+        this.realPowerSum = value.realPowerSum
+        this.theoryPowerSum = value.theoryPowerSum
       }
     }
   },
   methods: {
-    getWidth(dividend,divisor){
-      if(Number(divisor) === 0 || Number(dividend) === 0){
+    getGeneratingRatio(dividend, divisor) {
+      if (Number(divisor) === 0 || Number(dividend) === 0) {
+        return 0
+      }
+      // 百分之200的比例展示
+      return ((Number(dividend) / Number(divisor * 2)) * 100).toFixed(2)
+    },
+    getForecastRatio(dividend, divisor) {
+      if (Number(divisor) === 0 || Number(dividend) === 0) {
         return 0
       }
-      return ((Number(dividend) / Number(divisor)) * 100 ).toFixed(2)
+      // 百分之120展示
+      return ((Number(dividend) / Number(divisor * 1.2)) * 100).toFixed(2)
     }
   },
 }
@@ -81,6 +95,7 @@ export default {
 .tb_container {
   margin-left: 1.5vw;
   line-height: 2.5vh;
+
   .tb_title {
     width: 6rem;
     //margin-left: 1.5vw;
@@ -90,14 +105,15 @@ export default {
     margin-left: 1.5vw;
     font-size: 1.2vw;
   }
-  .tb_sum_num{
+
+  .tb_sum_num {
     font-size: .9vw;
   }
-  .tb_unit {
-    font-size: .85vw;
-    writing-mode: horizontal-tb;
-    color: #838686;
-  }
 }
 
+.tb_unit {
+  font-size: .85vw;
+  writing-mode: horizontal-tb;
+  color: #838686;
+}
 </style>

+ 31 - 16
cpp-ui/src/views/largeScreen/index.vue

@@ -28,29 +28,29 @@
             <div class="flex width-50">
               <img src="../../assets/images/dashboard/num3.png" class="left-img"/>
               <div class="flex-column justify-center items-center">
-                <span>风速(m/s)</span>
-                <span>{{ envData.ws }}</span>
+                <span>风速</span>
+                <span>{{ envData.wsAvg }} m/s</span>
               </div>
             </div>
             <div class="flex width-50">
               <img src="../../assets/images/dashboard/num2.png" class="left-img"/>
               <div class="flex-column justify-center items-center">
                 <span>风电开机容量</span>
-                <span>{{ envData.ws }}</span>
+                <span>{{ envData.fdOpenCapcitySum }} MW</span>
               </div>
             </div>
             <div class="flex width-50">
               <img src="../../assets/images/dashboard/num4.png" class="left-img"/>
               <div class="flex-column justify-center items-center">
-                <span>辐照度(W/㎡)</span>
-                <span>{{ envData.radiance }}</span>
+                <span>辐照度</span>
+                <span>{{ envData.fzdAvg }} W/㎡</span>
               </div>
             </div>
             <div class="flex width-50">
               <img src="../../assets/images/dashboard/num2.png" class="left-img"/>
               <div class="flex-column justify-center items-center">
                 <span>光伏开机容量</span>
-                <span>{{ envData.ws }}</span>
+                <span>{{ envData.gfOpenCapcitySum }} MW</span>
               </div>
             </div>
           </div>
@@ -430,8 +430,10 @@ export default {
         capacity: 0
       },
       envData: {
-        ws: 0,
-        radiance: 0,
+        wsAvg: 0,
+        fzdAvg: 0,
+        gfOpenCapcitySum: 0,
+        fdOpenCapcitySum: 0,
       },
       // 告警统计值
       allBadgeValue: {
@@ -555,8 +557,21 @@ export default {
     },
     async getBizData() {
       await this.$axios({url: '/largeScreenController/getBizData', method: 'get'}).then(response => {
-        // 顶部统计值
-        let sumMap = response.data.sumMap
+        // 顶部场站数据统计值
+        let electricFieldDataTotalDto = response.data.electricFieldDataTotalDto
+        this.envData.wsAvg = electricFieldDataTotalDto.wsAvg
+        this.envData.fzdAvg = electricFieldDataTotalDto.fzdAvg
+        this.envData.gfOpenCapcitySum = electricFieldDataTotalDto.gfOpenCapcitySum
+        this.envData.fdOpenCapcitySum = electricFieldDataTotalDto.fdOpenCapcitySum
+        // 首页左中部生产数据统计
+        let productionDataTotalDto = response.data.productionDataTotalDto
+        this.leftMiddleParams ={
+          realGeneratingSum: productionDataTotalDto.realGeneratingSum,
+          forecastGeneratingSum: productionDataTotalDto.forecastGeneratingSum,
+          realPowerSum: productionDataTotalDto.realPowerSum,
+          theoryPowerSum: productionDataTotalDto.theoryPowerSum,
+        }
+
         this.digitalDisk[0].num = this.formatNumber(sumMap.realSum) + ''
         this.digitalDisk[1].num = this.formatNumber(sumMap.ableSum) + ''
         this.digitalDisk[2].num = this.formatNumber(sumMap.theorySum) + ''
@@ -681,12 +696,12 @@ export default {
         ],
         xData: ["10月26", "10月27", "10月28", "10月29", "10月30", "10月31"]
       }
-      this.leftMiddleParams ={
-        dayValue: 456,
-        daySum: 1000,
-        realValue: 987,
-        realSum: 2000
-      }
+      // this.leftMiddleParams ={
+      //   dayValue: 456,
+      //   daySum: 1000,
+      //   realValue: 987,
+      //   realSum: 2000
+      // }
     },
     jumpRout() {
       this.$router.push({path: "/cloudDataQuery"})